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