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