ChangeSet ID: 21004 CVSROOT: /opt/cvs-commit Module name: wine Changes by: julliard@winehq.org 2005/10/31 15:04:18
Modified files: include : wingdi.h dlls/gdi : enhmetafile.c
Log message: Huw Davies huw@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: