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