From fde5da316a65ade864f9e65764a57c2ef3b674bb Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Tue, 23 Oct 2007 18:26:41 +0000 Subject: [PATCH] Factor out code to create a standard sized bitmap so it can be used in SetBitmapLabel too. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49357 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/mac/carbon/bmpbuttn.cpp | 115 ++++++++++++++++++++---------------- 1 file changed, 65 insertions(+), 50 deletions(-) diff --git a/src/mac/carbon/bmpbuttn.cpp b/src/mac/carbon/bmpbuttn.cpp index 26ee9dc953..0d9e2d3956 100644 --- a/src/mac/carbon/bmpbuttn.cpp +++ b/src/mac/carbon/bmpbuttn.cpp @@ -23,6 +23,63 @@ IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton) #include "wx/mac/uma.h" +//--------------------------------------------------------------------------- +// Helper functions + +static wxBitmap wxMakeStdSizeBitmap(const wxBitmap& bitmap) +{ + // in Mac OS X the icon controls (which are used for borderless bitmap + // buttons) can have only one of the few standard sizes and if they + // don't, the OS rescales them automatically resulting in really ugly + // images, so centre the image in a square of standard size instead + + // the supported sizes, sorted in decreasng order + static const int stdSizes[] = { 128, 48, 32, 16, 0 }; + + const int width = bitmap.GetWidth(); + const int height = bitmap.GetHeight(); + + wxBitmap newBmp(bitmap); + + int n; + for ( n = 0; n < (int)WXSIZEOF(stdSizes); n++ ) + { + const int sizeStd = stdSizes[n]; + if ( width > sizeStd || height > sizeStd ) + { + // it will become -1 if the bitmap is larger than the biggest + // supported size, this is intentional + n--; + + break; + } + } + + if ( n != -1 ) + { + const int sizeStd = stdSizes[n]; + if ( width != sizeStd || height != sizeStd ) + { + wxASSERT_MSG( width <= sizeStd && height <= sizeStd, + _T("bitmap shouldn't be cropped") ); + + newBmp.Create(sizeStd, sizeStd); + wxMemoryDC dcMem; + dcMem.SelectObject(newBmp); + dcMem.Clear(); + + dcMem.DrawBitmap(bitmap, + (sizeStd - width)/2, (sizeStd-height)/2, + true); + } + } + //else: let the system rescale the bitmap + + return newBmp; +} + +//--------------------------------------------------------------------------- + bool wxBitmapButton::Create( wxWindow *parent, wxWindowID id, const wxBitmap& bitmap, const wxPoint& pos, @@ -56,54 +113,8 @@ bool wxBitmapButton::Create( wxWindow *parent, m_peer = new wxMacControl( this ); if ( bitmap.Ok() && HasFlag(wxBORDER_NONE) ) - { - // in Mac OS X the icon controls (which are used for borderless bitmap - // buttons) can have only one of the few standard sizes and if they - // don't, the OS rescales them automatically resulting in really ugly - // images, so centre the image in a square of standard size instead - - // the supported sizes, sorted in decreasng order - static const int stdSizes[] = { 128, 48, 32, 16, 0 }; - - const int width = bitmap.GetWidth(); - const int height = bitmap.GetHeight(); - - int n; - for ( n = 0; n < (int)WXSIZEOF(stdSizes); n++ ) - { - const int sizeStd = stdSizes[n]; - if ( width > sizeStd || height > sizeStd ) - { - // it will become -1 if the bitmap is larger than the biggest - // supported size, this is intentional - n--; - - break; - } - } - - if ( n != -1 ) - { - const int sizeStd = stdSizes[n]; - if ( width != sizeStd || height != sizeStd ) - { - wxASSERT_MSG( width <= sizeStd && height <= sizeStd, - _T("bitmap shouldn't be cropped") ); - - m_bmpNormal.Create(sizeStd, sizeStd); - wxMemoryDC dcMem; - dcMem.SelectObject(m_bmpNormal); - dcMem.Clear(); - - dcMem.DrawBitmap(bitmap, - (sizeStd - width)/2, (sizeStd-height)/2, - true); - } - } - //else: let the system rescale the bitmap - } - - if ( !m_bmpNormal.Ok() ) + m_bmpNormal = wxMakeStdSizeBitmap(bitmap); + else m_bmpNormal = bitmap; @@ -137,14 +148,18 @@ bool wxBitmapButton::Create( wxWindow *parent, void wxBitmapButton::SetBitmapLabel( const wxBitmap& bitmap ) { - m_bmpNormal = bitmap; + if ( HasFlag( wxBORDER_NONE ) ) + m_bmpNormal = wxMakeStdSizeBitmap(bitmap); + else + m_bmpNormal = bitmap; + InvalidateBestSize(); ControlButtonContentInfo info; #ifdef __WXMAC_OSX__ if ( HasFlag( wxBORDER_NONE ) ) - { + { wxMacCreateBitmapButton( &info, m_bmpNormal, kControlContentIconRef ); if ( info.contentType != kControlNoContent ) m_peer->SetData( kControlIconPart, kControlIconContentTag, info ); -- 2.45.2