Piotr Caban : gdiplus: Add support for creating image object containing metafile.

Alexandre Julliard julliard at winehq.org
Mon Jul 17 15:37:20 CDT 2017


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Sat Jul 15 17:29:58 2017 +0200

gdiplus: Add support for creating image object containing 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 | 38 +++++++++++++++++++++++++++++++++++---
 1 file changed, 35 insertions(+), 3 deletions(-)

diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index a1db09b..cff5197 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -2482,6 +2482,10 @@ static GpStatus METAFILE_FillEmfPlusBitmap(EmfPlusBitmap *record, IStream *strea
 
 static GpStatus METAFILE_AddImageObject(GpMetafile *metafile, GpImage *image, DWORD *id)
 {
+    EmfPlusObject *object_record;
+    GpStatus stat;
+    DWORD size;
+
     *id = -1;
 
     if (metafile->metafile_type != MetafileTypeEmfPlusOnly && metafile->metafile_type != MetafileTypeEmfPlusDual)
@@ -2489,10 +2493,8 @@ static GpStatus METAFILE_AddImageObject(GpMetafile *metafile, GpImage *image, DW
 
     if (image->type == ImageTypeBitmap)
     {
-        EmfPlusObject *object_record;
         IStream *stream;
-        DWORD size, aligned_size;
-        GpStatus stat;
+        DWORD aligned_size;
 
         stat = METAFILE_CreateCompressedImageStream(image, &stream, &size);
         if (stat != Ok) return stat;
@@ -2519,6 +2521,36 @@ static GpStatus METAFILE_AddImageObject(GpMetafile *metafile, GpImage *image, DW
         if (stat != Ok) METAFILE_RemoveLastRecord(metafile, &object_record->Header);
         return stat;
     }
+    else if (image->type == ImageTypeMetafile)
+    {
+        HENHMETAFILE hemf = ((GpMetafile*)image)->hemf;
+        EmfPlusMetafile *metafile_record;
+
+        if (!hemf) return InvalidParameter;
+
+        size = GetEnhMetaFileBits(hemf, 0, NULL);
+        if (!size) return GenericError;
+
+        stat  = METAFILE_AllocateRecord(metafile,
+                FIELD_OFFSET(EmfPlusObject, ObjectData.image.ImageData.metafile.MetafileData[size]),
+                (void**)&object_record);
+        if (stat != Ok) return stat;
+
+        *id = METAFILE_AddObjectId(metafile);
+        object_record->Header.Type = EmfPlusRecordTypeObject;
+        object_record->Header.Flags = *id | ObjectTypeImage << 8;
+        object_record->ObjectData.image.Version = 0xDBC01002;
+        object_record->ObjectData.image.Type = ImageDataTypeMetafile;
+        metafile_record = &object_record->ObjectData.image.ImageData.metafile;
+        metafile_record->Type = ((GpMetafile*)image)->metafile_type;
+        metafile_record->MetafileDataSize = size;
+        if (GetEnhMetaFileBits(hemf, size, metafile_record->MetafileData) != size)
+        {
+            METAFILE_RemoveLastRecord(metafile, &object_record->Header);
+            return GenericError;
+        }
+        return Ok;
+    }
     else
     {
         FIXME("not supported image type (%d)\n", image->type);




More information about the wine-cvs mailing list