Tools/icons_to_html: reads image sizes from files (by Roland Hahn)

This commit is contained in:
wp_xyz 2024-04-26 13:08:40 +02:00
parent cb4b896c31
commit 1f76660947
3 changed files with 89 additions and 53 deletions

View File

@ -19,8 +19,8 @@
<VersionInfo> <VersionInfo>
<UseVersionInfo Value="True"/> <UseVersionInfo Value="True"/>
<MajorVersionNr Value="1"/> <MajorVersionNr Value="1"/>
<MinorVersionNr Value="2"/> <MinorVersionNr Value="3"/>
<StringTable CompanyName="Lazarus and Free Pascal" InternalName="IconTable" LegalCopyright="Lazarus and Free Pascal - Roland Hahn" OriginalFilename="IconTable.exe" ProductName="IconTable" ProductVersion="1.2"/> <StringTable CompanyName="Lazarus and Free Pascal" InternalName="IconTable" LegalCopyright="Lazarus and Free Pascal - Roland Hahn" OriginalFilename="IconTable.exe" ProductName="IconTable" ProductVersion="1.3"/>
</VersionInfo> </VersionInfo>
<BuildModes Count="2" Active="Release"> <BuildModes Count="2" Active="Release">
<Item1 Name="Debug" Default="True"/> <Item1 Name="Debug" Default="True"/>
@ -75,12 +75,13 @@
<PackageName Value="LCL"/> <PackageName Value="LCL"/>
</Item3> </Item3>
</RequiredPackages> </RequiredPackages>
<Units Count="3"> <Units Count="4">
<Unit0> <Unit0>
<Filename Value="IconTable.lpr"/> <Filename Value="IconTable.lpr"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<EditorIndex Value="-1"/> <CursorPos X="72" Y="22"/>
<UsageCount Value="37"/> <UsageCount Value="40"/>
<Loaded Value="True"/>
</Unit0> </Unit0>
<Unit1> <Unit1>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
@ -89,8 +90,12 @@
<HasResources Value="True"/> <HasResources Value="True"/>
<ResourceBaseClass Value="Form"/> <ResourceBaseClass Value="Form"/>
<IsVisibleTab Value="True"/> <IsVisibleTab Value="True"/>
<CursorPos X="14" Y="12"/> <EditorIndex Value="1"/>
<UsageCount Value="37"/> <CursorPos X="25" Y="32"/>
<UsageCount Value="40"/>
<Bookmarks Count="1">
<Item0 X="16" Y="501" ID="1"/>
</Bookmarks>
<Loaded Value="True"/> <Loaded Value="True"/>
<LoadedDesigner Value="True"/> <LoadedDesigner Value="True"/>
</Unit1> </Unit1>
@ -102,126 +107,135 @@
<CursorPos X="50" Y="549"/> <CursorPos X="50" Y="549"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
</Unit2> </Unit2>
<Unit3>
<Filename Value="..\..\..\lazarus-3.0-fpc-3.2.2\fpc\3.2.2\source\packages\fcl-image\src\fpimage.pp"/>
<UnitName Value="FPImage"/>
<EditorIndex Value="2"/>
<TopLine Value="108"/>
<CursorPos X="3" Y="96"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit3>
</Units> </Units>
<JumpHistory Count="30" HistoryIndex="29"> <JumpHistory Count="30" HistoryIndex="29">
<Position1> <Position1>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="284" TopLine="260"/> <Caret Line="283" TopLine="268"/>
</Position1> </Position1>
<Position2> <Position2>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="317" TopLine="293"/> <Caret Line="284" TopLine="268"/>
</Position2> </Position2>
<Position3> <Position3>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="284" TopLine="260"/> <Caret Line="289" TopLine="268"/>
</Position3> </Position3>
<Position4> <Position4>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="232" TopLine="207"/> <Caret Line="292" TopLine="268"/>
</Position4> </Position4>
<Position5> <Position5>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="213" Column="10" TopLine="206"/> <Caret Line="294" TopLine="268"/>
</Position5> </Position5>
<Position6> <Position6>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="182" TopLine="158"/> <Caret Line="281" TopLine="268"/>
</Position6> </Position6>
<Position7> <Position7>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="491" Column="18" TopLine="467"/> <Caret Line="283" TopLine="268"/>
</Position7> </Position7>
<Position8> <Position8>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="494" Column="43" TopLine="468"/> <Caret Line="284" TopLine="268"/>
</Position8> </Position8>
<Position9> <Position9>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="492" Column="5" TopLine="476"/> <Caret Line="289" TopLine="268"/>
</Position9> </Position9>
<Position10> <Position10>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="488" TopLine="476"/> <Caret Line="292" TopLine="268"/>
</Position10> </Position10>
<Position11> <Position11>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="489" Column="14" TopLine="476"/> <Caret Line="294" Column="10" TopLine="259"/>
</Position11> </Position11>
<Position12> <Position12>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="48" Column="12" TopLine="24"/>
</Position12> </Position12>
<Position13> <Position13>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="286" TopLine="262"/> <Caret Line="23" Column="45"/>
</Position13> </Position13>
<Position14> <Position14>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="233" TopLine="209"/> <Caret Line="47" Column="22" TopLine="18"/>
</Position14> </Position14>
<Position15> <Position15>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="214" TopLine="207"/> <Caret Line="500" Column="54" TopLine="489"/>
</Position15> </Position15>
<Position16> <Position16>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="181" TopLine="158"/> <Caret Line="504" Column="21" TopLine="489"/>
</Position16> </Position16>
<Position17> <Position17>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="48" Column="20" TopLine="30"/> <Caret Line="498" TopLine="489"/>
</Position17> </Position17>
<Position18> <Position18>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="436" Column="34" TopLine="412"/> <Caret Line="500" Column="31" TopLine="482"/>
</Position18> </Position18>
<Position19> <Position19>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="486" Column="31" TopLine="462"/> <Caret Line="496" Column="36" TopLine="482"/>
</Position19> </Position19>
<Position20> <Position20>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="438" Column="26" TopLine="414"/> <Caret Line="500" Column="51" TopLine="482"/>
</Position20> </Position20>
<Position21> <Position21>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="437" Column="31" TopLine="414"/> <Caret Line="527" Column="2" TopLine="494"/>
</Position21> </Position21>
<Position22> <Position22>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="436" Column="28" TopLine="414"/> <Caret Line="514" Column="8" TopLine="496"/>
</Position22> </Position22>
<Position23> <Position23>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="225" Column="14" TopLine="201"/> <Caret Line="24" Column="24"/>
</Position23> </Position23>
<Position24> <Position24>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="205" Column="18" TopLine="188"/>
</Position24> </Position24>
<Position25> <Position25>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="33" Column="23"/> <Caret Line="47" Column="15" TopLine="13"/>
</Position25> </Position25>
<Position26> <Position26>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="419" TopLine="395"/> <Caret Line="514" TopLine="497"/>
</Position26> </Position26>
<Position27> <Position27>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="232" TopLine="208"/> <Caret Line="8" Column="29"/>
</Position27> </Position27>
<Position28> <Position28>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="225" Column="5" TopLine="208"/> <Caret Line="197" Column="48" TopLine="168"/>
</Position28> </Position28>
<Position29> <Position29>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="196" TopLine="172"/> <Caret Line="47" Column="15" TopLine="12"/>
</Position29> </Position29>
<Position30> <Position30>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="186" TopLine="172"/> <Caret Line="507" Column="16" TopLine="491"/>
</Position30> </Position30>
</JumpHistory> </JumpHistory>
</ProjectOptions> </ProjectOptions>

View File

@ -9,13 +9,13 @@ object MainForm: TMainForm
ClientWidth = 700 ClientWidth = 700
Constraints.MinHeight = 515 Constraints.MinHeight = 515
Constraints.MinWidth = 700 Constraints.MinWidth = 700
Position = poScreenCenter
ShowHint = True
LCLVersion = '3.99.0.0'
OnClose = FormClose OnClose = FormClose
OnCreate = FormCreate OnCreate = FormCreate
OnDropFiles = FormDropFiles OnDropFiles = FormDropFiles
OnShow = FormShow OnShow = FormShow
Position = poScreenCenter
ShowHint = True
LCLVersion = '3.2.0.0'
object DirectoryEdit: TDirectoryEdit object DirectoryEdit: TDirectoryEdit
AnchorSideLeft.Control = Owner AnchorSideLeft.Control = Owner
AnchorSideTop.Control = sbtnLastDirs AnchorSideTop.Control = sbtnLastDirs
@ -516,6 +516,8 @@ object MainForm: TMainForm
object SynGutterMarks1: TSynGutterMarks object SynGutterMarks1: TSynGutterMarks
Width = 24 Width = 24
MouseActions = <> MouseActions = <>
MaxExtraMarksColums = 0
Options = [sgmoDeDuplicateMarksOnOverflow]
end end
object SynGutterLineNumber1: TSynGutterLineNumber object SynGutterLineNumber1: TSynGutterLineNumber
Width = 15 Width = 15
@ -596,9 +598,9 @@ object MainForm: TMainForm
Caption = 'Close' Caption = 'Close'
Images = ImageList Images = ImageList
ImageIndex = 6 ImageIndex = 6
OnClick = bbtnCloseClick
Spacing = 5 Spacing = 5
TabOrder = 6 TabOrder = 6
OnClick = bbtnCloseClick
end end
object bbtnSave: TBitBtn object bbtnSave: TBitBtn
AnchorSideTop.Control = bbtnClose AnchorSideTop.Control = bbtnClose
@ -616,9 +618,9 @@ object MainForm: TMainForm
Enabled = False Enabled = False
Images = ImageList Images = ImageList
ImageIndex = 5 ImageIndex = 5
OnClick = bbtnSaveClick
Spacing = 5 Spacing = 5
TabOrder = 5 TabOrder = 5
OnClick = bbtnSaveClick
end end
object bbtnCreateHTML: TBitBtn object bbtnCreateHTML: TBitBtn
AnchorSideTop.Control = bbtnPreview AnchorSideTop.Control = bbtnPreview
@ -637,9 +639,9 @@ object MainForm: TMainForm
Enabled = False Enabled = False
Images = ImageList Images = ImageList
ImageIndex = 3 ImageIndex = 3
OnClick = bbtnCreateHTMLClick
Spacing = 5 Spacing = 5
TabOrder = 3 TabOrder = 3
OnClick = bbtnCreateHTMLClick
end end
object bbtnPreview: TBitBtn object bbtnPreview: TBitBtn
AnchorSideTop.Control = bbtnSave AnchorSideTop.Control = bbtnSave
@ -655,12 +657,13 @@ object MainForm: TMainForm
Enabled = False Enabled = False
Images = ImageList Images = ImageList
ImageIndex = 4 ImageIndex = 4
OnClick = bbtnPreviewClick
TabOrder = 4 TabOrder = 4
OnClick = bbtnPreviewClick
end end
object TaskDialog: TTaskDialog object TaskDialog: TTaskDialog
Buttons = <> Buttons = <>
RadioButtons = <> RadioButtons = <>
QueryItemIndex = 0
Left = 96 Left = 96
Top = 64 Top = 64
end end

View File

@ -5,7 +5,7 @@ unit main;
interface interface
uses uses
Classes, SysUtils, Forms, Controls, Dialogs, StdCtrls, EditBtn, FileUtil, Classes, SysUtils, Forms, FPImage, Controls, Dialogs, StdCtrls, EditBtn, FileUtil,
LazUTF8, LazFileUtils, LCLIntf, LCLType, Buttons, Menus, IniFiles, LazUTF8, LazFileUtils, LCLIntf, LCLType, Buttons, Menus, IniFiles,
SynEdit, SynHighlighterHTML; SynEdit, SynHighlighterHTML;
@ -44,6 +44,7 @@ type
procedure CreateHTML(HTMLLines: TStrings; Preview: Boolean); procedure CreateHTML(HTMLLines: TStrings; Preview: Boolean);
procedure ShowMsg(const AMsgCaption: String; const AMsg: String); procedure ShowMsg(const AMsgCaption: String; const AMsg: String);
procedure UpdateLastDirs(ImgDir: String; Delete: Boolean); procedure UpdateLastDirs(ImgDir: String; Delete: Boolean);
procedure GetPixSize(FileName: String; var PixWidth: Integer; var PixHeight: Integer);
public public
end; end;
@ -241,6 +242,8 @@ var
IcoFile: String; IcoFile: String;
IcoSize: String; IcoSize: String;
IcoName: String; IcoName: String;
IcoWidth: Integer = 0;
IcoHeight: Integer = 0;
DPos: Integer; DPos: Integer;
IntDummy: Integer; IntDummy: Integer;
i: Integer; i: Integer;
@ -273,16 +276,14 @@ begin
for i := 0 to AllFileList.Count - 1 do for i := 0 to AllFileList.Count - 1 do
begin begin
IcoFile := ChangeFileExt(ExtractFileName(AllFileList.Strings[i]), ''); IcoFile := ChangeFileExt(ExtractFileName(AllFileList.Strings[i]), '');
GetPixSize(AllFileList.Strings[i], IcoWidth, IcoHeight);
IcoSize := IntToStr(IcoWidth);
DPos := LastDelimiter('_', IcoFile); DPos := LastDelimiter('_', IcoFile);
IcoSize := RightStr(IcoFile, Utf8Length(IcoFile) - DPos); if TryStrToInt(RightStr(IcoFile, Utf8Length(IcoFile) - DPos), IntDummy) then
IcoName := Utf8Copy(IcoFile, 1, DPos - 1)
if not TryStrToInt(IcoSize, IntDummy) then
IcoSize := '';
if IcoSize = '' then
IcoName := IcoFile
else else
IcoName := Utf8Copy(IcoFile, 1, DPos - 1); IcoName := IcoFile;
if Preview then if Preview then
IcoFileList.Add('file:///' + ImgDirectory + IcoFile) IcoFileList.Add('file:///' + ImgDirectory + IcoFile)
@ -334,7 +335,7 @@ begin
HTMLLines.Add('<table>'); HTMLLines.Add('<table>');
HTMLLines.Add(' <tr class="no_border">'); HTMLLines.Add(' <tr class="no_border">');
HTMLLines.Add(' <td class="colorset1 right_border"></td>'); HTMLLines.Add(' <td class="colorset1 right_border"></td>');
HTMLLines.Add(' <td class="colorset2 text_center" colspan="' + PixSizeList.Count.ToString + '">Appendix</td>'); HTMLLines.Add(' <td class="colorset2 text_center" colspan="' + PixSizeList.Count.ToString + '">Size</td>');
HTMLLines.Add(' </tr>'); HTMLLines.Add(' </tr>');
HTMLLines.Add(' <tr>'); HTMLLines.Add(' <tr>');
HTMLLines.Add(' <td class="colorset1 right_border">Name</td>'); HTMLLines.Add(' <td class="colorset1 right_border">Name</td>');
@ -489,6 +490,24 @@ begin
Result := ''; Result := '';
end; end;
procedure TMainForm.GetPixSize(FileName: String; var PixWidth: Integer; var PixHeight: Integer);
var
stream: TStream;
reader: TFPCustomImageReaderClass;
begin
stream := TFileStream.Create(FileName, fmOpenRead + fmShareDenyWrite);
try
reader := TFPCustomImage.FindReaderFromStream(stream);
with reader.ImageSize(stream) do
begin
PixWidth := X;
PixHeight := Y;
end;
finally
stream.Free;
end;
end;
function CustomSortProc(List: TStringList; X1, X2: Integer): Integer; function CustomSortProc(List: TStringList; X1, X2: Integer): Integer;
var var
P1, P2: Integer; P1, P2: Integer;