Vincent Povirk : gdiplus: Implement EMR_EXTSELECTCLIPRGN playback.
Alexandre Julliard
julliard at winehq.org
Tue Oct 11 15:21:11 CDT 2016
Module: wine
Branch: master
Commit: 069f20d1b30f745f284d3776d63974577422b8d6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=069f20d1b30f745f284d3776d63974577422b8d6
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Tue Oct 11 11:06:56 2016 -0500
gdiplus: Implement EMR_EXTSELECTCLIPRGN playback.
Signed-off-by: Vincent Povirk <vincent at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/gdiplus/metafile.c | 45 ++++++++++++++++++++++++++++++++++++---------
1 file changed, 36 insertions(+), 9 deletions(-)
diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index 32cd04e..69d8a16 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -1040,21 +1040,27 @@ GpStatus WINGDIPAPI GdipGetHemfFromMetafile(GpMetafile *metafile, HENHMETAFILE *
return Ok;
}
-static GpStatus METAFILE_PlaybackUpdateGdiTransform(GpMetafile *metafile)
+static void METAFILE_GetFinalGdiTransform(const GpMetafile *metafile, XFORM *result)
{
- XFORM combined, final;
const GpRectF *rect;
const GpPointF *pt;
/* This transforms metafile device space to output points. */
rect = &metafile->src_rect;
pt = metafile->playback_points;
- final.eM11 = (pt[1].X - pt[0].X) / rect->Width;
- final.eM21 = (pt[2].X - pt[0].X) / rect->Height;
- final.eDx = pt[0].X - final.eM11 * rect->X - final.eM21 * rect->Y;
- final.eM12 = (pt[1].Y - pt[0].Y) / rect->Width;
- final.eM22 = (pt[2].Y - pt[0].Y) / rect->Height;
- final.eDy = pt[0].Y - final.eM12 * rect->X - final.eM22 * rect->Y;
+ result->eM11 = (pt[1].X - pt[0].X) / rect->Width;
+ result->eM21 = (pt[2].X - pt[0].X) / rect->Height;
+ result->eDx = pt[0].X - result->eM11 * rect->X - result->eM21 * rect->Y;
+ result->eM12 = (pt[1].Y - pt[0].Y) / rect->Width;
+ result->eM22 = (pt[2].Y - pt[0].Y) / rect->Height;
+ result->eDy = pt[0].Y - result->eM12 * rect->X - result->eM22 * rect->Y;
+}
+
+static GpStatus METAFILE_PlaybackUpdateGdiTransform(GpMetafile *metafile)
+{
+ XFORM combined, final;
+
+ METAFILE_GetFinalGdiTransform(metafile, &final);
CombineTransform(&combined, &metafile->gdiworldtransform, &final);
@@ -1154,7 +1160,6 @@ GpStatus WINGDIPAPI GdipPlayMetafileRecord(GDIPCONST GpMetafile *metafile,
case EMR_SETWINDOWEXTEX:
case EMR_SETVIEWPORTORGEX:
case EMR_SETVIEWPORTEXTEX:
- case EMR_EXTSELECTCLIPRGN:
case EMR_SCALEVIEWPORTEXTEX:
case EMR_SCALEWINDOWEXTEX:
case EMR_MODIFYWORLDTRANSFORM:
@@ -1167,6 +1172,28 @@ GpStatus WINGDIPAPI GdipPlayMetafileRecord(GDIPCONST GpMetafile *metafile,
METAFILE_PlaybackUpdateGdiTransform(real_metafile);
break;
}
+ case EMR_EXTSELECTCLIPRGN:
+ {
+ DWORD rgndatasize = *(DWORD*)data;
+ DWORD mode = *(DWORD*)(data + 4);
+ const RGNDATA *rgndata = (const RGNDATA*)(data + 8);
+ HRGN hrgn = NULL;
+
+ if (dataSize > 8)
+ {
+ XFORM final;
+
+ METAFILE_GetFinalGdiTransform(metafile, &final);
+
+ hrgn = ExtCreateRegion(&final, rgndatasize, rgndata);
+ }
+
+ ExtSelectClipRgn(metafile->playback_dc, hrgn, mode);
+
+ DeleteObject(hrgn);
+
+ return Ok;
+ }
default:
break;
}
More information about the wine-cvs
mailing list