X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cc374a2f2985d8783e13063a7db33c1062ca35c4..7564225f8bff6e6c2ed27695836035fa85a81189:/src/mac/carbon/bmpbuttn.cpp?ds=inline diff --git a/src/mac/carbon/bmpbuttn.cpp b/src/mac/carbon/bmpbuttn.cpp index 48fec8aac6..26ee9dc953 100644 --- a/src/mac/carbon/bmpbuttn.cpp +++ b/src/mac/carbon/bmpbuttn.cpp @@ -6,28 +6,30 @@ // Created: 1998-01-01 // RCS-ID: $Id$ // Copyright: (c) Stefan Csomor -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" #if wxUSE_BMPBUTTON -#include "wx/window.h" #include "wx/bmpbuttn.h" +#ifndef WX_PRECOMP + #include "wx/dcmemory.h" +#endif + IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton) #include "wx/mac/uma.h" -#include "wx/bitmap.h" bool wxBitmapButton::Create( wxWindow *parent, - wxWindowID id, const wxBitmap& bitmap, - const wxPoint& pos, - const wxSize& size, - long style, - const wxValidator& validator, - const wxString& name ) + wxWindowID id, const wxBitmap& bitmap, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator, + const wxString& name ) { m_macIsUserPane = false; @@ -36,8 +38,6 @@ bool wxBitmapButton::Create( wxWindow *parent, if ( !wxControl::Create( parent, id, pos, size, style, validator, name ) ) return false; - m_bmpNormal = bitmap; - if ( style & wxBU_AUTODRAW ) { m_marginX = @@ -49,42 +49,80 @@ bool wxBitmapButton::Create( wxWindow *parent, m_marginY = 0; } - int width = size.x; - int height = size.y; - - if ( bitmap.Ok() ) - { - wxSize newSize = DoGetBestSize(); - if ( width == -1 ) - width = newSize.x; - if ( height == -1 ) - height = newSize.y; - } - - m_bmpNormal = bitmap; - OSStatus err = noErr; ControlButtonContentInfo info; Rect bounds = wxMacGetBoundsForControl( this, pos, size ); 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 = bitmap; + + #ifdef __WXMAC_OSX__ if ( HasFlag( wxBORDER_NONE ) ) { wxMacCreateBitmapButton( &info, m_bmpNormal, kControlContentIconRef ); err = CreateIconControl( - MAC_WXHWND(parent->MacGetTopLevelWindowRef()), - &bounds, &info, false, m_peer->GetControlRefAddr() ); + MAC_WXHWND(parent->MacGetTopLevelWindowRef()), + &bounds, &info, false, m_peer->GetControlRefAddr() ); } else #endif { wxMacCreateBitmapButton( &info, m_bmpNormal ); err = CreateBevelButtonControl( - MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds, CFSTR(""), - ((style & wxBU_AUTODRAW) ? kControlBevelButtonSmallBevel : kControlBevelButtonNormalBevel ), - kControlBehaviorOffsetContents, &info, 0, 0, 0, m_peer->GetControlRefAddr() ); + MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds, CFSTR(""), + ((style & wxBU_AUTODRAW) ? kControlBevelButtonSmallBevel : kControlBevelButtonNormalBevel ), + kControlBehaviorOffsetContents, &info, 0, 0, 0, m_peer->GetControlRefAddr() ); } verify_noerr( err );