Module: wine Branch: master Commit: b6c52ce9969ebc86f9f23534cbff5f0ecd7741ec URL: http://source.winehq.org/git/wine.git/?a=commit;h=b6c52ce9969ebc86f9f23534cb...
Author: Nikolay Sivov bunglehead@gmail.com Date: Fri Sep 5 14:41:49 2008 +0400
gdiplus: Implemented GdipCloneImage.
---
dlls/gdiplus/image.c | 45 +++++++++++++++++++++++++++++++++++++++++-- dlls/gdiplus/tests/image.c | 9 ++----- 2 files changed, 45 insertions(+), 9 deletions(-)
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index 197665d..bcdc64f 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -242,11 +242,50 @@ GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap* bitmap,
GpStatus WINGDIPAPI GdipCloneImage(GpImage *image, GpImage **cloneImage) { - if (!(image && cloneImage)) return InvalidParameter; + IStream* stream; + HRESULT hr; + INT size;
- FIXME("stub: %p, %p\n", image, cloneImage); + TRACE("%p, %p\n", image, cloneImage);
- return NotImplemented; + if (!image || !cloneImage) + return InvalidParameter; + + hr = CreateStreamOnHGlobal(0, TRUE, &stream); + if (FAILED(hr)) + return GenericError; + + *cloneImage = GdipAlloc(sizeof(GpImage)); + if (!*cloneImage) + { + IStream_Release(stream); + return OutOfMemory; + } + (*cloneImage)->type = image->type; + (*cloneImage)->flags = image->flags; + + hr = IPicture_SaveAsFile(image->picture, stream, FALSE, &size); + if(FAILED(hr)) + { + WARN("Failed to save image on stream\n"); + goto out; + } + + hr = OleLoadPicture(stream, size, FALSE, &IID_IPicture, + (LPVOID*) &(*cloneImage)->picture); + if (FAILED(hr)) + { + WARN("Failed to load image from stream\n"); + goto out; + } + + IStream_Release(stream); + return Ok; +out: + IStream_Release(stream); + GdipFree(*cloneImage); + *cloneImage = NULL; + return GenericError; }
GpStatus WINGDIPAPI GdipCreateBitmapFromFile(GDIPCONST WCHAR* filename, diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index 49d1e5e..46e63f2 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -504,22 +504,19 @@ static void test_GdipCloneImage(void) /* Create an image, clone it, delete the original, make sure the copy works */ stat = GdipCreateBitmapFromScan0(WIDTH, HEIGHT, 0, PixelFormat24bppRGB, NULL, &bm); expect(Ok, stat); -todo_wine -{ + image_src = ((GpImage*)bm); stat = GdipCloneImage(image_src, &image_dest); expect(Ok, stat); -} + stat = GdipDisposeImage((GpImage*)bm); expect(Ok, stat); -todo_wine -{ stat = GdipGetImageBounds(image_dest, &rectF, &unit); expect(Ok, stat); + stat = GdipDisposeImage(image_dest); expect(Ok, stat); } -}
START_TEST(image) {