From b7ed0e45b255d3d9dc9cf64486016cf607bdf936 Mon Sep 17 00:00:00 2001 From: Razor12911 Date: Sun, 22 May 2022 22:58:20 +0200 Subject: [PATCH] update to 0.5.3 --- imports/GrittibanzliDLL.pas | 52 ------ precompressor/PrecompLZ4.pas | 6 +- precompressor/PrecompLZO.pas | 2 +- precompressor/PrecompZLib.pas | 295 ++++++++++++++++++++++++++++------ precompressor/PrecompZSTD.pas | 2 +- xtool.dpr | 10 +- xtool.dproj | 1 - 7 files changed, 261 insertions(+), 107 deletions(-) delete mode 100644 imports/GrittibanzliDLL.pas diff --git a/imports/GrittibanzliDLL.pas b/imports/GrittibanzliDLL.pas deleted file mode 100644 index ed0a6ec..0000000 --- a/imports/GrittibanzliDLL.pas +++ /dev/null @@ -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. diff --git a/precompressor/PrecompLZ4.pas b/precompressor/PrecompLZ4.pas index 49ad8e0..f51b8b0 100644 --- a/precompressor/PrecompLZ4.pas +++ b/precompressor/PrecompLZ4.pas @@ -124,13 +124,13 @@ begin S := Funcs^.GetCodec(Command, I, False); if (CompareText(S, LZ4Codecs[LZ4_CODEC]) = 0) and LZ4DLL.DLLLoaded then begin - SetBits(Option^, 0, 0, 5); + SetBits(Option^, LZ4_CODEC, 0, 5); Result := True; end else if (CompareText(S, LZ4Codecs[LZ4HC_CODEC]) = 0) and LZ4DLL.DLLLoaded then begin - SetBits(Option^, 1, 0, 5); + SetBits(Option^, LZ4HC_CODEC, 0, 5); if Funcs^.GetParam(Command, I, 'l') <> '' then SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7); Result := True; @@ -138,7 +138,7 @@ begin else if (CompareText(S, LZ4Codecs[LZ4F_CODEC]) = 0) and LZ4DLL.DLLLoaded then begin - SetBits(Option^, 2, 0, 5); + SetBits(Option^, LZ4F_CODEC, 0, 5); if Funcs^.GetParam(Command, I, 'l') <> '' then SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7); if Funcs^.GetParam(Command, I, 'b') <> '' then diff --git a/precompressor/PrecompLZO.pas b/precompressor/PrecompLZO.pas index 20db38f..472fbcf 100644 --- a/precompressor/PrecompLZO.pas +++ b/precompressor/PrecompLZO.pas @@ -163,7 +163,7 @@ begin S := Funcs^.GetCodec(Command, I, False); if (CompareText(S, LZOCodecs[LZO1X_CODEC]) = 0) and LZODLL.DLLLoaded then begin - SetBits(Option^, 0, 0, 5); + SetBits(Option^, LZO1X_CODEC, 0, 5); SetBits(Option^, LZO1XVariant, 12, 5); if Funcs^.GetParam(Command, I, 'l') <> '' then SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7); diff --git a/precompressor/PrecompZLib.pas b/precompressor/PrecompZLib.pas index 1cac7ed..82b44ce 100644 --- a/precompressor/PrecompZLib.pas +++ b/precompressor/PrecompZLib.pas @@ -3,7 +3,7 @@ unit PrecompZLib; interface uses - ZLibDLL, ReflateDLL, PreflateDLL, GrittibanzliDLL, + ZLibDLL, ReflateDLL, PreflateDLL, Utils, PrecompUtils, System.SysUtils, System.StrUtils, System.Classes, System.Math; @@ -14,12 +14,12 @@ var implementation const - ZlibCodecs: array of PChar = ['zlib', 'reflate', 'preflate', 'grittibanzli']; + ZlibCodecs: array of PChar = ['zlib', 'reflate', 'preflate', 'png']; CODEC_COUNT = 4; ZLIB_CODEC = 0; REFLATE_CODEC = 1; PREFLATE_CODEC = 2; - GRITTIBANZLI_CODEC = 3; + PNG_CODEC = 3; const Z_WINBITS = 7; @@ -30,7 +30,6 @@ const R_LEVEL = 6; R_WORKMEM = 65536; P_HIFSIZE = 1048576; - G_HIFSIZE = 8338608; var SOList: array of array [0 .. CODEC_COUNT - 1] of TSOList; @@ -43,6 +42,196 @@ var Scan2Pos: TArray; Scan2SI: TArray; +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) : Boolean; var @@ -66,7 +255,7 @@ begin CodecAvailable[ZLIB_CODEC] := ZLibDLL.DLLLoaded; CodecAvailable[REFLATE_CODEC] := ReflateDLL.DLLLoaded; CodecAvailable[PREFLATE_CODEC] := PreflateDLL.DLLLoaded; - CodecAvailable[GRITTIBANZLI_CODEC] := GrittibanzliDLL.DLLLoaded; + CodecAvailable[PNG_CODEC] := True; X := 0; while Funcs^.GetCodec(Command, X, False) <> '' do begin @@ -92,9 +281,8 @@ begin else if (CompareText(S, ZlibCodecs[PREFLATE_CODEC]) = 0) and PreflateDLL.DLLLoaded then CodecEnabled[PREFLATE_CODEC] := True - else if (CompareText(S, ZlibCodecs[GRITTIBANZLI_CODEC]) = 0) and - GrittibanzliDLL.DLLLoaded then - CodecEnabled[GRITTIBANZLI_CODEC] := True; + else if (CompareText(S, ZlibCodecs[PNG_CODEC]) = 0) then + CodecEnabled[PNG_CODEC] := True; Inc(X); end; if CodecAvailable[ZLIB_CODEC] then @@ -193,7 +381,7 @@ begin S := Funcs^.GetCodec(Command, I, False); if (CompareText(S, ZlibCodecs[ZLIB_CODEC]) = 0) and ZLibDLL.DLLLoaded then begin - SetBits(Option^, 0, 0, 5); + SetBits(Option^, ZLIB_CODEC, 0, 5); if Funcs^.GetParam(Command, I, 'l') <> '' then SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7); if Funcs^.GetParam(Command, I, 'w') <> '' then @@ -204,7 +392,7 @@ begin else if (CompareText(S, ZlibCodecs[REFLATE_CODEC]) = 0) and ReflateDLL.DLLLoaded then begin - SetBits(Option^, 1, 0, 5); + SetBits(Option^, REFLATE_CODEC, 0, 5); if Funcs^.GetParam(Command, I, 'l') <> '' then SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7); Result := True; @@ -212,13 +400,12 @@ begin else if (CompareText(S, ZlibCodecs[PREFLATE_CODEC]) = 0) and PreflateDLL.DLLLoaded then begin - SetBits(Option^, 2, 0, 5); + SetBits(Option^, PREFLATE_CODEC, 0, 5); Result := True; end - else if (CompareText(S, ZlibCodecs[GRITTIBANZLI_CODEC]) = 0) and - GrittibanzliDLL.DLLLoaded then + else if (CompareText(S, ZlibCodecs[PNG_CODEC]) = 0) then begin - SetBits(Option^, 3, 0, 5); + SetBits(Option^, PNG_CODEC, 0, 5); Result := True; end; Inc(I); @@ -242,7 +429,7 @@ var SI: _StrInfo1; DI1, DI2: TDepthInfo; DS: TPrecompStr; - LastIn, LastOut: cardinal; + LastIn, LastOut: Cardinal; begin DI1 := Funcs^.GetDepthInfo(Instance); DS := Funcs^.GetCodec(DI1.Codec, 0, False); @@ -251,7 +438,7 @@ begin X := IndexTextW(@DS[0], ZlibCodecs); if (X < 0) or (DI1.OldSize <> SizeEx) then exit; - if not CodecAvailable[X] then + if CodecAvailable[X] then exit; end else if BoolArray(CodecEnabled, False) then @@ -261,6 +448,27 @@ begin IsZlib := False; while Pos < Size do 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)^; for I := 1 to 3 do begin @@ -403,7 +611,7 @@ var Res: Integer; I: Integer; ZStream: z_streamp; - LastIn, LastOut: cardinal; + LastIn, LastOut: Cardinal; begin Result := False; Scan2Pos[Instance] := 0; @@ -449,12 +657,13 @@ var ZStream: z_streamp; HR: Pointer; Verified: Boolean; - CRC: cardinal; + CRC: Cardinal; begin Result := False; X := GetBits(StreamInfo^.Option, 0, 5); - if BoolArray(CodecAvailable, False) or (CodecAvailable[X] = False) then - exit; + if not X in [PNG_CODEC] then + if BoolArray(CodecAvailable, False) or (CodecAvailable[X] = False) then + exit; case X of ZLIB_CODEC: begin @@ -514,15 +723,12 @@ begin end; if Result = False then begin - if CodecEnabled[REFLATE_CODEC] or CodecEnabled[PREFLATE_CODEC] or - CodecEnabled[GRITTIBANZLI_CODEC] then + if CodecEnabled[REFLATE_CODEC] or CodecEnabled[PREFLATE_CODEC] then begin if CodecEnabled[REFLATE_CODEC] then SetBits(StreamInfo^.Option, REFLATE_CODEC, 0, 5) else if CodecEnabled[PREFLATE_CODEC] then - SetBits(StreamInfo^.Option, PREFLATE_CODEC, 0, 5) - else - SetBits(StreamInfo^.Option, GRITTIBANZLI_CODEC, 0, 5); + SetBits(StreamInfo^.Option, PREFLATE_CODEC, 0, 5); Result := ZlibProcess(Instance, Depth, OldInput, NewInput, StreamInfo, Output, Funcs); end; @@ -595,20 +801,14 @@ begin PChar(Params), StreamInfo^.OldSize, StreamInfo^.NewSize + Res2, StreamInfo^.OldSize, Result); end; - GRITTIBANZLI_CODEC: + PNG_CODEC: begin - Res1 := StreamInfo^.NewSize; - Res2 := G_HIFSIZE; - Buffer := Funcs^.Allocator(Instance, Res2); - Params := 'w' + (GetBits(StreamInfo^.Option, 12, 3) + 8).ToString; - if Grittibanzli(OldInput, StreamInfo^.OldSize, NewInput, @Res1, Buffer, - @Res2) then - begin - Output(Instance, Buffer, Res2); - Result := True; - end; + Buffer := Funcs^.Allocator(Instance, StreamInfo^.OldSize); + Params := ''; + if DecodePNG(NewInput, Buffer, StreamInfo^.OldSize) then + Result := CompareMem(OldInput, Buffer, StreamInfo^.OldSize); Funcs^.LogProcess(ZlibCodecs[GetBits(StreamInfo^.Option, 0, 5)], - PChar(Params), StreamInfo^.OldSize, StreamInfo^.NewSize + Res2, + PChar(Params), StreamInfo^.OldSize, StreamInfo^.NewSize, StreamInfo^.OldSize, Result); end; end; @@ -628,8 +828,9 @@ var begin Result := False; X := GetBits(StreamInfo.Option, 0, 5); - if BoolArray(CodecAvailable, False) or (CodecAvailable[X] = False) then - exit; + if not X in [PNG_CODEC] then + if BoolArray(CodecAvailable, False) or (CodecAvailable[X] = False) then + exit; case X of ZLIB_CODEC: begin @@ -711,20 +912,18 @@ begin PChar(Params), StreamInfo.OldSize, StreamInfo.NewSize + StreamInfo.ExtSize, Res1, Result); end; - GRITTIBANZLI_CODEC: + PNG_CODEC: begin - Res1 := StreamInfo.OldSize; - Buffer := Funcs^.Allocator(Instance, Res1); - Params := 'w' + (GetBits(StreamInfo.Option, 12, 3) + 8).ToString; - if Ungrittibanzli(Input, StreamInfo.NewSize, InputExt, - StreamInfo.ExtSize, Buffer, @Res1) then + Buffer := Funcs^.Allocator(Instance, StreamInfo.OldSize); + Params := ''; + if DecodePNG(Input, Buffer, StreamInfo.OldSize) then begin - Output(Instance, Buffer, Res1); + Output(Instance, Buffer, StreamInfo.OldSize); Result := True; end; Funcs^.LogRestore(ZlibCodecs[GetBits(StreamInfo.Option, 0, 5)], - PChar(Params), StreamInfo.OldSize, StreamInfo.NewSize + - StreamInfo.ExtSize, Res1, Result); + PChar(Params), StreamInfo.OldSize, StreamInfo.NewSize, + StreamInfo.OldSize, Result); end; end; end; diff --git a/precompressor/PrecompZSTD.pas b/precompressor/PrecompZSTD.pas index f791421..8615493 100644 --- a/precompressor/PrecompZSTD.pas +++ b/precompressor/PrecompZSTD.pas @@ -112,7 +112,7 @@ begin S := Funcs^.GetCodec(Command, I, False); if (CompareText(S, ZSTDCodecs[ZSTD_CODEC]) = 0) and ZSTDDLL.DLLLoaded then begin - SetBits(Option^, 0, 0, 5); + SetBits(Option^, ZSTD_CODEC, 0, 5); if Funcs^.GetParam(Command, I, 'l') <> '' then SetBits(Option^, StrToInt(Funcs^.GetParam(Command, I, 'l')), 5, 7); Result := True; diff --git a/xtool.dpr b/xtool.dpr index 2415e83..bbe9006 100644 --- a/xtool.dpr +++ b/xtool.dpr @@ -52,7 +52,6 @@ uses oObjects in 'contrib\ParseExpression\oObjects.pas', ParseClass in 'contrib\ParseExpression\ParseClass.pas', ParseExpr in 'contrib\ParseExpression\ParseExpr.pas', - GrittibanzliDLL in 'imports\GrittibanzliDLL.pas', LZ4DLL in 'imports\LZ4DLL.pas', LZODLL in 'imports\LZODLL.pas', OodleDLL in 'imports\OodleDLL.pas', @@ -155,6 +154,10 @@ begin end; { changelog + ES_R34 (0.5.3) + - added png stream preprocessor + - removed grittibanzli codec (since nobody uses it) + ES_R33 (0.5.2) - added IO functions (archive, execute) - fixed issue in patch io function @@ -392,6 +395,11 @@ end; changelog } +procedure EncodePNG(Input: PByte; Output: PByte); +begin + +end; + const BufferSize = 1048576; diff --git a/xtool.dproj b/xtool.dproj index c38ec41..9936163 100644 --- a/xtool.dproj +++ b/xtool.dproj @@ -111,7 +111,6 @@ -