wine/ include/wingdi.h dlls/gdi/enhmetafile.c

Alexandre Julliard julliard at wine.codeweavers.com
Mon Oct 31 15:04:18 CST 2005


ChangeSet ID:	21004
CVSROOT:	/opt/cvs-commit
Module name:	wine
Changes by:	julliard at winehq.org	2005/10/31 15:04:18

Modified files:
	include        : wingdi.h 
	dlls/gdi       : enhmetafile.c 

Log message:
	Huw Davies <huw at codeweavers.com>
	Implement playback of EMR_ALPHABLEND.

Patch: http://cvs.winehq.org/patch.py?id=21004

Old revision  New revision  Changes     Path
 1.127         1.128         +21 -0      wine/include/wingdi.h
 1.15          1.16          +41 -1      wine/dlls/gdi/enhmetafile.c

Index: wine/include/wingdi.h
diff -u -p wine/include/wingdi.h:1.127 wine/include/wingdi.h:1.128
--- wine/include/wingdi.h	31 Oct 2005 21: 4:18 -0000
+++ /dev/null	31 Oct 2005 21: 4:18 -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: wine/dlls/gdi/enhmetafile.c
diff -u -p wine/dlls/gdi/enhmetafile.c:1.15 wine/dlls/gdi/enhmetafile.c:1.16
--- wine/dlls/gdi/enhmetafile.c	31 Oct 2005 21: 4:18 -0000
+++ /dev/null	31 Oct 2005 21: 4:18 -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-cvs mailing list