gdiplus: whole picture object should be cloned in GdipCloneImage(), not just parent class 'image'.
Kirill K. Smirnov
lich at math.spbu.ru
Mon Oct 20 08:10:10 CDT 2008
-------------- next part --------------
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 0cb5ded..482fd97 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -254,6 +254,7 @@ GpStatus WINGDIPAPI GdipCloneImage(GpImage *image, GpImage **cloneImage)
HRESULT hr;
INT size;
LARGE_INTEGER move;
+ GpStatus stat = GenericError;
TRACE("%p, %p\n", image, cloneImage);
@@ -264,14 +265,7 @@ GpStatus WINGDIPAPI GdipCloneImage(GpImage *image, GpImage **cloneImage)
if (FAILED(hr))
return GenericError;
- *cloneImage = GdipAlloc(sizeof(GpImage));
- if (!*cloneImage)
- {
- IStream_Release(stream);
- return OutOfMemory;
- }
- (*cloneImage)->type = image->type;
- (*cloneImage)->flags = image->flags;
+ *cloneImage = NULL; /* for GdipFree() */
hr = IPicture_SaveAsFile(image->picture, stream, FALSE, &size);
if(FAILED(hr))
@@ -286,11 +280,11 @@ GpStatus WINGDIPAPI GdipCloneImage(GpImage *image, GpImage **cloneImage)
if (FAILED(hr))
goto out;
- hr = OleLoadPicture(stream, size, FALSE, &IID_IPicture,
- (LPVOID*) &(*cloneImage)->picture);
- if (FAILED(hr))
+ stat = GdipLoadImageFromStream(stream, cloneImage);
+ if (stat != Ok)
{
WARN("Failed to load image from stream\n");
+ *cloneImage = NULL; /* Just in case for GdipFree() */
goto out;
}
@@ -300,7 +294,7 @@ out:
IStream_Release(stream);
GdipFree(*cloneImage);
*cloneImage = NULL;
- return GenericError;
+ return stat;
}
GpStatus WINGDIPAPI GdipCreateBitmapFromFile(GDIPCONST WCHAR* filename,
diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c
index 5d8c535..4d93da4 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -514,6 +514,10 @@ static void test_GdipCloneImage(void)
stat = GdipGetImageBounds(image_dest, &rectF, &unit);
expect(Ok, stat);
+ /* Treat FP values carefully */
+ ok(fabsf(rectF.Width-WIDTH)<1e-5, "Expected: %d, got %.05f\n", WIDTH, rectF.Width);
+ ok(fabsf(rectF.Height-HEIGHT)<1e-5, "Expected: %d, got %.05f\n", HEIGHT, rectF.Height);
+
stat = GdipDisposeImage(image_dest);
expect(Ok, stat);
}
More information about the wine-patches
mailing list