[haiku-commits] r40364 - haiku/trunk/src/servers/app

  • From: superstippi@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 6 Feb 2011 11:25:06 +0100 (CET)

Author: stippi
Date: 2011-02-06 11:25:06 +0100 (Sun, 06 Feb 2011)
New Revision: 40364
Changeset: http://dev.haiku-os.org/changeset/40364
Ticket: http://dev.haiku-os.org/ticket/7071

Modified:
   haiku/trunk/src/servers/app/ServerWindow.cpp
Log:
 * The app_server leaked the BGradient objects on each drawing operation
   related to gradients. This was for example very noticeable when running
   MediaPlayer which redraws the slider a lot. With three movies running,
   app_server would leak at about 100KiB per second.
Might be related to #7071 or even fix it.


Modified: haiku/trunk/src/servers/app/ServerWindow.cpp
===================================================================
--- haiku/trunk/src/servers/app/ServerWindow.cpp        2011-02-05 16:59:02 UTC 
(rev 40363)
+++ haiku/trunk/src/servers/app/ServerWindow.cpp        2011-02-06 10:25:06 UTC 
(rev 40364)
@@ -2269,6 +2269,7 @@
                        fCurrentView->ConvertToScreenForDrawing(&rect);
                        fCurrentView->ConvertToScreenForDrawing(gradient);
                        drawingEngine->FillRect(rect, *gradient);
+                       delete gradient;
                        break;
                }
                case AS_VIEW_DRAW_BITMAP:
@@ -2341,6 +2342,7 @@
                        fCurrentView->ConvertToScreenForDrawing(&r);
                        fCurrentView->ConvertToScreenForDrawing(gradient);
                        drawingEngine->FillArc(r, angle, span, *gradient);
+                       delete gradient;
                        break;
                }
                case AS_STROKE_BEZIER:
@@ -2376,6 +2378,7 @@
                                break;
                        fCurrentView->ConvertToScreenForDrawing(gradient);
                        drawingEngine->FillBezier(pts, *gradient);
+                       delete gradient;
                        break;
                }
                case AS_STROKE_ELLIPSE:
@@ -2405,6 +2408,7 @@
                        fCurrentView->ConvertToScreenForDrawing(&rect);
                        fCurrentView->ConvertToScreenForDrawing(gradient);
                        drawingEngine->FillEllipse(rect, *gradient);
+                       delete gradient;
                        break;
                }
                case AS_STROKE_ROUNDRECT:
@@ -2441,6 +2445,7 @@
                        fCurrentView->ConvertToScreenForDrawing(&rect);
                        fCurrentView->ConvertToScreenForDrawing(gradient);
                        drawingEngine->FillRoundRect(rect, xrad, yrad, 
*gradient);
+                       delete gradient;
                        break;
                }
                case AS_STROKE_TRIANGLE:
@@ -2482,6 +2487,7 @@
                        fCurrentView->ConvertToScreenForDrawing(&rect);
                        fCurrentView->ConvertToScreenForDrawing(gradient);
                        drawingEngine->FillTriangle(pts, rect, *gradient);
+                       delete gradient;
                        break;
                }
                case AS_STROKE_POLYGON:
@@ -2524,8 +2530,8 @@
 
                        BPoint* pointList = new(nothrow) BPoint[pointCount];
                        BGradient* gradient;
-                       if (link.Read(pointList, pointCount * sizeof(BPoint)) 
>= B_OK
-                               && link.ReadGradient(&gradient) >= B_OK) {
+                       if (link.Read(pointList, pointCount * sizeof(BPoint)) 
== B_OK
+                               && link.ReadGradient(&gradient) == B_OK) {
                                for (int32 i = 0; i < pointCount; i++)
                                        
fCurrentView->ConvertToScreenForDrawing(&pointList[i]);
                                
fCurrentView->ConvertToScreenForDrawing(&polyFrame);
@@ -2533,6 +2539,7 @@
 
                                drawingEngine->FillPolygon(pointList, 
pointCount,
                                        polyFrame, *gradient, isClosed && 
pointCount > 2);
+                               delete gradient;
                        }
                        delete[] pointList;
                        break;
@@ -2590,9 +2597,9 @@
                        uint32* opList = new(nothrow) uint32[opCount];
                        BPoint* ptList = new(nothrow) BPoint[ptCount];
                        BGradient* gradient;
-                       if (link.Read(opList, opCount * sizeof(uint32)) >= B_OK
-                               && link.Read(ptList, ptCount * sizeof(BPoint)) 
>= B_OK
-                               && link.ReadGradient(&gradient) >= B_OK) {
+                       if (link.Read(opList, opCount * sizeof(uint32)) == B_OK
+                               && link.Read(ptList, ptCount * sizeof(BPoint)) 
== B_OK
+                               && link.ReadGradient(&gradient) == B_OK) {
 
                                // this might seem a bit weird, but under R5, 
the shapes
                                // are always offset by the current pen location
@@ -2606,6 +2613,7 @@
                                drawingEngine->FillShape(shapeFrame, opCount, 
opList,
                                        ptCount, ptList, *gradient, 
screenOffset,
                                        fCurrentView->Scale());
+                               delete gradient;
                        }
 
                        delete[] opList;
@@ -2640,6 +2648,7 @@
                        fCurrentView->ConvertToScreenForDrawing(&region);
                        fCurrentView->ConvertToScreenForDrawing(gradient);
                        drawingEngine->FillRegion(region, *gradient);
+                       delete gradient;
                        break;
                }
                case AS_STROKE_LINEARRAY:


Other related posts: