avoid bitmap distortion when a non standard bitmap size is used (replaces patch 1477883)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41736 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
11012f4712
commit
2acac1b415
@ -39,8 +39,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 =
|
||||
@ -52,42 +50,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 == wxDefaultCoord )
|
||||
width = newSize.x;
|
||||
if ( height == wxDefaultCoord )
|
||||
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() && !size.IsFullySpecified() )
|
||||
{
|
||||
// in Mac OS X the 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 );
|
||||
|
Loading…
Reference in New Issue
Block a user