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:
Vadim Zeitlin 2006-10-08 17:18:12 +00:00
parent 11012f4712
commit 2acac1b415

View File

@ -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 );