diff options
| author | Matthew Hoops | 2011-08-20 16:41:10 -0400 | 
|---|---|---|
| committer | Matthew Hoops | 2011-08-20 16:41:10 -0400 | 
| commit | f408456d14b12152727be31fe00f61b028f18c3b (patch) | |
| tree | f13d81c1a63abf448edd10f0cbbcaa975621401a | |
| parent | 59200bf426cc85b9ec49865010a035ce214bb2bd (diff) | |
| download | scummvm-rg350-f408456d14b12152727be31fe00f61b028f18c3b.tar.gz scummvm-rg350-f408456d14b12152727be31fe00f61b028f18c3b.tar.bz2 scummvm-rg350-f408456d14b12152727be31fe00f61b028f18c3b.zip | |
COMMON: Add wrapper for inflating headerless zlib data
| -rw-r--r-- | common/zlib.cpp | 29 | ||||
| -rw-r--r-- | common/zlib.h | 9 | 
2 files changed, 38 insertions, 0 deletions
| diff --git a/common/zlib.cpp b/common/zlib.cpp index 86c618830e..70133fea30 100644 --- a/common/zlib.cpp +++ b/common/zlib.cpp @@ -49,6 +49,35 @@ bool uncompress(byte *dst, unsigned long *dstLen, const byte *src, unsigned long  	return Z_OK == ::uncompress(dst, dstLen, src, srcLen);  } +bool inflateZlibHeaderless(byte *dst, uint dstLen, const byte *src, uint srcLen) { +	if (!dst || !dstLen || !src || !srcLen) +		return false; + +	// Initialize zlib +	z_stream stream; +	stream.next_in = const_cast<byte *>(src); +	stream.avail_in = srcLen; +	stream.next_out = dst; +	stream.avail_out = dstLen; +	stream.zalloc = Z_NULL; +	stream.zfree = Z_NULL; +	stream.opaque = Z_NULL; + +	// Negative MAX_WBITS tells zlib there's no zlib header +	int err = inflateInit2(&stream, -MAX_WBITS); +	if (err != Z_OK) +		return false; + +	err = inflate(&stream, Z_SYNC_FLUSH); +	if (err != Z_OK && err != Z_STREAM_END) { +		inflateEnd(&stream); +		return false; +	} + +	inflateEnd(&stream); +	return true; +} +  /**   * A simple wrapper class which can be used to wrap around an arbitrary   * other SeekableReadStream and will then provide on-the-fly decompression support. diff --git a/common/zlib.h b/common/zlib.h index 1925034310..7af7df0da8 100644 --- a/common/zlib.h +++ b/common/zlib.h @@ -41,6 +41,15 @@ class WriteStream;   */  bool uncompress(byte *dst, unsigned long *dstLen, const byte *src, unsigned long srcLen); +/** + * Wrapper around zlib's inflate functions. This function will call the + * necessary inflate functions to uncompress data compressed with deflate + * but *not* with the standard zlib header. + * + * @return true on success (Z_OK or Z_STREAM_END), false otherwise + */ +bool inflateZlibHeaderless(byte *dst, uint dstLen, const byte *src, uint srcLen); +  #endif  /** | 
