Vincent Povirk : gdiplus: Implement SetPageTransform playback.
Alexandre Julliard
julliard at winehq.org
Fri Jan 17 11:55:32 CST 2014
Module: wine
Branch: master
Commit: 7c12d889d4000fd2b90fc9504a3d71e20b1a845b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7c12d889d4000fd2b90fc9504a3d71e20b1a845b
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Thu Jan 16 16:15:50 2014 -0600
gdiplus: Implement SetPageTransform playback.
---
dlls/gdiplus/metafile.c | 26 +++++++++++++++++++++++---
1 file changed, 23 insertions(+), 3 deletions(-)
diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index 1218800..af7ec27 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -528,9 +528,15 @@ static GpStatus METAFILE_PlaybackUpdateWorldTransform(GpMetafile *metafile)
if (stat == Ok)
{
- /* FIXME: Prepend page transform. */
+ REAL scale = units_to_pixels(1.0, metafile->page_unit, 96.0);
- stat = GdipMultiplyMatrix(real_transform, metafile->world_transform, MatrixOrderPrepend);
+ if (metafile->page_unit != UnitDisplay)
+ scale *= metafile->page_scale;
+
+ stat = GdipScaleMatrix(real_transform, scale, scale, MatrixOrderPrepend);
+
+ if (stat == Ok)
+ stat = GdipMultiplyMatrix(real_transform, metafile->world_transform, MatrixOrderPrepend);
if (stat == Ok)
stat = GdipSetWorldTransform(metafile->playback_graphics, real_transform);
@@ -545,6 +551,7 @@ GpStatus WINGDIPAPI GdipPlayMetafileRecord(GDIPCONST GpMetafile *metafile,
EmfPlusRecordType recordType, UINT flags, UINT dataSize, GDIPCONST BYTE *data)
{
GpStatus stat;
+ GpMetafile *real_metafile = (GpMetafile*)metafile;
TRACE("(%p,%x,%x,%d,%p)\n", metafile, recordType, flags, dataSize, data);
@@ -655,6 +662,19 @@ GpStatus WINGDIPAPI GdipPlayMetafileRecord(GDIPCONST GpMetafile *metafile,
return stat;
}
+ case EmfPlusRecordTypeSetPageTransform:
+ {
+ EmfPlusSetPageTransform *record = (EmfPlusSetPageTransform*)header;
+ GpUnit unit = (GpUnit)flags;
+
+ if (dataSize + sizeof(EmfPlusRecordHeader) < sizeof(EmfPlusSetPageTransform))
+ return InvalidParameter;
+
+ real_metafile->page_unit = unit;
+ real_metafile->page_scale = record->PageScale;
+
+ return METAFILE_PlaybackUpdateWorldTransform(real_metafile);
+ }
default:
FIXME("Not implemented for record type %x\n", recordType);
return NotImplemented;
@@ -774,7 +794,7 @@ GpStatus WINGDIPAPI GdipEnumerateMetafileSrcRectDestPoints(GpGraphics *graphics,
if (stat == Ok)
{
- real_metafile->page_unit = UnitPixel; /* FIXME: Use frame unit here? */
+ real_metafile->page_unit = UnitDisplay;
real_metafile->page_scale = 1.0;
stat = METAFILE_PlaybackUpdateWorldTransform(real_metafile);
}
More information about the wine-cvs
mailing list