X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6239ee05567eac71754f56c2a154222d10b57ff1..7f65743f005572f1de2754ba8c5e7cf1eed1847e:/src/mac/carbon/icon.cpp diff --git a/src/mac/carbon/icon.cpp b/src/mac/carbon/icon.cpp index ee61c69a8d..c90a0b37c7 100644 --- a/src/mac/carbon/icon.cpp +++ b/src/mac/carbon/icon.cpp @@ -19,28 +19,78 @@ #include "wx/mac/private.h" -IMPLEMENT_DYNAMIC_CLASS(wxIcon, wxBitmap) +IMPLEMENT_DYNAMIC_CLASS(wxIcon, wxGDIObject) #define M_ICONDATA ((wxIconRefData *)m_refData) +class WXDLLEXPORT wxIconRefData : public wxGDIRefData +{ +public: + wxIconRefData() { Init(); } + wxIconRefData( WXHICON iconref, int desiredWidth, int desiredHeight ); + virtual ~wxIconRefData() { Free(); } -wxIcon::wxIcon() + virtual bool IsOk() const { return m_iconRef != NULL; } + + virtual void Free(); + + void SetWidth( int width ) { m_width = width; } + void SetHeight( int height ) { m_height = height; } + + int GetWidth() const { return m_width; } + int GetHeight() const { return m_height; } + + WXHICON GetHICON() const { return (WXHICON) m_iconRef; } + +private: + void Init(); + + IconRef m_iconRef; + int m_width; + int m_height; +}; + + +wxIconRefData::wxIconRefData( WXHICON icon, int desiredWidth, int desiredHeight ) { + m_iconRef = MAC_WXHICON( icon ) ; + + // Standard sizes + SetWidth( desiredWidth == -1 ? 32 : desiredWidth ) ; + SetHeight( desiredHeight == -1 ? 32 : desiredHeight ) ; } -wxIcon::wxIcon( const char bits[], int width, int height ) +void wxIconRefData::Init() { - wxBitmap bmp( bits, width, height ) ; - CopyFromBitmap( bmp ) ; + m_iconRef = NULL ; + m_width = + m_height = 0; } -wxIcon::wxIcon( const char **bits ) +void wxIconRefData::Free() { - wxBitmap bmp( bits ) ; + if ( m_iconRef ) + { + ReleaseIconRef( m_iconRef ) ; + m_iconRef = NULL ; + } +} + +// +// +// + +wxIcon::wxIcon() +{ +} + +wxIcon::wxIcon( const char bits[], int width, int height ) +{ + wxBitmap bmp( bits, width, height ) ; CopyFromBitmap( bmp ) ; } -wxIcon::wxIcon( char **bits ) +wxIcon::wxIcon(const char* const* bits) { wxBitmap bmp( bits ) ; CopyFromBitmap( bmp ) ; @@ -60,15 +110,23 @@ wxIcon::wxIcon(WXHICON icon, const wxSize& size) if (icon) AcquireIconRef( (IconRef) icon ) ; - m_refData = new wxIconRefData( icon ) ; - M_ICONDATA->SetWidth( size.x ) ; - M_ICONDATA->SetHeight( size.y ) ; + m_refData = new wxIconRefData( icon, size.x, size.y ) ; } wxIcon::~wxIcon() { } +wxGDIRefData *wxIcon::CreateGDIRefData() const +{ + return new wxIconRefData; +} + +wxGDIRefData *wxIcon::CloneGDIRefData(const wxGDIRefData *data) const +{ + return new wxIconRefData(*wx_static_cast(const wxIconRefData *, data)); +} + WXHICON wxIcon::GetHICON() const { wxASSERT( Ok() ) ; @@ -107,11 +165,6 @@ void wxIcon::SetHeight( int WXUNUSED(height) ) { } -bool wxIcon::IsOk() const -{ - return m_refData != NULL ; -} - bool wxIcon::LoadFile( const wxString& filename, wxBitmapType type, int desiredWidth, int desiredHeight ) @@ -152,34 +205,38 @@ bool wxIcon::LoadFile( } else { - IconRef iconRef = NULL ; - - // first look in the resource fork - if ( iconRef == NULL ) - { - Str255 theName ; - - wxMacStringToPascal( filename , theName ) ; - Handle resHandle = GetNamedResource( 'icns' , theName ) ; - if ( resHandle != 0L ) - { - IconFamilyHandle iconFamily = (IconFamilyHandle) resHandle ; + IconRef iconRef = NULL ; + + // first look in the resource fork + if ( iconRef == NULL ) + { + Str255 theName ; + + wxMacStringToPascal( filename , theName ) ; + Handle resHandle = GetNamedResource( 'icns' , theName ) ; + if ( resHandle != 0L ) + { + IconFamilyHandle iconFamily = (IconFamilyHandle) resHandle ; HLock((Handle) iconFamily); OSStatus err = GetIconRefFromIconFamilyPtr( *iconFamily, GetHandleSize((Handle) iconFamily), &iconRef ); HUnlock((Handle) iconFamily); - wxASSERT_MSG( err == noErr , wxT("Error when constructing icon ref") ); + if ( err != noErr ) + { + wxFAIL_MSG("Error when constructing icon ref"); + } + ReleaseResource( resHandle ) ; - } - } + } + } if ( iconRef == NULL ) { // TODO add other attempts to load it from files etc here } - if ( iconRef ) - { - m_refData = new wxIconRefData( (WXHICON) iconRef ) ; - return true ; - } + if ( iconRef ) + { + m_refData = new wxIconRefData( (WXHICON) iconRef, desiredWidth, desiredHeight ) ; + return true ; + } } if ( theId != 0 ) @@ -188,7 +245,7 @@ bool wxIcon::LoadFile( verify_noerr( GetIconRef( kOnSystemDisk, kSystemIconsCreator, theId, &iconRef ) ) ; if ( iconRef ) { - m_refData = new wxIconRefData( (WXHICON) iconRef ) ; + m_refData = new wxIconRefData( (WXHICON) iconRef, desiredWidth, desiredHeight ) ; return true ; } @@ -241,35 +298,8 @@ 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 ) ; - - // Standard sizes - SetWidth( 32 ) ; - SetHeight( 32 ) ; -} - -void wxIconRefData::Init() -{ - m_iconRef = NULL ; -} - -void wxIconRefData::Free() -{ - if ( m_iconRef ) - { - ReleaseIconRef( m_iconRef ) ; - m_iconRef = NULL ; - } + IconRef iconRef = bmp.CreateIconRef() ; + m_refData = new wxIconRefData( (WXHICON) iconRef, bmp.GetWidth(), bmp.GetHeight() ) ; } IMPLEMENT_DYNAMIC_CLASS(wxICONResourceHandler, wxBitmapHandler)