From 7b99fe6f09ffc33d80e76e80c25f86c8bae6303a Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Tue, 17 Oct 2017 15:49:12 +0300 Subject: [PATCH] gdiplus/metafile: Added support for EmfPlusFont objects. Signed-off-by: Nikolay Sivov Signed-off-by: Vincent Povirk Signed-off-by: Alexandre Julliard --- 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 dc2f08923e7..d4c1fd94afe 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 9312a040508..b67f5654aee 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; -- 2.11.4.GIT