[PATCH 3/4] uxtheme: Use TransparentBlt() for bitmaps with all alpha values being 0xff.
Zhiyi Zhang
zzhang at codeweavers.com
Wed Aug 25 01:24:31 CDT 2021
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51553
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
dlls/uxtheme/msstyles.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/dlls/uxtheme/msstyles.c b/dlls/uxtheme/msstyles.c
index ed22d923250..6f74d2d3d7d 100644
--- a/dlls/uxtheme/msstyles.c
+++ b/dlls/uxtheme/msstyles.c
@@ -1072,11 +1072,18 @@ static BOOL prepare_alpha (HBITMAP bmp, BOOL* hasAlpha)
if (!bmp || GetObjectW( bmp, sizeof(dib), &dib ) != sizeof(dib))
return FALSE;
- if(dib.dsBm.bmBitsPixel != 32)
+ if (dib.dsBm.bmBitsPixel != 32 || dib.dsBmih.biCompression != BI_RGB)
/* nothing to do */
return TRUE;
- *hasAlpha = TRUE;
+ /* If all alpha values are 0xff, don't use alpha blending */
+ for (n = 0, p = dib.dsBm.bmBits; n < dib.dsBmih.biWidth * dib.dsBmih.biHeight; n++, p += 4)
+ if ((*hasAlpha = (p[3] != 0xff)))
+ break;
+
+ if (!*hasAlpha)
+ return TRUE;
+
p = dib.dsBm.bmBits;
n = dib.dsBmih.biHeight * dib.dsBmih.biWidth;
/* AlphaBlend() wants premultiplied alpha, so do that now */
--
2.30.2
More information about the wine-devel
mailing list