Fix conversion of bitmaps with alpha to icons/cursors in wxMSW.

CreateIconIndirect() applies pre-multiplication to the bitmap itself (as can be
seen by experimenting with this or reading WINE sources for it) and so we must
pass it a bitmap with data in non-pre-multiplied format to avoid doing it
twice.

This is similar to the change to wxImageList in the previous commit, see #9050.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65961 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2010-10-30 23:51:04 +00:00
parent 5c96c8649e
commit 2e7a64e9e6

View File

@@ -1633,6 +1633,21 @@ HICON wxBitmapToIconOrCursor(const wxBitmap& bmp,
if ( bmp.HasAlpha() )
{
HBITMAP hbmp;
#if wxUSE_WXDIB && wxUSE_IMAGE
// CreateIconIndirect() requires non-pre-multiplied pixel data on input
// as it does pre-multiplication internally itself so we need to create
// a special DIB in such format to pass to it. This is inefficient but
// better than creating an icon with wrong colours.
AutoHBITMAP hbmpRelease;
hbmp = wxDIB(bmp.ConvertToImage(),
wxDIB::PixelFormat_NotPreMultiplied).Detach();
hbmpRelease.Init(hbmp);
#else // !(wxUSE_WXDIB && wxUSE_IMAGE)
hbmp = GetHbitmapOf(bmp);
#endif // wxUSE_WXDIB && wxUSE_IMAGE
// Create an empty mask bitmap.
// it doesn't seem to work if we mess with the mask at all.
HBITMAP hMonoBitmap = CreateBitmap(bmp.GetWidth(),bmp.GetHeight(),1,1,NULL);
@@ -1647,7 +1662,7 @@ HICON wxBitmapToIconOrCursor(const wxBitmap& bmp,
}
iconInfo.hbmMask = hMonoBitmap;
iconInfo.hbmColor = GetHbitmapOf(bmp);
iconInfo.hbmColor = hbmp;
HICON hicon = ::CreateIconIndirect(&iconInfo);