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