gdiplus: Store an ImageAttributes in texture brushes.
authorVincent Povirk <vincent@codeweavers.com>
Mon, 14 Feb 2011 21:35:47 +0000 (15:35 -0600)
committerAlexandre Julliard <julliard@winehq.org>
Tue, 15 Feb 2011 16:01:43 +0000 (17:01 +0100)
dlls/gdiplus/brush.c
dlls/gdiplus/gdiplus_private.h

index 480d0a39b0ea103858431e0e8e40d058647f1feb..6cc78e8bdd342d061cb011787c1a20b0fe6f6674 100644 (file)
@@ -164,8 +164,14 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone)
             GpStatus stat;
             GpTexture *texture = (GpTexture*)brush;
             GpTexture *new_texture;
+            UINT width, height;
 
-            stat = GdipCreateTexture(texture->image, texture->wrap, &new_texture);
+            stat = GdipGetImageWidth(texture->image, &width);
+            if (stat != Ok) return stat;
+            stat = GdipGetImageHeight(texture->image, &height);
+            if (stat != Ok) return stat;
+
+            stat = GdipCreateTextureIA(texture->image, texture->imageattributes, 0, 0, width, height, &new_texture);
 
             if (stat == Ok)
             {
@@ -773,7 +779,7 @@ GpStatus WINGDIPAPI GdipCreateTexture(GpImage *image, GpWrapMode wrapmode,
         GpTexture **texture)
 {
     UINT width, height;
-    GpImageAttributes attributes;
+    GpImageAttributes *attributes;
     GpStatus stat;
 
     TRACE("%p, %d %p\n", image, wrapmode, texture);
@@ -785,10 +791,20 @@ GpStatus WINGDIPAPI GdipCreateTexture(GpImage *image, GpWrapMode wrapmode,
     if (stat != Ok) return stat;
     stat = GdipGetImageHeight(image, &height);
     if (stat != Ok) return stat;
-    attributes.wrap = wrapmode;
 
-    return GdipCreateTextureIA(image, &attributes, 0, 0, width, height,
+    stat = GdipCreateImageAttributes(&attributes);
+
+    if (stat == Ok)
+    {
+        attributes->wrap = wrapmode;
+
+        stat = GdipCreateTextureIA(image, attributes, 0, 0, width, height,
             texture);
+
+        GdipDisposeImageAttributes(attributes);
+    }
+
+    return stat;
 }
 
 /******************************************************************************
@@ -797,14 +813,25 @@ GpStatus WINGDIPAPI GdipCreateTexture(GpImage *image, GpWrapMode wrapmode,
 GpStatus WINGDIPAPI GdipCreateTexture2(GpImage *image, GpWrapMode wrapmode,
         REAL x, REAL y, REAL width, REAL height, GpTexture **texture)
 {
-    GpImageAttributes attributes;
+    GpImageAttributes *attributes;
+    GpStatus stat;
 
     TRACE("%p %d %f %f %f %f %p\n", image, wrapmode,
             x, y, width, height, texture);
 
-    attributes.wrap = wrapmode;
-    return GdipCreateTextureIA(image, &attributes, x, y, width, height,
-            texture);
+    stat = GdipCreateImageAttributes(&attributes);
+
+    if (stat == Ok)
+    {
+        attributes->wrap = wrapmode;
+
+        stat = GdipCreateTextureIA(image, attributes, x, y, width, height,
+                texture);
+
+        GdipDisposeImageAttributes(attributes);
+    }
+
+    return stat;
 }
 
 /******************************************************************************
@@ -854,16 +881,25 @@ GpStatus WINGDIPAPI GdipCreateTextureIA(GpImage *image,
         goto exit;
     }
 
+    if (imageattr)
+    {
+        status = GdipCloneImageAttributes(imageattr, &(*texture)->imageattributes);
+    }
+    else
+    {
+        status = GdipCreateImageAttributes(&(*texture)->imageattributes);
+        if (status == Ok)
+            (*texture)->imageattributes->wrap = WrapModeTile;
+    }
+    if (status != Ok)
+        goto exit;
+
     (*texture)->brush.lb.lbStyle = BS_PATTERN;
     (*texture)->brush.lb.lbColor = 0;
     (*texture)->brush.lb.lbHatch = (ULONG_PTR)hbm;
 
     (*texture)->brush.gdibrush = CreateBrushIndirect(&(*texture)->brush.lb);
     (*texture)->brush.bt = BrushTypeTextureFill;
-    if (imageattr)
-        (*texture)->wrap = imageattr->wrap;
-    else
-        (*texture)->wrap = WrapModeTile;
     (*texture)->image = new_image;
 
 exit:
@@ -876,6 +912,7 @@ exit:
         if (*texture)
         {
             GdipDeleteMatrix((*texture)->transform);
+            GdipDisposeImageAttributes((*texture)->imageattributes);
             GdipFree(*texture);
             *texture = NULL;
         }
@@ -984,6 +1021,7 @@ GpStatus WINGDIPAPI GdipDeleteBrush(GpBrush *brush)
         case BrushTypeTextureFill:
             GdipDeleteMatrix(((GpTexture*)brush)->transform);
             GdipDisposeImage(((GpTexture*)brush)->image);
+            GdipDisposeImageAttributes(((GpTexture*)brush)->imageattributes);
             break;
         default:
             break;
@@ -1277,7 +1315,7 @@ GpStatus WINGDIPAPI GdipGetTextureWrapMode(GpTexture *brush, GpWrapMode *wrapmod
     if(!brush || !wrapmode)
         return InvalidParameter;
 
-    *wrapmode = brush->wrap;
+    *wrapmode = brush->imageattributes->wrap;
 
     return Ok;
 }
@@ -1757,7 +1795,7 @@ GpStatus WINGDIPAPI GdipSetTextureWrapMode(GpTexture *brush, GpWrapMode wrapmode
     if(!brush)
         return InvalidParameter;
 
-    brush->wrap = wrapmode;
+    brush->imageattributes->wrap = wrapmode;
 
     return Ok;
 }
index 7665714a8c7f67d349a622436a3fd3d1269b0d84..bdfb204542db7013dc916ab23f82c66aed6b5960 100644 (file)
@@ -215,7 +215,7 @@ struct GpTexture{
     GpBrush brush;
     GpMatrix *transform;
     GpImage *image;
-    WrapMode wrap;  /* not used yet */
+    GpImageAttributes *imageattributes;
 };
 
 struct GpPath{