Nikolay Sivov : gdiplus: Implemented GdipCloneImage.
Alexandre Julliard
julliard at winehq.org
Fri Sep 5 06:58:09 CDT 2008
Module: wine
Branch: master
Commit: b6c52ce9969ebc86f9f23534cbff5f0ecd7741ec
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b6c52ce9969ebc86f9f23534cbff5f0ecd7741ec
Author: Nikolay Sivov <bunglehead at 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)
{
More information about the wine-cvs
mailing list