Module: wine Branch: master Commit: d8a855305f177ad2315a9c4840a6f174c5f90805 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d8a855305f177ad2315a9c4840...
Author: Vincent Povirk vincent@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);