[Gdiplus] Implement GdipCloneImage

Adam Petaccia adam at tpetaccia.com
Sat Aug 16 22:26:42 CDT 2008


This seems like the right thing to do, but OleLoadImage fails.
Comments welcome.
---
 dlls/gdiplus/image.c       |   42 ++++++++++++++++++++++++++++++++++++++++--
 dlls/gdiplus/tests/image.c |    2 +-
 2 files changed, 41 insertions(+), 3 deletions(-)

diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 197665d..a74003f 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -242,11 +242,49 @@ GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap* bitmap,
 
 GpStatus WINGDIPAPI GdipCloneImage(GpImage *image, GpImage **cloneImage)
 {
+    IStream* stream;
+    HRESULT hr;
+    INT size;
+
+    TRACE("%p, %p\n", image, cloneImage);
+
     if (!(image && cloneImage)) return InvalidParameter;
 
-    FIXME("stub: %p, %p\n", image, cloneImage);
+    hr = CreateStreamOnHGlobal(0, TRUE, &stream);
+    if (FAILED(hr))
+        return GenericError;
 
-    return NotImplemented;
+    *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\n");
+        goto out;
+    }
+
+    hr = OleLoadPicture(stream, size, FALSE, &IID_IPicture,
+            (LPVOID*)(*cloneImage)->picture);
+    if (FAILED(hr))
+    {
+        WARN("Failed to load image\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..2aff0af 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -512,9 +512,9 @@ todo_wine
 }
     stat = GdipDisposeImage((GpImage*)bm);
     expect(Ok, stat);
+    stat = GdipGetImageBounds(image_dest, &rectF, &unit);
 todo_wine
 {
-    stat = GdipGetImageBounds(image_dest, &rectF, &unit);
     expect(Ok, stat);
     stat = GdipDisposeImage(image_dest);
     expect(Ok, stat);
-- 
1.5.4.3




More information about the wine-patches mailing list