[PATCH 3/3] gdiplus: Add FillRegion serialization.

Shawn M. Chapla schapla at codeweavers.com
Mon Jul 20 21:45:19 CDT 2020


Signed-off-by: Shawn M. Chapla <schapla at codeweavers.com>
---
 dlls/gdiplus/gdiplus_private.h |  2 ++
 dlls/gdiplus/graphics.c        | 13 ++++++---
 dlls/gdiplus/metafile.c        | 48 ++++++++++++++++++++++++++++++++++
 dlls/gdiplus/tests/metafile.c  | 16 ++++++------
 4 files changed, 67 insertions(+), 12 deletions(-)

diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 1b2de4e8f4..aac5509afa 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -107,6 +107,8 @@ extern GpStatus METAFILE_FillPath(GpMetafile *metafile, GpBrush *brush, GpPath *
 extern GpStatus METAFILE_DrawDriverString(GpMetafile *metafile, GDIPCONST UINT16 *text, INT length,
     GDIPCONST GpFont *font, GDIPCONST GpStringFormat *format, GDIPCONST GpBrush *brush,
     GDIPCONST PointF *positions, INT flags, GDIPCONST GpMatrix *matrix) DECLSPEC_HIDDEN;
+extern GpStatus METAFILE_FillRegion(GpMetafile* metafile, GpBrush* brush,
+    GpRegion* region) DECLSPEC_HIDDEN;
 extern void METAFILE_Free(GpMetafile *metafile) DECLSPEC_HIDDEN;
 
 extern void calc_curve_bezier(const GpPointF *pts, REAL tension, REAL *x1,
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 1307bdc1ef..f0da41c6cb 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -4700,11 +4700,16 @@ GpStatus WINGDIPAPI GdipFillRegion(GpGraphics* graphics, GpBrush* brush,
     if(graphics->busy)
         return ObjectBusy;
 
-    if (!graphics->image && !graphics->alpha_hdc)
-        stat = GDI32_GdipFillRegion(graphics, brush, region);
+    if (graphics->image && graphics->image->type == ImageTypeMetafile)
+        stat = METAFILE_FillRegion((GpMetafile*)graphics->image, brush, region);
+    else
+    {
+        if (!graphics->image && !graphics->alpha_hdc)
+            stat = GDI32_GdipFillRegion(graphics, brush, region);
 
-    if (stat == NotImplemented)
-        stat = SOFTWARE_GdipFillRegion(graphics, brush, region);
+        if (stat == NotImplemented)
+            stat = SOFTWARE_GdipFillRegion(graphics, brush, region);
+    }
 
     if (stat == NotImplemented)
     {
diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index ed4e8a8be4..1d7c0fe306 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -4854,3 +4854,51 @@ GpStatus METAFILE_DrawDriverString(GpMetafile *metafile, GDIPCONST UINT16 *text,
 
     return Ok;
 }
+
+GpStatus METAFILE_FillRegion(GpMetafile* metafile, GpBrush* brush, GpRegion* region)
+{
+    GpStatus stat;
+    DWORD brush_id;
+    DWORD region_id;
+    EmfPlusFillRegion *fill_region_record;
+    BOOL inline_color;
+
+    if (metafile->metafile_type != MetafileTypeEmfPlusOnly &&
+            metafile->metafile_type != MetafileTypeEmfPlusDual)
+    {
+        FIXME("metafile type not supported: %i\n", metafile->metafile_type);
+        return NotImplemented;
+    }
+
+    inline_color = (brush->bt == BrushTypeSolidColor);
+    if (!inline_color)
+    {
+        stat = METAFILE_AddBrushObject(metafile, brush, &brush_id);
+        if (stat != Ok)
+            return stat;
+    }
+
+    stat = METAFILE_AddRegionObject(metafile, region, &region_id);
+    if (stat != Ok)
+        return stat;
+
+    stat = METAFILE_AllocateRecord(metafile, sizeof(EmfPlusFillRegion),
+        (void**)&fill_region_record);
+    if (stat != Ok)
+        return stat;
+
+    fill_region_record->Header.Type = EmfPlusRecordTypeFillRegion;
+    fill_region_record->Header.Flags = region_id;
+
+    if (inline_color)
+    {
+        fill_region_record->Header.Flags |= 0x8000;
+        fill_region_record->data.Color = ((GpSolidFill*)brush)->color;
+    }
+    else
+        fill_region_record->data.BrushId = brush_id;
+
+    METAFILE_WriteRecords(metafile);
+
+    return Ok;
+}
diff --git a/dlls/gdiplus/tests/metafile.c b/dlls/gdiplus/tests/metafile.c
index f0b31b4f9c..ddb58504c9 100644
--- a/dlls/gdiplus/tests/metafile.c
+++ b/dlls/gdiplus/tests/metafile.c
@@ -3177,11 +3177,11 @@ static void test_unknownfontdecode(void)
 static const emfplus_record fillregion_records[] = {
     { EMR_HEADER },
     { EmfPlusRecordTypeHeader },
-    { EmfPlusRecordTypeObject, ObjectTypeRegion << 8, 1 },
-    { EmfPlusRecordTypeFillRegion, 0x8000, 1 },
-    { EmfPlusRecordTypeObject, (ObjectTypeBrush << 8) | 1, 1 },
-    { EmfPlusRecordTypeObject, (ObjectTypeRegion << 8) | 2, 1 },
-    { EmfPlusRecordTypeFillRegion, 2, 1 },
+    { EmfPlusRecordTypeObject, ObjectTypeRegion << 8 },
+    { EmfPlusRecordTypeFillRegion, 0x8000 },
+    { EmfPlusRecordTypeObject, (ObjectTypeBrush << 8) | 1 },
+    { EmfPlusRecordTypeObject, (ObjectTypeRegion << 8) | 2 },
+    { EmfPlusRecordTypeFillRegion, 2 },
     { EmfPlusRecordTypeEndOfFile },
     { EMR_EOF },
     { 0 }
@@ -3251,15 +3251,15 @@ static void test_fillregion(void)
 
     stat = GdipBitmapGetPixel(bitmap, 25, 25, &color);
     expect(Ok, stat);
-    todo_wine expect(0xffaabbcc, color);
+    expect(0xffaabbcc, color);
 
     stat = GdipBitmapGetPixel(bitmap, 56, 56, &color);
     expect(Ok, stat);
-    todo_wine expect(0xffff0000, color);
+    expect(0xffff0000, color);
 
     stat = GdipBitmapGetPixel(bitmap, 57, 57, &color);
     expect(Ok, stat);
-    todo_wine expect(0xff0000ff, color);
+    expect(0xff0000ff, color);
 
     GdipDeleteRegion(solidregion);
     GdipDeleteRegion(hatchregion);
-- 
2.27.0




More information about the wine-devel mailing list