Piotr Caban : gdiplus: Add function for managing metafile objects id.

Alexandre Julliard julliard at winehq.org
Mon Jul 10 15:52:47 CDT 2017


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Mon Jul 10 11:30:24 2017 +0200

gdiplus: Add function for managing metafile objects id.

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/gdiplus_private.h |  1 +
 dlls/gdiplus/metafile.c        | 17 +++++++++++++----
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 9da720b..6fd0968 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -370,6 +370,7 @@ struct GpMetafile{
     IStream *record_stream;
     BOOL auto_frame; /* If true, determine the frame automatically */
     GpPointF auto_frame_min, auto_frame_max;
+    DWORD next_object_id;
 
     /* playback */
     GpGraphics *playback_graphics;
diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index f3bef73..a3f94a1 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -250,6 +250,11 @@ typedef struct EmfPlusDrawImagePoints
     } PointData[3];
 } EmfPlusDrawImagePoints;
 
+static DWORD METAFILE_AddObjectId(GpMetafile *metafile)
+{
+    return (metafile->next_object_id++) % 64;
+}
+
 static GpStatus METAFILE_AllocateRecord(GpMetafile *metafile, DWORD size, void **result)
 {
     DWORD size_needed;
@@ -2363,8 +2368,10 @@ static GpStatus METAFILE_FillEmfPlusBitmap(EmfPlusBitmap *record, IStream *strea
     return Ok;
 }
 
-static GpStatus METAFILE_AddImageObject(GpMetafile *metafile, GpImage *image)
+static GpStatus METAFILE_AddImageObject(GpMetafile *metafile, GpImage *image, DWORD *id)
 {
+    *id = -1;
+
     if (metafile->metafile_type != MetafileTypeEmfPlusOnly && metafile->metafile_type != MetafileTypeEmfPlusDual)
         return Ok;
 
@@ -2389,8 +2396,9 @@ static GpStatus METAFILE_AddImageObject(GpMetafile *metafile, GpImage *image)
         }
         memset(object_record->ObjectData.image.ImageData.bitmap.BitmapData + size, 0, aligned_size - size);
 
+        *id = METAFILE_AddObjectId(metafile);
         object_record->Header.Type = EmfPlusRecordTypeObject;
-        object_record->Header.Flags = ObjectTypeImage << 8;
+        object_record->Header.Flags = *id | ObjectTypeImage << 8;
         object_record->ObjectData.image.Version = 0xDBC01002;
         object_record->ObjectData.image.Type = ImageDataTypeBitmap;
 
@@ -2412,6 +2420,7 @@ GpStatus METAFILE_DrawImagePointsRect(GpMetafile *metafile, GpImage *image,
      DrawImageAbort callback, VOID *callbackData)
 {
     EmfPlusDrawImagePoints *draw_image_record;
+    DWORD image_id;
     GpStatus stat;
 
     if (count != 3) return InvalidParameter;
@@ -2430,13 +2439,13 @@ GpStatus METAFILE_DrawImagePointsRect(GpMetafile *metafile, GpImage *image,
         return NotImplemented;
     }
 
-    stat = METAFILE_AddImageObject(metafile, image);
+    stat = METAFILE_AddImageObject(metafile, image, &image_id);
     if (stat != Ok) return stat;
 
     stat = METAFILE_AllocateRecord(metafile, sizeof(EmfPlusDrawImagePoints), (void**)&draw_image_record);
     if (stat != Ok) return stat;
     draw_image_record->Header.Type = EmfPlusRecordTypeDrawImagePoints;
-    draw_image_record->Header.Flags = 0;
+    draw_image_record->Header.Flags = image_id;
     draw_image_record->ImageAttributesID = -1;
     draw_image_record->SrcUnit = UnitPixel;
     draw_image_record->SrcRect.X = units_to_pixels(srcx, srcUnit, metafile->image.xres);




More information about the wine-cvs mailing list