Module: wine Branch: master Commit: ac231b14b946276615519198256968fe339956d6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ac231b14b94627661551919825...
Author: Piotr Caban piotr@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@codeweavers.com Signed-off-by: Vincent Povirk vincent@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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);