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(®ion); fCurrentView->ConvertToScreenForDrawing(gradient); drawingEngine->FillRegion(region, *gradient); + delete gradient; break; } case AS_STROKE_LINEARRAY: