[5/5] gdiplus: Use GdipGetMetafileHeaderFromEmf when opening metafiles.
Vincent Povirk
madewokherd at gmail.com
Fri Oct 30 15:08:36 CDT 2015
-------------- next part --------------
From 83df4f3f82bf7103692d8c5ee1fabdf6beed0c85 Mon Sep 17 00:00:00 2001
From: Vincent Povirk <vincent at codeweavers.com>
Date: Fri, 30 Oct 2015 14:55:32 -0500
Subject: [PATCH 5/5] gdiplus: Use GdipGetMetafileHeaderFromEmf when opening
metafiles.
Signed-off-by: Vincent Povirk <vincent at codeweavers.com>
---
dlls/gdiplus/metafile.c | 70 +++++++++----------------------------------
dlls/gdiplus/tests/metafile.c | 20 ++++++-------
2 files changed, 24 insertions(+), 66 deletions(-)
diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index ca9889b..6d7048a 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -887,46 +887,6 @@ GpStatus WINGDIPAPI GdipEnumerateMetafileDestPointI(GpGraphics *graphics,
return GdipEnumerateMetafileDestPoint(graphics, metafile, &ptf, callback, cb_data, attrs);
}
-static int CALLBACK get_metafile_type_proc(HDC hDC, HANDLETABLE *lpHTable, const ENHMETARECORD *lpEMFR,
- int nObj, LPARAM lpData)
-{
- MetafileType *result = (MetafileType*)lpData;
-
- if (lpEMFR->iType == EMR_GDICOMMENT)
- {
- const EMRGDICOMMENT *comment = (const EMRGDICOMMENT*)lpEMFR;
-
- if (comment->cbData >= 4 && memcmp(comment->Data, "EMF+", 4) == 0)
- {
- const EmfPlusRecordHeader *header = (const EmfPlusRecordHeader*)&comment->Data[4];
-
- if (4 + sizeof(EmfPlusRecordHeader) <= comment->cbData &&
- header->Type == EmfPlusRecordTypeHeader)
- {
- if ((header->Flags & 1) == 1)
- *result = MetafileTypeEmfPlusDual;
- else
- *result = MetafileTypeEmfPlusOnly;
- }
- }
- else
- *result = MetafileTypeEmf;
- }
- else if (lpEMFR->iType == EMR_HEADER)
- return TRUE;
- else
- *result = MetafileTypeEmf;
-
- return FALSE;
-}
-
-static MetafileType METAFILE_GetEmfType(HENHMETAFILE hemf)
-{
- MetafileType result = MetafileTypeInvalid;
- EnumEnhMetaFile(NULL, hemf, get_metafile_type_proc, &result, NULL);
- return result;
-}
-
GpStatus WINGDIPAPI GdipGetMetafileHeaderFromMetafile(GpMetafile * metafile,
MetafileHeader * header)
{
@@ -1069,21 +1029,17 @@ GpStatus WINGDIPAPI GdipGetMetafileHeaderFromStream(IStream *stream,
GpStatus WINGDIPAPI GdipCreateMetafileFromEmf(HENHMETAFILE hemf, BOOL delete,
GpMetafile **metafile)
{
- ENHMETAHEADER header;
- MetafileType metafile_type;
+ GpStatus stat;
+ MetafileHeader header;
TRACE("(%p,%i,%p)\n", hemf, delete, metafile);
if(!hemf || !metafile)
return InvalidParameter;
- if (GetEnhMetaFileHeader(hemf, sizeof(header), &header) == 0)
- return GenericError;
-
- metafile_type = METAFILE_GetEmfType(hemf);
-
- if (metafile_type == MetafileTypeInvalid)
- return GenericError;
+ stat = GdipGetMetafileHeaderFromEmf(hemf, &header);
+ if (stat != Ok)
+ return stat;
*metafile = heap_alloc_zero(sizeof(GpMetafile));
if (!*metafile)
@@ -1092,14 +1048,16 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromEmf(HENHMETAFILE hemf, BOOL delete,
(*metafile)->image.type = ImageTypeMetafile;
(*metafile)->image.format = ImageFormatEMF;
(*metafile)->image.frame_count = 1;
- (*metafile)->image.xres = (REAL)header.szlDevice.cx;
- (*metafile)->image.yres = (REAL)header.szlDevice.cy;
- (*metafile)->bounds.X = (REAL)header.rclBounds.left;
- (*metafile)->bounds.Y = (REAL)header.rclBounds.top;
- (*metafile)->bounds.Width = (REAL)(header.rclBounds.right - header.rclBounds.left);
- (*metafile)->bounds.Height = (REAL)(header.rclBounds.bottom - header.rclBounds.top);
+ (*metafile)->image.xres = header.DpiX;
+ (*metafile)->image.yres = header.DpiY;
+ (*metafile)->bounds.X = (REAL)header.EmfHeader.rclFrame.left / 2540.0 * header.DpiX;
+ (*metafile)->bounds.Y = (REAL)header.EmfHeader.rclFrame.top / 2540.0 * header.DpiY;
+ (*metafile)->bounds.Width = (REAL)(header.EmfHeader.rclFrame.right - header.EmfHeader.rclFrame.left)
+ / 2540.0 * header.DpiX;
+ (*metafile)->bounds.Height = (REAL)(header.EmfHeader.rclFrame.bottom - header.EmfHeader.rclFrame.top)
+ / 2540.0 * header.DpiY;
(*metafile)->unit = UnitPixel;
- (*metafile)->metafile_type = metafile_type;
+ (*metafile)->metafile_type = header.Type;
(*metafile)->hemf = hemf;
(*metafile)->preserve_hemf = !delete;
diff --git a/dlls/gdiplus/tests/metafile.c b/dlls/gdiplus/tests/metafile.c
index 5a7d037..a4b3f59 100644
--- a/dlls/gdiplus/tests/metafile.c
+++ b/dlls/gdiplus/tests/metafile.c
@@ -401,17 +401,17 @@ static void test_empty(void)
expect(Ok, stat);
expectf(0.0, bounds.X);
expectf(0.0, bounds.Y);
- todo_wine expectf_(100.0, bounds.Width, 0.05);
- todo_wine expectf_(100.0, bounds.Height, 0.05);
+ expectf_(100.0, bounds.Width, 0.05);
+ expectf_(100.0, bounds.Height, 0.05);
expect(UnitPixel, unit);
stat = GdipGetImageHorizontalResolution((GpImage*)metafile, &xres);
expect(Ok, stat);
- todo_wine expectf(header.DpiX, xres);
+ expectf(header.DpiX, xres);
stat = GdipGetImageVerticalResolution((GpImage*)metafile, &yres);
expect(Ok, stat);
- todo_wine expectf(header.DpiY, yres);
+ expectf(header.DpiY, yres);
stat = GdipDisposeImage((GpImage*)metafile);
expect(Ok, stat);
@@ -746,19 +746,19 @@ static void test_emfonly(void)
stat = GdipGetImageBounds((GpImage*)metafile, &bounds, &unit);
expect(Ok, stat);
- todo_wine expectf(0.0, bounds.X);
- todo_wine expectf(0.0, bounds.Y);
- todo_wine expectf_(100.0, bounds.Width, 0.05);
- todo_wine expectf_(100.0, bounds.Height, 0.05);
+ expectf(0.0, bounds.X);
+ expectf(0.0, bounds.Y);
+ expectf_(100.0, bounds.Width, 0.05);
+ expectf_(100.0, bounds.Height, 0.05);
expect(UnitPixel, unit);
stat = GdipGetImageHorizontalResolution((GpImage*)metafile, &xres);
expect(Ok, stat);
- todo_wine expectf(header.DpiX, xres);
+ expectf(header.DpiX, xres);
stat = GdipGetImageVerticalResolution((GpImage*)metafile, &yres);
expect(Ok, stat);
- todo_wine expectf(header.DpiY, yres);
+ expectf(header.DpiY, yres);
stat = GdipDisposeImage((GpImage*)metafile);
expect(Ok, stat);
--
2.1.4
More information about the wine-patches
mailing list