This patch fixes an application that draws 32 bpp icons manually.
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- dlls/user32/cursoricon.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c index 0adb73bf56..62576a341a 100644 --- a/dlls/user32/cursoricon.c +++ b/dlls/user32/cursoricon.c @@ -1296,6 +1296,36 @@ 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 )) + { + unsigned char *alpha_mask_bits = HeapAlloc( GetProcessHeap(), 0, bmi_width * bmi_height * 4 ); + if (alpha_mask_bits) + { + const unsigned char *src; + unsigned char *dst; + LONG i; + + for (i = 0, src = color_bits, dst = alpha_mask_bits; i < bmi_width * bmi_height; i++, src += 4, dst += 4) + { + if (src[3] == 0xff) + dst[0] = dst[1] = dst[2] = 0; + else + dst[0] = dst[1] = dst[2] = 0xff; + + dst[3] = 0; + } + + SelectObject( hdc, mask ); + StretchDIBits( hdc, 0, 0, width, height, + 0, 0, bmi_width, bmi_height, + alpha_mask_bits, bmi, DIB_RGB_COLORS, SRCCOPY ); + + HeapFree( GetProcessHeap(), 0, alpha_mask_bits ); + } + } + } ret = TRUE;
done: