Shawn M. Chapla : gdiplus: Add FillRegion record deserialization.

Alexandre Julliard julliard at winehq.org
Wed Jul 22 16:34:29 CDT 2020


Module: wine
Branch: master
Commit: 8191ed86ca592adbce8e52963a52cfccddfcd8bd
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=8191ed86ca592adbce8e52963a52cfccddfcd8bd

Author: Shawn M. Chapla <schapla at codeweavers.com>
Date:   Mon Jul 20 22:45:18 2020 -0400

gdiplus: Add FillRegion record deserialization.

Signed-off-by: Shawn M. Chapla <schapla at codeweavers.com>
Signed-off-by: Esme Povirk <esme at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;




More information about the wine-cvs mailing list