From: Piotr Caban piotr@codeweavers.com
--- include/wingdi.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
diff --git a/include/wingdi.h b/include/wingdi.h index 046009c0e98..6ae9409803c 100644 --- a/include/wingdi.h +++ b/include/wingdi.h @@ -2717,6 +2717,27 @@ typedef struct { LONG cySrc; } EMRALPHABLEND, *PEMRALPHABLEND;
+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; +} EMRTRANSPARENTBLT, *PEMRTRANSPARENTBLT; + typedef struct { EMR emr; RECTL rclBounds;
From: Piotr Caban piotr@codeweavers.com
--- dlls/gdi32/enhmetafile.c | 48 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-)
diff --git a/dlls/gdi32/enhmetafile.c b/dlls/gdi32/enhmetafile.c index bab0d5739cc..b6b51e3483a 100644 --- a/dlls/gdi32/enhmetafile.c +++ b/dlls/gdi32/enhmetafile.c @@ -2238,6 +2238,53 @@ BOOL WINAPI PlayEnhMetaFileRecord( break; }
+ case EMR_TRANSPARENTBLT: + { + const EMRTRANSPARENTBLT *pTransparentBlt = (const EMRTRANSPARENTBLT *)mr; + + TRACE("EMR_TRANSPARENTBLT: %ld, %ld %ldx%ld -> %ld, %ld %ldx%ld color %08lx offBitsSrc %ld\n", + pTransparentBlt->xSrc, pTransparentBlt->ySrc, pTransparentBlt->cxSrc, + pTransparentBlt->cySrc, pTransparentBlt->xDest, pTransparentBlt->yDest, + pTransparentBlt->cxDest, pTransparentBlt->cyDest, + pTransparentBlt->dwRop, pTransparentBlt->offBitsSrc); + + if(pTransparentBlt->offBmiSrc == 0) { + FIXME("EMR_TRANSPARENTBLT: offBmiSrc == 0\n"); + } else { + HDC hdcSrc = NtGdiCreateCompatibleDC( hdc ); + HBRUSH hBrush, hBrushOld; + HBITMAP hBmp = 0, hBmpOld = 0; + const BITMAPINFO *pbi = (const BITMAPINFO *)((const BYTE *)mr + pTransparentBlt->offBmiSrc); + + SetGraphicsMode(hdcSrc, GM_ADVANCED); + SetWorldTransform(hdcSrc, &pTransparentBlt->xformSrc); + + hBrush = CreateSolidBrush(pTransparentBlt->crBkColorSrc); + hBrushOld = SelectObject(hdcSrc, hBrush); + PatBlt(hdcSrc, pTransparentBlt->rclBounds.left, pTransparentBlt->rclBounds.top, + pTransparentBlt->rclBounds.right - pTransparentBlt->rclBounds.left, + pTransparentBlt->rclBounds.bottom - pTransparentBlt->rclBounds.top, PATCOPY); + SelectObject(hdcSrc, hBrushOld); + DeleteObject(hBrush); + + hBmp = CreateDIBitmap(hdc, (const BITMAPINFOHEADER *)pbi, CBM_INIT, + (const BYTE *)mr + pTransparentBlt->offBitsSrc, + pbi, pTransparentBlt->iUsageSrc); + hBmpOld = SelectObject(hdcSrc, hBmp); + + GdiTransparentBlt(hdc, pTransparentBlt->xDest, pTransparentBlt->yDest, + pTransparentBlt->cxDest, pTransparentBlt->cyDest, + hdcSrc, pTransparentBlt->xSrc, pTransparentBlt->ySrc, + pTransparentBlt->cxSrc, pTransparentBlt->cySrc, + pTransparentBlt->dwRop); + + SelectObject(hdcSrc, hBmpOld); + DeleteObject(hBmp); + DeleteDC(hdcSrc); + } + break; + } + case EMR_GRADIENTFILL: { EMRGRADIENTFILL *grad = (EMRGRADIENTFILL *)mr; @@ -2257,7 +2304,6 @@ BOOL WINAPI PlayEnhMetaFileRecord( case EMR_COLORCORRECTPALETTE: case EMR_SETICMPROFILEA: case EMR_SETICMPROFILEW: - case EMR_TRANSPARENTBLT: case EMR_SETLINKEDUFI: case EMR_COLORMATCHTOTARGETW: case EMR_CREATECOLORSPACEW:
This merge request was approved by Huw Davies.