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