Vincent Povirk : gdiplus: Implement GdipCloneImage for metafiles with a handle.

Alexandre Julliard julliard at winehq.org
Thu Nov 1 14:42:58 CDT 2012


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Wed Oct 31 14:33:50 2012 -0500

gdiplus: Implement GdipCloneImage for metafiles with a handle.

---

 dlls/gdiplus/image.c          |   34 ++++++++++++++++++++++++++++++++--
 dlls/gdiplus/tests/metafile.c |   24 ++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 2 deletions(-)

diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 3ee024c..3918301 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -1382,10 +1382,40 @@ GpStatus WINGDIPAPI GdipCloneImage(GpImage *image, GpImage **cloneImage)
 
         return stat;
     }
+    else if (image->type == ImageTypeMetafile && ((GpMetafile*)image)->hemf)
+    {
+        GpMetafile *result, *metafile;
+
+        metafile = (GpMetafile*)image;
+
+        result = GdipAlloc(sizeof(*result));
+        if (!result)
+            return OutOfMemory;
+
+        result->image.type = ImageTypeMetafile;
+        result->image.format = image->format;
+        result->image.flags = image->flags;
+        result->image.frame_count = 1;
+        result->image.xres = image->xres;
+        result->image.yres = image->yres;
+        result->bounds = metafile->bounds;
+        result->unit = metafile->unit;
+        result->metafile_type = metafile->metafile_type;
+        result->hemf = CopyEnhMetaFileW(metafile->hemf, NULL);
+
+        if (!result->hemf)
+        {
+            GdipFree(result);
+            return OutOfMemory;
+        }
+
+        *cloneImage = &result->image;
+        return Ok;
+    }
     else
     {
-        ERR("GpImage with no IPicture or bitmap?!\n");
-        return NotImplemented;
+        WARN("GpImage with no image data (metafile in wrong state?)\n");
+        return InvalidParameter;
     }
 }
 
diff --git a/dlls/gdiplus/tests/metafile.c b/dlls/gdiplus/tests/metafile.c
index f283c06..3366f0e 100644
--- a/dlls/gdiplus/tests/metafile.c
+++ b/dlls/gdiplus/tests/metafile.c
@@ -474,6 +474,7 @@ static void test_emfonly(void)
 {
     GpStatus stat;
     GpMetafile *metafile;
+    GpImage *clone;
     GpGraphics *graphics;
     HDC hdc, metafile_dc;
     HENHMETAFILE hemf;
@@ -560,6 +561,29 @@ static void test_emfonly(void)
     expect(Ok, stat);
     expect(0xff0000ff, color);
 
+    stat = GdipCloneImage((GpImage*)metafile, &clone);
+    expect(Ok, stat);
+
+    if (stat == Ok)
+    {
+        stat = GdipBitmapSetPixel(bitmap, 50, 50, 0);
+        expect(Ok, stat);
+
+        stat = GdipDrawImagePointsRect(graphics, clone, dst_points, 3,
+            0.0, 0.0, 100.0, 100.0, UnitPixel, NULL, NULL, NULL);
+        expect(Ok, stat);
+
+        stat = GdipBitmapGetPixel(bitmap, 15, 15, &color);
+        expect(Ok, stat);
+        expect(0, color);
+
+        stat = GdipBitmapGetPixel(bitmap, 50, 50, &color);
+        expect(Ok, stat);
+        expect(0xff0000ff, color);
+
+        GdipDisposeImage(clone);
+    }
+
     stat = GdipDeleteGraphics(graphics);
     expect(Ok, stat);
 




More information about the wine-cvs mailing list