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