On 14/8/2011 04:56, Ludo Brands wrote:
Clearly you haven't looked at the valgrind massif data I posted earlier.
They clearly show that a lot of data is staying in memory. It'll require a
lot of digging to figure out exactly where the problems are. One I found out
is that synedit creates an image list with gutter symbols for every page!
The attached patch creates a shared imagelist
Please test and see what is the gain
PS: this is a quick patch just for test. more cleanup can be done
Luiz
Index: synedit/synguttercodefolding.pp
===================================================================
--- synedit/synguttercodefolding.pp (revision 31801)
+++ synedit/synguttercodefolding.pp (working copy)
@@ -68,17 +68,12 @@
FPopUp: TPopupMenu;
FMenuInf: Array of TFoldViewNodeInfo;
FIsFoldHidePreviousLine: Boolean;
- FPopUpImageList: TImageList;
FReversePopMenuOrder: Boolean;
procedure SetMouseActionsCollapsed(const AValue: TSynEditMouseActions);
procedure SetMouseActionsExpanded(const AValue: TSynEditMouseActions);
function FoldTypeForLine(AScreenLine: Integer): TSynEditFoldLineCapability;
function IsFoldHidePreviousLine(AScreenLine: Integer): Boolean;
function IsSingleLineHide(AScreenLine: Integer): Boolean;
- procedure InitPopUpImageList;
- procedure DrawNodeSymbol(Canvas: TCanvas; Rect: TRect;
- NodeType: TSynEditFoldLineCapability;
- SubType: TDrawNodeSymbolOptions);
protected
function PreferedWidth: Integer; override;
procedure CreatePopUpMenuEntries(APopUp: TPopupMenu; ALine: Integer); virtual;
@@ -108,6 +103,135 @@
uses
SynEdit;
+procedure DrawNodeSymbol(Canvas: TCanvas; Rect: TRect;
+ NodeType: TSynEditFoldLineCapability; SubType: TDrawNodeSymbolOptions);
+var
+ Points: Array [0..3] of TPoint;
+ X, Y: Integer;
+ AliasMode: TAntialiasingMode;
+ OdlCosmetic: Boolean;
+begin
+ AliasMode := Canvas.AntialiasingMode;
+ Canvas.AntialiasingMode:=amOff;
+ if nsoLostHl in SubType then begin
+ Canvas.Pen.Style := psDot;
+ OdlCosmetic := Canvas.Pen.Cosmetic;
+ Canvas.Pen.Cosmetic := False;
+ end;
+ if nsoBlockSel in SubType then begin
+ Canvas.Pen.Style := psDash;
+ OdlCosmetic := Canvas.Pen.Cosmetic;
+ Canvas.Pen.Cosmetic := False;
+ end;
+ Canvas.Rectangle(Rect);
+ Canvas.Pen.Style := psSolid;
+ Canvas.Pen.Cosmetic := OdlCosmetic;
+ X := (Rect.Left - 1 + Rect.Right) div 2;
+ Y := (Rect.Top - 1 + Rect.Bottom) div 2;
+
+ case NodeType of
+ cfFoldStart:
+ begin
+ // [-]
+ Canvas.MoveTo(X - 2, Y);
+ Canvas.LineTo(X + 3, Y);
+ end;
+ cfHideStart:
+ begin
+ // [.]
+ Canvas.MoveTo(X, Y);
+ Canvas.LineTo(X + 1, Y);
+ end;
+ cfCollapsedFold:
+ begin
+ // [+]
+ Canvas.MoveTo(X - 2, Y);
+ Canvas.LineTo(X + 3, Y);
+ Canvas.MoveTo(X, Y - 2);
+ Canvas.LineTo(X, Y + 3);
+ end;
+ cfCollapsedHide:
+ begin
+ case nsoSubtype in SubType of
+ false: begin
+ // [v]
+ Points[0].X := X;
+ Points[0].y := Y + 2;
+ Points[1].X := X - 2;
+ Points[1].y := Y;
+ Points[2].X := X + 2;
+ Points[2].y := Y;
+ Points[3].X := X;
+ Points[3].y := Y + 2;
+ end;
+ true: begin
+ // [v]
+ Points[0].X := X;
+ Points[0].y := Y - 2;
+ Points[1].X := X - 2;
+ Points[1].y := Y;
+ Points[2].X := X + 2;
+ Points[2].y := Y;
+ Points[3].X := X;
+ Points[3].y := Y - 2;
+ end;
+ end;
+ Canvas.Polygon(Points);
+ end;
+ end;
+ Canvas.AntialiasingMode := AliasMode;
+end;
+
+
+function CreatePopUpImageList: TImageList;
+var
+ img: TBitmap;
+ procedure NewImg;
+ begin
+ img := TBitmap.Create;
+ img.SetSize(16, 16);
+ img.Canvas.Brush.Color := clWhite;
+ img.Canvas.FillRect(0,0,16,16);
+ img.TransparentColor := clWhite;
+ img.Canvas.Pen.Color := clBlack;
+ img.Canvas.Pen.Width := 1;
+ end;
+begin
+ Result := TImageList.Create(nil);
+ Result.DrawingStyle := dsTransparent;
+
+ NewImg;
+ DrawNodeSymbol(img.Canvas, Rect(3,3,14,14), cfFoldStart, []); // [-]
+ Result.Add(img, nil);
+ img.Free;
+
+ NewImg;
+ DrawNodeSymbol(img.Canvas, Rect(3,3,14,14), cfCollapsedFold, []); // [+]
+ Result.Add(img, nil);
+ img.Free;
+
+ NewImg;
+ DrawNodeSymbol(img.Canvas, Rect(3,3,14,14), cfHideStart, []); // [.]
+ Result.Add(img, nil);
+ img.Free;
+
+ NewImg;
+ DrawNodeSymbol(img.Canvas, Rect(3,3,14,14), cfCollapsedHide, []); // [v]
+ Result.Add(img, nil);
+ img.Free;
+end;
+
+
+var
+ PopUpImageListInstance: TImageList;
+
+function GetPopUpImageList: TImageList;
+begin
+ if PopUpImageListInstance = nil then
+
+ Result := PopUpImageListInstance;
+end;
+
{ TSynGutterCodeFolding }
procedure TSynGutterCodeFolding.SetMouseActionsCollapsed(const AValue: TSynEditMouseActions);
@@ -182,44 +306,6 @@
Result := True;
end;
-procedure TSynGutterCodeFolding.InitPopUpImageList;
-var
- img: TBitmap;
- procedure NewImg;
- begin
- img := TBitmap.Create;
- img.SetSize(16, 16);
- img.Canvas.Brush.Color := clWhite;
- img.Canvas.FillRect(0,0,16,16);
- img.TransparentColor := clWhite;
- img.Canvas.Pen.Color := clBlack;
- img.Canvas.Pen.Width := 1;
- end;
-begin
- FPopUpImageList.DrawingStyle := dsTransparent;
-
- NewImg;
- DrawNodeSymbol(img.Canvas, Rect(3,3,14,14), cfFoldStart, []); // [-]
- FPopUpImageList.Add(img, nil);
- img.Free;
-
- NewImg;
- DrawNodeSymbol(img.Canvas, Rect(3,3,14,14), cfCollapsedFold, []); // [+]
- FPopUpImageList.Add(img, nil);
- img.Free;
-
- NewImg;
- DrawNodeSymbol(img.Canvas, Rect(3,3,14,14), cfHideStart, []); // [.]
- FPopUpImageList.Add(img, nil);
- img.Free;
-
- NewImg;
- DrawNodeSymbol(img.Canvas, Rect(3,3,14,14), cfCollapsedHide, []); // [v]
- FPopUpImageList.Add(img, nil);
- img.Free;
-
-end;
-
procedure TSynGutterCodeFolding.CreatePopUpMenuEntries(APopUp: TPopupMenu;
ALine: Integer);
@@ -298,10 +384,8 @@
FMouseActionsCollapsed.ResetDefaults;
FMouseActionsExpanded.ResetDefaults;
- FPopUpImageList := TImageList.Create(nil);
- InitPopUpImageList;
FPopUp := TPopupMenu.Create(nil);
- FPopUp.Images := FPopUpImageList;
+ FPopUp.Images := GetPopUpImageList;
inherited Create(AOwner);
@@ -316,7 +400,6 @@
FreeAndNil(FMouseActionsCollapsed);
FreeAndNil(FMouseActionsExpanded);
FreeAndNil(FPopUp);
- FreeAndNil(FPopUpImageList);
inherited Destroy;
end;
@@ -438,85 +521,6 @@
end;
end;
-procedure TSynGutterCodeFolding.DrawNodeSymbol(Canvas: TCanvas; Rect: TRect;
- NodeType: TSynEditFoldLineCapability; SubType: TDrawNodeSymbolOptions);
-var
- Points: Array [0..3] of TPoint;
- X, Y: Integer;
- AliasMode: TAntialiasingMode;
- OdlCosmetic: Boolean;
-begin
- AliasMode := Canvas.AntialiasingMode;
- Canvas.AntialiasingMode:=amOff;
- if nsoLostHl in SubType then begin
- Canvas.Pen.Style := psDot;
- OdlCosmetic := Canvas.Pen.Cosmetic;
- Canvas.Pen.Cosmetic := False;
- end;
- if nsoBlockSel in SubType then begin
- Canvas.Pen.Style := psDash;
- OdlCosmetic := Canvas.Pen.Cosmetic;
- Canvas.Pen.Cosmetic := False;
- end;
- Canvas.Rectangle(Rect);
- Canvas.Pen.Style := psSolid;
- Canvas.Pen.Cosmetic := OdlCosmetic;
- X := (Rect.Left - 1 + Rect.Right) div 2;
- Y := (Rect.Top - 1 + Rect.Bottom) div 2;
-
- case NodeType of
- cfFoldStart:
- begin
- // [-]
- Canvas.MoveTo(X - 2, Y);
- Canvas.LineTo(X + 3, Y);
- end;
- cfHideStart:
- begin
- // [.]
- Canvas.MoveTo(X, Y);
- Canvas.LineTo(X + 1, Y);
- end;
- cfCollapsedFold:
- begin
- // [+]
- Canvas.MoveTo(X - 2, Y);
- Canvas.LineTo(X + 3, Y);
- Canvas.MoveTo(X, Y - 2);
- Canvas.LineTo(X, Y + 3);
- end;
- cfCollapsedHide:
- begin
- case nsoSubtype in SubType of
- false: begin
- // [v]
- Points[0].X := X;
- Points[0].y := Y + 2;
- Points[1].X := X - 2;
- Points[1].y := Y;
- Points[2].X := X + 2;
- Points[2].y := Y;
- Points[3].X := X;
- Points[3].y := Y + 2;
- end;
- true: begin
- // [v]
- Points[0].X := X;
- Points[0].y := Y - 2;
- Points[1].X := X - 2;
- Points[1].y := Y;
- Points[2].X := X + 2;
- Points[2].y := Y;
- Points[3].X := X;
- Points[3].y := Y - 2;
- end;
- end;
- Canvas.Polygon(Points);
- end;
- end;
- Canvas.AntialiasingMode := AliasMode;
-end;
-
function TSynGutterCodeFolding.PreferedWidth: Integer;
begin
Result := 10;
@@ -699,5 +703,8 @@
AddCommand(emcCodeFoldExpand, False, mbLeft, ccAny, cdDown, [], [ssCtrl], emcoCodeFoldExpandAll);
end;
+finalization
+ PopUpImageListInstance.Free;
+
end.
--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus