hedgewars/uFLDrawnMap.pas
branchqmlfrontend
changeset 11480 b0c34402038c
parent 11462 33a0e3a14ddc
--- 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.