Implement playback of EMR_ALPHABLEND.
This commit is contained in:
parent
8f0c45b5c8
commit
063824dd22
|
@ -646,6 +646,7 @@ static BOOL emr_produces_output(int type)
|
||||||
case EMR_POLYTEXTOUTA:
|
case EMR_POLYTEXTOUTA:
|
||||||
case EMR_POLYTEXTOUTW:
|
case EMR_POLYTEXTOUTW:
|
||||||
case EMR_SMALLTEXTOUT:
|
case EMR_SMALLTEXTOUT:
|
||||||
|
case EMR_ALPHABLEND:
|
||||||
case EMR_TRANSPARENTBLT:
|
case EMR_TRANSPARENTBLT:
|
||||||
return TRUE;
|
return TRUE;
|
||||||
default:
|
default:
|
||||||
|
@ -1795,6 +1796,46 @@ BOOL WINAPI PlayEnhMetaFileRecord(
|
||||||
break;
|
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:
|
case EMR_MASKBLT:
|
||||||
{
|
{
|
||||||
PEMRMASKBLT pMaskBlt= (PEMRMASKBLT)mr;
|
PEMRMASKBLT pMaskBlt= (PEMRMASKBLT)mr;
|
||||||
|
@ -2061,7 +2102,6 @@ BOOL WINAPI PlayEnhMetaFileRecord(
|
||||||
case EMR_COLORCORRECTPALETTE:
|
case EMR_COLORCORRECTPALETTE:
|
||||||
case EMR_SETICMPROFILEA:
|
case EMR_SETICMPROFILEA:
|
||||||
case EMR_SETICMPROFILEW:
|
case EMR_SETICMPROFILEW:
|
||||||
case EMR_ALPHABLEND:
|
|
||||||
case EMR_TRANSPARENTBLT:
|
case EMR_TRANSPARENTBLT:
|
||||||
case EMR_GRADIENTFILL:
|
case EMR_GRADIENTFILL:
|
||||||
case EMR_SETLINKEDUFI:
|
case EMR_SETLINKEDUFI:
|
||||||
|
|
|
@ -2581,6 +2581,27 @@ typedef struct {
|
||||||
LONG cySrc;
|
LONG cySrc;
|
||||||
} EMRSTRETCHBLT, *PEMRSTRETCHBLT;
|
} 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 {
|
typedef struct {
|
||||||
EMR emr;
|
EMR emr;
|
||||||
RECTL rclBounds;
|
RECTL rclBounds;
|
||||||
|
|
Loading…
Reference in New Issue