gdi: Implement playback of EMR_ALPHABLEND

Huw D M Davies h.davies1 at physics.ox.ac.uk
Mon Oct 31 10:51:12 CST 2005


        Huw Davies <huw at codeweavers.com>
        Implement playback of EMR_ALPHABLEND
-- 
Huw Davies
huw at codeweavers.com
Index: include/wingdi.h
===================================================================
RCS file: /home/wine/wine/include/wingdi.h,v
retrieving revision 1.127
diff -u -p -r1.127 wingdi.h
--- include/wingdi.h	26 Oct 2005 10:10:23 -0000	1.127
+++ include/wingdi.h	31 Oct 2005 16:48:52 -0000
@@ -2582,6 +2582,27 @@ typedef struct {
 } EMRSTRETCHBLT, *PEMRSTRETCHBLT;
 
 typedef struct {
+    EMR      emr;
+    RECTL    rclBounds;
+    LONG     xDest;
+    LONG     yDest;
+    LONG     cxDest;
+    LONG     cyDest;
+    DWORD    dwRop;
+    LONG     xSrc;
+    LONG     ySrc;
+    XFORM    xformSrc;
+    COLORREF crBkColorSrc;
+    DWORD    iUsageSrc;
+    DWORD    offBmiSrc;
+    DWORD    cbBmiSrc;
+    DWORD    offBitsSrc;
+    DWORD    cbBitsSrc;
+    LONG     cxSrc;
+    LONG     cySrc;
+} EMRALPHABLEND, *PEMRALPHABLEND;
+
+typedef struct {
     EMR   emr;
     RECTL rclBounds;
     LONG  xDest;
Index: dlls/gdi/enhmetafile.c
===================================================================
RCS file: /home/wine/wine/dlls/gdi/enhmetafile.c,v
retrieving revision 1.15
diff -u -p -r1.15 enhmetafile.c
--- dlls/gdi/enhmetafile.c	12 Oct 2005 21:06:20 -0000	1.15
+++ dlls/gdi/enhmetafile.c	31 Oct 2005 16:48:52 -0000
@@ -646,6 +646,7 @@ static BOOL emr_produces_output(int type
     case EMR_POLYTEXTOUTA:
     case EMR_POLYTEXTOUTW:
     case EMR_SMALLTEXTOUT:
+    case EMR_ALPHABLEND:
     case EMR_TRANSPARENTBLT:
         return TRUE;
     default:
@@ -1795,6 +1796,46 @@ BOOL WINAPI PlayEnhMetaFileRecord(
 	break;
     }
 
+    case EMR_ALPHABLEND:
+    {
+	PEMRALPHABLEND pAlphaBlend= (PEMRALPHABLEND)mr;
+
+        TRACE("EMR_ALPHABLEND: %ld, %ld %ldx%ld -> %ld, %ld %ldx%ld. blendfn %08lx offBitsSrc %ld\n",
+	       pAlphaBlend->xSrc, pAlphaBlend->ySrc, pAlphaBlend->cxSrc, pAlphaBlend->cySrc,
+	       pAlphaBlend->xDest, pAlphaBlend->yDest, pAlphaBlend->cxDest, pAlphaBlend->cyDest,
+	       pAlphaBlend->dwRop, pAlphaBlend->offBitsSrc);
+
+        if(pAlphaBlend->offBmiSrc == 0) {
+            FIXME("EMR_ALPHABLEND: offBmiSrc == 0\n");
+        } else {
+            HDC hdcSrc = CreateCompatibleDC(hdc);
+            HBITMAP hBmp = 0, hBmpOld = 0;
+            BITMAPINFO *pbi = (BITMAPINFO *)((BYTE *)mr + pAlphaBlend->offBmiSrc);
+            BLENDFUNCTION blendfn;
+            void *bits;
+
+            SetWorldTransform(hdcSrc, &pAlphaBlend->xformSrc);
+
+            hBmp = CreateDIBSection(hdc, pbi, pAlphaBlend->iUsageSrc, &bits, NULL, 0);
+            memcpy(bits, (BYTE*)mr + pAlphaBlend->offBitsSrc, pAlphaBlend->cbBitsSrc);
+            hBmpOld = SelectObject(hdcSrc, hBmp);
+
+            blendfn.BlendOp             = (pAlphaBlend->dwRop >> 24) & 0xff;
+            blendfn.BlendFlags          = (pAlphaBlend->dwRop >> 16) & 0xff;
+            blendfn.SourceConstantAlpha = (pAlphaBlend->dwRop >>  8) & 0xff;
+            blendfn.AlphaFormat         = (pAlphaBlend->dwRop) & 0xff;
+
+            GdiAlphaBlend(hdc, pAlphaBlend->xDest, pAlphaBlend->yDest, pAlphaBlend->cxDest, pAlphaBlend->cyDest,
+                       hdcSrc, pAlphaBlend->xSrc, pAlphaBlend->ySrc, pAlphaBlend->cxSrc, pAlphaBlend->cySrc,
+                       blendfn);
+
+            SelectObject(hdcSrc, hBmpOld);
+            DeleteObject(hBmp);
+            DeleteDC(hdcSrc);
+        }
+	break;
+    }
+
     case EMR_MASKBLT:
     {
 	PEMRMASKBLT pMaskBlt= (PEMRMASKBLT)mr;
@@ -2061,7 +2102,6 @@ BOOL WINAPI PlayEnhMetaFileRecord(
 	case EMR_COLORCORRECTPALETTE:
 	case EMR_SETICMPROFILEA:
 	case EMR_SETICMPROFILEW:
-	case EMR_ALPHABLEND:
 	case EMR_TRANSPARENTBLT:
 	case EMR_GRADIENTFILL:
 	case EMR_SETLINKEDUFI:



More information about the wine-patches mailing list