Peter Urbanec : winex11: Implement AlphaBlend mode for the case where SourceConstantAlpha is combined with source alpha .
Alexandre Julliard
julliard at winehq.org
Wed Nov 11 08:33:26 CST 2009
Module: wine
Branch: master
Commit: ab081aa84535e013b89a6c4c3a8a9fcee636840d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ab081aa84535e013b89a6c4c3a8a9fcee636840d
Author: Peter Urbanec <winehq.org at urbanec.net>
Date: Wed Nov 11 02:58:41 2009 +1100
winex11: Implement AlphaBlend mode for the case where SourceConstantAlpha is combined with source alpha.
---
dlls/winex11.drv/xrender.c | 35 ++++++++++++++++++++++++++++-------
1 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
index 005296b..2eb1d1e 100644
--- a/dlls/winex11.drv/xrender.c
+++ b/dlls/winex11.drv/xrender.c
@@ -1956,9 +1956,6 @@ BOOL CDECL X11DRV_AlphaBlend(X11DRV_PDEVICE *devDst, INT xDst, INT yDst, INT wid
return FALSE;
}
- if ((blendfn.AlphaFormat & AC_SRC_ALPHA) && blendfn.SourceConstantAlpha != 0xff)
- FIXME("Ignoring SourceConstantAlpha %d for AC_SRC_ALPHA\n", blendfn.SourceConstantAlpha);
-
if(dib.dsBm.bmBitsPixel != 32) {
FIXME("not a 32 bpp dibsection\n");
return FALSE;
@@ -1979,11 +1976,35 @@ BOOL CDECL X11DRV_AlphaBlend(X11DRV_PDEVICE *devDst, INT xDst, INT yDst, INT wid
if (blendfn.AlphaFormat & AC_SRC_ALPHA)
{
- for(; y >= y2; y--)
+ if (blendfn.SourceConstantAlpha == 0xff)
{
- memcpy(dstbits, (char *)dib.dsBm.bmBits + y * dib.dsBm.bmWidthBytes + xSrc * 4,
- widthSrc * 4);
- dstbits += (top_down ? -1 : 1) * widthSrc;
+ for (; y >= y2; y--)
+ {
+ memcpy(dstbits, (char *)dib.dsBm.bmBits + y * dib.dsBm.bmWidthBytes + xSrc * 4,
+ widthSrc * 4);
+ dstbits += (top_down ? -1 : 1) * widthSrc;
+ }
+ }
+ else
+ {
+ /* SourceConstantAlpha combined with source alpha */
+ for (; y >= y2; y--)
+ {
+ int x;
+ DWORD *srcbits = (DWORD *)((char *)dib.dsBm.bmBits + y * dib.dsBm.bmWidthBytes) + xSrc;
+ for (x = 0; x < widthSrc; x++)
+ {
+ DWORD argb = *srcbits++;
+ BYTE *s = (BYTE *) &argb;
+ s[0] = (s[0] * blendfn.SourceConstantAlpha) / 255;
+ s[1] = (s[1] * blendfn.SourceConstantAlpha) / 255;
+ s[2] = (s[2] * blendfn.SourceConstantAlpha) / 255;
+ s[3] = (s[3] * blendfn.SourceConstantAlpha) / 255;
+ *dstbits++ = argb;
+ }
+ if (top_down) /* we traversed the row forward so we should go back by two rows */
+ dstbits -= 2 * widthSrc;
+ }
}
}
else
More information about the wine-cvs
mailing list