X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-editor.git;a=blobdiff_plain;f=src%2Fshared%2FWADEDITOR.pas;h=e68fd21bcdee1c7d63ced3b086fb58abf80cd09d;hp=26110093c33f149d023741811db89865be5183c5;hb=3dc2fe6b3d29cd54425db8f590e922f2dce50e99;hpb=212386359ea0af4e0a861f9bf92c45a1516ac87c diff --git a/src/shared/WADEDITOR.pas b/src/shared/WADEDITOR.pas index 2611009..e68fd21 100644 --- a/src/shared/WADEDITOR.pas +++ b/src/shared/WADEDITOR.pas @@ -75,7 +75,7 @@ const implementation uses - SysUtils, BinEditor, ZLib, utils; + SysUtils, BinEditor, ZLib, utils, e_log; const DFWAD_OPENED_NONE = 0; @@ -122,6 +122,41 @@ begin end; end; +procedure CompressBuf(const InBuf: Pointer; InBytes: Integer; + out OutBuf: Pointer; out OutBytes: Integer); +var + strm: TZStreamRec; + P: Pointer; +begin + FillChar(strm, sizeof(strm), 0); + OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255; + GetMem(OutBuf, OutBytes); + try + strm.next_in := InBuf; + strm.avail_in := InBytes; + strm.next_out := OutBuf; + strm.avail_out := OutBytes; + deflateInit_(strm, Z_BEST_COMPRESSION, zlib_version, sizeof(strm)); + try + while deflate(strm, Z_FINISH) <> Z_STREAM_END do + begin + P := OutBuf; + Inc(OutBytes, 256); + ReallocMem(OutBuf, OutBytes); + strm.next_out := PByteF(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P))); + strm.avail_out := 256; + end; + finally + deflateEnd(strm); + end; + ReallocMem(OutBuf, strm.total_out); + OutBytes := strm.total_out; + except + FreeMem(OutBuf); + raise + end; +end; + procedure g_ProcessResourceStr(ResourceStr: String; var FileName, SectionName, ResourceName: String); var @@ -220,8 +255,9 @@ begin ResCompressed := nil; ResCompressedSize := 0; - Compress(Data, @Len, ResCompressed, ResCompressedSize); + CompressBuf(Data, Len, ResCompressed, ResCompressedSize); if ResCompressed = nil then Exit; + e_WriteLog('Fuck me (D)', MSG_NOTIFY); if FResData = nil then FResData := AllocMem(ResCompressedSize) else ReallocMem(FResData, FDataSize+Cardinal(ResCompressedSize)); @@ -316,7 +352,7 @@ begin ResCompressed := nil; ResCompressedSize := 0; - Compress(TempResource, @OriginalSize, ResCompressed, ResCompressedSize); + CompressBuf(TempResource, OriginalSize, ResCompressed, ResCompressedSize); FreeMemory(TempResource); if ResCompressed = nil then Exit; @@ -600,8 +636,8 @@ begin else begin TempData := GetMemory(FResTable[i].Length); - CopyMemory(TempData, Pointer(LongWord(FResData)+FResTable[i].Address+6+ - LongWord(SizeOf(TWADHeaderRec_1)+SizeOf(TResourceTableRec_1)*Length(FResTable))), + CopyMemory(TempData, Pointer(PtrUInt(FResData)+FResTable[i].Address+6+ + PtrUInt(SizeOf(TWADHeaderRec_1)+SizeOf(TResourceTableRec_1)*Length(FResTable))), FResTable[i].Length); DecompressBuf(TempData, FResTable[i].Length, 0, pData, OutBytes); FreeMem(TempData); @@ -761,19 +797,19 @@ begin Exit; end; - CopyMemory(@FVersion, Pointer(LongWord(Data)+5), 1); + CopyMemory(@FVersion, Pointer(PtrUInt(Data)+5), 1); if FVersion <> DFWAD_VERSION then begin FLastError := DFWAD_ERROR_WRONGVERSION; Exit; end; - CopyMemory(@FHeader, Pointer(LongWord(Data)+6), SizeOf(TWADHeaderRec_1)); + CopyMemory(@FHeader, Pointer(PtrUInt(Data)+6), SizeOf(TWADHeaderRec_1)); SetLength(FResTable, FHeader.RecordsCount); if FResTable <> nil then begin - CopyMemory(@FResTable[0], Pointer(LongWord(Data)+6+SizeOf(TWADHeaderRec_1)), + CopyMemory(@FResTable[0], Pointer(PtrUInt(Data)+6+SizeOf(TWADHeaderRec_1)), SizeOf(TResourceTableRec_1)*FHeader.RecordsCount); for a := 0 to High(FResTable) do @@ -799,6 +835,8 @@ var begin if FResTable = nil then Exit; + e_WriteLog('Fuck me (B) ' + Section + ' ' + Resource, MSG_NOTIFY); + i := -1; b := 0; c := 0; @@ -824,6 +862,8 @@ begin if i = -1 then Exit; + e_WriteLog('Fuck me (C) ' + Section + ' ' + Resource, MSG_NOTIFY); + for a := i to High(FResTable)-1 do FResTable[a] := FResTable[a+1]; @@ -837,7 +877,7 @@ begin d := d+FResTable[a].Length; end; - CopyMemory(Pointer(LongWord(FResData)+c), Pointer(LongWord(FResData)+c+b), d); + CopyMemory(Pointer(PtrUInt(FResData)+c), Pointer(PtrUInt(FResData)+c+b), d); FDataSize := FDataSize-b; FOffset := FOffset-b;