Dmitry Timoshkov : user32: Create a mask from alpha channel when loading a 32 bpp icon.

Alexandre Julliard julliard at winehq.org
Thu Aug 23 16:37:03 CDT 2018


Module: wine
Branch: master
Commit: 1f75f426428b5896b837113dd149f90b7a05de46
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=1f75f426428b5896b837113dd149f90b7a05de46

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Wed Aug 22 14:00:13 2018 +0800

user32: Create a mask from alpha channel when loading a 32 bpp icon.

This patch fixes applications that draw the 32 bpp icons manually.

Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/cursoricon.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c
index 0adb73b..99337ab 100644
--- a/dlls/user32/cursoricon.c
+++ b/dlls/user32/cursoricon.c
@@ -1144,6 +1144,7 @@ static HICON create_icon_from_bmi( const BITMAPINFO *bmi, DWORD maxsize, HMODULE
     DWORD size, color_size, mask_size;
     HBITMAP color = 0, mask = 0, alpha = 0;
     const void *color_bits, *mask_bits;
+    void *alpha_mask_bits = NULL;
     BITMAPINFO *bmi_copy;
     BOOL ret = FALSE;
     BOOL do_stretch;
@@ -1266,7 +1267,27 @@ static HICON create_icon_from_bmi( const BITMAPINFO *bmi, DWORD maxsize, HMODULE
                        color_bits, bmi_copy, DIB_RGB_COLORS, SRCCOPY );
 
         if (bmi_has_alpha( bmi_copy, color_bits ))
+        {
             alpha = create_alpha_bitmap( color, bmi_copy, color_bits );
+            if (!mask_size)  /* generate mask from alpha */
+            {
+                LONG x, y, dst_stride = ((bmi_width + 31) / 8) & ~3;
+
+                if ((alpha_mask_bits = heap_calloc( bmi_height, dst_stride )))
+                {
+                    static const unsigned char masks[] = { 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1 };
+                    const DWORD *src = color_bits;
+                    unsigned char *dst = alpha_mask_bits;
+
+                    for (y = 0; y < bmi_height; y++, src += bmi_width, dst += dst_stride)
+                        for (x = 0; x < bmi_width; x++)
+                            if (src[x] >> 24 != 0xff) dst[x >> 3] |= masks[x & 7];
+
+                    mask_bits = alpha_mask_bits;
+                    mask_size = bmi_height * dst_stride;
+                }
+            }
+        }
 
         /* convert info to monochrome to copy the mask */
         if (bmi_copy->bmiHeader.biSize != sizeof(BITMAPCOREHEADER))
@@ -1301,6 +1322,7 @@ static HICON create_icon_from_bmi( const BITMAPINFO *bmi, DWORD maxsize, HMODULE
 done:
     DeleteDC( hdc );
     HeapFree( GetProcessHeap(), 0, bmi_copy );
+    HeapFree( GetProcessHeap(), 0, alpha_mask_bits );
 
     if (ret)
         hObj = alloc_icon_handle( FALSE, 0 );




More information about the wine-cvs mailing list