diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h index 5e8f78a6185..e4e6b92a112 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -59,6 +59,7 @@ extern GpStatus METAFILE_GetDC(GpMetafile* metafile, HDC *hdc) DECLSPEC_HIDDEN; extern GpStatus METAFILE_ReleaseDC(GpMetafile* metafile, HDC hdc) DECLSPEC_HIDDEN; extern GpStatus METAFILE_FillRectangles(GpMetafile* metafile, GpBrush* brush, GDIPCONST GpRectF* rects, INT count) DECLSPEC_HIDDEN; +extern GpStatus METAFILE_SetPageTransform(GpMetafile* metafile, GpUnit unit, REAL scale) DECLSPEC_HIDDEN; extern GpStatus METAFILE_GraphicsDeleted(GpMetafile* metafile) DECLSPEC_HIDDEN; extern MetafileType METAFILE_GetEmfType(HENHMETAFILE hemf) DECLSPEC_HIDDEN; diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 7f892f60a2c..21ee84df162 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -5274,6 +5274,8 @@ GpStatus WINGDIPAPI GdipSetInterpolationMode(GpGraphics *graphics, GpStatus WINGDIPAPI GdipSetPageScale(GpGraphics *graphics, REAL scale) { + GpStatus stat; + TRACE("(%p, %.2f)\n", graphics, scale); if(!graphics || (scale <= 0.0)) @@ -5282,6 +5284,13 @@ GpStatus WINGDIPAPI GdipSetPageScale(GpGraphics *graphics, REAL scale) if(graphics->busy) return ObjectBusy; + if (graphics->image && graphics->image->type == ImageTypeMetafile) + { + stat = METAFILE_SetPageTransform((GpMetafile*)graphics->image, graphics->unit, scale); + if (stat != Ok) + return stat; + } + graphics->scale = scale; return Ok; @@ -5289,6 +5298,8 @@ GpStatus WINGDIPAPI GdipSetPageScale(GpGraphics *graphics, REAL scale) GpStatus WINGDIPAPI GdipSetPageUnit(GpGraphics *graphics, GpUnit unit) { + GpStatus stat; + TRACE("(%p, %d)\n", graphics, unit); if(!graphics) @@ -5300,6 +5311,13 @@ GpStatus WINGDIPAPI GdipSetPageUnit(GpGraphics *graphics, GpUnit unit) if(unit == UnitWorld) return InvalidParameter; + if (graphics->image && graphics->image->type == ImageTypeMetafile) + { + stat = METAFILE_SetPageTransform((GpMetafile*)graphics->image, unit, graphics->scale); + if (stat != Ok) + return stat; + } + graphics->unit = unit; return Ok; diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c index 4df7f6f1033..1218800b3d1 100644 --- a/dlls/gdiplus/metafile.c +++ b/dlls/gdiplus/metafile.c @@ -64,6 +64,12 @@ typedef struct EmfPlusFillRects DWORD Count; } EmfPlusFillRects; +typedef struct EmfPlusSetPageTransform +{ + EmfPlusRecordHeader Header; + REAL PageScale; +} EmfPlusSetPageTransform; + typedef struct EmfPlusRect { SHORT X; @@ -416,6 +422,29 @@ GpStatus METAFILE_FillRectangles(GpMetafile* metafile, GpBrush* brush, return Ok; } +GpStatus METAFILE_SetPageTransform(GpMetafile* metafile, GpUnit unit, REAL scale) +{ + if (metafile->metafile_type == MetafileTypeEmfPlusOnly || metafile->metafile_type == MetafileTypeEmfPlusDual) + { + EmfPlusSetPageTransform *record; + GpStatus stat; + + stat = METAFILE_AllocateRecord(metafile, + sizeof(EmfPlusSetPageTransform), + (void**)&record); + if (stat != Ok) + return stat; + + record->Header.Type = EmfPlusRecordTypeSetPageTransform; + record->Header.Flags = unit; + record->PageScale = scale; + + METAFILE_WriteRecords(metafile); + } + + return Ok; +} + GpStatus METAFILE_ReleaseDC(GpMetafile* metafile, HDC hdc) { if (hdc != metafile->record_dc)