Module: wine Branch: master Commit: f75b57ad81c4f352b68d2fc821383786d29f409c URL: http://source.winehq.org/git/wine.git/?a=commit;h=f75b57ad81c4f352b68d2fc821...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Fri Nov 3 09:49:13 2017 +0300
gdiplus/metafile: Implement playback for EmfPlusRecordTypeFillEllipse.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Vincent Povirk vincent@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/gdiplus/metafile.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+)
diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c index 614fc43..051f33e 100644 --- a/dlls/gdiplus/metafile.c +++ b/dlls/gdiplus/metafile.c @@ -465,6 +465,17 @@ typedef struct EmfPlusFillPath } data; } EmfPlusFillPath;
+typedef struct EmfPlusFillEllipse +{ + EmfPlusRecordHeader Header; + DWORD BrushId; + union + { + EmfPlusRect rect; + EmfPlusRectF rectF; + } RectData; +} EmfPlusFillEllipse; + typedef struct EmfPlusFont { DWORD Version; @@ -2867,6 +2878,45 @@ GpStatus WINGDIPAPI GdipPlayMetafileRecord(GDIPCONST GpMetafile *metafile, GdipDeleteBrush((GpBrush *)solidfill); return stat; } + case EmfPlusRecordTypeFillEllipse: + { + EmfPlusFillEllipse *fill = (EmfPlusFillEllipse *)header; + GpSolidFill *solidfill = NULL; + GpBrush *brush; + + if (dataSize <= FIELD_OFFSET(EmfPlusFillEllipse, RectData) - sizeof(EmfPlusRecordHeader)) + return InvalidParameter; + dataSize -= FIELD_OFFSET(EmfPlusFillEllipse, RectData) - sizeof(EmfPlusRecordHeader); + + if (dataSize != (flags & 0x4000 ? sizeof(EmfPlusRect) : sizeof(EmfPlusRectF))) + return InvalidParameter; + + if (flags & 0x8000) + { + stat = GdipCreateSolidFill(fill->BrushId, (GpSolidFill **)&solidfill); + if (stat != Ok) + return stat; + brush = (GpBrush *)solidfill; + } + else + { + if (fill->BrushId >= EmfPlusObjectTableSize || + real_metafile->objtable[fill->BrushId].type != ObjectTypeBrush) + return InvalidParameter; + + brush = real_metafile->objtable[fill->BrushId].u.brush; + } + + if (flags & 0x4000) + stat = GdipFillEllipseI(real_metafile->playback_graphics, brush, fill->RectData.rect.X, + fill->RectData.rect.Y, fill->RectData.rect.Width, fill->RectData.rect.Height); + else + stat = GdipFillEllipse(real_metafile->playback_graphics, brush, fill->RectData.rectF.X, + fill->RectData.rectF.Y, fill->RectData.rectF.Width, fill->RectData.rectF.Height); + + GdipDeleteBrush((GpBrush *)solidfill); + return stat; + } case EmfPlusRecordTypeDrawPath: { EmfPlusDrawPath *draw = (EmfPlusDrawPath *)header;