[PATCH] user32: Create a mask from alpha channel when loading a 32 bpp icon. (v3)
Dmitry Timoshkov
dmitry at baikal.ru
Tue Aug 7 03:09:16 CDT 2018
This patch fixes applications that draws 32 bpp icons manually.
v3: create 8-bit intermediate mask from alpha instead of 32-bit.
Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
dlls/user32/cursoricon.c | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c
index 0adb73bf56..5d63a42373 100644
--- a/dlls/user32/cursoricon.c
+++ b/dlls/user32/cursoricon.c
@@ -1296,6 +1296,41 @@ static HICON create_icon_from_bmi( const BITMAPINFO *bmi, DWORD maxsize, HMODULE
0, 0, bmi_width, bmi_height,
mask_bits, bmi_copy, DIB_RGB_COLORS, SRCCOPY );
}
+ else
+ {
+ if (bmi_has_alpha( bmi, color_bits ))
+ {
+ DWORD alpha_mask_bits_size = bmi_width * bmi_height;
+ unsigned char *alpha_mask_bits = HeapAlloc( GetProcessHeap(), 0, alpha_mask_bits_size );
+
+ if (alpha_mask_bits)
+ {
+ const unsigned char *src = color_bits;
+ unsigned char *dst = alpha_mask_bits;
+
+ while (alpha_mask_bits_size--)
+ {
+ *dst++ = src[3] == 0xff ? 0 : 1;
+ src += 4;
+ }
+
+ /* DIB palette and color count are already initialized correctly
+ * for the monochrome case, so just correct the bit depth.
+ */
+ if (bmi_copy->bmiHeader.biSize != sizeof(BITMAPCOREHEADER))
+ bmi_copy->bmiHeader.biBitCount = 8;
+ else
+ ((BITMAPCOREINFO *)bmi_copy)->bmciHeader.bcBitCount = 8;
+
+ SelectObject( hdc, mask );
+ StretchDIBits( hdc, 0, 0, width, height,
+ 0, 0, bmi_width, bmi_height,
+ alpha_mask_bits, bmi_copy, DIB_RGB_COLORS, SRCCOPY );
+
+ HeapFree( GetProcessHeap(), 0, alpha_mask_bits );
+ }
+ }
+ }
ret = TRUE;
done:
--
2.17.1
More information about the wine-devel
mailing list