Browse Source

Add support for header-less DEFLATE data to love.data.compress/decompress.

Alex Szpakowski 7 years ago
parent
commit
3a2ffc5e07
2 changed files with 13 additions and 6 deletions
  1. 12 6
      src/modules/data/Compressor.cpp
  2. 1 0
      src/modules/data/Compressor.h

+ 12 - 6
src/modules/data/Compressor.cpp

@@ -198,6 +198,8 @@ private:
 		int windowbits = 15;
 		if (format == FORMAT_GZIP)
 			windowbits += 16; // This tells zlib to use a gzip header.
+		else if (format == FORMAT_DEFLATE)
+			windowbits = -windowbits;
 
 		int err = deflateInit2(&stream, level, Z_DEFLATED, windowbits, 8, Z_DEFAULT_STRATEGY);
 
@@ -217,7 +219,7 @@ private:
 		return deflateEnd(&stream);
 	}
 
-	int zlibDecompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)
+	int zlibDecompress(Format format, Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)
 	{
 		z_stream stream = {};
 
@@ -230,6 +232,9 @@ private:
 		// 15 is the default. Adding 32 makes zlib auto-detect the header type.
 		int windowbits = 15 + 32;
 
+		if (format == FORMAT_DEFLATE)
+			windowbits = -15;
+
 		int err = inflateInit2(&stream, windowbits);
 
 		if (err != Z_OK)
@@ -324,7 +329,7 @@ public:
 			}
 
 			uLongf destLen = (uLongf) rawsize;
-			int status = zlibDecompress((Bytef *) rawbytes, &destLen, (const Bytef *) data, (uLong) dataSize);
+			int status = zlibDecompress(format, (Bytef *) rawbytes, &destLen, (const Bytef *) data, (uLong) dataSize);
 
 			if (status == Z_OK)
 			{
@@ -348,7 +353,7 @@ public:
 
 	bool isSupported(Format format) const override
 	{
-		return format == FORMAT_ZLIB || format == FORMAT_GZIP;
+		return format == FORMAT_ZLIB || format == FORMAT_GZIP || format == FORMAT_DEFLATE;
 	}
 
 }; // zlibCompressor
@@ -386,9 +391,10 @@ std::vector<std::string> Compressor::getConstants(Format)
 
 StringMap<Compressor::Format, Compressor::FORMAT_MAX_ENUM>::Entry Compressor::formatEntries[] =
 {
-	{ "lz4",  FORMAT_LZ4  },
-	{ "zlib", FORMAT_ZLIB },
-	{ "gzip", FORMAT_GZIP },
+	{ "lz4",     FORMAT_LZ4     },
+	{ "zlib",    FORMAT_ZLIB    },
+	{ "gzip",    FORMAT_GZIP    },
+	{ "deflate", FORMAT_DEFLATE },
 };
 
 StringMap<Compressor::Format, Compressor::FORMAT_MAX_ENUM> Compressor::formatNames(Compressor::formatEntries, sizeof(Compressor::formatEntries));

+ 1 - 0
src/modules/data/Compressor.h

@@ -40,6 +40,7 @@ public:
 		FORMAT_LZ4,
 		FORMAT_ZLIB,
 		FORMAT_GZIP,
+		FORMAT_DEFLATE,
 		FORMAT_MAX_ENUM
 	};