X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e40298d54ecd5b109222a7c60aa2ef084a304d69..b16de7461ac6d97b0b04a5ce4e73447925e93416:/src/mac/carbon/icon.cpp diff --git a/src/mac/carbon/icon.cpp b/src/mac/carbon/icon.cpp index ef4526a670..8423ef6224 100644 --- a/src/mac/carbon/icon.cpp +++ b/src/mac/carbon/icon.cpp @@ -9,18 +9,17 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "icon.h" -#endif +#include "wx/wxprec.h" #include "wx/icon.h" -#if !USE_SHARED_LIBRARIES IMPLEMENT_DYNAMIC_CLASS(wxIcon, wxBitmap) -#endif +#include "wx/image.h" #include "wx/mac/private.h" +#define M_ICONDATA ((wxIconRefData *)m_refData) + /* * Icons @@ -30,20 +29,22 @@ wxIcon::wxIcon() { } -wxIcon::wxIcon(const char bits[], int width, int height) : - wxBitmap(bits, width, height) +wxIcon::wxIcon(const char bits[], int width, int height) { - + wxBitmap bmp(bits,width,height) ; + CopyFromBitmap( bmp ) ; } -wxIcon::wxIcon( const char **bits ) : - wxBitmap(bits) +wxIcon::wxIcon( const char **bits ) { + wxBitmap bmp(bits) ; + CopyFromBitmap( bmp ) ; } -wxIcon::wxIcon( char **bits ) : - wxBitmap(bits) +wxIcon::wxIcon( char **bits ) { + wxBitmap bmp(bits) ; + CopyFromBitmap( bmp ) ; } wxIcon::wxIcon(const wxString& icon_file, int flags, @@ -56,83 +57,174 @@ wxIcon::~wxIcon() { } -bool wxIcon::LoadFile(const wxString& filename, wxBitmapType type, - int desiredWidth, int desiredHeight) +WXHICON wxIcon::GetHICON() const { - UnRef(); - - m_refData = new wxBitmapRefData; - - wxBitmapHandler *handler = FindHandler((wxBitmapType)type); - - if ( handler ) - return handler->LoadFile(this, filename, type, desiredWidth, desiredHeight); - else - return FALSE; + wxASSERT( Ok() ) ; + return (WXHICON) ((wxIconRefData*)m_refData)->GetHICON() ; } -void wxIcon::CopyFromBitmap(const wxBitmap& bmp) +int wxIcon::GetWidth() const { - wxIcon *icon = (wxIcon*)(&bmp); - *this = *icon; + wxCHECK_MSG( Ok(), -1, wxT("invalid icon") ); + + return M_ICONDATA->GetWidth(); } -IMPLEMENT_DYNAMIC_CLASS(wxICONResourceHandler, wxBitmapHandler) +int wxIcon::GetHeight() const +{ + wxCHECK_MSG( Ok(), -1, wxT("invalid icon") ); -bool wxICONResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags, - int desiredWidth, int desiredHeight) + return M_ICONDATA->GetHeight(); +} + +int wxIcon::GetDepth() const{ + return 32; +} + +void wxIcon::SetDepth(int depth){ + +} + +void wxIcon::SetWidth(int width){ + +} + +void wxIcon::SetHeight(int height){ + +} + +bool wxIcon::Ok() const { - short theId = -1 ; - if ( name == "wxICON_INFORMATION" ) - { - theId = kNoteIcon ; - } - else if ( name == "wxICON_QUESTION" ) - { - theId = kCautionIcon ; - } - else if ( name == "wxICON_WARNING" ) - { - theId = kCautionIcon ; - } - else if ( name == "wxICON_ERROR" ) + return m_refData != NULL ; +} + +bool wxIcon::LoadFile(const wxString& filename, wxBitmapType type, + int desiredWidth, int desiredHeight) +{ + UnRef(); + + if ( type == wxBITMAP_TYPE_ICON_RESOURCE ) { - theId = kStopIcon ; + OSType theId = 0 ; + if ( filename == wxT("wxICON_INFORMATION") ) + { + theId = kAlertNoteIcon ; + } + else if ( filename == wxT("wxICON_QUESTION") ) + { + theId = kAlertCautionIcon ; + } + else if ( filename == wxT("wxICON_WARNING") ) + { + theId = kAlertCautionIcon ; + } + else if ( filename == wxT("wxICON_ERROR") ) + { + theId = kAlertStopIcon ; + } + else + {/* + Str255 theName ; + OSType theType ; + wxMacStringToPascal( name , theName ) ; + + Handle resHandle = GetNamedResource( 'cicn' , theName ) ; + if ( resHandle != 0L ) + { + GetResInfo( resHandle , &theId , &theType , theName ) ; + ReleaseResource( resHandle ) ; + } + */ + } + if ( theId != 0 ) + { + IconRef iconRef = NULL ; + verify_noerr(GetIconRef(kOnSystemDisk,kSystemIconsCreator,theId, &iconRef)) ; + if ( iconRef ) + { + m_refData = new wxIconRefData( (WXHICON) iconRef ) ; + return TRUE ; + } + } + return FALSE ; } else { - Str255 theName ; - OSType theType ; - -#if TARGET_CARBON - c2pstrcpy( (StringPtr) theName , name ) ; -#else - strcpy( (char *) theName , name ) ; - c2pstr( (char *) theName ) ; -#endif - - Handle resHandle = GetNamedResource( 'cicn' , theName ) ; - if ( resHandle != 0L ) + wxBitmapHandler *handler = wxBitmap::FindHandler(type); + + if ( handler ) { - GetResInfo( resHandle , &theId , &theType , theName ) ; - ReleaseResource( resHandle ) ; + wxBitmap bmp ; + if ( handler->LoadFile(&bmp , filename, type, desiredWidth, desiredHeight )) + { + CopyFromBitmap( bmp ) ; + return true ; + } + return false ; } - } - if ( theId != -1 ) - { - CIconHandle theIcon = (CIconHandle ) GetCIcon( theId ) ; - if ( theIcon ) + else { - M_BITMAPHANDLERDATA->m_hIcon = theIcon ; - M_BITMAPHANDLERDATA->m_width = 32 ; - M_BITMAPHANDLERDATA->m_height = 32 ; - - M_BITMAPHANDLERDATA->m_depth = 8 ; - M_BITMAPHANDLERDATA->m_ok = true ; - M_BITMAPHANDLERDATA->m_numColors = 256 ; - M_BITMAPHANDLERDATA->m_bitmapType = kMacBitmapTypeIcon ; - return TRUE ; +#if wxUSE_IMAGE + wxImage loadimage(filename, type); + if (loadimage.Ok()) + { + if ( desiredWidth == -1 ) + desiredWidth = loadimage.GetWidth() ; + if ( desiredHeight == -1 ) + desiredHeight = loadimage.GetHeight() ; + if ( desiredWidth != loadimage.GetWidth() || desiredHeight != loadimage.GetHeight() ) + loadimage.Rescale( desiredWidth , desiredHeight ) ; + wxBitmap bmp( loadimage ); + CopyFromBitmap( bmp ) ; + return true; + } +#endif } } - return FALSE ; + return true ; +} + +void wxIcon::CopyFromBitmap(const wxBitmap& bmp) +{ + UnRef() ; + + // as the bitmap owns that ref, we have to acquire it as well + IconRef iconRef = bmp.GetBitmapData()->GetIconRef() ; + AcquireIconRef( iconRef ) ; + m_refData = new wxIconRefData( (WXHICON) iconRef ) ; + M_ICONDATA->SetWidth( bmp.GetWidth() ) ; + M_ICONDATA->SetHeight( bmp.GetHeight() ) ; +} + +wxIconRefData::wxIconRefData( WXHICON icon ) +{ + m_iconRef = MAC_WXHICON( icon ) ; + // Std sizes + SetWidth( 32 ) ; + SetHeight( 32 ) ; +} + +void wxIconRefData::Init() +{ + m_iconRef = NULL ; +} + +void wxIconRefData::Free() +{ + if ( m_iconRef ) + { + ReleaseIconRef( m_iconRef ) ; + m_iconRef = NULL ; + } +} + +IMPLEMENT_DYNAMIC_CLASS(wxICONResourceHandler, wxBitmapHandler) + +bool wxICONResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags, + int desiredWidth, int desiredHeight) +{ + wxIcon icon ; + icon.LoadFile( name , wxBITMAP_TYPE_ICON_RESOURCE , desiredWidth , desiredHeight ) ; + bitmap->CopyFromIcon( icon ) ; + return bitmap->Ok() ; }