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

Reply via email to