gdiplus: Create a GDI brush only when needed.

Dmitry Timoshkov dmitry at baikal.ru
Wed Feb 15 02:44:40 CST 2012


This patch fixes the problem reported in the bug 29894.
---
 dlls/gdiplus/brush.c           |   19 -------------------
 dlls/gdiplus/gdiplus_private.h |    1 -
 dlls/gdiplus/graphics.c        |   13 ++++++++++++-
 3 files changed, 12 insertions(+), 21 deletions(-)

diff --git a/dlls/gdiplus/brush.c b/dlls/gdiplus/brush.c
index d1af903..e0c400e 100644
--- a/dlls/gdiplus/brush.c
+++ b/dlls/gdiplus/brush.c
@@ -55,7 +55,6 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone)
 
             memcpy(*clone, brush, sizeof(GpSolidFill));
 
-            (*clone)->gdibrush = CreateBrushIndirect(&(*clone)->lb);
             fill->bmp = ARGB2BMP(fill->color);
             break;
         }
@@ -123,8 +122,6 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone)
 
             memcpy(dest, src, sizeof(GpLineGradient));
 
-            dest->brush.gdibrush = CreateSolidBrush(dest->brush.lb.lbColor);
-
             count = dest->blendcount;
             dest->blendfac = GdipAlloc(count * sizeof(REAL));
             dest->blendpos = GdipAlloc(count * sizeof(REAL));
@@ -142,7 +139,6 @@ GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone)
                 GdipFree(dest->blendpos);
                 GdipFree(dest->pblendcolor);
                 GdipFree(dest->pblendpos);
-                DeleteObject(dest->brush.gdibrush);
                 GdipFree(dest);
                 return OutOfMemory;
             }
@@ -295,7 +291,6 @@ GpStatus WINGDIPAPI GdipCreateHatchBrush(HatchStyle hatchstyle, ARGB forecol, AR
             (*brush)->brush.lb.lbStyle = BS_PATTERN;
             (*brush)->brush.lb.lbColor = 0;
             (*brush)->brush.lb.lbHatch = (ULONG_PTR)hbmp;
-            (*brush)->brush.gdibrush = CreateBrushIndirect(&(*brush)->brush.lb);
 
             DeleteObject(hbmp);
         }
@@ -307,7 +302,6 @@ GpStatus WINGDIPAPI GdipCreateHatchBrush(HatchStyle hatchstyle, ARGB forecol, AR
         (*brush)->brush.lb.lbStyle = BS_SOLID;
         (*brush)->brush.lb.lbColor = fgcol;
         (*brush)->brush.lb.lbHatch = 0;
-        (*brush)->brush.gdibrush = CreateBrushIndirect(&(*brush)->brush.lb);
     }
 
     if (stat == Ok)
@@ -351,7 +345,6 @@ GpStatus WINGDIPAPI GdipCreateLineBrush(GDIPCONST GpPointF* startpoint,
     (*line)->brush.lb.lbStyle = BS_SOLID;
     (*line)->brush.lb.lbColor = col;
     (*line)->brush.lb.lbHatch = 0;
-    (*line)->brush.gdibrush = CreateSolidBrush(col);
     (*line)->brush.bt = BrushTypeLinearGradient;
 
     (*line)->startpoint.X = startpoint->X;
@@ -387,7 +380,6 @@ GpStatus WINGDIPAPI GdipCreateLineBrush(GDIPCONST GpPointF* startpoint,
     {
         GdipFree((*line)->blendfac);
         GdipFree((*line)->blendpos);
-        DeleteObject((*line)->brush.gdibrush);
         GdipFree(*line);
         *line = NULL;
         return OutOfMemory;
@@ -624,7 +616,6 @@ GpStatus WINGDIPAPI GdipCreatePathGradient(GDIPCONST GpPointF* points,
     (*grad)->brush.lb.lbColor = col;
     (*grad)->brush.lb.lbHatch = 0;
 
-    (*grad)->brush.gdibrush = CreateSolidBrush(col);
     (*grad)->brush.bt = BrushTypePathGradient;
     (*grad)->centercolor = 0xffffffff;
     (*grad)->wrap = wrap;
@@ -719,7 +710,6 @@ GpStatus WINGDIPAPI GdipCreatePathGradientFromPath(GDIPCONST GpPath* path,
     (*grad)->brush.lb.lbColor = col;
     (*grad)->brush.lb.lbHatch = 0;
 
-    (*grad)->brush.gdibrush = CreateSolidBrush(col);
     (*grad)->brush.bt = BrushTypePathGradient;
     (*grad)->centercolor = 0xffffffff;
     (*grad)->wrap = WrapModeClamp;
@@ -753,7 +743,6 @@ GpStatus WINGDIPAPI GdipCreateSolidFill(ARGB color, GpSolidFill **sf)
     (*sf)->brush.lb.lbColor = col;
     (*sf)->brush.lb.lbHatch = 0;
 
-    (*sf)->brush.gdibrush = CreateSolidBrush(col);
     (*sf)->brush.bt = BrushTypeSolidColor;
     (*sf)->color = color;
     (*sf)->bmp = ARGB2BMP(color);
@@ -898,7 +887,6 @@ GpStatus WINGDIPAPI GdipCreateTextureIA(GpImage *image,
     (*texture)->brush.lb.lbColor = 0;
     (*texture)->brush.lb.lbHatch = (ULONG_PTR)hbm;
 
-    (*texture)->brush.gdibrush = CreateBrushIndirect(&(*texture)->brush.lb);
     (*texture)->brush.bt = BrushTypeTextureFill;
     (*texture)->image = new_image;
 
@@ -1036,7 +1024,6 @@ GpStatus WINGDIPAPI GdipDeleteBrush(GpBrush *brush)
             break;
     }
 
-    DeleteObject(brush->gdibrush);
     GdipFree(brush);
 
     return Ok;
@@ -1578,9 +1565,6 @@ GpStatus WINGDIPAPI GdipSetPathGradientCenterColor(GpPathGradient *grad,
     grad->centercolor = argb;
     grad->brush.lb.lbColor = ARGB2COLORREF(argb);
 
-    DeleteObject(grad->brush.gdibrush);
-    grad->brush.gdibrush = CreateSolidBrush(grad->brush.lb.lbColor);
-
     return Ok;
 }
 
@@ -1775,9 +1759,6 @@ GpStatus WINGDIPAPI GdipSetSolidFillColor(GpSolidFill *sf, ARGB argb)
     sf->color = argb;
     sf->brush.lb.lbColor = ARGB2COLORREF(argb);
 
-    DeleteObject(sf->brush.gdibrush);
-    sf->brush.gdibrush = CreateSolidBrush(sf->brush.lb.lbColor);
-
     return Ok;
 }
 
diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 9afe15b..b597511 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -170,7 +170,6 @@ struct GpGraphics{
 };
 
 struct GpBrush{
-    HBRUSH gdibrush;
     GpBrushType bt;
     LOGBRUSH lb;
 };
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 65a3815..35aa504 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -723,10 +723,21 @@ static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)
         /* else fall through */
     }
     default:
-        SelectObject(graphics->hdc, brush->gdibrush);
+    {
+        HBRUSH gdibrush, old_brush;
+
+        if (brush->lb.lbStyle == BS_SOLID)
+            gdibrush = CreateSolidBrush(brush->lb.lbColor);
+        else
+            gdibrush = CreateBrushIndirect(&brush->lb);
+
+        old_brush = SelectObject(graphics->hdc, gdibrush);
         FillPath(graphics->hdc);
+        SelectObject(graphics->hdc, old_brush);
+        DeleteObject(gdibrush);
         break;
     }
+    }
 }
 
 static INT brush_can_fill_pixels(GpBrush *brush)
-- 
1.7.8.4




More information about the wine-patches mailing list