From 2e7a64e9e6043d934a117a32d781e01fb907a01e Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 30 Oct 2010 23:51:04 +0000 Subject: [PATCH] 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 --- src/msw/bitmap.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/msw/bitmap.cpp b/src/msw/bitmap.cpp index b0e759a7b9..4f79bc0ddd 100644 --- a/src/msw/bitmap.cpp +++ b/src/msw/bitmap.cpp @@ -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); -- 2.47.2