gdiplus: Store an image in texture brushes, and use it when cloning.
authorVincent Povirk <vincent@codeweavers.com>
Thu, 11 Feb 2010 22:43:45 +0000 (16:43 -0600)
committerAlexandre Julliard <julliard@winehq.org>
Mon, 15 Feb 2010 11:20:00 +0000 (12:20 +0100)
dlls/gdiplus/brush.c
dlls/gdiplus/gdiplus_private.h

index a533aca80673f14d5fe3cce48bcf4138df17ec96..4d36de27f6e951bddea5bacef99869a3c6e7f2e6 100644 (file)
@@ -160,13 +160,23 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone)
             break;
         }
         case BrushTypeTextureFill:
-            *clone = GdipAlloc(sizeof(GpTexture));
-            if(!*clone)    return OutOfMemory;
+        {
+            GpStatus stat;
+            GpTexture *texture = (GpTexture*)brush;
+            GpTexture *new_texture;
 
-            memcpy(*clone, brush, sizeof(GpTexture));
+            stat = GdipCreateTexture(texture->image, texture->wrap, &new_texture);
 
-            (*clone)->gdibrush = CreateBrushIndirect(&(*clone)->lb);
-            break;
+            if (stat == Ok)
+            {
+                memcpy(new_texture->transform, texture->transform, sizeof(GpMatrix));
+                *clone = (GpBrush*)new_texture;
+            }
+            else
+                *clone = NULL;
+
+            return stat;
+        }
         default:
             ERR("not implemented for brush type %d\n", brush->bt);
             return NotImplemented;
@@ -829,10 +839,9 @@ GpStatus WINGDIPAPI GdipCreateTextureIA(GpImage *image,
     (*texture)->brush.gdibrush = CreateBrushIndirect(&(*texture)->brush.lb);
     (*texture)->brush.bt = BrushTypeTextureFill;
     (*texture)->wrap = imageattr->wrap;
+    (*texture)->image = new_image;
 
 exit:
-    GdipDisposeImage(new_image);
-
     if (status == Ok)
     {
         TRACE("<-- %p\n", *texture);
@@ -845,6 +854,7 @@ exit:
             GdipFree(*texture);
             *texture = NULL;
         }
+        GdipDisposeImage(new_image);
         TRACE("<-- error %u\n", status);
     }
 
@@ -946,6 +956,7 @@ GpStatus WINGDIPAPI GdipDeleteBrush(GpBrush *brush)
             break;
         case BrushTypeTextureFill:
             GdipDeleteMatrix(((GpTexture*)brush)->transform);
+            GdipDisposeImage(((GpTexture*)brush)->image);
             break;
         default:
             break;
index 75dc8c607c7e5afc8f923d6e35232c22411971d5..8e26eb18db96ace90248d48c16353547379b70fa 100644 (file)
@@ -180,6 +180,7 @@ struct GpLineGradient{
 struct GpTexture{
     GpBrush brush;
     GpMatrix *transform;
+    GpImage *image;
     WrapMode wrap;  /* not used yet */
 };