#include "wx/imaglist.h"
#include "wx/dc.h"
#include "wx/msw/dc.h"
+#include "wx/msw/dib.h"
#include "wx/msw/private.h"
// ----------------------------------------------------------------------------
// 'bitmap' and 'mask'.
int wxImageList::Add(const wxBitmap& bitmap, const wxBitmap& mask)
{
- HBITMAP hbmpMask = GetMaskForImage(bitmap, mask);
+ HBITMAP hbmp;
- int index = ImageList_Add(GetHImageList(), GetHbitmapOf(bitmap), hbmpMask);
+#if wxUSE_WXDIB && wxUSE_IMAGE
+ // wxBitmap normally stores alpha in pre-multiplied format but
+ // ImageList_Draw() does pre-multiplication internally so we need to undo
+ // the pre-multiplication here. Converting back and forth like this is, of
+ // course, very inefficient but it's better than wrong appearance so we do
+ // this for now until a better way can be found.
+ AutoHBITMAP hbmpRelease;
+ if ( bitmap.HasAlpha() )
+ {
+ hbmp = wxDIB(bitmap.ConvertToImage(),
+ wxDIB::PixelFormat_NotPreMultiplied).Detach();
+ hbmpRelease.Init(hbmp);
+ }
+ else
+#endif // wxUSE_WXDIB && wxUSE_IMAGE
+ hbmp = GetHbitmapOf(bitmap);
+
+ AutoHBITMAP hbmpMask(GetMaskForImage(bitmap, mask));
+
+ int index = ImageList_Add(GetHImageList(), hbmp, hbmpMask);
if ( index == -1 )
{
wxLogError(_("Couldn't add an image to the image list."));
}
- ::DeleteObject(hbmpMask);
-
return index;
}
// 'bitmap'.
int wxImageList::Add(const wxBitmap& bitmap, const wxColour& maskColour)
{
+ HBITMAP hbmp;
+
+#if wxUSE_WXDIB && wxUSE_IMAGE
+ // See the comment in overloaded Add() above.
+ AutoHBITMAP hbmpRelease;
+ if ( bitmap.HasAlpha() )
+ {
+ hbmp = wxDIB(bitmap.ConvertToImage(),
+ wxDIB::PixelFormat_NotPreMultiplied).Detach();
+ hbmpRelease.Init(hbmp);
+ }
+ else
+#endif // wxUSE_WXDIB && wxUSE_IMAGE
+ hbmp = GetHbitmapOf(bitmap);
+
int index = ImageList_AddMasked(GetHImageList(),
- GetHbitmapOf(bitmap),
+ hbmp,
wxColourToRGB(maskColour));
if ( index == -1 )
{
// Note that wxImageList creates new bitmaps, so you may delete
// 'bitmap' and 'mask'.
bool wxImageList::Replace(int index,
- const wxBitmap& bitmap, const wxBitmap& mask)
+ const wxBitmap& bitmap,
+ const wxBitmap& mask)
{
- HBITMAP hbmpMask = GetMaskForImage(bitmap, mask);
+ HBITMAP hbmp;
- bool ok = ImageList_Replace(GetHImageList(), index,
- GetHbitmapOf(bitmap), hbmpMask) != 0;
- if ( !ok )
+#if wxUSE_WXDIB && wxUSE_IMAGE
+ // See the comment in Add() above.
+ AutoHBITMAP hbmpRelease;
+ if ( bitmap.HasAlpha() )
{
- wxLogLastError(wxT("ImageList_Replace()"));
+ hbmp = wxDIB(bitmap.ConvertToImage(),
+ wxDIB::PixelFormat_NotPreMultiplied).Detach();
+ hbmpRelease.Init(hbmp);
}
+ else
+#endif // wxUSE_WXDIB && wxUSE_IMAGE
+ hbmp = GetHbitmapOf(bitmap);
- ::DeleteObject(hbmpMask);
+ AutoHBITMAP hbmpMask(GetMaskForImage(bitmap, mask));
- return ok;
+ if ( !ImageList_Replace(GetHImageList(), index, hbmp, hbmpMask) )
+ {
+ wxLogLastError(wxT("ImageList_Replace()"));
+ return false;
+ }
+
+ return true;
}
// Replaces a bitmap and mask from an icon.