[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