[3/4] gdiplus: Implement GdipCloneImage for metafiles with a handle.
Vincent Povirk
madewokherd at gmail.com
Wed Oct 31 16:07:57 CDT 2012
-------------- next part --------------
From cdca7fdd88945ca8451af6e0804df272d26b875a Mon Sep 17 00:00:00 2001
From: Vincent Povirk <vincent at codeweavers.com>
Date: Wed, 31 Oct 2012 14:33:50 -0500
Subject: [PATCH 3/4] 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);
--
1.7.9.5
More information about the wine-patches
mailing list