File: svgzvectorialreader.pas

package info (click to toggle)
lazarus 2.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 214,460 kB
  • sloc: pascal: 1,862,622; xml: 265,709; cpp: 56,595; sh: 3,008; java: 609; makefile: 535; perl: 297; sql: 222; ansic: 137
file content (76 lines) | stat: -rw-r--r-- 1,670 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
unit svgzvectorialreader;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils,
  zstream,
  svgvectorialreader, fpvectorial, fpvutils, lazutf8;

type
  { TvSVGZVectorialReader }

  TvSVGZVectorialReader = class(TvSVGVectorialReader)
  public
    { General reading methods }
    procedure InflateGZ(AGZFilename: string; ADest: TStream);
    procedure ReadFromFile(AFileName: string; AData: TvVectorialDocument); override;
    procedure ReadFromStream(AStream: TStream; AData: TvVectorialDocument); override;
  end;

implementation

{ TvSVGZVectorialReader }

procedure TvSVGZVectorialReader.InflateGZ(AGZFilename: string; ADest: TStream);
var
  GZStream: TGZFileStream;
  chunk:string;
  cnt:integer;
const
  CHUNKSIZE=4096;
begin
  GZStream := TGZFileStream.Create(AGZFilename, gzopenread);
  try
    setlength(chunk,CHUNKSIZE);
    repeat
      cnt := GZStream.read(chunk[1],CHUNKSIZE);
      if cnt<CHUNKSIZE then
        setlength(chunk,cnt);
      ADest.Write(chunk[1], Length(chunk));
    until cnt<CHUNKSIZE;
  finally
    GZStream.Free;
  end;
end;

procedure TvSVGZVectorialReader.ReadFromFile(AFileName: string;
  AData: TvVectorialDocument);
var
  DataStream: TMemoryStream;
begin
  DataStream := TMemoryStream.Create;
  try
    InflateGZ(AFileName, DataStream);
    DataStream.Position := 0;
    ReadFromStream(DataStream, AData);
    //DataStream.SaveToFile('/tmp/foo.svg');
  finally
    DataStream.Free;
  end;
end;

procedure TvSVGZVectorialReader.ReadFromStream(AStream: TStream;
  AData: TvVectorialDocument);
begin
  inherited ReadFromStream(AStream, AData);
end;

initialization

  RegisterVectorialReader(TvSVGZVectorialReader, vfSVGZ);

end.