diff --git a/packages/fcl-base/src/lzwstream.pp b/packages/fcl-base/src/lzwstream.pp index 3cd45af35c..4b73bc714a 100644 --- a/packages/fcl-base/src/lzwstream.pp +++ b/packages/fcl-base/src/lzwstream.pp @@ -88,6 +88,7 @@ Type FOutSize : Cardinal; FOutRead : Cardinal; FFirstRead : Boolean; + FPosition : Int64; procedure MoveFromBuffer(Dest: PByte; aCount: Integer); Protected function ReadByte(out aByte: Byte): Boolean; @@ -98,8 +99,11 @@ Type procedure WriteStringFromCode(aCode: integer; AddFirstChar: boolean = false); Procedure FillInBuffer; Procedure FillOutBuffer; + function GetPosition: Int64; override; + procedure SetPosition(const Pos: Int64); override; Public Constructor Create(aSource : TStream; aOptions : TLZWStreamOptions; InitialBufsize : Word = LZWDefaultBufSize); overload; + function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override; function Read(var Buffer; Count: Longint): Longint; override; end; @@ -278,7 +282,7 @@ end; procedure TLZWDecompressionStream.WriteStringFromCode(aCode: integer; AddFirstChar: boolean = false); var s: TLZWString; - i : Integer; +// i : Integer; begin // WriteLn('WriteStringFromCode Code=',aCode,' AddFirstChar=',AddFirstChar); @@ -378,6 +382,18 @@ begin until FOutSize>=FillCapacity; end; +function TLZWDecompressionStream.GetPosition: Int64; +begin + Result:=FPosition; +end; + +procedure TLZWDecompressionStream.SetPosition(const Pos: Int64); +begin + if Pos=FPosition then + exit; + inherited SetPosition(Pos); +end; + constructor TLZWDecompressionStream.Create(aSource: TStream; aOptions: TLZWStreamOptions; InitialBufsize: Word); begin @@ -386,6 +402,16 @@ begin FOutSize:=0; FOutRead:=0; FFirstRead:=True; + FPosition:=0; +end; + +function TLZWDecompressionStream.Seek(const Offset: Int64; Origin: TSeekOrigin + ): Int64; +begin + if (Offset=0) and (Origin=soCurrent) then + Result:=FPosition + else + Result:=inherited Seek(Offset, Origin); end; procedure TLZWDecompressionStream.MoveFromBuffer(Dest : PByte; aCount : Integer); @@ -395,7 +421,7 @@ begin Inc(FOutRead,aCount); end; -Procedure TLZWDecompressionStream.FillInBuffer; +procedure TLZWDecompressionStream.FillInBuffer; begin FInSize:=Source.Read(FInBuffer,SizeOf(FInBuffer)); @@ -439,6 +465,7 @@ begin if Count>0 then // we need more data FillOutBuffer; end; + Inc(FPosition,Result); end;