Module: wine Branch: master Commit: 8191ed86ca592adbce8e52963a52cfccddfcd8bd URL: https://source.winehq.org/git/wine.git/?a=commit;h=8191ed86ca592adbce8e52963...
Author: Shawn M. Chapla schapla@codeweavers.com Date: Mon Jul 20 22:45:18 2020 -0400
gdiplus: Add FillRegion record deserialization.
Signed-off-by: Shawn M. Chapla schapla@codeweavers.com Signed-off-by: Esme Povirk esme@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/gdiplus/metafile.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+)
diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c index d6bcbb5c12..ed4e8a8be4 100644 --- a/dlls/gdiplus/metafile.c +++ b/dlls/gdiplus/metafile.c @@ -563,6 +563,16 @@ typedef struct EmfPlusDrawDriverString BYTE VariableData[1]; } EmfPlusDrawDriverString;
+typedef struct EmfPlusFillRegion +{ + EmfPlusRecordHeader Header; + union + { + DWORD BrushId; + EmfPlusARGB Color; + } data; +} EmfPlusFillRegion; + static void metafile_free_object_table_entry(GpMetafile *metafile, BYTE id) { struct emfplus_object *object = &metafile->objtable[id]; @@ -3438,6 +3448,42 @@ GpStatus WINGDIPAPI GdipPlayMetafileRecord(GDIPCONST GpMetafile *metafile,
return stat; } + case EmfPlusRecordTypeFillRegion: + { + EmfPlusFillRegion * const fill = (EmfPlusFillRegion*)header; + GpSolidFill *solidfill = NULL; + GpBrush *brush; + BYTE region = flags & 0xff; + + if (dataSize != sizeof(EmfPlusFillRegion) - sizeof(EmfPlusRecordHeader)) + return InvalidParameter; + + if (region >= EmfPlusObjectTableSize || + real_metafile->objtable[region].type != ObjectTypeRegion) + return InvalidParameter; + + if (flags & 0x8000) + { + stat = GdipCreateSolidFill(fill->data.Color, &solidfill); + if (stat != Ok) + return stat; + brush = (GpBrush*)solidfill; + } + else + { + if (fill->data.BrushId >= EmfPlusObjectTableSize || + real_metafile->objtable[fill->data.BrushId].type != ObjectTypeBrush) + return InvalidParameter; + + brush = real_metafile->objtable[fill->data.BrushId].u.brush; + } + + stat = GdipFillRegion(real_metafile->playback_graphics, brush, + real_metafile->objtable[region].u.region); + GdipDeleteBrush((GpBrush*)solidfill); + + return stat; + } default: FIXME("Not implemented for record type %x\n", recordType); return NotImplemented;