From 5fccac7f72de42b1b2e7af2c77ec10a79ffd5eff Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Mon, 14 Feb 2011 15:35:47 -0600 Subject: [PATCH 1/3] 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{ -- 1.7.1