Factor out duplicated code for bitmap scaling in wxArtProvider.

Move duplicated code responsible for rescaling bitmaps in wxArtProvider to the
shared wxArtPrvider::RescaleBitmap() method.

Additionally, make this new method work even in wxUSE_IMAGE==0 case.

See #17071.

See https://github.com/wxWidgets/wxWidgets/pull/64.
This commit is contained in:
Artur Wieczorek
2015-08-07 23:40:40 +02:00
committed by Vadim Zeitlin
parent 09e8876c0c
commit 244ec264af
4 changed files with 29 additions and 11 deletions

View File

@@ -188,6 +188,9 @@ public:
// the topmost provider if platform_dependent = false
static wxSize GetSizeHint(const wxArtClient& client, bool platform_dependent = false);
// Rescale bitmap (used internally if requested size is other than the available).
static void RescaleBitmap(wxBitmap& bmp, const wxSize& sizeNeeded);
protected:
friend class wxArtProviderModule;
#if wxUSE_ARTPROVIDER_STD

View File

@@ -212,6 +212,29 @@ wxArtProvider::~wxArtProvider()
// wxArtProvider: retrieving bitmaps/icons
// ----------------------------------------------------------------------------
void wxArtProvider::RescaleBitmap(wxBitmap& bmp, const wxSize& sizeNeeded)
{
wxCHECK_RET( sizeNeeded.IsFullySpecified(), wxS("New size must be given") );
#if wxUSE_IMAGE
wxImage img = bmp.ConvertToImage();
img.Rescale(sizeNeeded.x, sizeNeeded.y);
bmp = wxBitmap(img);
#else // !wxUSE_IMAGE
// Fallback method of scaling the bitmap
wxBitmap newBmp(sizeNeeded);
newBmp.UseAlpha(bmp.HasAlpha());
{
wxMemoryDC dc(newBmp);
double scX = (double)sizeNeeded.GetWidth() / bmp.GetWidth();
double scY = (double)sizeNeeded.GetHeight() / bmp.GetHeight();
dc.SetUserScale(scX, scY);
dc.DrawBitmap(bmp, 0, 0);
}
bmp = newBmp;
#endif // wxUSE_IMAGE/!wxUSE_IMAGE
}
/*static*/ wxBitmap wxArtProvider::GetBitmap(const wxArtID& id,
const wxArtClient& client,
const wxSize& size)
@@ -256,17 +279,13 @@ wxArtProvider::~wxArtProvider()
}
// if we didn't get the correct size, resize the bitmap
#if wxUSE_IMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB)
if ( bmp.IsOk() && sizeNeeded != wxDefaultSize )
{
if ( bmp.GetSize() != sizeNeeded )
{
wxImage img = bmp.ConvertToImage();
img.Rescale(sizeNeeded.x, sizeNeeded.y);
bmp = wxBitmap(img);
RescaleBitmap(bmp, sizeNeeded);
}
}
#endif // wxUSE_IMAGE
sm_cache->PutBitmap(hashId, bmp);
}

View File

@@ -570,7 +570,7 @@ public:
void Resort();
private:
wxDataViewMainWindow *m_window;
wxDataViewMainWindow * const m_window;
wxDataViewTreeNode *m_parent;
// Corresponding model item.

View File

@@ -150,7 +150,6 @@ static wxBitmap CreateFromStdIcon(const char *iconName,
wxBitmap bmp;
bmp.CopyFromIcon(icon);
#if wxUSE_IMAGE
// The standard native message box icons are in message box size (32x32).
// If they are requested in any size other than the default or message
// box size, they must be rescaled first.
@@ -159,12 +158,9 @@ static wxBitmap CreateFromStdIcon(const char *iconName,
const wxSize size = wxArtProvider::GetNativeSizeHint(client);
if ( size != wxDefaultSize )
{
wxImage img = bmp.ConvertToImage();
img.Rescale(size.x, size.y);
bmp = wxBitmap(img);
wxArtProvider::RescaleBitmap(bmp, size);
}
}
#endif // wxUSE_IMAGE
return bmp;
}