]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix conversion of bitmaps with alpha to icons/cursors in wxMSW.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 30 Oct 2010 23:51:04 +0000 (23:51 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 30 Oct 2010 23:51:04 +0000 (23:51 +0000)
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

index b0e759a7b90517b86d00b986aeb9e0eb81ccadd3..4f79bc0ddd0f4cd3f406ed1d9dc3d75fccf875da 100644 (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);