Use kControlContentIconRef in SetBitmapLabel for wxBORDER_NONE buttons.
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/branches/WX_2_8_BRANCH@49358 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -138,7 +149,11 @@ 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;
|
||||
@@ -146,7 +161,7 @@ void wxBitmapButton::SetBitmapLabel( const wxBitmap& bitmap )
|
||||
#ifdef __WXMAC_OSX__
|
||||
if ( HasFlag( wxBORDER_NONE ) )
|
||||
{
|
||||
wxMacCreateBitmapButton( &info, m_bmpNormal );
|
||||
wxMacCreateBitmapButton( &info, m_bmpNormal, kControlContentIconRef );
|
||||
if ( info.contentType != kControlNoContent )
|
||||
m_peer->SetData( kControlIconPart, kControlIconContentTag, info );
|
||||
}
|
||||
|
Reference in New Issue
Block a user