[PATCH 2/4] gdiplus/metafile: Support solid brushes in EmfPlusRecordTypeObject record playback

Nikolay Sivov nsivov at codeweavers.com
Thu Oct 12 05:44:30 CDT 2017


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/gdiplus/gdiplus_private.h |  1 +
 dlls/gdiplus/metafile.c        | 28 ++++++++++++++++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index d6ccb95b07..95445e879a 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -393,6 +393,7 @@ typedef enum EmfPlusObjectType
 struct emfplus_object {
     EmfPlusObjectType type;
     union {
+        GpBrush *brush;
         GpImageAttributes *image_attributes;
         void *object;
     } u;
diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index 78ea854c4c..5542bfea62 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -364,6 +364,9 @@ static void metafile_free_object_table_entry(GpMetafile *metafile, BYTE id)
     {
     case ObjectTypeInvalid:
         break;
+    case ObjectTypeBrush:
+        GdipDeleteBrush(object->u.brush);
+        break;
     case ObjectTypeImageAttributes:
         GdipDisposeImageAttributes(object->u.image_attributes);
         break;
@@ -1455,6 +1458,31 @@ static GpStatus METAFILE_PlaybackObject(GpMetafile *metafile, UINT flags, UINT d
 
     switch (type)
     {
+    case ObjectTypeBrush:
+    {
+        static const UINT header_size = FIELD_OFFSET(EmfPlusBrush, BrushData);
+        EmfPlusBrush *data = (EmfPlusBrush *)record_data;
+        GpBrush *brush = NULL;
+
+        if (data_size < header_size)
+            return InvalidParameter;
+
+        switch (data->Type)
+        {
+        case BrushTypeSolidColor:
+            if (data_size != header_size + sizeof(EmfPlusSolidBrushData))
+                return InvalidParameter;
+
+            status = GdipCreateSolidFill(*(ARGB *)&data->BrushData.solid.SolidColor, (GpSolidFill **)&brush);
+            if (status == Ok)
+                object = brush;
+            break;
+        default:
+            FIXME("brush type %u is not supported.\n", data->Type);
+            return NotImplemented;
+        }
+        break;
+    }
     case ObjectTypeImageAttributes:
     {
         EmfPlusImageAttributes *data = (EmfPlusImageAttributes *)record_data;
-- 
2.14.2




More information about the wine-patches mailing list