Nikolay Sivov : gdiplus/metafile: Added support for EmfPlusFont objects.

Alexandre Julliard julliard at winehq.org
Wed Oct 18 15:16:28 CDT 2017


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Oct 17 15:49:12 2017 +0300

gdiplus/metafile: Added support for EmfPlusFont objects.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Vincent Povirk <vincent at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdiplus/gdiplus_private.h |  1 +
 dlls/gdiplus/metafile.c        | 42 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index dc2f0892..d4c1fd9 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -396,6 +396,7 @@ struct emfplus_object {
         GpBrush *brush;
         GpPath *path;
         GpImage *image;
+        GpFont *font;
         GpImageAttributes *image_attributes;
         void *object;
     } u;
diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index 9312a04..b67f565 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -377,6 +377,17 @@ typedef struct EmfPlusFillPath
     } data;
 } EmfPlusFillPath;
 
+typedef struct EmfPlusFont
+{
+    DWORD Version;
+    float EmSize;
+    DWORD SizeUnit;
+    DWORD FontStyleFlags;
+    DWORD Reserved;
+    DWORD Length;
+    WCHAR FamilyName[1];
+} EmfPlusFont;
+
 static void metafile_free_object_table_entry(GpMetafile *metafile, BYTE id)
 {
     struct emfplus_object *object = &metafile->objtable[id];
@@ -394,6 +405,9 @@ static void metafile_free_object_table_entry(GpMetafile *metafile, BYTE id)
     case ObjectTypeImage:
         GdipDisposeImage(object->u.image);
         break;
+    case ObjectTypeFont:
+        GdipDeleteFont(object->u.font);
+        break;
     case ObjectTypeImageAttributes:
         GdipDisposeImageAttributes(object->u.image_attributes);
         break;
@@ -1692,6 +1706,34 @@ static GpStatus METAFILE_PlaybackObject(GpMetafile *metafile, UINT flags, UINT d
     case ObjectTypeImage:
         status = metafile_deserialize_image(record_data, data_size, (GpImage **)&object);
         break;
+    case ObjectTypeFont:
+    {
+        EmfPlusFont *data = (EmfPlusFont *)record_data;
+        GpFontFamily *family;
+        WCHAR *familyname;
+
+        if (data_size <= FIELD_OFFSET(EmfPlusFont, FamilyName))
+            return InvalidParameter;
+        data_size -= FIELD_OFFSET(EmfPlusFont, FamilyName);
+
+        if (data_size < data->Length * sizeof(WCHAR))
+            return InvalidParameter;
+
+        if (!(familyname = GdipAlloc((data->Length + 1) * sizeof(*familyname))))
+            return OutOfMemory;
+
+        memcpy(familyname, data->FamilyName, data->Length * sizeof(*familyname));
+        familyname[data->Length] = 0;
+
+        status = GdipCreateFontFamilyFromName(familyname, NULL, &family);
+        GdipFree(familyname);
+        if (status != Ok)
+            return InvalidParameter;
+
+        status = GdipCreateFont(family, data->EmSize, data->FontStyleFlags, data->SizeUnit, (GpFont **)&object);
+        GdipDeleteFontFamily(family);
+        break;
+    }
     case ObjectTypeImageAttributes:
     {
         EmfPlusImageAttributes *data = (EmfPlusImageAttributes *)record_data;




More information about the wine-cvs mailing list