X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/20b6985553b4e01e7960847e3211d940aeff8742..0bca03736369e836cce9297509505c5972e775dd:/src/mac/carbon/icon.cpp?ds=sidebyside diff --git a/src/mac/carbon/icon.cpp b/src/mac/carbon/icon.cpp index 914b40b46b..3473bf72ba 100644 --- a/src/mac/carbon/icon.cpp +++ b/src/mac/carbon/icon.cpp @@ -9,72 +9,86 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#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" +IMPLEMENT_DYNAMIC_CLASS(wxIcon, wxBitmap) + +#define M_ICONDATA ((wxIconRefData *)m_refData) -/* - * Icons - */ wxIcon::wxIcon() { } -wxIcon::wxIcon(const char bits[], int width, int height) +wxIcon::wxIcon( const char bits[], int width, int height ) { - wxBitmap bmp(bits,width,height) ; + wxBitmap bmp( bits, width, height ) ; CopyFromBitmap( bmp ) ; } -wxIcon::wxIcon( const char **bits ) +wxIcon::wxIcon( const char **bits ) { - wxBitmap bmp(bits) ; + wxBitmap bmp( bits ) ; CopyFromBitmap( bmp ) ; } -wxIcon::wxIcon( char **bits ) +wxIcon::wxIcon( char **bits ) { - wxBitmap bmp(bits) ; + wxBitmap bmp( bits ) ; CopyFromBitmap( bmp ) ; } -wxIcon::wxIcon(const wxString& icon_file, int flags, - int desiredWidth, int desiredHeight) +wxIcon::wxIcon( + const wxString& icon_file, int flags, + int desiredWidth, int desiredHeight ) { - LoadFile(icon_file, (wxBitmapType) flags, desiredWidth, desiredHeight); + LoadFile( icon_file, (wxBitmapType) flags, desiredWidth, desiredHeight ); } wxIcon::~wxIcon() { } -WXHICON wxIcon::GetHICON() const +WXHICON wxIcon::GetHICON() const { wxASSERT( Ok() ) ; + return (WXHICON) ((wxIconRefData*)m_refData)->GetHICON() ; } int wxIcon::GetWidth() const { - return 32 ; + wxCHECK_MSG( Ok(), -1, wxT("invalid icon") ); + + return M_ICONDATA->GetWidth(); } int wxIcon::GetHeight() const { - return 32 ; + wxCHECK_MSG( Ok(), -1, wxT("invalid icon") ); + + 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 @@ -82,14 +96,16 @@ bool wxIcon::Ok() const return m_refData != NULL ; } -bool wxIcon::LoadFile(const wxString& filename, wxBitmapType type, - int desiredWidth, int desiredHeight) +bool wxIcon::LoadFile( + const wxString& filename, wxBitmapType type, + int desiredWidth, int desiredHeight ) { UnRef(); - + if ( type == wxBITMAP_TYPE_ICON_RESOURCE ) { OSType theId = 0 ; + if ( filename == wxT("wxICON_INFORMATION") ) { theId = kAlertNoteIcon ; @@ -107,49 +123,56 @@ bool wxIcon::LoadFile(const wxString& filename, wxBitmapType type, theId = kAlertStopIcon ; } else - {/* + { +#if 0 Str255 theName ; OSType theType ; wxMacStringToPascal( name , theName ) ; - + Handle resHandle = GetNamedResource( 'cicn' , theName ) ; if ( resHandle != 0L ) { GetResInfo( resHandle , &theId , &theType , theName ) ; ReleaseResource( resHandle ) ; } - */ +#endif } + if ( theId != 0 ) { IconRef iconRef = NULL ; - verify_noerr(GetIconRef(kOnSystemDisk,kSystemIconsCreator,theId, &iconRef)) ; + verify_noerr( GetIconRef( kOnSystemDisk, kSystemIconsCreator, theId, &iconRef ) ) ; if ( iconRef ) { m_refData = new wxIconRefData( (WXHICON) iconRef ) ; - return TRUE ; + + return true ; } } - return FALSE ; + + return false ; } else { - wxBitmapHandler *handler = wxBitmap::FindHandler(type); + wxBitmapHandler *handler = wxBitmap::FindHandler( type ); if ( handler ) { wxBitmap bmp ; - if ( handler->LoadFile(&bmp , filename, type, desiredWidth, desiredHeight )) + if ( handler->LoadFile( &bmp , filename, type, desiredWidth, desiredHeight )) { CopyFromBitmap( bmp ) ; + return true ; } + return false ; } else { - wxImage loadimage(filename, type); - if (loadimage.Ok()) +#if wxUSE_IMAGE + wxImage loadimage( filename, type ); + if (loadimage.Ok()) { if ( desiredWidth == -1 ) desiredWidth = loadimage.GetWidth() ; @@ -157,28 +180,41 @@ bool wxIcon::LoadFile(const wxString& filename, wxBitmapType type, desiredHeight = loadimage.GetHeight() ; if ( desiredWidth != loadimage.GetWidth() || desiredHeight != loadimage.GetHeight() ) loadimage.Rescale( desiredWidth , desiredHeight ) ; + wxBitmap bmp( loadimage ); CopyFromBitmap( bmp ) ; + return true; } +#endif } } return true ; } -void wxIcon::CopyFromBitmap(const wxBitmap& bmp) +void wxIcon::CopyFromBitmap( const wxBitmap& bmp ) { UnRef() ; - - m_refData = new wxIconRefData( (WXHICON) wxMacCreateIconRef( bmp ) ) ; + + // 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 ) ; + + // Standard sizes + SetWidth( 32 ) ; + SetHeight( 32 ) ; } -void wxIconRefData::Init() +void wxIconRefData::Init() { m_iconRef = NULL ; } @@ -194,11 +230,14 @@ void wxIconRefData::Free() IMPLEMENT_DYNAMIC_CLASS(wxICONResourceHandler, wxBitmapHandler) -bool wxICONResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags, - int desiredWidth, int desiredHeight) +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() ; } +