From ab081aa84535e013b89a6c4c3a8a9fcee636840d Mon Sep 17 00:00:00 2001 From: Peter Urbanec Date: Wed, 11 Nov 2009 02:58:41 +1100 Subject: [PATCH] winex11: Implement AlphaBlend mode for the case where SourceConstantAlpha is combined with source alpha. --- dlls/winex11.drv/xrender.c | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index 005296b8a9f..2eb1d1e65a3 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 -- 2.11.4.GIT