update to 0.5.3
This commit is contained in:
parent
580541c8a3
commit
b7ed0e45b2
|
@ -1,52 +0,0 @@
|
||||||
unit GrittibanzliDLL;
|
|
||||||
|
|
||||||
interface
|
|
||||||
|
|
||||||
uses
|
|
||||||
WinAPI.Windows,
|
|
||||||
System.SysUtils, System.Classes;
|
|
||||||
|
|
||||||
var
|
|
||||||
Grittibanzli: function(const src: Pointer; srcSize: Cardinal; dst1: Pointer;
|
|
||||||
dst1Capacity: PCardinal; dst2: Pointer; dst2Capacity: PCardinal)
|
|
||||||
: boolean cdecl;
|
|
||||||
Ungrittibanzli: function(const src1: Pointer; src1Size: Cardinal;
|
|
||||||
const src2: Pointer; src2Size: Cardinal; dst: Pointer;
|
|
||||||
dstCapacity: PCardinal): boolean cdecl;
|
|
||||||
DLLLoaded: boolean = False;
|
|
||||||
|
|
||||||
implementation
|
|
||||||
|
|
||||||
var
|
|
||||||
DLLHandle: THandle;
|
|
||||||
|
|
||||||
procedure Init;
|
|
||||||
begin
|
|
||||||
DLLHandle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) +
|
|
||||||
'grittibanzli_dll.dll'));
|
|
||||||
if DLLHandle >= 32 then
|
|
||||||
begin
|
|
||||||
@Grittibanzli := GetProcAddress(DLLHandle, '__Grittibanzli');
|
|
||||||
@Ungrittibanzli := GetProcAddress(DLLHandle, '__Ungrittibanzli');
|
|
||||||
DLLLoaded := Assigned(Grittibanzli) and Assigned(Ungrittibanzli);
|
|
||||||
end
|
|
||||||
else
|
|
||||||
DLLLoaded := False;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure Deinit;
|
|
||||||
begin
|
|
||||||
if not DLLLoaded then
|
|
||||||
exit;
|
|
||||||
FreeLibrary(DLLHandle);
|
|
||||||
end;
|
|
||||||
|
|
||||||
initialization
|
|
||||||
|
|
||||||
Init;
|
|
||||||
|
|
||||||
finalization
|
|
||||||
|
|
||||||
Deinit;
|
|
||||||
|
|
||||||
end.
|
|
|
@ -124,13 +124,13 @@ begin
|
||||||
S := Funcs^.GetCodec(Command, I, False);
|
S := Funcs^.GetCodec(Command, I, False);
|
||||||
if (CompareText(S, LZ4Codecs[LZ4_CODEC]) = 0) and LZ4DLL.DLLLoaded then
|
if (CompareText(S, LZ4Codecs[LZ4_CODEC]) = 0) and LZ4DLL.DLLLoaded then
|
||||||
begin
|
begin
|
||||||
SetBits(Option^, 0, 0, 5);
|
SetBits(Option^, LZ4_CODEC, 0, 5);
|
||||||
Result := True;
|
Result := True;
|
||||||
end
|
end
|
||||||
else if (CompareText(S, LZ4Codecs[LZ4HC_CODEC]) = 0) and LZ4DLL.DLLLoaded
|
else if (CompareText(S, LZ4Codecs[LZ4HC_CODEC]) = 0) and LZ4DLL.DLLLoaded
|
||||||
then
|
then
|
||||||
begin
|
begin
|
||||||
SetBits(Option^, 1, 0, 5);
|
SetBits(Option^, LZ4HC_CODEC, 0, 5);
|
||||||
if Funcs^.GetParam(Command, I, 'l') <> '' then
|
if Funcs^.GetParam(Command, I, 'l') <> '' then
|
||||||
SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7);
|
SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7);
|
||||||
Result := True;
|
Result := True;
|
||||||
|
@ -138,7 +138,7 @@ begin
|
||||||
else if (CompareText(S, LZ4Codecs[LZ4F_CODEC]) = 0) and LZ4DLL.DLLLoaded
|
else if (CompareText(S, LZ4Codecs[LZ4F_CODEC]) = 0) and LZ4DLL.DLLLoaded
|
||||||
then
|
then
|
||||||
begin
|
begin
|
||||||
SetBits(Option^, 2, 0, 5);
|
SetBits(Option^, LZ4F_CODEC, 0, 5);
|
||||||
if Funcs^.GetParam(Command, I, 'l') <> '' then
|
if Funcs^.GetParam(Command, I, 'l') <> '' then
|
||||||
SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7);
|
SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7);
|
||||||
if Funcs^.GetParam(Command, I, 'b') <> '' then
|
if Funcs^.GetParam(Command, I, 'b') <> '' then
|
||||||
|
|
|
@ -163,7 +163,7 @@ begin
|
||||||
S := Funcs^.GetCodec(Command, I, False);
|
S := Funcs^.GetCodec(Command, I, False);
|
||||||
if (CompareText(S, LZOCodecs[LZO1X_CODEC]) = 0) and LZODLL.DLLLoaded then
|
if (CompareText(S, LZOCodecs[LZO1X_CODEC]) = 0) and LZODLL.DLLLoaded then
|
||||||
begin
|
begin
|
||||||
SetBits(Option^, 0, 0, 5);
|
SetBits(Option^, LZO1X_CODEC, 0, 5);
|
||||||
SetBits(Option^, LZO1XVariant, 12, 5);
|
SetBits(Option^, LZO1XVariant, 12, 5);
|
||||||
if Funcs^.GetParam(Command, I, 'l') <> '' then
|
if Funcs^.GetParam(Command, I, 'l') <> '' then
|
||||||
SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7);
|
SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7);
|
||||||
|
|
|
@ -3,7 +3,7 @@ unit PrecompZLib;
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
ZLibDLL, ReflateDLL, PreflateDLL, GrittibanzliDLL,
|
ZLibDLL, ReflateDLL, PreflateDLL,
|
||||||
Utils,
|
Utils,
|
||||||
PrecompUtils,
|
PrecompUtils,
|
||||||
System.SysUtils, System.StrUtils, System.Classes, System.Math;
|
System.SysUtils, System.StrUtils, System.Classes, System.Math;
|
||||||
|
@ -14,12 +14,12 @@ var
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
const
|
const
|
||||||
ZlibCodecs: array of PChar = ['zlib', 'reflate', 'preflate', 'grittibanzli'];
|
ZlibCodecs: array of PChar = ['zlib', 'reflate', 'preflate', 'png'];
|
||||||
CODEC_COUNT = 4;
|
CODEC_COUNT = 4;
|
||||||
ZLIB_CODEC = 0;
|
ZLIB_CODEC = 0;
|
||||||
REFLATE_CODEC = 1;
|
REFLATE_CODEC = 1;
|
||||||
PREFLATE_CODEC = 2;
|
PREFLATE_CODEC = 2;
|
||||||
GRITTIBANZLI_CODEC = 3;
|
PNG_CODEC = 3;
|
||||||
|
|
||||||
const
|
const
|
||||||
Z_WINBITS = 7;
|
Z_WINBITS = 7;
|
||||||
|
@ -30,7 +30,6 @@ const
|
||||||
R_LEVEL = 6;
|
R_LEVEL = 6;
|
||||||
R_WORKMEM = 65536;
|
R_WORKMEM = 65536;
|
||||||
P_HIFSIZE = 1048576;
|
P_HIFSIZE = 1048576;
|
||||||
G_HIFSIZE = 8338608;
|
|
||||||
|
|
||||||
var
|
var
|
||||||
SOList: array of array [0 .. CODEC_COUNT - 1] of TSOList;
|
SOList: array of array [0 .. CODEC_COUNT - 1] of TSOList;
|
||||||
|
@ -43,6 +42,196 @@ var
|
||||||
Scan2Pos: TArray<Integer>;
|
Scan2Pos: TArray<Integer>;
|
||||||
Scan2SI: TArray<PStrInfo2>;
|
Scan2SI: TArray<PStrInfo2>;
|
||||||
|
|
||||||
|
function EncodePNG(Instance: Integer; Input: PByte; Pos, Size: NativeInt;
|
||||||
|
Output: _PrecompOutput; Add: _PrecompAdd; Funcs: PPrecompFuncs): Integer;
|
||||||
|
const
|
||||||
|
PNG_SIG = $A1A0A0D474E5089;
|
||||||
|
PNG_HDR = $52444849;
|
||||||
|
PNG_DAT = $54414449;
|
||||||
|
PNG_END = $444E4549;
|
||||||
|
type
|
||||||
|
PPNGStruct = ^TPNGStruct;
|
||||||
|
|
||||||
|
TPNGStruct = packed record
|
||||||
|
Size, Header: Integer;
|
||||||
|
end;
|
||||||
|
var
|
||||||
|
I, J: Integer;
|
||||||
|
I64: Int64;
|
||||||
|
CurPos: NativeInt;
|
||||||
|
LStr: TPNGStruct;
|
||||||
|
CRC: Cardinal;
|
||||||
|
SI: _StrInfo1;
|
||||||
|
DI1, DI2: TDepthInfo;
|
||||||
|
DS: TPrecompStr;
|
||||||
|
begin
|
||||||
|
DI1 := Funcs^.GetDepthInfo(Instance);
|
||||||
|
DS := Funcs^.GetCodec(DI1.Codec, 0, False);
|
||||||
|
Result := 0;
|
||||||
|
if Pos + 16 < Size then
|
||||||
|
begin
|
||||||
|
I64 := PNG_SIG;
|
||||||
|
if (PInt64(Input + Pos)^ = I64) and (PInteger(Input + Pos + 12)^ = PNG_HDR)
|
||||||
|
then
|
||||||
|
begin
|
||||||
|
Output(Instance, nil, 0);
|
||||||
|
Inc(I64);
|
||||||
|
Output(Instance, @I64, I64.Size);
|
||||||
|
for I := 1 to 2 do
|
||||||
|
begin
|
||||||
|
CurPos := 8;
|
||||||
|
LStr := PPNGStruct(Input + Pos + CurPos)^;
|
||||||
|
LStr.Size := EndianSwap(LStr.Size);
|
||||||
|
while (Pos + CurPos < Size) and (LStr.Header <> PNG_END) do
|
||||||
|
begin
|
||||||
|
CRC := EndianSwap(CRC32(0, Input + Pos + CurPos + LStr.Size.Size,
|
||||||
|
LStr.Size + LStr.Header.Size));
|
||||||
|
if CRC = PCardinal(Input + Pos + CurPos + SizeOf(TPNGStruct) +
|
||||||
|
LStr.Size)^ then
|
||||||
|
begin
|
||||||
|
J := SizeOf(TPNGStruct) + LStr.Size + CRC.Size;
|
||||||
|
if (LStr.Header = PNG_DAT) then
|
||||||
|
begin
|
||||||
|
if I = 1 then
|
||||||
|
begin
|
||||||
|
Output(Instance, Input + Pos + CurPos, SizeOf(TPNGStruct));
|
||||||
|
Output(Instance, Input + Pos + CurPos + SizeOf(TPNGStruct) +
|
||||||
|
LStr.Size, CRC.Size);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Output(Instance, Input + Pos + CurPos + SizeOf(TPNGStruct),
|
||||||
|
LStr.Size);
|
||||||
|
end
|
||||||
|
else if I = 1 then
|
||||||
|
Output(Instance, Input + Pos + CurPos, J);
|
||||||
|
Inc(CurPos, J);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
LStr := PPNGStruct(Input + Pos + CurPos)^;
|
||||||
|
LStr.Size := EndianSwap(LStr.Size);
|
||||||
|
end;
|
||||||
|
if LStr.Header = PNG_END then
|
||||||
|
begin
|
||||||
|
J := SizeOf(TPNGStruct) + LStr.Size + CRC.Size;
|
||||||
|
if I = 1 then
|
||||||
|
Output(Instance, Input + Pos + CurPos, J);
|
||||||
|
Inc(CurPos, J);
|
||||||
|
if I = 2 then
|
||||||
|
begin
|
||||||
|
SI.Position := Pos;
|
||||||
|
SI.OldSize := CurPos;
|
||||||
|
SI.NewSize := CurPos;
|
||||||
|
SI.Status := TStreamStatus.None;
|
||||||
|
SI.Option := 0;
|
||||||
|
SetBits(SI.Option, PNG_CODEC, 0, 5);
|
||||||
|
DS := Funcs^.GetDepthCodec(DI1.Codec);
|
||||||
|
Move(DS[0], DI2.Codec, SizeOf(DI2.Codec));
|
||||||
|
DI2.OldSize := SI.NewSize;
|
||||||
|
DI2.NewSize := SI.NewSize;
|
||||||
|
if Assigned(Add) then
|
||||||
|
begin
|
||||||
|
Funcs^.LogScan1(ZlibCodecs[GetBits(SI.Option, 0, 5)], SI.Position,
|
||||||
|
SI.OldSize, SI.NewSize);
|
||||||
|
Add(Instance, @SI, DI1.Codec, @DI2);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
Scan2Pos[Instance] := SI.Position;
|
||||||
|
Scan2SI[Instance]^.OldSize := SI.OldSize;
|
||||||
|
Scan2SI[Instance]^.NewSize := SI.NewSize;
|
||||||
|
Scan2SI[Instance]^.Resource := SI.Resource;
|
||||||
|
Scan2SI[Instance]^.Status := SI.Status;
|
||||||
|
Scan2SI[Instance]^.Option := SI.Option;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
Result := CurPos;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function DecodePNG(InBuff, OutBuff: PByte; Size: NativeInt): Boolean;
|
||||||
|
const
|
||||||
|
PNG_SIG = $A1A0A0D474E5089;
|
||||||
|
PNG_HDR = $52444849;
|
||||||
|
PNG_DAT = $54414449;
|
||||||
|
PNG_END = $444E4549;
|
||||||
|
type
|
||||||
|
PPNGStruct = ^TPNGStruct;
|
||||||
|
|
||||||
|
TPNGStruct = packed record
|
||||||
|
Size, Header: Integer;
|
||||||
|
end;
|
||||||
|
var
|
||||||
|
I, J, K: Integer;
|
||||||
|
I64: Int64;
|
||||||
|
CurPos1, CurPos2, ReadPos: NativeInt;
|
||||||
|
LStr: TPNGStruct;
|
||||||
|
CRC: Cardinal;
|
||||||
|
begin
|
||||||
|
CurPos1 := 0;
|
||||||
|
CurPos2 := 0;
|
||||||
|
Result := False;
|
||||||
|
I64 := Succ(PNG_SIG);
|
||||||
|
if (PInt64(InBuff)^ = I64) and (PInteger(InBuff + 12)^ = PNG_HDR) then
|
||||||
|
begin
|
||||||
|
Dec(I64);
|
||||||
|
Move(I64, (OutBuff + CurPos2)^, I64.Size);
|
||||||
|
for I := 1 to 2 do
|
||||||
|
begin
|
||||||
|
CurPos1 := 8;
|
||||||
|
CurPos2 := 8;
|
||||||
|
LStr := PPNGStruct(InBuff + CurPos1)^;
|
||||||
|
LStr.Size := EndianSwap(LStr.Size);
|
||||||
|
while LStr.Header <> PNG_END do
|
||||||
|
begin
|
||||||
|
if (LStr.Header = PNG_DAT) then
|
||||||
|
J := SizeOf(TPNGStruct) + CRC.Size
|
||||||
|
else
|
||||||
|
J := SizeOf(TPNGStruct) + LStr.Size + CRC.Size;
|
||||||
|
K := SizeOf(TPNGStruct) + LStr.Size + CRC.Size;
|
||||||
|
if I = 2 then
|
||||||
|
begin
|
||||||
|
if (LStr.Header = PNG_DAT) then
|
||||||
|
begin
|
||||||
|
Move((InBuff + CurPos1)^, (OutBuff + CurPos2)^, SizeOf(TPNGStruct));
|
||||||
|
Move((InBuff + ReadPos)^, (OutBuff + CurPos2 + SizeOf(TPNGStruct))^,
|
||||||
|
LStr.Size);
|
||||||
|
Inc(ReadPos, LStr.Size);
|
||||||
|
Move((InBuff + CurPos1 + SizeOf(TPNGStruct))^,
|
||||||
|
(OutBuff + CurPos2 + SizeOf(TPNGStruct) + LStr.Size)^, CRC.Size);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Move((InBuff + CurPos1)^, (OutBuff + CurPos2)^, J);
|
||||||
|
end;
|
||||||
|
Inc(CurPos1, J);
|
||||||
|
Inc(CurPos2, K);
|
||||||
|
LStr := PPNGStruct(InBuff + CurPos1)^;
|
||||||
|
LStr.Size := EndianSwap(LStr.Size);
|
||||||
|
end;
|
||||||
|
if LStr.Header = PNG_END then
|
||||||
|
begin
|
||||||
|
J := SizeOf(TPNGStruct) + LStr.Size + CRC.Size;
|
||||||
|
if I = 2 then
|
||||||
|
Move((InBuff + CurPos1)^, (OutBuff + CurPos2)^, J);
|
||||||
|
Inc(CurPos1, J);
|
||||||
|
Inc(CurPos2, J);
|
||||||
|
if I = 1 then
|
||||||
|
ReadPos := CurPos1
|
||||||
|
else
|
||||||
|
Result := True;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function ZlibInit(Command: PChar; Count: Integer; Funcs: PPrecompFuncs)
|
function ZlibInit(Command: PChar; Count: Integer; Funcs: PPrecompFuncs)
|
||||||
: Boolean;
|
: Boolean;
|
||||||
var
|
var
|
||||||
|
@ -66,7 +255,7 @@ begin
|
||||||
CodecAvailable[ZLIB_CODEC] := ZLibDLL.DLLLoaded;
|
CodecAvailable[ZLIB_CODEC] := ZLibDLL.DLLLoaded;
|
||||||
CodecAvailable[REFLATE_CODEC] := ReflateDLL.DLLLoaded;
|
CodecAvailable[REFLATE_CODEC] := ReflateDLL.DLLLoaded;
|
||||||
CodecAvailable[PREFLATE_CODEC] := PreflateDLL.DLLLoaded;
|
CodecAvailable[PREFLATE_CODEC] := PreflateDLL.DLLLoaded;
|
||||||
CodecAvailable[GRITTIBANZLI_CODEC] := GrittibanzliDLL.DLLLoaded;
|
CodecAvailable[PNG_CODEC] := True;
|
||||||
X := 0;
|
X := 0;
|
||||||
while Funcs^.GetCodec(Command, X, False) <> '' do
|
while Funcs^.GetCodec(Command, X, False) <> '' do
|
||||||
begin
|
begin
|
||||||
|
@ -92,9 +281,8 @@ begin
|
||||||
else if (CompareText(S, ZlibCodecs[PREFLATE_CODEC]) = 0) and PreflateDLL.DLLLoaded
|
else if (CompareText(S, ZlibCodecs[PREFLATE_CODEC]) = 0) and PreflateDLL.DLLLoaded
|
||||||
then
|
then
|
||||||
CodecEnabled[PREFLATE_CODEC] := True
|
CodecEnabled[PREFLATE_CODEC] := True
|
||||||
else if (CompareText(S, ZlibCodecs[GRITTIBANZLI_CODEC]) = 0) and
|
else if (CompareText(S, ZlibCodecs[PNG_CODEC]) = 0) then
|
||||||
GrittibanzliDLL.DLLLoaded then
|
CodecEnabled[PNG_CODEC] := True;
|
||||||
CodecEnabled[GRITTIBANZLI_CODEC] := True;
|
|
||||||
Inc(X);
|
Inc(X);
|
||||||
end;
|
end;
|
||||||
if CodecAvailable[ZLIB_CODEC] then
|
if CodecAvailable[ZLIB_CODEC] then
|
||||||
|
@ -193,7 +381,7 @@ begin
|
||||||
S := Funcs^.GetCodec(Command, I, False);
|
S := Funcs^.GetCodec(Command, I, False);
|
||||||
if (CompareText(S, ZlibCodecs[ZLIB_CODEC]) = 0) and ZLibDLL.DLLLoaded then
|
if (CompareText(S, ZlibCodecs[ZLIB_CODEC]) = 0) and ZLibDLL.DLLLoaded then
|
||||||
begin
|
begin
|
||||||
SetBits(Option^, 0, 0, 5);
|
SetBits(Option^, ZLIB_CODEC, 0, 5);
|
||||||
if Funcs^.GetParam(Command, I, 'l') <> '' then
|
if Funcs^.GetParam(Command, I, 'l') <> '' then
|
||||||
SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7);
|
SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7);
|
||||||
if Funcs^.GetParam(Command, I, 'w') <> '' then
|
if Funcs^.GetParam(Command, I, 'w') <> '' then
|
||||||
|
@ -204,7 +392,7 @@ begin
|
||||||
else if (CompareText(S, ZlibCodecs[REFLATE_CODEC]) = 0) and ReflateDLL.DLLLoaded
|
else if (CompareText(S, ZlibCodecs[REFLATE_CODEC]) = 0) and ReflateDLL.DLLLoaded
|
||||||
then
|
then
|
||||||
begin
|
begin
|
||||||
SetBits(Option^, 1, 0, 5);
|
SetBits(Option^, REFLATE_CODEC, 0, 5);
|
||||||
if Funcs^.GetParam(Command, I, 'l') <> '' then
|
if Funcs^.GetParam(Command, I, 'l') <> '' then
|
||||||
SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7);
|
SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7);
|
||||||
Result := True;
|
Result := True;
|
||||||
|
@ -212,13 +400,12 @@ begin
|
||||||
else if (CompareText(S, ZlibCodecs[PREFLATE_CODEC]) = 0) and PreflateDLL.DLLLoaded
|
else if (CompareText(S, ZlibCodecs[PREFLATE_CODEC]) = 0) and PreflateDLL.DLLLoaded
|
||||||
then
|
then
|
||||||
begin
|
begin
|
||||||
SetBits(Option^, 2, 0, 5);
|
SetBits(Option^, PREFLATE_CODEC, 0, 5);
|
||||||
Result := True;
|
Result := True;
|
||||||
end
|
end
|
||||||
else if (CompareText(S, ZlibCodecs[GRITTIBANZLI_CODEC]) = 0) and
|
else if (CompareText(S, ZlibCodecs[PNG_CODEC]) = 0) then
|
||||||
GrittibanzliDLL.DLLLoaded then
|
|
||||||
begin
|
begin
|
||||||
SetBits(Option^, 3, 0, 5);
|
SetBits(Option^, PNG_CODEC, 0, 5);
|
||||||
Result := True;
|
Result := True;
|
||||||
end;
|
end;
|
||||||
Inc(I);
|
Inc(I);
|
||||||
|
@ -242,7 +429,7 @@ var
|
||||||
SI: _StrInfo1;
|
SI: _StrInfo1;
|
||||||
DI1, DI2: TDepthInfo;
|
DI1, DI2: TDepthInfo;
|
||||||
DS: TPrecompStr;
|
DS: TPrecompStr;
|
||||||
LastIn, LastOut: cardinal;
|
LastIn, LastOut: Cardinal;
|
||||||
begin
|
begin
|
||||||
DI1 := Funcs^.GetDepthInfo(Instance);
|
DI1 := Funcs^.GetDepthInfo(Instance);
|
||||||
DS := Funcs^.GetCodec(DI1.Codec, 0, False);
|
DS := Funcs^.GetCodec(DI1.Codec, 0, False);
|
||||||
|
@ -251,7 +438,7 @@ begin
|
||||||
X := IndexTextW(@DS[0], ZlibCodecs);
|
X := IndexTextW(@DS[0], ZlibCodecs);
|
||||||
if (X < 0) or (DI1.OldSize <> SizeEx) then
|
if (X < 0) or (DI1.OldSize <> SizeEx) then
|
||||||
exit;
|
exit;
|
||||||
if not CodecAvailable[X] then
|
if CodecAvailable[X] then
|
||||||
exit;
|
exit;
|
||||||
end
|
end
|
||||||
else if BoolArray(CodecEnabled, False) then
|
else if BoolArray(CodecEnabled, False) then
|
||||||
|
@ -261,6 +448,27 @@ begin
|
||||||
IsZlib := False;
|
IsZlib := False;
|
||||||
while Pos < Size do
|
while Pos < Size do
|
||||||
begin
|
begin
|
||||||
|
if CodecEnabled[PNG_CODEC] then
|
||||||
|
begin
|
||||||
|
if PInt64(Input + Pos)^ = $A1A0A0D474E5089 then
|
||||||
|
begin
|
||||||
|
Res := EncodePNG(Instance, Input, Pos, SizeEx, Output, Add, Funcs);
|
||||||
|
if Res > 0 then
|
||||||
|
begin
|
||||||
|
if not Assigned(Add) then
|
||||||
|
exit;
|
||||||
|
Inc(Pos, Res);
|
||||||
|
continue;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
if (CodecEnabled[ZLIB_CODEC] = False) and
|
||||||
|
(CodecEnabled[REFLATE_CODEC] = False) and
|
||||||
|
(CodecEnabled[PREFLATE_CODEC] = False) then
|
||||||
|
begin
|
||||||
|
Inc(Pos);
|
||||||
|
continue;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
Res := PInteger(Input + Pos)^;
|
Res := PInteger(Input + Pos)^;
|
||||||
for I := 1 to 3 do
|
for I := 1 to 3 do
|
||||||
begin
|
begin
|
||||||
|
@ -403,7 +611,7 @@ var
|
||||||
Res: Integer;
|
Res: Integer;
|
||||||
I: Integer;
|
I: Integer;
|
||||||
ZStream: z_streamp;
|
ZStream: z_streamp;
|
||||||
LastIn, LastOut: cardinal;
|
LastIn, LastOut: Cardinal;
|
||||||
begin
|
begin
|
||||||
Result := False;
|
Result := False;
|
||||||
Scan2Pos[Instance] := 0;
|
Scan2Pos[Instance] := 0;
|
||||||
|
@ -449,12 +657,13 @@ var
|
||||||
ZStream: z_streamp;
|
ZStream: z_streamp;
|
||||||
HR: Pointer;
|
HR: Pointer;
|
||||||
Verified: Boolean;
|
Verified: Boolean;
|
||||||
CRC: cardinal;
|
CRC: Cardinal;
|
||||||
begin
|
begin
|
||||||
Result := False;
|
Result := False;
|
||||||
X := GetBits(StreamInfo^.Option, 0, 5);
|
X := GetBits(StreamInfo^.Option, 0, 5);
|
||||||
if BoolArray(CodecAvailable, False) or (CodecAvailable[X] = False) then
|
if not X in [PNG_CODEC] then
|
||||||
exit;
|
if BoolArray(CodecAvailable, False) or (CodecAvailable[X] = False) then
|
||||||
|
exit;
|
||||||
case X of
|
case X of
|
||||||
ZLIB_CODEC:
|
ZLIB_CODEC:
|
||||||
begin
|
begin
|
||||||
|
@ -514,15 +723,12 @@ begin
|
||||||
end;
|
end;
|
||||||
if Result = False then
|
if Result = False then
|
||||||
begin
|
begin
|
||||||
if CodecEnabled[REFLATE_CODEC] or CodecEnabled[PREFLATE_CODEC] or
|
if CodecEnabled[REFLATE_CODEC] or CodecEnabled[PREFLATE_CODEC] then
|
||||||
CodecEnabled[GRITTIBANZLI_CODEC] then
|
|
||||||
begin
|
begin
|
||||||
if CodecEnabled[REFLATE_CODEC] then
|
if CodecEnabled[REFLATE_CODEC] then
|
||||||
SetBits(StreamInfo^.Option, REFLATE_CODEC, 0, 5)
|
SetBits(StreamInfo^.Option, REFLATE_CODEC, 0, 5)
|
||||||
else if CodecEnabled[PREFLATE_CODEC] then
|
else if CodecEnabled[PREFLATE_CODEC] then
|
||||||
SetBits(StreamInfo^.Option, PREFLATE_CODEC, 0, 5)
|
SetBits(StreamInfo^.Option, PREFLATE_CODEC, 0, 5);
|
||||||
else
|
|
||||||
SetBits(StreamInfo^.Option, GRITTIBANZLI_CODEC, 0, 5);
|
|
||||||
Result := ZlibProcess(Instance, Depth, OldInput, NewInput,
|
Result := ZlibProcess(Instance, Depth, OldInput, NewInput,
|
||||||
StreamInfo, Output, Funcs);
|
StreamInfo, Output, Funcs);
|
||||||
end;
|
end;
|
||||||
|
@ -595,20 +801,14 @@ begin
|
||||||
PChar(Params), StreamInfo^.OldSize, StreamInfo^.NewSize + Res2,
|
PChar(Params), StreamInfo^.OldSize, StreamInfo^.NewSize + Res2,
|
||||||
StreamInfo^.OldSize, Result);
|
StreamInfo^.OldSize, Result);
|
||||||
end;
|
end;
|
||||||
GRITTIBANZLI_CODEC:
|
PNG_CODEC:
|
||||||
begin
|
begin
|
||||||
Res1 := StreamInfo^.NewSize;
|
Buffer := Funcs^.Allocator(Instance, StreamInfo^.OldSize);
|
||||||
Res2 := G_HIFSIZE;
|
Params := '';
|
||||||
Buffer := Funcs^.Allocator(Instance, Res2);
|
if DecodePNG(NewInput, Buffer, StreamInfo^.OldSize) then
|
||||||
Params := 'w' + (GetBits(StreamInfo^.Option, 12, 3) + 8).ToString;
|
Result := CompareMem(OldInput, Buffer, StreamInfo^.OldSize);
|
||||||
if Grittibanzli(OldInput, StreamInfo^.OldSize, NewInput, @Res1, Buffer,
|
|
||||||
@Res2) then
|
|
||||||
begin
|
|
||||||
Output(Instance, Buffer, Res2);
|
|
||||||
Result := True;
|
|
||||||
end;
|
|
||||||
Funcs^.LogProcess(ZlibCodecs[GetBits(StreamInfo^.Option, 0, 5)],
|
Funcs^.LogProcess(ZlibCodecs[GetBits(StreamInfo^.Option, 0, 5)],
|
||||||
PChar(Params), StreamInfo^.OldSize, StreamInfo^.NewSize + Res2,
|
PChar(Params), StreamInfo^.OldSize, StreamInfo^.NewSize,
|
||||||
StreamInfo^.OldSize, Result);
|
StreamInfo^.OldSize, Result);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
@ -628,8 +828,9 @@ var
|
||||||
begin
|
begin
|
||||||
Result := False;
|
Result := False;
|
||||||
X := GetBits(StreamInfo.Option, 0, 5);
|
X := GetBits(StreamInfo.Option, 0, 5);
|
||||||
if BoolArray(CodecAvailable, False) or (CodecAvailable[X] = False) then
|
if not X in [PNG_CODEC] then
|
||||||
exit;
|
if BoolArray(CodecAvailable, False) or (CodecAvailable[X] = False) then
|
||||||
|
exit;
|
||||||
case X of
|
case X of
|
||||||
ZLIB_CODEC:
|
ZLIB_CODEC:
|
||||||
begin
|
begin
|
||||||
|
@ -711,20 +912,18 @@ begin
|
||||||
PChar(Params), StreamInfo.OldSize, StreamInfo.NewSize +
|
PChar(Params), StreamInfo.OldSize, StreamInfo.NewSize +
|
||||||
StreamInfo.ExtSize, Res1, Result);
|
StreamInfo.ExtSize, Res1, Result);
|
||||||
end;
|
end;
|
||||||
GRITTIBANZLI_CODEC:
|
PNG_CODEC:
|
||||||
begin
|
begin
|
||||||
Res1 := StreamInfo.OldSize;
|
Buffer := Funcs^.Allocator(Instance, StreamInfo.OldSize);
|
||||||
Buffer := Funcs^.Allocator(Instance, Res1);
|
Params := '';
|
||||||
Params := 'w' + (GetBits(StreamInfo.Option, 12, 3) + 8).ToString;
|
if DecodePNG(Input, Buffer, StreamInfo.OldSize) then
|
||||||
if Ungrittibanzli(Input, StreamInfo.NewSize, InputExt,
|
|
||||||
StreamInfo.ExtSize, Buffer, @Res1) then
|
|
||||||
begin
|
begin
|
||||||
Output(Instance, Buffer, Res1);
|
Output(Instance, Buffer, StreamInfo.OldSize);
|
||||||
Result := True;
|
Result := True;
|
||||||
end;
|
end;
|
||||||
Funcs^.LogRestore(ZlibCodecs[GetBits(StreamInfo.Option, 0, 5)],
|
Funcs^.LogRestore(ZlibCodecs[GetBits(StreamInfo.Option, 0, 5)],
|
||||||
PChar(Params), StreamInfo.OldSize, StreamInfo.NewSize +
|
PChar(Params), StreamInfo.OldSize, StreamInfo.NewSize,
|
||||||
StreamInfo.ExtSize, Res1, Result);
|
StreamInfo.OldSize, Result);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
|
@ -112,7 +112,7 @@ begin
|
||||||
S := Funcs^.GetCodec(Command, I, False);
|
S := Funcs^.GetCodec(Command, I, False);
|
||||||
if (CompareText(S, ZSTDCodecs[ZSTD_CODEC]) = 0) and ZSTDDLL.DLLLoaded then
|
if (CompareText(S, ZSTDCodecs[ZSTD_CODEC]) = 0) and ZSTDDLL.DLLLoaded then
|
||||||
begin
|
begin
|
||||||
SetBits(Option^, 0, 0, 5);
|
SetBits(Option^, ZSTD_CODEC, 0, 5);
|
||||||
if Funcs^.GetParam(Command, I, 'l') <> '' then
|
if Funcs^.GetParam(Command, I, 'l') <> '' then
|
||||||
SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7);
|
SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7);
|
||||||
Result := True;
|
Result := True;
|
||||||
|
|
10
xtool.dpr
10
xtool.dpr
|
@ -52,7 +52,6 @@ uses
|
||||||
oObjects in 'contrib\ParseExpression\oObjects.pas',
|
oObjects in 'contrib\ParseExpression\oObjects.pas',
|
||||||
ParseClass in 'contrib\ParseExpression\ParseClass.pas',
|
ParseClass in 'contrib\ParseExpression\ParseClass.pas',
|
||||||
ParseExpr in 'contrib\ParseExpression\ParseExpr.pas',
|
ParseExpr in 'contrib\ParseExpression\ParseExpr.pas',
|
||||||
GrittibanzliDLL in 'imports\GrittibanzliDLL.pas',
|
|
||||||
LZ4DLL in 'imports\LZ4DLL.pas',
|
LZ4DLL in 'imports\LZ4DLL.pas',
|
||||||
LZODLL in 'imports\LZODLL.pas',
|
LZODLL in 'imports\LZODLL.pas',
|
||||||
OodleDLL in 'imports\OodleDLL.pas',
|
OodleDLL in 'imports\OodleDLL.pas',
|
||||||
|
@ -155,6 +154,10 @@ begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ changelog
|
{ changelog
|
||||||
|
ES_R34 (0.5.3)
|
||||||
|
- added png stream preprocessor
|
||||||
|
- removed grittibanzli codec (since nobody uses it)
|
||||||
|
|
||||||
ES_R33 (0.5.2)
|
ES_R33 (0.5.2)
|
||||||
- added IO functions (archive, execute)
|
- added IO functions (archive, execute)
|
||||||
- fixed issue in patch io function
|
- fixed issue in patch io function
|
||||||
|
@ -392,6 +395,11 @@ end;
|
||||||
|
|
||||||
changelog }
|
changelog }
|
||||||
|
|
||||||
|
procedure EncodePNG(Input: PByte; Output: PByte);
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
const
|
const
|
||||||
BufferSize = 1048576;
|
BufferSize = 1048576;
|
||||||
|
|
||||||
|
|
|
@ -111,7 +111,6 @@
|
||||||
<DCCReference Include="contrib\ParseExpression\oObjects.pas"/>
|
<DCCReference Include="contrib\ParseExpression\oObjects.pas"/>
|
||||||
<DCCReference Include="contrib\ParseExpression\ParseClass.pas"/>
|
<DCCReference Include="contrib\ParseExpression\ParseClass.pas"/>
|
||||||
<DCCReference Include="contrib\ParseExpression\ParseExpr.pas"/>
|
<DCCReference Include="contrib\ParseExpression\ParseExpr.pas"/>
|
||||||
<DCCReference Include="imports\GrittibanzliDLL.pas"/>
|
|
||||||
<DCCReference Include="imports\LZ4DLL.pas"/>
|
<DCCReference Include="imports\LZ4DLL.pas"/>
|
||||||
<DCCReference Include="imports\LZODLL.pas"/>
|
<DCCReference Include="imports\LZODLL.pas"/>
|
||||||
<DCCReference Include="imports\OodleDLL.pas"/>
|
<DCCReference Include="imports\OodleDLL.pas"/>
|
||||||
|
|
Loading…
Reference in New Issue