Vincent Povirk : gdiplus: Store an ImageAttributes in texture brushes.

Alexandre Julliard julliard at winehq.org
Tue Feb 15 11:29:25 CST 2011


Module: wine
Branch: master
Commit: 86d58dc6c8c09976a53b93ee2a77ed499d205db2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=86d58dc6c8c09976a53b93ee2a77ed499d205db2

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Mon Feb 14 15:35:47 2011 -0600

gdiplus: Store an ImageAttributes in texture brushes.

---

 dlls/gdiplus/brush.c           |   66 +++++++++++++++++++++++++++++++--------
 dlls/gdiplus/gdiplus_private.h |    2 +-
 2 files changed, 53 insertions(+), 15 deletions(-)

diff --git a/dlls/gdiplus/brush.c b/dlls/gdiplus/brush.c
index 480d0a3..6cc78e8 100644
--- a/dlls/gdiplus/brush.c
+++ b/dlls/gdiplus/brush.c
@@ -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;
 }
diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 7665714..bdfb204 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -215,7 +215,7 @@ struct GpTexture{
     GpBrush brush;
     GpMatrix *transform;
     GpImage *image;
-    WrapMode wrap;  /* not used yet */
+    GpImageAttributes *imageattributes;
 };
 
 struct GpPath{




More information about the wine-cvs mailing list