Vincent Povirk : gdiplus: Implement GdipEnumerateMetafileSrcRectDestPoints.

Alexandre Julliard julliard at winehq.org
Mon May 23 13:24:56 CDT 2011


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Sat May 21 17:48:32 2011 -0500

gdiplus: Implement GdipEnumerateMetafileSrcRectDestPoints.

---

 dlls/gdiplus/metafile.c       |   67 +++++++++++++++++++++++++++++++++++++++-
 dlls/gdiplus/tests/metafile.c |    4 +-
 2 files changed, 67 insertions(+), 4 deletions(-)

diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index 665d1a3..26dba93 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -323,21 +323,84 @@ GpStatus WINGDIPAPI GdipGetHemfFromMetafile(GpMetafile *metafile, HENHMETAFILE *
     return Ok;
 }
 
+struct enum_metafile_data
+{
+    EnumerateMetafileProc callback;
+    void *callback_data;
+};
+
+static int CALLBACK enum_metafile_proc(HDC hDC, HANDLETABLE *lpHTable, const ENHMETARECORD *lpEMFR,
+    int nObj, LPARAM lpData)
+{
+    BOOL ret;
+    struct enum_metafile_data *data = (struct enum_metafile_data*)lpData;
+    const BYTE* pStr;
+
+    /* First check for an EMF+ record. */
+    if (lpEMFR->iType == EMR_GDICOMMENT)
+    {
+        const EMRGDICOMMENT *comment = (const EMRGDICOMMENT*)lpEMFR;
+
+        if (comment->cbData >= 4 && memcmp(comment->Data, "EMF+", 4) == 0)
+        {
+            int offset = 4;
+
+            while (offset + sizeof(EmfPlusRecordHeader) <= comment->cbData)
+            {
+                const EmfPlusRecordHeader *record = (const EmfPlusRecordHeader*)&comment->Data[offset];
+
+                if (record->DataSize)
+                    pStr = (const BYTE*)(record+1);
+                else
+                    pStr = NULL;
+
+                ret = data->callback(record->Type, record->Flags, record->DataSize,
+                    pStr, data->callback_data);
+
+                if (!ret)
+                    return 0;
+
+                offset += record->Size;
+            }
+
+            return 1;
+        }
+    }
+
+    if (lpEMFR->nSize != 8)
+        pStr = (const BYTE*)lpEMFR->dParm;
+    else
+        pStr = NULL;
+
+    return data->callback(lpEMFR->iType, 0, lpEMFR->nSize-8,
+        pStr, data->callback_data);
+}
+
 GpStatus WINGDIPAPI GdipEnumerateMetafileSrcRectDestPoints(GpGraphics *graphics,
     GDIPCONST GpMetafile *metafile, GDIPCONST GpPointF *destPoints, INT count,
     GDIPCONST GpRectF *srcRect, Unit srcUnit, EnumerateMetafileProc callback,
     VOID *callbackData, GDIPCONST GpImageAttributes *imageAttributes)
 {
-    FIXME("(%p,%p,%p,%i,%p,%i,%p,%p,%p): stub\n", graphics, metafile,
+    struct enum_metafile_data data;
+
+    TRACE("(%p,%p,%p,%i,%p,%i,%p,%p,%p)\n", graphics, metafile,
         destPoints, count, srcRect, srcUnit, callback, callbackData,
         imageAttributes);
 
     if (!graphics || !metafile || !destPoints || count != 3 || !srcRect)
         return InvalidParameter;
 
+    if (!metafile->hemf)
+        return InvalidParameter;
+
     TRACE("%s %i -> %s %s %s\n", debugstr_rectf(srcRect), srcUnit,
         debugstr_pointf(&destPoints[0]), debugstr_pointf(&destPoints[1]),
         debugstr_pointf(&destPoints[2]));
 
-    return NotImplemented;
+    data.callback = callback;
+    data.callback_data = callbackData;
+
+    EnumEnhMetaFile(0, metafile->hemf, enum_metafile_proc, &data, NULL);
+
+    return Ok;
 }
diff --git a/dlls/gdiplus/tests/metafile.c b/dlls/gdiplus/tests/metafile.c
index ff9c346..30fdf64 100644
--- a/dlls/gdiplus/tests/metafile.c
+++ b/dlls/gdiplus/tests/metafile.c
@@ -178,9 +178,9 @@ static void check_metafile(GpMetafile *metafile, const emfplus_record *expected,
 
     stat = GdipEnumerateMetafileSrcRectDestPoints(graphics, metafile, dst_points,
         3, src_rect, src_unit, enum_metafile_proc, &state, NULL);
-    todo_wine expect(Ok, stat);
+    expect(Ok, stat);
 
-    todo_wine ok(expected[state.count].record_type == 0, "%s: Got %i records, expecting more\n", desc, state.count);
+    ok(expected[state.count].record_type == 0, "%s: Got %i records, expecting more\n", desc, state.count);
 
     GdipDeleteGraphics(graphics);
 




More information about the wine-cvs mailing list