fpvectorial: Fix memory leaks in svg reader and visualtest application.

This commit is contained in:
wp_xyz 2023-01-28 17:31:29 +01:00
parent 224095f27b
commit 5bc07f9b2c
5 changed files with 35 additions and 25 deletions

View File

@ -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

View File

@ -9,6 +9,7 @@
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="visualtest"/>
<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>

View File

@ -13,6 +13,7 @@ uses
begin
RequireDerivedFormResource := True;
Application.Scaled:=True;
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;

View File

@ -38,6 +38,7 @@ object MainForm: TMainForm
StateImages = ImageList
TabOrder = 0
OnCustomDrawItem = TreeCustomDrawItem
OnDeletion = TreeDeletion
OnGetImageIndex = TreeGetImageIndex
OnGetSelectedIndex = TreeGetSelectedIndex
OnSelectionChanged = TreeSelectionChanged

View File

@ -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;