From 5bc07f9b2c56167be3f49e1fc158279342746525 Mon Sep 17 00:00:00 2001 From: wp_xyz Date: Sat, 28 Jan 2023 17:31:29 +0100 Subject: [PATCH] fpvectorial: Fix memory leaks in svg reader and visualtest application. --- components/fpvectorial/svgvectorialreader.pas | 5 +- components/fpvectorial/tests/visualtest.lpi | 7 +++ components/fpvectorial/tests/visualtest.lpr | 1 + components/fpvectorial/tests/vtmain.lfm | 1 + components/fpvectorial/tests/vtmain.pas | 46 +++++++++---------- 5 files changed, 35 insertions(+), 25 deletions(-) diff --git a/components/fpvectorial/svgvectorialreader.pas b/components/fpvectorial/svgvectorialreader.pas index a89b4b04ff..c8e13b55fd 100644 --- a/components/fpvectorial/svgvectorialreader.pas +++ b/components/fpvectorial/svgvectorialreader.pas @@ -137,7 +137,7 @@ type { TvSVGPathList } - TvSVGPathList = class(TFPObjectList) + TvSVGPathList = class(TFPList) public // parsing temporary info IsFirstPathMove: Boolean; @@ -2349,7 +2349,7 @@ var lNodeName, lDStr: String; i, j: Integer; lCurPath: TPath; - lPaths: TvSVGPathList; + lPaths: TvSVGPathList = nil; begin Result := nil; for i := 0 to ANode.Attributes.Length - 1 do @@ -2421,6 +2421,7 @@ begin TvEntityWithSubEntities(Result).Name := ANode.Attributes.Item[i].NodeValue; end; end; + lPaths.Free; end; // Documentation: http://www.w3.org/TR/SVG/paths.html diff --git a/components/fpvectorial/tests/visualtest.lpi b/components/fpvectorial/tests/visualtest.lpi index 7f01e7702a..d74647f92b 100644 --- a/components/fpvectorial/tests/visualtest.lpi +++ b/components/fpvectorial/tests/visualtest.lpi @@ -9,6 +9,7 @@ + <Scaled Value="True"/> <ResourceType Value="res"/> <UseXPManifest Value="True"/> <Icon Value="0"/> @@ -72,8 +73,14 @@ <Linking> <Debugging> <DebugInfoType Value="dsDwarf3"/> + <UseHeaptrc Value="True"/> <UseExternalDbgSyms Value="True"/> </Debugging> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> </Linking> </CompilerOptions> <Debugging> diff --git a/components/fpvectorial/tests/visualtest.lpr b/components/fpvectorial/tests/visualtest.lpr index 5dac372de4..293ab8c4f5 100644 --- a/components/fpvectorial/tests/visualtest.lpr +++ b/components/fpvectorial/tests/visualtest.lpr @@ -13,6 +13,7 @@ uses begin RequireDerivedFormResource := True; + Application.Scaled:=True; Application.Initialize; Application.CreateForm(TMainForm, MainForm); Application.Run; diff --git a/components/fpvectorial/tests/vtmain.lfm b/components/fpvectorial/tests/vtmain.lfm index e04ba3a6b4..7d40e241d1 100644 --- a/components/fpvectorial/tests/vtmain.lfm +++ b/components/fpvectorial/tests/vtmain.lfm @@ -38,6 +38,7 @@ object MainForm: TMainForm StateImages = ImageList TabOrder = 0 OnCustomDrawItem = TreeCustomDrawItem + OnDeletion = TreeDeletion OnGetImageIndex = TreeGetImageIndex OnGetSelectedIndex = TreeGetSelectedIndex OnSelectionChanged = TreeSelectionChanged diff --git a/components/fpvectorial/tests/vtmain.pas b/components/fpvectorial/tests/vtmain.pas index eb92558c46..6664011abb 100644 --- a/components/fpvectorial/tests/vtmain.pas +++ b/components/fpvectorial/tests/vtmain.pas @@ -27,6 +27,7 @@ type RenderState: array[0..1] of TRenderState; // 0 = svg, 1 = wmf constructor Create(ARenderEvent: TRenderEvent; ARefFilename: String; AIntParam: Integer = MaxInt); + destructor Destroy; override; end; TRenderCoords = (rcBottomLeftCoords, rcTopLeftCoords); @@ -88,6 +89,7 @@ type procedure rgTestResultsSelectionChanged(Sender: TObject); procedure TreeCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); + procedure TreeDeletion(Sender: TObject; Node: TTreeNode); procedure TreeGetImageIndex(Sender: TObject; Node: TTreeNode); procedure TreeGetSelectedIndex(Sender: TObject; Node: TTreeNode); procedure TreeSelectionChanged(Sender: TObject); @@ -196,6 +198,11 @@ begin IntParam := AIntParam; end; +destructor TRenderParams.Destroy; +begin + RefFile := ''; + inherited; +end; { TMainForm } @@ -207,12 +214,12 @@ var renderParams: TRenderParams; page: TvVectorialPage; begin - renderParams := TRenderParams(Tree.Selected.Data); - if RenderParams = nil then + if (Tree.Selected = nil) or (Tree.Selected.Data = nil) then exit; if FDoc[rcBottomLeftCoords] = nil then exit; + renderParams := TRenderParams(Tree.Selected.Data); page := FDoc[rcBottomLeftCoords].GetPageAsVectorial(0); bmp := TBitmap.Create; @@ -247,10 +254,11 @@ var fmt: TvVectorialFormat; ext: String; begin - renderParams := TRenderParams(Tree.Selected.Data); - if RenderParams = nil then + if (Tree.Selected = nil) or (Tree.Selected.Data = nil) then exit; + renderParams := TRenderParams(Tree.Selected.Data); + fmt := GetFileFormat; ext := GetFileFormatExt; folder := GetImagesFolder(ext); @@ -280,10 +288,10 @@ var begin BtnSaveToFilesClick(nil); - renderParams := TRenderParams(Tree.Selected.Data); - if renderParams = nil then + if (Tree.Selected = nil) or (Tree.Selected.Data = nil) then exit; + renderParams := TRenderParams(Tree.Selected.Data); ext := GetFileFormatExt; folder := GetImagesFolder(ext); @@ -353,25 +361,13 @@ end; procedure TMainForm.FormDestroy(Sender: TObject); var - parentnode, node: TTreeNode; rc: TRenderCoords; begin - parentnode := Tree.Items.GetFirstNode; - while parentnode <> nil do begin - node := parentnode.GetFirstChild; - while node <> nil do begin - TObject(node.Data).Free; - node := node.GetNextSibling; - end; - parentnode := parentnode.GetNextSibling; - end; - for rc in TRenderCoords do begin FreeAndNil(FDoc[rc]); FreeAndNil(FDocFromSVG[rc]); FreeAndNil(FDocFromWMF[rc]); end; - WriteIni; end; @@ -474,16 +470,11 @@ begin end; procedure TMainForm.rgTestResultsSelectionChanged(Sender: TObject); -var - renderParams: TRenderParams; begin if FLockResults > 0 then exit; if (Tree.Selected <> nil) and (Tree.Selected.Data <> nil) then begin - renderParams := TRenderParams(Tree.Selected.Data); - - //renderParams.RenderState[CbFileFormat.ItemIndex] := TRenderState(rgTestResults.ItemIndex); TreeGetImageIndex(nil, Tree.Selected); Tree.Invalidate; end; @@ -1181,6 +1172,15 @@ begin DefaultDraw := true; end; +procedure TMainForm.TreeDeletion(Sender: TObject; Node: TTreeNode); +begin + if (TObject(Node.Data) is TRenderParams) then + begin + TRenderParams(Node.Data).Free; + Node.Data := nil; + end; +end; + procedure TMainForm.TreeGetImageIndex(Sender: TObject; Node: TTreeNode); var renderParams: TRenderParams;