--- 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.