Piotr Caban : gdiplus: Add helper for saving path objects in metafile.

Alexandre Julliard julliard at winehq.org
Thu Jul 13 14:41:34 CDT 2017


Module: wine
Branch: master
Commit: e502a8dd071d69065e2c23eeef3d7c847ce81e9e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e502a8dd071d69065e2c23eeef3d7c847ce81e9e

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Thu Jul 13 11:53:48 2017 +0200

gdiplus: Add helper for saving path objects in metafile.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Vincent Povirk <vincent at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdiplus/metafile.c       | 63 ++++++++++++++++++++++++++++++++++++++++++-
 dlls/gdiplus/tests/metafile.c |  2 +-
 2 files changed, 63 insertions(+), 2 deletions(-)

diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index 2c3be42..ee1efa1 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -157,6 +157,17 @@ typedef struct container
     GpRegion *clip;
 } container;
 
+typedef struct EmfPlusPath
+{
+    DWORD Version;
+    DWORD PathPointCount;
+    DWORD PathPointFlags;
+    /* PathPoints[] */
+    /* PathPointTypes[] */
+    /* AlignmentPadding */
+    BYTE data[1];
+} EmfPlusPath;
+
 typedef enum
 {
     BitmapDataTypePixel,
@@ -235,6 +246,7 @@ typedef struct EmfPlusObject
     EmfPlusRecordHeader Header;
     union
     {
+        EmfPlusPath path;
         EmfPlusImage image;
         EmfPlusImageAttributes image_attributes;
     } ObjectData;
@@ -2570,8 +2582,57 @@ GpStatus METAFILE_AddSimpleProperty(GpMetafile *metafile, SHORT prop, SHORT val)
     return Ok;
 }
 
+static GpStatus METAFILE_AddPathObject(GpMetafile *metafile, GpPath *path, DWORD *id)
+{
+    EmfPlusObject *object_record;
+    EmfPlusPointF *points;
+    BYTE *types;
+    GpStatus stat;
+    DWORD i, size;
+
+    if (metafile->metafile_type != MetafileTypeEmfPlusOnly && metafile->metafile_type != MetafileTypeEmfPlusDual)
+        return Ok;
+
+    /* TODO: Add support for more point formats */
+    size = sizeof(EmfPlusPointF)*path->pathdata.Count + path->pathdata.Count;
+    size = (size + 3) & ~3;
+
+    stat = METAFILE_AllocateRecord(metafile,
+            FIELD_OFFSET(EmfPlusObject, ObjectData.path.data[size]),
+            (void**)&object_record);
+    if (stat != Ok) return stat;
+
+    *id = METAFILE_AddObjectId(metafile);
+    object_record->Header.Type = EmfPlusRecordTypeObject;
+    object_record->Header.Flags = *id | ObjectTypePath << 8;
+
+    object_record->ObjectData.path.Version = 0xDBC01002;
+    object_record->ObjectData.path.PathPointCount = path->pathdata.Count;
+    object_record->ObjectData.path.PathPointFlags = 0;
+
+    points = (EmfPlusPointF*)object_record->ObjectData.path.data;
+    for (i=0; i<path->pathdata.Count; i++)
+    {
+        points[i].X = path->pathdata.Points[i].X;
+        points[i].Y = path->pathdata.Points[i].Y;
+    }
+
+    types = (BYTE*)(points + path->pathdata.Count);
+    for (i=0; i<path->pathdata.Count; i++)
+        types[i] = path->pathdata.Types[i];
+    return Ok;
+}
+
 GpStatus METAFILE_DrawPath(GpMetafile *metafile, GpPen *pen, GpPath *path)
 {
-    FIXME("stub\n");
+    DWORD path_id;
+    GpStatus stat;
+
+    FIXME("stub!\n");
+
+    stat = METAFILE_AddPathObject(metafile, path, &path_id);
+    if (stat != Ok) return stat;
+
+    METAFILE_WriteRecords(metafile);
     return NotImplemented;
 }
diff --git a/dlls/gdiplus/tests/metafile.c b/dlls/gdiplus/tests/metafile.c
index 805db91..1d3a35d 100644
--- a/dlls/gdiplus/tests/metafile.c
+++ b/dlls/gdiplus/tests/metafile.c
@@ -2486,7 +2486,7 @@ static void test_properties(void)
 static const emfplus_record draw_path_records[] = {
     {0, EMR_HEADER},
     {0, EmfPlusRecordTypeHeader},
-    {1, EmfPlusRecordTypeObject},
+    {0, EmfPlusRecordTypeObject},
     {1, EmfPlusRecordTypeObject},
     {1, EmfPlusRecordTypeDrawPath},
     {1, EMR_SAVEDC},




More information about the wine-cvs mailing list