]> git.saurik.com Git - wxWidgets.git/commitdiff
When converting a wxIcon to a bitmap check if the icon has an alpha
authorRobin Dunn <robin@alldunn.com>
Wed, 25 May 2005 17:06:58 +0000 (17:06 +0000)
committerRobin Dunn <robin@alldunn.com>
Wed, 25 May 2005 17:06:58 +0000 (17:06 +0000)
channel and set the bitmap to use it.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@34340 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
src/msw/bitmap.cpp

index 2783bf3832d37295a51a9568bdb7f81fb251487c..1527fe617209a95d9c2e9739072b7a394599864e 100644 (file)
@@ -37,6 +37,8 @@ wxMSW:
 - Compiles again with WIN64.
 - Restored separators on toolbars under XP themes.
 - Winelib compilation now works.
+- When converting a wxIcon to a bitmap check if the icon has an alpha
+  channel and set the bitmap to use it.
 
 wxGTK:
 
index adb8e3f5ba33c0f45c1ec2f9074764734d19e247..015c8309bd345093a29e6fff305f439a761816d0 100644 (file)
@@ -310,11 +310,38 @@ bool wxBitmap::CopyFromIconOrCursor(const wxGDIImage& icon)
 
     refData->m_hBitmap = (WXHBITMAP)iconInfo.hbmColor;
 
-    // the mask returned by GetIconInfo() is inversed compared to the usual
-    // wxWin convention
-    refData->SetMask(wxInvertMask(iconInfo.hbmMask, w, h));
-
-
+#if wxUSE_WXDIB
+    // If the icon is 32 bits per pixel then it may have alpha channel data,
+    // although there are some icons that are 32 bpp but have no alpha... So
+    // convert to a DIB and manually check the 4th byte for each pixel.
+    BITMAP bm;
+    if ( ::GetObject(iconInfo.hbmColor, sizeof(BITMAP), (LPVOID)&bm)
+         && bm.bmBitsPixel == 32)
+    {
+        wxDIB dib(iconInfo.hbmColor);
+        if (dib.IsOk())
+        {
+            unsigned char* pixels = dib.GetData();
+            for (int idx=0; idx<w*h*4; idx+=4)
+            {
+                if (pixels[idx+3] != 0) 
+                {
+                    // If there is an alpha byte that is non-zero then set the
+                    // alpha flag and bail out of the loop.
+                    refData->m_hasAlpha = true;
+                    break;
+                }
+            }
+        }
+    }
+#endif
+    if ( !refData->m_hasAlpha )
+    {
+        // the mask returned by GetIconInfo() is inversed compared to the usual
+        // wxWin convention
+        refData->SetMask(wxInvertMask(iconInfo.hbmMask, w, h));
+    }
+    
     // delete the old one now as we don't need it any more
     ::DeleteObject(iconInfo.hbmMask);