diff -r 33a0e3a14ddc -r b0c34402038c hedgewars/uFLDrawnMap.pas --- a/hedgewars/uFLDrawnMap.pas Sat Dec 26 22:29:57 2015 +0300 +++ b/hedgewars/uFLDrawnMap.pas Fri Jan 01 19:14:59 2016 +0300 @@ -1,13 +1,58 @@ unit uFLDrawnMap; interface +uses SDLh; -function decodeDrawnMap(data: ansistring): ansistring; +procedure decodeDrawnMap(data: ansistring; dataSize: Longword; var mapData: PByteArray; var size: Longword); implementation -uses uUtils; +uses uUtils, zlib; + +procedure decodeDrawnMap(data: ansistring; dataSize: Longword; var mapData: PByteArray; var size: Longword); +var i, cl: Longword; + ul: uLong; + s: shortstring; + r: LongInt; + compressedBuf, uncompressedData: PByteArray; +begin + if dataSize = 0 then + begin + mapData:= nil; + size:= 0; + exit; + end; + + compressedBuf:= GetMem(dataSize * 3 div 4); + cl:= 0; + i:= 1; -function decodeDrawnMap(data: ansistring): ansistring; -begin + while i < dataSize do + begin + if dataSize - i > 240 then + s:= copy(data, i, 240) + else + s:= copy(data, i, dataSize - i + 1); + + s:= DecodeBase64(s); + Move(s[1], compressedBuf^[cl], byte(s[0])); + inc(i, 240); + inc(cl, byte(s[0])); + end; + + ul:= SDLNet_Read32(compressedBuf); + uncompressedData:= GetMem(ul); + r:= uncompress(pBytef(uncompressedData), @ul, @(compressedBuf^[4]), cl - 4); + FreeMem(compressedBuf, dataSize * 3 div 4); + + if r = Z_OK then + begin + mapData:= uncompressedData; + size:= ul + end else + begin + FreeMem(uncompressedData, ul); + mapData:= nil; + size:= 0 + end; end; end.