| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732 |
- unit PNGExplorerMain;
- interface
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- Menus, ComCtrls, StdCtrls, ExtCtrls, ToolWin, ActnList, StdActns,
- ImgList, System.ImageList, System.Actions,
- GR32,
- GR32_PortableNetworkGraphic,
- GR32_PNG,
- GR32_Image;
- type
- TMyPortableNetworkGraphic = class(TPortableNetworkGraphic32);
- TFmPngExplorer = class(TForm)
- AcEditCopy: TEditCopy;
- AcEditCut: TEditCut;
- AcEditPaste: TEditPaste;
- AcEditUndo: TEditUndo;
- AcFileExit: TFileExit;
- AcFileOpen: TFileOpen;
- AcFileSaveAs: TFileSaveAs;
- ActionList: TActionList;
- CoolBar: TCoolBar;
- ImgView32: TImgView32;
- ListView: TListView;
- MainMenu: TMainMenu;
- MIAbout: TMenuItem;
- MiCopy: TMenuItem;
- MICut: TMenuItem;
- MIEdit: TMenuItem;
- MIExit: TMenuItem;
- MIFile: TMenuItem;
- MIHelp: TMenuItem;
- MIOpen: TMenuItem;
- MIPaste: TMenuItem;
- MISave: TMenuItem;
- MISaveAs: TMenuItem;
- MIStatusBar: TMenuItem;
- MIToolbar: TMenuItem;
- MIUndo: TMenuItem;
- MIView: TMenuItem;
- N1: TMenuItem;
- N2: TMenuItem;
- N3: TMenuItem;
- PnMain: TPanel;
- PnPaintBox: TPanel;
- SpHorizontal: TSplitter;
- SpVertical: TSplitter;
- StatusBar: TStatusBar;
- TbCopy: TToolButton;
- TbCut: TToolButton;
- TbOpen: TToolButton;
- TbPaste: TToolButton;
- TbSplit1: TToolButton;
- TbSplit2: TToolButton;
- ToolBar: TToolBar;
- ToolbarImages: TImageList;
- TreeView: TTreeView;
- procedure FormCreate(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- procedure FormShow(Sender: TObject);
- procedure AcFileOpenAccept(Sender: TObject);
- procedure MIStatusBarClick(Sender: TObject);
- procedure MIToolbarClick(Sender: TObject);
- procedure ShowHint(Sender: TObject);
- procedure TreeViewChange(Sender: TObject; Node: TTreeNode);
- procedure TreeViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
- private
- FPngFile : TMyPortableNetworkGraphic;
- procedure InitializeDefaultListView;
- procedure PNGChanged;
- protected
- procedure ListViewColumns(Columns: Array of string);
- procedure ListViewData(Strings: Array of string);
- procedure DisplayHeaderChunk(HeaderChunk: TChunkPngImageHeader);
- procedure DisplayPaletteChunk(PaletteChunk: TChunkPngPalette);
- procedure DisplayChromaticitiesChunk(ChromaChunk: TChunkPngPrimaryChromaticities);
- procedure DisplayGammaChunk(GammaChunk: TChunkPngGamma);
- procedure DisplayPhysicalDimensionsChunk(PhysicalDimensionsChunk: TChunkPngPhysicalPixelDimensions);
- procedure DisplayTextChunk(TextChunk: TCustomChunkPngText);
- {$if defined(TChunkPngSuggestedPalette)} // TChunkPngSuggestedPalette is incomplete and has been disabled
- procedure DisplaySuggestedPaletteChunk(SuggestedPaletteChunk: TChunkPngSuggestedPalette);
- {$ifend}
- procedure DisplaySignificantBitsChunk(SignificantBitsChunk: TChunkPngSignificantBits);
- procedure DisplayStandardColorSpaceRGBChunk(StandardColorSpaceRGB: TChunkPngStandardColorSpaceRGB);
- procedure DisplayBackgroundColorChunk(BackgroundColor: TChunkPngBackgroundColor);
- procedure DisplayTransparencyChunk(TransparencyChunk: TChunkPngTransparency);
- procedure DisplayHistogramChunk(HistogramChunk: TChunkPngImageHistogram);
- procedure DisplayTimeChunk(TimeChunk: TChunkPngTime);
- public
- procedure LoadFromFile(Filename: TFileName);
- procedure LoadFromStream(Stream: TStream);
- end;
- var
- FmPngExplorer: TFmPngExplorer;
- implementation
- {$R *.dfm}
- uses
- Inifiles, Math, Types;
- { TFmPngExplorer }
- procedure TFmPngExplorer.FormCreate(Sender: TObject);
- begin
- Application.OnHint := ShowHint;
- FPngFile := TMyPortableNetworkGraphic.Create;
- end;
- procedure TFmPngExplorer.FormDestroy(Sender: TObject);
- begin
- // free png file
- FreeAndNil(FPngFile);
- end;
- procedure TFmPngExplorer.FormShow(Sender: TObject);
- begin
- if FileExists(ParamStr(1)) then
- LoadFromFile(ParamStr(1));
- end;
- procedure TFmPngExplorer.InitializeDefaultListView;
- begin
- // add columns
- ListViewColumns(['Name', 'Value']);
- end;
- procedure TFmPngExplorer.ListViewColumns(Columns: array of string);
- var
- ColumnIndex : Integer;
- begin
- // clear list view
- ListView.Clear;
- // clear columns
- ListView.Columns.Clear;
- // add column
- for ColumnIndex := 0 to Length(Columns) - 1 do
- with ListView.Columns.Add do
- begin
- Caption := Columns[ColumnIndex];
- Width := Min(256, (ListView.Width - 16) div (Length(Columns)));
- MinWidth := 64;
- AutoSize := True;
- end;
- end;
- procedure TFmPngExplorer.ListViewData(Strings: array of string);
- var
- ValueIndex : Integer;
- begin
- // add data
- with ListView.Items.Add do
- begin
- Caption := Strings[0];
- for ValueIndex := 1 to Length(Strings) - 1 do
- SubItems.Add(Strings[ValueIndex]);
- end;
- end;
- procedure TFmPngExplorer.ShowHint(Sender: TObject);
- begin
- if Length(Application.Hint) > 0 then
- begin
- StatusBar.SimplePanel := True;
- StatusBar.SimpleText := Application.Hint;
- end
- else
- StatusBar.SimplePanel := False;
- end;
- procedure TFmPngExplorer.AcFileOpenAccept(Sender: TObject);
- begin
- LoadFromFile(AcFileOpen.Dialog.Filename);
- end;
- procedure TFmPngExplorer.MIStatusBarClick(Sender: TObject);
- begin
- MIStatusBar.Checked := not MIStatusBar.Checked;
- StatusBar.Visible := MIStatusBar.Checked;
- end;
- procedure TFmPngExplorer.MIToolbarClick(Sender: TObject);
- begin
- MIToolbar.Checked := not MIToolbar.Checked;
- CoolBar.Visible := MIToolbar.Checked;
- end;
- procedure TFmPngExplorer.DisplayHeaderChunk(HeaderChunk: TChunkPngImageHeader);
- begin
- with HeaderChunk do
- begin
- InitializeDefaultListView;
- ListViewData(['Width', IntToStr(Width)]);
- ListViewData(['Height', IntToStr(Height)]);
- ListViewData(['Bit Depth', IntToStr(BitDepth)]);
- ListViewData(['Color Type', ColorTypeToString(ColorType)]);
- ListViewData(['Compression Method', IntToStr(CompressionMethod)]);
- ListViewData(['Filter Method', 'Adaptive']);
- ListViewData(['Interlace Method', InterlaceMethodToString(InterlaceMethod)]);
- ListViewData(['HasPallette', BoolToStr(HasPalette)]);
- ListView.BringToFront;
- end;
- end;
- procedure TFmPngExplorer.DisplayPaletteChunk(PaletteChunk: TChunkPngPalette);
- var
- Index : Integer;
- begin
- with PaletteChunk do
- begin
- InitializeDefaultListView;
- ListViewColumns(['Index', 'Color']);
- for Index := 0 to Count - 1 do
- with PaletteEntry[Index] do
- ListViewData([IntToStr(Index), '#' + IntToHex(
- Integer(R shl 16 + G shl 8 + B), 6)]);
- ListView.BringToFront;
- end;
- end;
- procedure TFmPngExplorer.DisplayGammaChunk(GammaChunk: TChunkPngGamma);
- begin
- with GammaChunk do
- begin
- InitializeDefaultListView;
- ListViewData(['Gamma', FloatToStr(GammaAsSingle)]);
- ListView.BringToFront;
- end;
- end;
- procedure TFmPngExplorer.DisplayHistogramChunk(HistogramChunk: TChunkPngImageHistogram);
- var
- Index : Integer;
- begin
- with HistogramChunk do
- begin
- ListViewColumns(['Index', 'Frequency']);
- for Index := 0 to Count - 1 do
- ListViewData([IntToStr(Index), IntToStr(Frequency[Index])]);
- ListView.BringToFront;
- end;
- end;
- {$if defined(TChunkPngSuggestedPalette)}
- procedure TFmPngExplorer.DisplaySuggestedPaletteChunk(SuggestedPaletteChunk: TChunkPngSuggestedPalette);
- begin
- with SuggestedPaletteChunk do
- begin
- InitializeDefaultListView;
- // ListViewData(['Palette Entries', IntToStr(Count)]);
- ListView.BringToFront;
- end;
- end;
- {$ifend}
- procedure TFmPngExplorer.DisplaySignificantBitsChunk(
- SignificantBitsChunk: TChunkPngSignificantBits);
- begin
- with SignificantBitsChunk do
- begin
- InitializeDefaultListView;
- if SignificantBits is TPngSignificantBitsFormat0 then
- ListViewData(['Greyscale Bits',
- IntToStr(TPngSignificantBitsFormat0(SignificantBits).GrayBits)])
- else if SignificantBits is TPngSignificantBitsFormat23 then
- begin
- ListViewData(['Red Bits',
- IntToStr(TPngSignificantBitsFormat23(SignificantBits).RedBits)]);
- ListViewData(['Green Bits',
- IntToStr(TPngSignificantBitsFormat23(SignificantBits).GreenBits)]);
- ListViewData(['Blue Bits',
- IntToStr(TPngSignificantBitsFormat23(SignificantBits).BlueBits)]);
- end
- else if SignificantBits is TPngSignificantBitsFormat4 then
- begin
- ListViewData(['Greyscale Bits',
- IntToStr(TPngSignificantBitsFormat4(SignificantBits).GrayBits)]);
- ListViewData(['Alpha Bits',
- IntToStr(TPngSignificantBitsFormat4(SignificantBits).AlphaBits)]);
- end
- else if SignificantBits is TPngSignificantBitsFormat6 then
- begin
- ListViewData(['Red Bits',
- IntToStr(TPngSignificantBitsFormat6(SignificantBits).RedBits)]);
- ListViewData(['Green Bits',
- IntToStr(TPngSignificantBitsFormat6(SignificantBits).GreenBits)]);
- ListViewData(['Blue Bits',
- IntToStr(TPngSignificantBitsFormat6(SignificantBits).BlueBits)]);
- ListViewData(['Alpha Bits',
- IntToStr(TPngSignificantBitsFormat6(SignificantBits).AlphaBits)]);
- end;
- ListView.BringToFront;
- end;
- end;
- procedure TFmPngExplorer.DisplayStandardColorSpaceRGBChunk(
- StandardColorSpaceRGB: TChunkPngStandardColorSpaceRGB);
- begin
- with StandardColorSpaceRGB do
- begin
- InitializeDefaultListView;
- case RenderingIntent of
- 0 : ListViewData(['Rendering Indent', 'Perceptual']);
- 1 : ListViewData(['Rendering Indent', 'Relative Colorimetric']);
- 2 : ListViewData(['Rendering Indent', 'Saturation']);
- 3 : ListViewData(['Rendering Indent', 'Absolute Colorimetric']);
- else
- ListViewData(['Rendering Indent', IntToStr(RenderingIntent)]);
- end;
- ListView.BringToFront;
- end;
- end;
- procedure TFmPngExplorer.DisplayTextChunk(TextChunk: TCustomChunkPngText);
- begin
- with TextChunk do
- begin
- InitializeDefaultListView;
- ListViewData([string(Keyword), string(Text)]);
- ListView.BringToFront;
- end;
- end;
- procedure TFmPngExplorer.DisplayTimeChunk(TimeChunk: TChunkPngTime);
- begin
- with TimeChunk do
- begin
- InitializeDefaultListView;
- ListViewData(['Time', DateTimeToStr(ModifiedDateTime)]);
- ListView.BringToFront;
- end;
- end;
- procedure TFmPngExplorer.DisplayTransparencyChunk(
- TransparencyChunk: TChunkPngTransparency);
- var
- Index : Integer;
- begin
- with TransparencyChunk do
- begin
- InitializeDefaultListView;
- if Transparency is TPngTransparencyFormat0 then
- ListViewData(['Grey Sample Value',
- IntToStr(TPngTransparencyFormat0(Transparency).GraySampleValue)])
- else if Transparency is TPngTransparencyFormat2 then
- begin
- ListViewData(['Red Sample Value',
- IntToStr(TPngTransparencyFormat2(Transparency).RedSampleValue)]);
- ListViewData(['Blue Sample Value',
- IntToStr(TPngTransparencyFormat2(Transparency).BlueSampleValue)]);
- ListViewData(['Green Sample Value',
- IntToStr(TPngTransparencyFormat2(Transparency).GreenSampleValue)]);
- end
- else if Transparency is TPngTransparencyFormat3 then
- for Index := 0 to TPngTransparencyFormat3(Transparency).Count - 1 do
- ListViewData(['Index ' + IntToStr(Index),
- IntToStr(TPngTransparencyFormat3(Transparency).Transparency[Index])]);
- ListView.BringToFront;
- end;
- end;
- procedure TFmPngExplorer.DisplayPhysicalDimensionsChunk(PhysicalDimensionsChunk: TChunkPngPhysicalPixelDimensions);
- begin
- with PhysicalDimensionsChunk do
- begin
- InitializeDefaultListView;
- ListViewData(['Pixels per unit X', IntToStr(PixelsPerUnitX)]);
- ListViewData(['Pixels per unit Y', IntToStr(PixelsPerUnitY)]);
- ListView.BringToFront;
- end;
- end;
- procedure TFmPngExplorer.DisplayBackgroundColorChunk(
- BackgroundColor: TChunkPngBackgroundColor);
- begin
- with BackgroundColor do
- begin
- InitializeDefaultListView;
- if Background is TPngBackgroundColorFormat04 then
- ListViewData(['Grey',
- IntToStr(TPngBackgroundColorFormat04(Background).GraySampleValue)])
- else if Background is TPngBackgroundColorFormat26 then
- begin
- ListViewData(['Red',
- IntToStr(TPngBackgroundColorFormat26(Background).RedSampleValue)]);
- ListViewData(['Blue',
- IntToStr(TPngBackgroundColorFormat26(Background).BlueSampleValue)]);
- ListViewData(['Green',
- IntToStr(TPngBackgroundColorFormat26(Background).GreenSampleValue)]);
- end
- else if Background is TPngBackgroundColorFormat3 then
- ListViewData(['Palette Index',
- IntToStr(TPngBackgroundColorFormat3(Background).PaletteIndex)]);
- ListView.BringToFront;
- end;
- end;
- procedure TFmPngExplorer.DisplayChromaticitiesChunk(ChromaChunk: TChunkPngPrimaryChromaticities);
- begin
- with ChromaChunk do
- begin
- InitializeDefaultListView;
- ListViewData(['White X', FloatToStr(WhiteXAsSingle)]);
- ListViewData(['White Y', FloatToStr(WhiteYAsSingle)]);
- ListViewData(['Red X', FloatToStr(RedXAsSingle)]);
- ListViewData(['Red Y', FloatToStr(RedYAsSingle)]);
- ListViewData(['Green X', FloatToStr(GreenXAsSingle)]);
- ListViewData(['Green Y', FloatToStr(GreenYAsSingle)]);
- ListViewData(['Blue X', FloatToStr(BlueXAsSingle)]);
- ListViewData(['Blue Y', FloatToStr(BlueYAsSingle)]);
- ListView.BringToFront;
- end;
- end;
- procedure TFmPngExplorer.TreeViewMouseMove(Sender: TObject; Shift: TShiftState; X,
- Y: Integer);
- var
- MouseOverNode : TTreeNode;
- ParentNode : TTreeNode;
- begin
- MouseOverNode := TreeView.GetNodeAt(X, Y);
- // status bar
- if Assigned(MouseOverNode) and Assigned(MouseOverNode.Data) then
- begin
- ParentNode := MouseOverNode;
- while not (TObject(ParentNode.Data) is TCustomDefinedChunk) do
- begin
- ParentNode := ParentNode.Parent;
- if not Assigned(ParentNode.Data)
- then Exit;
- end;
- if TObject(ParentNode.Data) is TCustomDefinedChunkWithHeader then
- with TCustomDefinedChunkWithHeader(ParentNode.Data) do
- begin
- // StatusBar.SimpleText := 'Table ID: ' + TableType;
- end;
- end;
- end;
- procedure TFmPngExplorer.TreeViewChange(Sender: TObject; Node: TTreeNode);
- begin
- Node.Expanded := True;
- if Assigned(Node.Data) then
- begin
- // display chunk size
- if TObject(Node.Data) is TCustomDefinedChunk then
- StatusBar.SimpleText := 'Chunk Size: ' + IntToStr(
- TCustomDefinedChunk(Node.Data).ChunkSize);
- // PNG HeaderChunk chunk
- if TObject(Node.Data) is TChunkPngImageHeader then
- DisplayHeaderChunk(TChunkPngImageHeader(Node.Data))
- else if TObject(Node.Data) is TChunkPngPalette then
- DisplayPaletteChunk(TChunkPngPalette(Node.Data))
- else if TObject(Node.Data) is TChunkPngGamma then
- DisplayGammaChunk(TChunkPngGamma(Node.Data))
- else if TObject(Node.Data) is TChunkPngTime then
- DisplayTimeChunk(TChunkPngTime(Node.Data))
- (*
- else if TObject(Node.Data) is TChunkPngPhysicalScale then
- DisplayPhysicalScaleChunk(TChunkPngPhysicalScale(Node.Data))
- *)
- else if TObject(Node.Data) is TCustomChunkPngText then
- DisplayTextChunk(TCustomChunkPngText(Node.Data))
- else if TObject(Node.Data) is TChunkPngStandardColorSpaceRGB then
- DisplayStandardColorSpaceRGBChunk(TChunkPngStandardColorSpaceRGB(Node.Data))
- else if TObject(Node.Data) is TChunkPngImageHistogram then
- DisplayHistogramChunk(TChunkPngImageHistogram(Node.Data))
- else if TObject(Node.Data) is TChunkPngBackgroundColor then
- DisplayBackgroundColorChunk(TChunkPngBackgroundColor(Node.Data))
- {$if defined(TChunkPngSuggestedPalette)}
- else if TObject(Node.Data) is TChunkPngSuggestedPalette then
- DisplaySuggestedPaletteChunk(TChunkPngSuggestedPalette(Node.Data))
- {$ifend}
- else if TObject(Node.Data) is TChunkPngPrimaryChromaticities then
- DisplayChromaticitiesChunk(TChunkPngPrimaryChromaticities(Node.Data))
- else if TObject(Node.Data) is TChunkPngPhysicalPixelDimensions then
- DisplayPhysicalDimensionsChunk(TChunkPngPhysicalPixelDimensions(Node.Data))
- else if TObject(Node.Data) is TChunkPngSignificantBits then
- DisplaySignificantBitsChunk(TChunkPngSignificantBits(Node.Data))
- else if TObject(Node.Data) is TChunkPngTransparency then
- DisplayTransparencyChunk(TChunkPngTransparency(Node.Data))
- else
- // other unregistered chunks
- if TObject(Node.Data) is TCustomChunk then
- with TCustomChunk(Node.Data) do
- begin
- InitializeDefaultListView;
- ListViewData(['Chunk Name', string(ChunkNameAsString)]);
- ListViewData(['Chunk Size', IntToStr(ChunkSize)]);
- ListView.BringToFront;
- end;
- PnPaintBox.Visible := False;
- SpVertical.Visible := False;
- end
- else
- begin
- PnPaintBox.Visible := True;
- SpVertical.Visible := True;
- end;
- end;
- procedure TFmPngExplorer.PNGChanged;
- var
- Index : Integer;
- begin
- with FPngFile, TreeView do
- begin
- // begin update
- Items.BeginUpdate;
- // add PNG Header chunk
- Items.AddChildObject(Items[0], 'IHDR', FImageHeader);
- // eventually add Palette chunk
- if Assigned(FPaletteChunk) then
- Items.AddChildObject(Items[0], 'PLTE', FPaletteChunk);
- // eventually add PNG Gamma chunk
- if Assigned(FGammaChunk) then
- Items.AddChildObject(Items[0], 'gAMA', FGammaChunk);
- // eventually add PNG Time chunk
- if Assigned(FTimeChunk) then
- Items.AddChildObject(Items[0], 'tIME', FTimeChunk);
- // eventually add PNG Background chunk
- if Assigned(FBackgroundChunk) then
- Items.AddChildObject(Items[0], 'bKGD', FBackgroundChunk);
- // eventually add PNG Significant Bits chunk
- if Assigned(FSignificantBits) then
- Items.AddChildObject(Items[0], 'sBIT', FSignificantBits);
- // eventually add PNG Transparency chunk
- if Assigned(FTransparencyChunk) then
- Items.AddChildObject(Items[0], 'tRNS', FTransparencyChunk);
- // eventually add PNG Chroma chunk
- if Assigned(FChromaChunk) then
- Items.AddChildObject(Items[0], 'cHRM', FChromaChunk);
- // eventually add PNG Physical Pixel Dimensions chunk
- if Assigned(FPhysicalDimensions) then
- Items.AddChildObject(Items[0], 'pHYs', FPhysicalDimensions);
- // eventually add additional chunks
- for Index := 0 to FAdditionalChunkList.Count - 1 do
- begin
- if FAdditionalChunkList[Index] is TCustomChunk then
- Items.AddChildObject(Items[0],
- string(TCustomChunk(FAdditionalChunkList[Index]).ChunkNameAsString),
- FAdditionalChunkList[Index])
- end;
- // end update
- Items.EndUpdate;
- // assign png file
- ImgView32.Bitmap.Assign(FPngFile);
- // expand tree
- Items[0].Expanded := True;
- end;
- end;
- procedure TFmPngExplorer.LoadFromFile(Filename: TFileName);
- var
- Start, Stop, Freq : Int64;
- MemoryFileStream : TMemoryStream;
- begin
- if FileExists(FileName) then
- begin
- // initialize listview
- InitializeDefaultListView;
- // create temporary memory strem
- MemoryFileStream := TMemoryStream.Create;
- try
- // query start
- QueryPerformanceCounter(Start);
- // load data from file
- MemoryFileStream.LoadFromFile(Filename);
- // query stop
- QueryPerformanceCounter(Stop);
- // query performance frequency
- QueryPerformanceFrequency(Freq);
- // add loading TimeChunk
- ListViewData(['loading time', FloatToStrF((Stop - Start) * 1000 / Freq, ffGeneral, 4, 4) + ' ms']);
- // query start
- QueryPerformanceCounter(Start);
- // load PNG file
- FPngFile.LoadFromStream(MemoryFileStream);
- // query stop
- QueryPerformanceCounter(Stop);
- // query performance frequency
- QueryPerformanceFrequency(Freq);
- // add loading TimeChunk
- ListViewData(['interpreting time', FloatToStrF((Stop - Start) * 1000 / Freq, ffGeneral, 4, 4) + ' ms']);
- finally
- FreeAndNil(MemoryFileStream);
- end;
- // clear existing items on treeview
- TreeView.Items.Clear;
- // add root item on treeview
- TreeView.Items.AddChild(nil, ExtractFileName(FileName));
- // query start
- QueryPerformanceCounter(Start);
- PNGChanged;
- // query stop
- QueryPerformanceCounter(Stop);
- // add building tree TimeChunk
- ListViewData(['building tree time', FloatToStrF((Stop - Start) * 1000 / Freq, ffGeneral, 4, 4) + ' ms']);
- ListView.BringToFront;
- Caption := 'PNG Explorer [' + ExtractFileName(Filename) + ']';
- end
- else
- raise Exception.Create('File does not exists');
- end;
- procedure TFmPngExplorer.LoadFromStream(Stream: TStream);
- var
- Start, Stop, Freq : Int64;
- begin
- // reset stream position
- Stream.Position := 0;
- // query start
- QueryPerformanceCounter(Start);
- // load PNG file
- FPNGFile.LoadFromStream(Stream);
- // query stop
- QueryPerformanceCounter(Stop);
- // query performance frequency
- QueryPerformanceFrequency(Freq);
- // initialize listview
- InitializeDefaultListView;
- // add loading TimeChunk
- ListViewData(['loading time', FloatToStrF((Stop - Start) * 1000 / Freq, ffGeneral, 4, 4) + ' ms']);
- // clear existing items on treeview
- TreeView.Items.Clear;
- // add root item on treeview
- TreeView.Items.AddChild(nil, '(internal PNG)');
- // query start
- QueryPerformanceCounter(Start);
- PNGChanged;
- // query stop
- QueryPerformanceCounter(Stop);
- // add building tree TimeChunk
- ListViewData(['building tree time', FloatToStrF((Stop - Start) * 1000 / Freq, ffGeneral, 4, 4) + ' ms']);
- ListView.BringToFront;
- // change caption
- Caption := 'PNG Explorer';
- end;
- end.
|