Visual Servoing Platform  version 3.6.1 under development (2024-04-30)
basisu_miniz.h
1 /* miniz.c v1.15 - deflate/inflate, zlib-subset, ZIP reading/writing/appending, PNG writing
2  Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt
3 
4  Forked from the public domain/unlicense version at: https://code.google.com/archive/p/miniz/
5 
6  Copyright (C) 2019-2021 Binomial LLC. All Rights Reserved.
7 
8  Licensed under the Apache License, Version 2.0 (the "License");
9  you may not use this file except in compliance with the License.
10  You may obtain a copy of the License at
11 
12  http://www.apache.org/licenses/LICENSE-2.0
13 
14  Unless required by applicable law or agreed to in writing, software
15  distributed under the License is distributed on an "AS IS" BASIS,
16  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  See the License for the specific language governing permissions and
18  limitations under the License.
19 */
20 
21 #ifndef MINIZ_HEADER_INCLUDED
22 #define MINIZ_HEADER_INCLUDED
23 
24 #include <stdlib.h>
25 
26 // Defines to completely disable specific portions of miniz.c:
27 // If all macros here are defined the only functionality remaining will be CRC-32, adler-32, tinfl, and tdefl.
28 
29 // Define MINIZ_NO_STDIO to disable all usage and any functions which rely on stdio for file I/O.
30 //#define MINIZ_NO_STDIO
31 
32 // If MINIZ_NO_TIME is specified then the ZIP archive functions will not be able to get the current time, or
33 // get/set file times, and the C run-time funcs that get/set times won't be called.
34 // The current downside is the times written to your archives will be from 1979.
35 //#define MINIZ_NO_TIME
36 
37 // Define MINIZ_NO_ARCHIVE_APIS to disable all ZIP archive API's.
38 //#define MINIZ_NO_ARCHIVE_APIS
39 
40 // Define MINIZ_NO_ARCHIVE_APIS to disable all writing related ZIP archive API's.
41 //#define MINIZ_NO_ARCHIVE_WRITING_APIS
42 
43 // Define MINIZ_NO_ZLIB_APIS to remove all ZLIB-style compression/decompression API's.
44 //#define MINIZ_NO_ZLIB_APIS
45 
46 // Define MINIZ_NO_ZLIB_COMPATIBLE_NAME to disable zlib names, to prevent conflicts against stock zlib.
47 //#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES
48 
49 // Define MINIZ_NO_MALLOC to disable all calls to malloc, free, and realloc.
50 // Note if MINIZ_NO_MALLOC is defined then the user must always provide custom user alloc/free/realloc
51 // callbacks to the zlib and archive API's, and a few stand-alone helper API's which don't provide custom user
52 // functions (such as tdefl_compress_mem_to_heap() and tinfl_decompress_mem_to_heap()) won't work.
53 //#define MINIZ_NO_MALLOC
54 
55 #if defined(__TINYC__) && (defined(__linux) || defined(__linux__))
56  // TODO: Work around "error: include file 'sys\utime.h' when compiling with tcc on Linux
57 #define MINIZ_NO_TIME
58 #endif
59 
60 #if !defined(MINIZ_NO_TIME) && !defined(MINIZ_NO_ARCHIVE_APIS)
61 #include <time.h>
62 #endif
63 
64 #if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__i386) || defined(__i486__) || defined(__i486) || defined(i386) || defined(__ia64__) || defined(__x86_64__)
65 // MINIZ_X86_OR_X64_CPU is only used to help set the below macros.
66 #define MINIZ_X86_OR_X64_CPU 1
67 #endif
68 
69 #if (__BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU
70 // Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian.
71 #define MINIZ_LITTLE_ENDIAN 1
72 #endif
73 
74 #if MINIZ_X86_OR_X64_CPU
75 // Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient integer loads and stores from unaligned addresses.
76 #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1
77 #endif
78 
79 // Using unaligned loads and stores causes errors when using UBSan. Jam it off.
80 #if defined(__has_feature)
81 #if __has_feature(undefined_behavior_sanitizer)
82 #undef MINIZ_USE_UNALIGNED_LOADS_AND_STORES
83 #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 0
84 #endif
85 #endif
86 
87 #if defined(_M_X64) || defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__) || defined(__ia64__) || defined(__x86_64__)
88 // Set MINIZ_HAS_64BIT_REGISTERS to 1 if operations on 64-bit integers are reasonably fast (and don't involve compiler generated calls to helper functions).
89 #define MINIZ_HAS_64BIT_REGISTERS 1
90 #endif
91 
92 namespace buminiz
93 {
94 
95 // ------------------- zlib-style API Definitions.
96 
97 // For more compatibility with zlib, miniz.c uses unsigned long for some parameters/struct members. Beware: mz_ulong can be either 32 or 64-bits!
98 typedef unsigned long mz_ulong;
99 
100 // mz_free() internally uses the MZ_FREE() macro (which by default calls free() unless you've modified the MZ_MALLOC macro) to release a block allocated from the heap.
101 void mz_free(void *p);
102 
103 #define MZ_ADLER32_INIT (1)
104 // mz_adler32() returns the initial adler-32 value to use when called with ptr==NULL.
105 mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len);
106 
107 #define MZ_CRC32_INIT (0)
108 // mz_crc32() returns the initial CRC-32 value to use when called with ptr==NULL.
109 mz_ulong mz_crc32(mz_ulong crc, const unsigned char *ptr, size_t buf_len);
110 
111 // Compression strategies.
113 
114 // Method
115 #define MZ_DEFLATED 8
116 
117 #ifndef MINIZ_NO_ZLIB_APIS
118 
119 // Heap allocation callbacks.
120 // Note that mz_alloc_func parameter types purpsosely differ from zlib's: items/size is size_t, not unsigned long.
121 typedef void *(*mz_alloc_func)(void *opaque, size_t items, size_t size);
122 typedef void (*mz_free_func)(void *opaque, void *address);
123 typedef void *(*mz_realloc_func)(void *opaque, void *address, size_t items, size_t size);
124 
125 #define MZ_VERSION "9.1.15"
126 #define MZ_VERNUM 0x91F0
127 #define MZ_VER_MAJOR 9
128 #define MZ_VER_MINOR 1
129 #define MZ_VER_REVISION 15
130 #define MZ_VER_SUBREVISION 0
131 
132 // Flush values. For typical usage you only need MZ_NO_FLUSH and MZ_FINISH. The other values are for advanced use (refer to the zlib docs).
134 
135 // Return status codes. MZ_PARAM_ERROR is non-standard.
137 
138 // Compression levels: 0-9 are the standard zlib-style levels, 10 is best possible compression (not zlib compatible, and may be very slow), MZ_DEFAULT_COMPRESSION=MZ_DEFAULT_LEVEL.
140 
141 // Window bits
142 #define MZ_DEFAULT_WINDOW_BITS 15
143 
144 struct mz_internal_state;
145 
146 // Compression/decompression stream struct.
147 typedef struct mz_stream_s
148 {
149  const unsigned char *next_in; // pointer to next byte to read
150  unsigned int avail_in; // number of bytes available at next_in
151  mz_ulong total_in; // total number of bytes consumed so far
152 
153  unsigned char *next_out; // pointer to next byte to write
154  unsigned int avail_out; // number of bytes that can be written to next_out
155  mz_ulong total_out; // total number of bytes produced so far
156 
157  char *msg; // error msg (unused)
158  struct mz_internal_state *state; // internal state, allocated by zalloc/zfree
159 
160  mz_alloc_func zalloc; // optional heap allocation function (defaults to malloc)
161  mz_free_func zfree; // optional heap free function (defaults to free)
162  void *opaque; // heap alloc function user pointer
163 
164  int data_type; // data_type (unused)
165  mz_ulong adler; // adler32 of the source or uncompressed data
166  mz_ulong reserved; // not used
168 
170 
171 // Returns the version string of miniz.c.
172 const char *mz_version(void);
173 
174 // mz_deflateInit() initializes a compressor with default options:
175 // Parameters:
176 // pStream must point to an initialized mz_stream struct.
177 // level must be between [MZ_NO_COMPRESSION, MZ_BEST_COMPRESSION].
178 // level 1 enables a specially optimized compression function that's been optimized purely for performance, not ratio.
179 // (This special func. is currently only enabled when MINIZ_USE_UNALIGNED_LOADS_AND_STORES and MINIZ_LITTLE_ENDIAN are defined.)
180 // Return values:
181 // MZ_OK on success.
182 // MZ_STREAM_ERROR if the stream is bogus.
183 // MZ_PARAM_ERROR if the input parameters are bogus.
184 // MZ_MEM_ERROR on out of memory.
185 int mz_deflateInit(mz_streamp pStream, int level);
186 
187 // mz_deflateInit2() is like mz_deflate(), except with more control:
188 // Additional parameters:
189 // method must be MZ_DEFLATED
190 // window_bits must be MZ_DEFAULT_WINDOW_BITS (to wrap the deflate stream with zlib header/adler-32 footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate/no header or footer)
191 // mem_level must be between [1, 9] (it's checked but ignored by miniz.c)
192 int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy);
193 
194 // Quickly resets a compressor without having to reallocate anything. Same as calling mz_deflateEnd() followed by mz_deflateInit()/mz_deflateInit2().
195 int mz_deflateReset(mz_streamp pStream);
196 
197 // mz_deflate() compresses the input to output, consuming as much of the input and producing as much output as possible.
198 // Parameters:
199 // pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members.
200 // flush may be MZ_NO_FLUSH, MZ_PARTIAL_FLUSH/MZ_SYNC_FLUSH, MZ_FULL_FLUSH, or MZ_FINISH.
201 // Return values:
202 // MZ_OK on success (when flushing, or if more input is needed but not available, and/or there's more output to be written but the output buffer is full).
203 // MZ_STREAM_END if all input has been consumed and all output bytes have been written. Don't call mz_deflate() on the stream anymore.
204 // MZ_STREAM_ERROR if the stream is bogus.
205 // MZ_PARAM_ERROR if one of the parameters is invalid.
206 // MZ_BUF_ERROR if no forward progress is possible because the input and/or output buffers are empty. (Fill up the input buffer or free up some output space and try again.)
207 int mz_deflate(mz_streamp pStream, int flush);
208 
209 // mz_deflateEnd() deinitializes a compressor:
210 // Return values:
211 // MZ_OK on success.
212 // MZ_STREAM_ERROR if the stream is bogus.
213 int mz_deflateEnd(mz_streamp pStream);
214 
215 // mz_deflateBound() returns a (very) conservative upper bound on the amount of data that could be generated by deflate(), assuming flush is set to only MZ_NO_FLUSH or MZ_FINISH.
216 mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len);
217 
218 // Single-call compression functions mz_compress() and mz_compress2():
219 // Returns MZ_OK on success, or one of the error codes from mz_deflate() on failure.
220 int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len);
221 int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level);
222 
223 // mz_compressBound() returns a (very) conservative upper bound on the amount of data that could be generated by calling mz_compress().
225 
226 // Initializes a decompressor.
227 int mz_inflateInit(mz_streamp pStream);
228 
229 // mz_inflateInit2() is like mz_inflateInit() with an additional option that controls the window size and whether or not the stream has been wrapped with a zlib header/footer:
230 // window_bits must be MZ_DEFAULT_WINDOW_BITS (to parse zlib header/footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate).
231 int mz_inflateInit2(mz_streamp pStream, int window_bits);
232 
233 // Decompresses the input stream to the output, consuming only as much of the input as needed, and writing as much to the output as possible.
234 // Parameters:
235 // pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members.
236 // flush may be MZ_NO_FLUSH, MZ_SYNC_FLUSH, or MZ_FINISH.
237 // On the first call, if flush is MZ_FINISH it's assumed the input and output buffers are both sized large enough to decompress the entire stream in a single call (this is slightly faster).
238 // MZ_FINISH implies that there are no more source bytes available beside what's already in the input buffer, and that the output buffer is large enough to hold the rest of the decompressed data.
239 // Return values:
240 // MZ_OK on success. Either more input is needed but not available, and/or there's more output to be written but the output buffer is full.
241 // MZ_STREAM_END if all needed input has been consumed and all output bytes have been written. For zlib streams, the adler-32 of the decompressed data has also been verified.
242 // MZ_STREAM_ERROR if the stream is bogus.
243 // MZ_DATA_ERROR if the deflate stream is invalid.
244 // MZ_PARAM_ERROR if one of the parameters is invalid.
245 // MZ_BUF_ERROR if no forward progress is possible because the input buffer is empty but the inflater needs more input to continue, or if the output buffer is not large enough. Call mz_inflate() again
246 // with more input data, or with more room in the output buffer (except when using single call decompression, described above).
247 int mz_inflate(mz_streamp pStream, int flush);
248 int mz_inflate2(mz_streamp pStream, int flush, int adler32_checking);
249 
250 // Deinitializes a decompressor.
251 int mz_inflateEnd(mz_streamp pStream);
252 
253 // Single-call decompression.
254 // Returns MZ_OK on success, or one of the error codes from mz_inflate() on failure.
255 int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len);
256 
257 // Returns a string description of the specified error code, or NULL if the error code is invalid.
258 const char *mz_error(int err);
259 
260 // Redefine zlib-compatible names to miniz equivalents, so miniz.c can be used as a drop-in replacement for the subset of zlib that miniz.c supports.
261 // Define MINIZ_NO_ZLIB_COMPATIBLE_NAMES to disable zlib-compatibility if you use zlib in the same project.
262 #ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES
263 typedef unsigned char Byte;
264 typedef unsigned int uInt;
265 typedef mz_ulong uLong;
266 typedef Byte Bytef;
267 typedef uInt uIntf;
268 typedef char charf;
269 typedef int intf;
270 typedef void *voidpf;
271 typedef uLong uLongf;
272 typedef void *voidp;
273 typedef void *const voidpc;
274 #define Z_NULL 0
275 #define Z_NO_FLUSH MZ_NO_FLUSH
276 #define Z_PARTIAL_FLUSH MZ_PARTIAL_FLUSH
277 #define Z_SYNC_FLUSH MZ_SYNC_FLUSH
278 #define Z_FULL_FLUSH MZ_FULL_FLUSH
279 #define Z_FINISH MZ_FINISH
280 #define Z_BLOCK MZ_BLOCK
281 #define Z_OK MZ_OK
282 #define Z_STREAM_END MZ_STREAM_END
283 #define Z_NEED_DICT MZ_NEED_DICT
284 #define Z_ERRNO MZ_ERRNO
285 #define Z_STREAM_ERROR MZ_STREAM_ERROR
286 #define Z_DATA_ERROR MZ_DATA_ERROR
287 #define Z_MEM_ERROR MZ_MEM_ERROR
288 #define Z_BUF_ERROR MZ_BUF_ERROR
289 #define Z_VERSION_ERROR MZ_VERSION_ERROR
290 #define Z_PARAM_ERROR MZ_PARAM_ERROR
291 #define Z_NO_COMPRESSION MZ_NO_COMPRESSION
292 #define Z_BEST_SPEED MZ_BEST_SPEED
293 #define Z_BEST_COMPRESSION MZ_BEST_COMPRESSION
294 #define Z_DEFAULT_COMPRESSION MZ_DEFAULT_COMPRESSION
295 #define Z_DEFAULT_STRATEGY MZ_DEFAULT_STRATEGY
296 #define Z_FILTERED MZ_FILTERED
297 #define Z_HUFFMAN_ONLY MZ_HUFFMAN_ONLY
298 #define Z_RLE MZ_RLE
299 #define Z_FIXED MZ_FIXED
300 #define Z_DEFLATED MZ_DEFLATED
301 #define Z_DEFAULT_WINDOW_BITS MZ_DEFAULT_WINDOW_BITS
302 #define alloc_func mz_alloc_func
303 #define free_func mz_free_func
304 #define internal_state mz_internal_state
305 #define z_stream mz_stream
306 #define deflateInit mz_deflateInit
307 #define deflateInit2 mz_deflateInit2
308 #define deflateReset mz_deflateReset
309 #define deflate mz_deflate
310 #define deflateEnd mz_deflateEnd
311 #define deflateBound mz_deflateBound
312 #define compress mz_compress
313 #define compress2 mz_compress2
314 #define compressBound mz_compressBound
315 #define inflateInit mz_inflateInit
316 #define inflateInit2 mz_inflateInit2
317 #define inflate mz_inflate
318 #define inflateEnd mz_inflateEnd
319 #define uncompress mz_uncompress
320 #define crc32 mz_crc32
321 #define adler32 mz_adler32
322 #define MAX_WBITS 15
323 #define MAX_MEM_LEVEL 9
324 #define zError mz_error
325 #define ZLIB_VERSION MZ_VERSION
326 #define ZLIB_VERNUM MZ_VERNUM
327 #define ZLIB_VER_MAJOR MZ_VER_MAJOR
328 #define ZLIB_VER_MINOR MZ_VER_MINOR
329 #define ZLIB_VER_REVISION MZ_VER_REVISION
330 #define ZLIB_VER_SUBREVISION MZ_VER_SUBREVISION
331 #define zlibVersion mz_version
332 #define zlib_version mz_version()
333 #endif // #ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES
334 
335 #endif // MINIZ_NO_ZLIB_APIS
336 
337 // ------------------- Types and macros
338 
339 typedef unsigned char mz_uint8;
340 typedef signed short mz_int16;
341 typedef unsigned short mz_uint16;
342 typedef unsigned int mz_uint32;
343 typedef unsigned int mz_uint;
344 typedef long long mz_int64;
345 typedef unsigned long long mz_uint64;
346 typedef int mz_bool;
347 
348 #define MZ_FALSE (0)
349 #define MZ_TRUE (1)
350 
351 // An attempt to work around MSVC's spammy "warning C4127: conditional expression is constant" message.
352 #ifdef _MSC_VER
353 #define MZ_MACRO_END while (0, 0)
354 #else
355 #define MZ_MACRO_END while (0)
356 #endif
357 
358 // ------------------- Low-level Decompression API Definitions
359 
360 // Decompression flags used by tinfl_decompress().
361 // TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and ends with an adler32 checksum (it's a valid zlib stream). Otherwise, the input is a raw deflate stream.
362 // TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available beyond the end of the supplied input buffer. If clear, the input buffer contains all remaining input.
363 // TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large enough to hold the entire decompressed stream. If clear, the output buffer is at least the size of the dictionary (typically 32KB).
364 // TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the decompressed bytes.
365 enum
366 {
371 };
372 
373 // High level decompression functions:
374 // tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block allocated via malloc().
375 // On entry:
376 // pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data to decompress.
377 // On return:
378 // Function returns a pointer to the decompressed data, or NULL on failure.
379 // *pOut_len will be set to the decompressed data's size, which could be larger than src_buf_len on uncompressible data.
380 // The caller must call mz_free() on the returned block when it's no longer needed.
381 void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags);
382 
383 // tinfl_decompress_mem_to_mem() decompresses a block in memory to another block in memory.
384 // Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes written on success.
385 #define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1))
386 size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags);
387 
388 // tinfl_decompress_mem_to_callback() decompresses a block in memory to an internal 32KB buffer, and a user provided callback function will be called to flush the buffer.
389 // Returns 1 on success or 0 on failure.
390 typedef int (*tinfl_put_buf_func_ptr)(const void *pBuf, int len, void *pUser);
391 int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags);
392 
394 
395 // Max size of LZ dictionary.
396 #define TINFL_LZ_DICT_SIZE 32768
397 
398 // Return status.
399 typedef enum
400 {
408 
409 // Initializes the decompressor to its initial state.
410 #define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END
411 #define tinfl_get_adler32(r) (r)->m_check_adler32
412 
413 // Main low-level decompressor coroutine function. This is the only function actually needed for decompression. All the other functions are just high-level helpers for improved usability.
414 // This is a universal API, i.e. it can be used as a building block to build any desired higher level decompression API. In the limit case, it can be called once per every byte input or output.
415 tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags);
416 
417 // Internal/private bits follow.
418 enum
419 {
422 };
423 
424 typedef struct
425 {
429 
430 #if MINIZ_HAS_64BIT_REGISTERS
431 #define TINFL_USE_64BIT_BITBUF 1
432 #endif
433 
434 #if TINFL_USE_64BIT_BITBUF
435 typedef mz_uint64 tinfl_bit_buf_t;
436 #define TINFL_BITBUF_SIZE (64)
437 #else
439 #define TINFL_BITBUF_SIZE (32)
440 #endif
441 
443 {
449 };
450 
451 // ------------------- Low-level Compression API Definitions
452 
453 // Set TDEFL_LESS_MEMORY to 1 to use less memory (compression will be slightly slower, and raw/dynamic blocks will be output more frequently).
454 #define TDEFL_LESS_MEMORY 0
455 
456 // tdefl_init() compression flags logically OR'd together (low 12 bits contain the max. number of probes per dictionary search):
457 // TDEFL_DEFAULT_MAX_PROBES: The compressor defaults to 128 dictionary probes per dictionary search. 0=Huffman only, 1=Huffman+LZ (fastest/crap compression), 4095=Huffman+LZ (slowest/best compression).
458 enum
459 {
461 };
462 
463 // TDEFL_WRITE_ZLIB_HEADER: If set, the compressor outputs a zlib header before the deflate data, and the Adler-32 of the source data at the end. Otherwise, you'll get raw deflate data.
464 // TDEFL_COMPUTE_ADLER32: Always compute the adler-32 of the input data (even when not writing zlib headers).
465 // TDEFL_GREEDY_PARSING_FLAG: Set to use faster greedy parsing, instead of more efficient lazy parsing.
466 // TDEFL_NONDETERMINISTIC_PARSING_FLAG: Enable to decrease the compressor's initialization time to the minimum, but the output may vary from run to run given the same input (depending on the contents of memory).
467 // TDEFL_RLE_MATCHES: Only look for RLE matches (matches with a distance of 1)
468 // TDEFL_FILTER_MATCHES: Discards matches <= 5 chars if enabled.
469 // TDEFL_FORCE_ALL_STATIC_BLOCKS: Disable usage of optimized Huffman tables.
470 // TDEFL_FORCE_ALL_RAW_BLOCKS: Only use raw (uncompressed) deflate blocks.
471 // The low 12 bits are reserved to control the max # of hash probes per dictionary lookup (see TDEFL_MAX_PROBES_MASK).
472 enum
473 {
478  TDEFL_RLE_MATCHES = 0x10000,
482 };
483 
484 // High level compression functions:
485 // tdefl_compress_mem_to_heap() compresses a block in memory to a heap block allocated via malloc().
486 // On entry:
487 // pSrc_buf, src_buf_len: Pointer and size of source block to compress.
488 // flags: The max match finder probes (default is 128) logically OR'd against the above flags. Higher probes are slower but improve compression.
489 // On return:
490 // Function returns a pointer to the compressed data, or NULL on failure.
491 // *pOut_len will be set to the compressed data's size, which could be larger than src_buf_len on uncompressible data.
492 // The caller must free() the returned block when it's no longer needed.
493 void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags);
494 
495 // tdefl_compress_mem_to_mem() compresses a block in memory to another block in memory.
496 // Returns 0 on failure.
497 size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags);
498 
499 // Compresses an image to a compressed PNG file in memory.
500 // On entry:
501 // pImage, w, h, and num_chans describe the image to compress. num_chans may be 1, 2, 3, or 4.
502 // The image pitch in bytes per scanline will be w*num_chans. The leftmost pixel on the top scanline is stored first in memory.
503 // level may range from [0,10], use MZ_NO_COMPRESSION, MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc. or a decent default is MZ_DEFAULT_LEVEL
504 // If flip is true, the image will be flipped on the Y axis (useful for OpenGL apps).
505 // On return:
506 // Function returns a pointer to the compressed data, or NULL on failure.
507 // *pLen_out will be set to the size of the PNG image file.
508 // The caller must mz_free() the returned heap block (which will typically be larger than *pLen_out) when it's no longer needed.
509 void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, size_t *pLen_out, mz_uint level, mz_bool flip);
510 void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out);
511 
512 // Output stream interface. The compressor uses this interface to write compressed data. It'll typically be called TDEFL_OUT_BUF_SIZE at a time.
513 typedef mz_bool(*tdefl_put_buf_func_ptr)(const void *pBuf, int len, void *pUser);
514 
515 // tdefl_compress_mem_to_output() compresses a block to an output stream. The above helpers use this function internally.
516 mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags);
517 
519 
520 // TDEFL_OUT_BUF_SIZE MUST be large enough to hold a single entire compressed output block (using static/fixed Huffman codes).
521 #if TDEFL_LESS_MEMORY
523 #else
525 #endif
526 
527 // The low-level tdefl functions below may be used directly if the above helper functions aren't flexible enough. The low-level functions don't make any heap allocations, unlike the above helper functions.
528 typedef enum
529 {
534 } tdefl_status;
535 
536 // Must map to MZ_NO_FLUSH, MZ_SYNC_FLUSH, etc. enums
537 typedef enum
538 {
542  TDEFL_FINISH = 4
544 
545 // tdefl's compression state structure.
546 typedef struct
547 {
550  mz_uint m_flags, m_max_probes[2];
552  mz_uint m_adler32, m_lookahead_pos, m_lookahead_size, m_dict_size;
553  mz_uint8 *m_pLZ_code_buf, *m_pLZ_flags, *m_pOutput_buf, *m_pOutput_buf_end;
554  mz_uint m_num_flags_left, m_total_lz_bytes, m_lz_code_buf_dict_pos, m_bits_in, m_bit_buffer;
555  mz_uint m_saved_match_dist, m_saved_match_len, m_saved_lit, m_output_flush_ofs, m_output_flush_remaining, m_finished, m_block_index, m_wants_to_finish;
557  const void *m_pIn_buf;
558  void *m_pOut_buf;
559  size_t *m_pIn_buf_size, *m_pOut_buf_size;
561  const mz_uint8 *m_pSrc;
562  size_t m_src_buf_left, m_out_buf_ofs;
572 
573 // Initializes the compressor.
574 // There is no corresponding deinit() function because the tdefl API's do not dynamically allocate memory.
575 // pBut_buf_func: If NULL, output data will be supplied to the specified callback. In this case, the user should call the tdefl_compress_buffer() API for compression.
576 // If pBut_buf_func is NULL the user should always call the tdefl_compress() API.
577 // flags: See the above enums (TDEFL_HUFFMAN_ONLY, TDEFL_WRITE_ZLIB_HEADER, etc.)
578 tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags);
579 
580 // Compresses a block of data, consuming as much of the specified input buffer as possible, and writing as much compressed data to the specified output buffer as possible.
581 tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush);
582 
583 // tdefl_compress_buffer() is only usable when the tdefl_init() is called with a non-NULL tdefl_put_buf_func_ptr.
584 // tdefl_compress_buffer() always consumes the entire input buffer.
585 tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush);
586 
589 
590 // Can't use tdefl_create_comp_flags_from_zip_params if MINIZ_NO_ZLIB_APIS isn't defined, because it uses some of its macros.
591 #ifndef MINIZ_NO_ZLIB_APIS
592 // Create tdefl_compress() flags given zlib-style compression parameters.
593 // level may range from [0,10] (where 10 is absolute max compression, but may be much slower on some files)
594 // window_bits may be -15 (raw deflate) or 15 (zlib)
595 // strategy may be either MZ_DEFAULT_STRATEGY, MZ_FILTERED, MZ_HUFFMAN_ONLY, MZ_RLE, or MZ_FIXED
596 mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy);
597 #endif // #ifndef MINIZ_NO_ZLIB_APIS
598 
599 } // namespace buminiz
600 
601 #endif // MINIZ_HEADER_INCLUDED
602 
603 // ------------------- End of Header: Implementation follows. (If you only want the header, define MINIZ_HEADER_FILE_ONLY.)
604 
605 #ifndef MINIZ_HEADER_FILE_ONLY
606 
607 #include <string.h>
608 #include <assert.h>
609 
610 namespace buminiz
611 {
612 
613 typedef unsigned char mz_validate_uint16[sizeof(mz_uint16)==2 ? 1 : -1];
614 typedef unsigned char mz_validate_uint32[sizeof(mz_uint32)==4 ? 1 : -1];
615 typedef unsigned char mz_validate_uint64[sizeof(mz_uint64)==8 ? 1 : -1];
616 
617 #define MZ_ASSERT(x) assert(x)
618 
619 #ifdef MINIZ_NO_MALLOC
620 #define MZ_MALLOC(x) NULL
621 #define MZ_FREE(x) (void)x, ((void)0)
622 #define MZ_REALLOC(p, x) NULL
623 #else
624 #define MZ_MALLOC(x) malloc(x)
625 #define MZ_FREE(x) free(x)
626 #define MZ_REALLOC(p, x) realloc(p, x)
627 #endif
628 
629 #define MZ_MAX(a,b) (((a)>(b))?(a):(b))
630 #define MZ_MIN(a,b) (((a)<(b))?(a):(b))
631 #define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj))
632 
633 #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
634 #define MZ_READ_LE16(p) *((const mz_uint16 *)(p))
635 #define MZ_READ_LE32(p) *((const mz_uint32 *)(p))
636 #else
637 #define MZ_READ_LE16(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U))
638 #define MZ_READ_LE32(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) | ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U))
639 #endif
640 
641 #ifdef _MSC_VER
642 #define MZ_FORCEINLINE __forceinline
643 #elif defined(__GNUC__)
644 #define MZ_FORCEINLINE inline __attribute__((__always_inline__))
645 #else
646 #define MZ_FORCEINLINE inline
647 #endif
648 
649 // ------------------- zlib-style API's
650 
651 mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len)
652 {
653  mz_uint32 i, s1 = (mz_uint32)(adler & 0xffff), s2 = (mz_uint32)(adler >> 16); size_t block_len = buf_len % 5552;
654  if (!ptr) return MZ_ADLER32_INIT;
655  while (buf_len) {
656  for (i = 0; i + 7 < block_len; i += 8, ptr += 8) {
657  s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1;
658  s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1;
659  }
660  for (; i < block_len; ++i) s1 += *ptr++, s2 += s1;
661  s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552;
662  }
663  return (s2 << 16) + s1;
664 }
665 
666 // Karl Malbrain's compact CRC-32. See "A compact CCITT crc16 and crc32 C implementation that balances processor cache usage against speed": http://www.geocities.com/malbrain/
667 mz_ulong mz_crc32(mz_ulong crc, const mz_uint8 *ptr, size_t buf_len)
668 {
669  static const mz_uint32 s_crc32[16] = { 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
670  0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c };
671  mz_uint32 crcu32 = (mz_uint32)crc;
672  if (!ptr) return MZ_CRC32_INIT;
673  crcu32 = ~crcu32; while (buf_len--) { mz_uint8 b = *ptr++; crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)]; crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)]; }
674  return ~crcu32;
675 }
676 
677 void mz_free(void *p)
678 {
679  MZ_FREE(p);
680 }
681 
682 #ifndef MINIZ_NO_ZLIB_APIS
683 
684 static void *def_alloc_func(void *opaque, size_t items, size_t size) { (void)opaque, (void)items, (void)size; return MZ_MALLOC(items * size); }
685 static void def_free_func(void *opaque, void *address) { (void)opaque, (void)address; MZ_FREE(address); }
686 //static void *def_realloc_func(void *opaque, void *address, size_t items, size_t size) { (void)opaque, (void)address, (void)items, (void)size; return MZ_REALLOC(address, items * size); }
687 
688 const char *mz_version(void)
689 {
690  return MZ_VERSION;
691 }
692 
693 int mz_deflateInit(mz_streamp pStream, int level)
694 {
695  return mz_deflateInit2(pStream, level, MZ_DEFLATED, MZ_DEFAULT_WINDOW_BITS, 9, MZ_DEFAULT_STRATEGY);
696 }
697 
698 int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy)
699 {
700  tdefl_compressor *pComp;
701  mz_uint comp_flags = TDEFL_COMPUTE_ADLER32 | tdefl_create_comp_flags_from_zip_params(level, window_bits, strategy);
702 
703  if (!pStream) return MZ_STREAM_ERROR;
704  if ((method != MZ_DEFLATED) || ((mem_level < 1) || (mem_level > 9)) || ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS))) return MZ_PARAM_ERROR;
705 
706  pStream->data_type = 0;
707  pStream->adler = MZ_ADLER32_INIT;
708  pStream->msg = NULL;
709  pStream->reserved = 0;
710  pStream->total_in = 0;
711  pStream->total_out = 0;
712  if (!pStream->zalloc) pStream->zalloc = def_alloc_func;
713  if (!pStream->zfree) pStream->zfree = def_free_func;
714 
715  pComp = (tdefl_compressor *)pStream->zalloc(pStream->opaque, 1, sizeof(tdefl_compressor));
716  if (!pComp)
717  return MZ_MEM_ERROR;
718 
719  pStream->state = (struct mz_internal_state *)pComp;
720 
721  if (tdefl_init(pComp, NULL, NULL, comp_flags) != TDEFL_STATUS_OKAY) {
722  mz_deflateEnd(pStream);
723  return MZ_PARAM_ERROR;
724  }
725 
726  return MZ_OK;
727 }
728 
730 {
731  if ((!pStream) || (!pStream->state) || (!pStream->zalloc) || (!pStream->zfree)) return MZ_STREAM_ERROR;
732  pStream->total_in = pStream->total_out = 0;
733  tdefl_init((tdefl_compressor *)pStream->state, NULL, NULL, ((tdefl_compressor *)pStream->state)->m_flags);
734  return MZ_OK;
735 }
736 
737 int mz_deflate(mz_streamp pStream, int flush)
738 {
739  size_t in_bytes, out_bytes;
740  mz_ulong orig_total_in, orig_total_out;
741  int mz_status = MZ_OK;
742 
743  if ((!pStream) || (!pStream->state) || (flush < 0) || (flush > MZ_FINISH) || (!pStream->next_out)) return MZ_STREAM_ERROR;
744  if (!pStream->avail_out) return MZ_BUF_ERROR;
745 
746  if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH;
747 
748  if (((tdefl_compressor *)pStream->state)->m_prev_return_status == TDEFL_STATUS_DONE)
749  return (flush == MZ_FINISH) ? MZ_STREAM_END : MZ_BUF_ERROR;
750 
751  orig_total_in = pStream->total_in; orig_total_out = pStream->total_out;
752  for (; ; ) {
753  tdefl_status defl_status;
754  in_bytes = pStream->avail_in; out_bytes = pStream->avail_out;
755 
756  defl_status = tdefl_compress((tdefl_compressor *)pStream->state, pStream->next_in, &in_bytes, pStream->next_out, &out_bytes, (tdefl_flush)flush);
757  pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes;
758  pStream->total_in += (mz_uint)in_bytes; pStream->adler = tdefl_get_adler32((tdefl_compressor *)pStream->state);
759 
760  pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes;
761  pStream->total_out += (mz_uint)out_bytes;
762 
763  if (defl_status < 0) {
764  mz_status = MZ_STREAM_ERROR;
765  break;
766  }
767  else if (defl_status == TDEFL_STATUS_DONE) {
768  mz_status = MZ_STREAM_END;
769  break;
770  }
771  else if (!pStream->avail_out)
772  break;
773  else if ((!pStream->avail_in) && (flush != MZ_FINISH)) {
774  if ((flush) || (pStream->total_in != orig_total_in) || (pStream->total_out != orig_total_out))
775  break;
776  return MZ_BUF_ERROR; // Can't make forward progress without some input.
777  }
778  }
779  return mz_status;
780 }
781 
783 {
784  if (!pStream) return MZ_STREAM_ERROR;
785  if (pStream->state) {
786  pStream->zfree(pStream->opaque, pStream->state);
787  pStream->state = NULL;
788  }
789  return MZ_OK;
790 }
791 
793 {
794  (void)pStream;
795  // This is really over conservative. (And lame, but it's actually pretty tricky to compute a true upper bound given the way tdefl's blocking works.)
796  mz_uint64 a = 128ULL + (source_len * 110ULL) / 100ULL;
797  mz_uint64 b = 128ULL + (mz_uint64)source_len + ((source_len / (31 * 1024)) + 1ULL) * 5ULL;
798 
799  mz_uint64 t = MZ_MAX(a, b);
800  if (((mz_ulong)t) != t)
801  t = (mz_ulong)(-1);
802 
803  return (mz_ulong)t;
804 }
805 
806 int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level)
807 {
808  int status;
809  mz_stream stream;
810  memset(&stream, 0, sizeof(stream));
811 
812  // In case mz_ulong is 64-bits (argh I hate longs).
813  if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR;
814 
815  stream.next_in = pSource;
816  stream.avail_in = (mz_uint32)source_len;
817  stream.next_out = pDest;
818  stream.avail_out = (mz_uint32)*pDest_len;
819 
820  status = mz_deflateInit(&stream, level);
821  if (status != MZ_OK) return status;
822 
823  status = mz_deflate(&stream, MZ_FINISH);
824  if (status != MZ_STREAM_END) {
825  mz_deflateEnd(&stream);
826  return (status == MZ_OK) ? MZ_BUF_ERROR : status;
827  }
828 
829  *pDest_len = stream.total_out;
830  return mz_deflateEnd(&stream);
831 }
832 
833 int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len)
834 {
835  return mz_compress2(pDest, pDest_len, pSource, source_len, MZ_DEFAULT_COMPRESSION);
836 }
837 
839 {
840  return mz_deflateBound(NULL, source_len);
841 }
842 
843 typedef struct
844 {
846  mz_uint m_dict_ofs, m_dict_avail, m_first_call, m_has_flushed; int m_window_bits;
847  mz_uint8 m_dict[TINFL_LZ_DICT_SIZE];
849 } inflate_state;
850 
851 int mz_inflateInit2(mz_streamp pStream, int window_bits)
852 {
853  inflate_state *pDecomp;
854  if (!pStream) return MZ_STREAM_ERROR;
855  if ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS)) return MZ_PARAM_ERROR;
856 
857  pStream->data_type = 0;
858  pStream->adler = 0;
859  pStream->msg = NULL;
860  pStream->total_in = 0;
861  pStream->total_out = 0;
862  pStream->reserved = 0;
863  if (!pStream->zalloc) pStream->zalloc = def_alloc_func;
864  if (!pStream->zfree) pStream->zfree = def_free_func;
865 
866  pDecomp = (inflate_state *)pStream->zalloc(pStream->opaque, 1, sizeof(inflate_state));
867  if (!pDecomp) return MZ_MEM_ERROR;
868 
869  pStream->state = (struct mz_internal_state *)pDecomp;
870 
871  tinfl_init(&pDecomp->m_decomp);
872  pDecomp->m_dict_ofs = 0;
873  pDecomp->m_dict_avail = 0;
875  pDecomp->m_first_call = 1;
876  pDecomp->m_has_flushed = 0;
877  pDecomp->m_window_bits = window_bits;
878 
879  return MZ_OK;
880 }
881 
883 {
884  return mz_inflateInit2(pStream, MZ_DEFAULT_WINDOW_BITS);
885 }
886 
887 int mz_inflate2(mz_streamp pStream, int flush, int adler32_checking)
888 {
889  inflate_state *pState;
890  mz_uint n, first_call, decomp_flags = adler32_checking ? TINFL_FLAG_COMPUTE_ADLER32 : 0;
891  size_t in_bytes, out_bytes, orig_avail_in;
892  tinfl_status status;
893 
894  if ((!pStream) || (!pStream->state)) return MZ_STREAM_ERROR;
895  if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH;
896  if ((flush) && (flush != MZ_SYNC_FLUSH) && (flush != MZ_FINISH)) return MZ_STREAM_ERROR;
897 
898  pState = (inflate_state *)pStream->state;
899  if (pState->m_window_bits > 0) decomp_flags |= TINFL_FLAG_PARSE_ZLIB_HEADER;
900  orig_avail_in = pStream->avail_in;
901 
902  first_call = pState->m_first_call; pState->m_first_call = 0;
903  if (pState->m_last_status < 0) return MZ_DATA_ERROR;
904 
905  if (pState->m_has_flushed && (flush != MZ_FINISH)) return MZ_STREAM_ERROR;
906  pState->m_has_flushed |= (flush == MZ_FINISH);
907 
908  if ((flush == MZ_FINISH) && (first_call)) {
909  // MZ_FINISH on the first call implies that the input and output buffers are large enough to hold the entire compressed/decompressed file.
911  in_bytes = pStream->avail_in; out_bytes = pStream->avail_out;
912  status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pStream->next_out, pStream->next_out, &out_bytes, decomp_flags);
913  pState->m_last_status = status;
914  pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; pStream->total_in += (mz_uint)in_bytes;
915  pStream->adler = tinfl_get_adler32(&pState->m_decomp);
916  pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes; pStream->total_out += (mz_uint)out_bytes;
917 
918  if (status < 0)
919  return MZ_DATA_ERROR;
920  else if (status != TINFL_STATUS_DONE) {
922  return MZ_BUF_ERROR;
923  }
924  return MZ_STREAM_END;
925  }
926  // flush != MZ_FINISH then we must assume there's more input.
927  if (flush != MZ_FINISH) decomp_flags |= TINFL_FLAG_HAS_MORE_INPUT;
928 
929  if (pState->m_dict_avail) {
930  n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);
931  memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);
932  pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n;
933  pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);
934  return ((pState->m_last_status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK;
935  }
936 
937  for (; ; ) {
938  in_bytes = pStream->avail_in;
939  out_bytes = TINFL_LZ_DICT_SIZE - pState->m_dict_ofs;
940 
941  status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict, pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags);
942  pState->m_last_status = status;
943 
944  pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes;
945  pStream->total_in += (mz_uint)in_bytes; pStream->adler = tinfl_get_adler32(&pState->m_decomp);
946 
947  pState->m_dict_avail = (mz_uint)out_bytes;
948 
949  n = MZ_MIN(pState->m_dict_avail, pStream->avail_out);
950  memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n);
951  pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n;
952  pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1);
953 
954  if (status < 0)
955  return MZ_DATA_ERROR; // Stream is corrupted (there could be some uncompressed data left in the output dictionary - oh well).
956  else if ((status == TINFL_STATUS_NEEDS_MORE_INPUT) && (!orig_avail_in))
957  return MZ_BUF_ERROR; // Signal caller that we can't make forward progress without supplying more input or by setting flush to MZ_FINISH.
958  else if (flush == MZ_FINISH) {
959  // The output buffer MUST be large to hold the remaining uncompressed data when flush==MZ_FINISH.
960  if (status == TINFL_STATUS_DONE)
961  return pState->m_dict_avail ? MZ_BUF_ERROR : MZ_STREAM_END;
962  // status here must be TINFL_STATUS_HAS_MORE_OUTPUT, which means there's at least 1 more byte on the way. If there's no more room left in the output buffer then something is wrong.
963  else if (!pStream->avail_out)
964  return MZ_BUF_ERROR;
965  }
966  else if ((status == TINFL_STATUS_DONE) || (!pStream->avail_in) || (!pStream->avail_out) || (pState->m_dict_avail))
967  break;
968  }
969 
970  return ((status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK;
971 }
972 
973 int mz_inflate(mz_streamp pStream, int flush)
974 {
975  return mz_inflate2(pStream, flush, MZ_TRUE);
976 }
977 
979 {
980  if (!pStream)
981  return MZ_STREAM_ERROR;
982  if (pStream->state) {
983  pStream->zfree(pStream->opaque, pStream->state);
984  pStream->state = NULL;
985  }
986  return MZ_OK;
987 }
988 
989 int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len)
990 {
991  mz_stream stream;
992  int status;
993  memset(&stream, 0, sizeof(stream));
994 
995  // In case mz_ulong is 64-bits (argh I hate longs).
996  if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR;
997 
998  stream.next_in = pSource;
999  stream.avail_in = (mz_uint32)source_len;
1000  stream.next_out = pDest;
1001  stream.avail_out = (mz_uint32)*pDest_len;
1002 
1003  status = mz_inflateInit(&stream);
1004  if (status != MZ_OK)
1005  return status;
1006 
1007  status = mz_inflate(&stream, MZ_FINISH);
1008  if (status != MZ_STREAM_END) {
1009  mz_inflateEnd(&stream);
1010  return ((status == MZ_BUF_ERROR) && (!stream.avail_in)) ? MZ_DATA_ERROR : status;
1011  }
1012  *pDest_len = stream.total_out;
1013 
1014  return mz_inflateEnd(&stream);
1015 }
1016 
1017 const char *mz_error(int err)
1018 {
1019  static struct { int m_err; const char *m_pDesc; } s_error_descs[] =
1020  {
1021  { MZ_OK, "" }, { MZ_STREAM_END, "stream end" }, { MZ_NEED_DICT, "need dictionary" }, { MZ_ERRNO, "file error" }, { MZ_STREAM_ERROR, "stream error" },
1022  { MZ_DATA_ERROR, "data error" }, { MZ_MEM_ERROR, "out of memory" }, { MZ_BUF_ERROR, "buf error" }, { MZ_VERSION_ERROR, "version error" }, { MZ_PARAM_ERROR, "parameter error" }
1023  };
1024  mz_uint i; for (i = 0; i < sizeof(s_error_descs) / sizeof(s_error_descs[0]); ++i) if (s_error_descs[i].m_err == err) return s_error_descs[i].m_pDesc;
1025  return NULL;
1026 }
1027 
1028 #endif //MINIZ_NO_ZLIB_APIS
1029 
1030 // ------------------- Low-level Decompression (completely independent from all compression API's)
1031 
1032 #define TINFL_MEMCPY(d, s, l) memcpy(d, s, l)
1033 #define TINFL_MEMSET(p, c, l) memset(p, c, l)
1034 
1035 #define TINFL_CR_BEGIN switch(r->m_state) { case 0:
1036 #define TINFL_CR_RETURN(state_index, result) do { status = result; r->m_state = state_index; goto common_exit; case state_index:; } MZ_MACRO_END
1037 #define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END
1038 #define TINFL_CR_FINISH }
1039 
1040 // TODO: If the caller has indicated that there's no more input, and we attempt to read beyond the input buf, then something is wrong with the input because the inflator never
1041 // reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of the stream with 0's in this scenario.
1042 #define TINFL_GET_BYTE(state_index, c) do { \
1043  if (pIn_buf_cur >= pIn_buf_end) { \
1044  for ( ; ; ) { \
1045  if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \
1046  TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \
1047  if (pIn_buf_cur < pIn_buf_end) { \
1048  c = *pIn_buf_cur++; \
1049  break; \
1050  } \
1051  } else { \
1052  c = 0; \
1053  break; \
1054  } \
1055  } \
1056  } else c = *pIn_buf_cur++; } MZ_MACRO_END
1057 
1058 #define TINFL_NEED_BITS(state_index, n) do { mz_uint c; TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; } while (num_bits < (mz_uint)(n))
1059 #define TINFL_SKIP_BITS(state_index, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END
1060 #define TINFL_GET_BITS(state_index, b, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } b = bit_buf & ((1 << (n)) - 1); bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END
1061 
1062 // TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes remaining in the input buffer falls below 2.
1063 // It reads just enough bytes from the input stream that are needed to decode the next Huffman code (and absolutely no more). It works by trying to fully decode a
1064 // Huffman code by using whatever bits are currently present in the bit buffer. If this fails, it reads another byte, and tries again until it succeeds or until the
1065 // bit buffer contains >=15 bits (deflate's max. Huffman code size).
1066 #define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \
1067  do { \
1068  temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \
1069  if (temp >= 0) { \
1070  code_len = temp >> 9; \
1071  if ((code_len) && (num_bits >= code_len)) \
1072  break; \
1073  } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \
1074  code_len = TINFL_FAST_LOOKUP_BITS; \
1075  do { \
1076  temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \
1077  } while ((temp < 0) && (num_bits >= (code_len + 1))); if (temp >= 0) break; \
1078  } TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; \
1079  } while (num_bits < 15);
1080 
1081 // TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex than you would initially expect because the zlib API expects the decompressor to never read
1082 // beyond the final byte of the deflate stream. (In other words, when this macro wants to read another byte from the input, it REALLY needs another byte in order to fully
1083 // decode the next Huffman code.) Handling this properly is particularly important on raw deflate (non-zlib) streams, which aren't followed by a byte aligned adler-32.
1084 // The slow path is only executed at the very end of the input buffer.
1085 #define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \
1086  int temp; mz_uint code_len, c; \
1087  if (num_bits < 15) { \
1088  if ((pIn_buf_end - pIn_buf_cur) < 2) { \
1089  TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \
1090  } else { \
1091  bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); pIn_buf_cur += 2; num_bits += 16; \
1092  } \
1093  } \
1094  if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \
1095  code_len = temp >> 9, temp &= 511; \
1096  else { \
1097  code_len = TINFL_FAST_LOOKUP_BITS; do { temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; } while (temp < 0); \
1098  } sym = temp; bit_buf >>= code_len; num_bits -= code_len; } MZ_MACRO_END
1099 
1100 tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags)
1101 {
1102  static const int s_length_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 };
1103  static const int s_length_extra[31] = { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };
1104  static const int s_dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0 };
1105  static const int s_dist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 };
1106  static const mz_uint8 s_length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
1107  static const int s_min_table_sizes[3] = { 257, 1, 4 };
1108 
1109  tinfl_status status = TINFL_STATUS_FAILED; mz_uint32 num_bits, dist, counter, num_extra; tinfl_bit_buf_t bit_buf;
1110  const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size;
1111  mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size;
1112  size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t)-1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start;
1113 
1114  // Ensure the output buffer's size is a power of 2, unless the output buffer is large enough to hold the entire output file (in which case it doesn't matter).
1115  if (((out_buf_size_mask + 1) & out_buf_size_mask) || (pOut_buf_next < pOut_buf_start)) { *pIn_buf_size = *pOut_buf_size = 0; return TINFL_STATUS_BAD_PARAM; }
1116 
1117  num_bits = r->m_num_bits; bit_buf = r->m_bit_buf; dist = r->m_dist; counter = r->m_counter; num_extra = r->m_num_extra; dist_from_out_buf_start = r->m_dist_from_out_buf_start;
1118  TINFL_CR_BEGIN
1119 
1120  bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; r->m_z_adler32 = r->m_check_adler32 = 1;
1121  if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) {
1122  TINFL_GET_BYTE(1, r->m_zhdr0); TINFL_GET_BYTE(2, r->m_zhdr1);
1123  counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8));
1124  if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1ULL << (8U + (r->m_zhdr0 >> 4)))));
1125  if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); }
1126  }
1127 
1128  do {
1129  TINFL_GET_BITS(3, r->m_final, 3); r->m_type = r->m_final >> 1;
1130  if (r->m_type == 0) {
1131  TINFL_SKIP_BITS(5, num_bits & 7);
1132  for (counter = 0; counter < 4; ++counter) { if (num_bits) TINFL_GET_BITS(6, r->m_raw_header[counter], 8); else TINFL_GET_BYTE(7, r->m_raw_header[counter]); }
1133  if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) != (mz_uint)(0xFFFF ^ (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) { TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED); }
1134  while ((counter) && (num_bits)) {
1135  TINFL_GET_BITS(51, dist, 8);
1136  while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); }
1137  *pOut_buf_cur++ = (mz_uint8)dist;
1138  counter--;
1139  }
1140  while (counter) {
1141  size_t n; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); }
1142  while (pIn_buf_cur >= pIn_buf_end) {
1143  if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) {
1144  TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT);
1145  }
1146  else {
1147  TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED);
1148  }
1149  }
1150  n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter);
1151  TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (mz_uint)n;
1152  }
1153  }
1154  else if (r->m_type == 3) {
1155  TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED);
1156  }
1157  else {
1158  if (r->m_type == 1) {
1159  mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i;
1160  r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32);
1161  for (i = 0; i <= 143; ++i) {
1162  *p++ = 8;
1163  }
1164  for (; i <= 255; ++i) {
1165  *p++ = 9;
1166  }
1167  for (; i <= 279; ++i) {
1168  *p++ = 7;
1169  }
1170  for (; i <= 287; ++i) {
1171  *p++ = 8;
1172  }
1173  }
1174  else {
1175  for (counter = 0; counter < 3; counter++) { TINFL_GET_BITS(11, r->m_table_sizes[counter], "\05\05\04"[counter]); r->m_table_sizes[counter] += s_min_table_sizes[counter]; }
1176  MZ_CLEAR_OBJ(r->m_tables[2].m_code_size); for (counter = 0; counter < r->m_table_sizes[2]; counter++) { mz_uint s; TINFL_GET_BITS(14, s, 3); r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s; }
1177  r->m_table_sizes[2] = 19;
1178  }
1179  for (; (int)r->m_type >= 0; r->m_type--) {
1180  int tree_next, tree_cur; tinfl_huff_table *pTable;
1181  mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16]; pTable = &r->m_tables[r->m_type]; MZ_CLEAR_OBJ(total_syms); MZ_CLEAR_OBJ(pTable->m_look_up); MZ_CLEAR_OBJ(pTable->m_tree);
1182  for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) total_syms[pTable->m_code_size[i]]++;
1183  used_syms = 0, total = 0; next_code[0] = next_code[1] = 0;
1184  for (i = 1; i <= 15; ++i) { used_syms += total_syms[i]; next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); }
1185  if ((65536 != total) && (used_syms > 1)) {
1186  TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED);
1187  }
1188  for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index) {
1189  mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index]; if (!code_size) continue;
1190  cur_code = next_code[code_size]++; for (l = code_size; l > 0; l--, cur_code >>= 1) rev_code = (rev_code << 1) | (cur_code & 1);
1191  if (code_size <= TINFL_FAST_LOOKUP_BITS) { mz_int16 k = (mz_int16)((code_size << 9) | sym_index); while (rev_code < TINFL_FAST_LOOKUP_SIZE) { pTable->m_look_up[rev_code] = k; rev_code += (1 << code_size); } continue; }
1192  if (0 == (tree_cur = pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)])) { pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; }
1193  rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1);
1194  for (j = code_size; j >(TINFL_FAST_LOOKUP_BITS + 1); j--) {
1195  tree_cur -= ((rev_code >>= 1) & 1);
1196  if (!pTable->m_tree[-tree_cur - 1]) { pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; }
1197  else tree_cur = pTable->m_tree[-tree_cur - 1];
1198  }
1199  tree_cur -= ((rev_code >>= 1) & 1); pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index;
1200  }
1201  if (r->m_type == 2) {
1202  for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]); ) {
1203  mz_uint s; TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); if (dist < 16) { r->m_len_codes[counter++] = (mz_uint8)dist; continue; }
1204  if ((dist == 16) && (!counter)) {
1205  TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED);
1206  }
1207  num_extra = "\02\03\07"[dist - 16]; TINFL_GET_BITS(18, s, num_extra); s += "\03\03\013"[dist - 16];
1208  TINFL_MEMSET(r->m_len_codes + counter, (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); counter += s;
1209  }
1210  if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter) {
1211  TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED);
1212  }
1213  TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, r->m_table_sizes[0]); TINFL_MEMCPY(r->m_tables[1].m_code_size, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]);
1214  }
1215  }
1216  for (; ; ) {
1217  mz_uint8 *pSrc;
1218  for (; ; ) {
1219  if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2)) {
1220  TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]);
1221  if (counter >= 256)
1222  break;
1223  while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); }
1224  *pOut_buf_cur++ = (mz_uint8)counter;
1225  }
1226  else {
1227  int sym2; mz_uint code_len;
1228 #if TINFL_USE_64BIT_BITBUF
1229  if (num_bits < 30) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits); pIn_buf_cur += 4; num_bits += 32; }
1230 #else
1231  if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; }
1232 #endif
1233  if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)
1234  code_len = sym2 >> 9;
1235  else {
1236  code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);
1237  }
1238  counter = sym2; bit_buf >>= code_len; num_bits -= code_len;
1239  if (counter & 256)
1240  break;
1241 
1242 #if !TINFL_USE_64BIT_BITBUF
1243  if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; }
1244 #endif
1245  if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)
1246  code_len = sym2 >> 9;
1247  else {
1248  code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);
1249  }
1250  bit_buf >>= code_len; num_bits -= code_len;
1251 
1252  pOut_buf_cur[0] = (mz_uint8)counter;
1253  if (sym2 & 256) {
1254  pOut_buf_cur++;
1255  counter = sym2;
1256  break;
1257  }
1258  pOut_buf_cur[1] = (mz_uint8)sym2;
1259  pOut_buf_cur += 2;
1260  }
1261  }
1262  if ((counter &= 511) == 256) break;
1263 
1264  num_extra = s_length_extra[counter - 257]; counter = s_length_base[counter - 257];
1265  if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(25, extra_bits, num_extra); counter += extra_bits; }
1266 
1267  TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]);
1268  num_extra = s_dist_extra[dist]; dist = s_dist_base[dist];
1269  if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(27, extra_bits, num_extra); dist += extra_bits; }
1270 
1271  dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start;
1272  if ((dist > dist_from_out_buf_start) && (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) {
1273  TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED);
1274  }
1275 
1276  pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask);
1277 
1278  if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end) {
1279  while (counter--) {
1280  while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); }
1281  *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask];
1282  }
1283  continue;
1284  }
1285 #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
1286  else if ((counter >= 9) && (counter <= dist)) {
1287  const mz_uint8 *pSrc_end = pSrc + (counter & ~7);
1288  do {
1289  ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0];
1290  ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1];
1291  pOut_buf_cur += 8;
1292  } while ((pSrc += 8) < pSrc_end);
1293  if ((counter &= 7) < 3) {
1294  if (counter) {
1295  pOut_buf_cur[0] = pSrc[0];
1296  if (counter > 1)
1297  pOut_buf_cur[1] = pSrc[1];
1298  pOut_buf_cur += counter;
1299  }
1300  continue;
1301  }
1302  }
1303 #endif
1304  do {
1305  pOut_buf_cur[0] = pSrc[0];
1306  pOut_buf_cur[1] = pSrc[1];
1307  pOut_buf_cur[2] = pSrc[2];
1308  pOut_buf_cur += 3; pSrc += 3;
1309  } while ((int)(counter -= 3) > 2);
1310  if ((int)counter > 0) {
1311  pOut_buf_cur[0] = pSrc[0];
1312  if ((int)counter > 1)
1313  pOut_buf_cur[1] = pSrc[1];
1314  pOut_buf_cur += counter;
1315  }
1316  }
1317  }
1318  } while (!(r->m_final & 1));
1319  if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) {
1320  TINFL_SKIP_BITS(32, num_bits & 7); for (counter = 0; counter < 4; ++counter) { mz_uint s; if (num_bits) TINFL_GET_BITS(41, s, 8); else TINFL_GET_BYTE(42, s); r->m_z_adler32 = (r->m_z_adler32 << 8) | s; }
1321  }
1322  TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE);
1323  TINFL_CR_FINISH
1324 
1325  common_exit :
1326  r->m_num_bits = num_bits; r->m_bit_buf = bit_buf; r->m_dist = dist; r->m_counter = counter; r->m_num_extra = num_extra; r->m_dist_from_out_buf_start = dist_from_out_buf_start;
1327  *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next;
1328  //if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0))
1329  if ((decomp_flags & TINFL_FLAG_COMPUTE_ADLER32) && (status >= 0)) {
1330  const mz_uint8 *ptr = pOut_buf_next; size_t buf_len = *pOut_buf_size;
1331  mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, s2 = r->m_check_adler32 >> 16; size_t block_len = buf_len % 5552;
1332  while (buf_len) {
1333  for (i = 0; i + 7 < block_len; i += 8, ptr += 8) {
1334  s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1;
1335  s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1;
1336  }
1337  for (; i < block_len; ++i) s1 += *ptr++, s2 += s1;
1338  s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552;
1339  }
1340  r->m_check_adler32 = (s2 << 16) + s1;
1341  if ((status == TINFL_STATUS_DONE) && (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) && (r->m_check_adler32 != r->m_z_adler32))
1343  }
1344  return status;
1345 }
1346 
1347 // Higher level helper functions.
1348 void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags)
1349 {
1350  tinfl_decompressor decomp; void *pBuf = NULL, *pNew_buf; size_t src_buf_ofs = 0, out_buf_capacity = 0;
1351  *pOut_len = 0;
1352  tinfl_init(&decomp);
1353  for (; ; ) {
1354  size_t src_buf_size = src_buf_len - src_buf_ofs, dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity;
1355  tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8 *)pSrc_buf + src_buf_ofs, &src_buf_size, (mz_uint8 *)pBuf, pBuf ? (mz_uint8 *)pBuf + *pOut_len : NULL, &dst_buf_size,
1357  if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) {
1358  MZ_FREE(pBuf); *pOut_len = 0; return NULL;
1359  }
1360  src_buf_ofs += src_buf_size;
1361  *pOut_len += dst_buf_size;
1362  if (status == TINFL_STATUS_DONE) break;
1363  new_out_buf_capacity = out_buf_capacity * 2; if (new_out_buf_capacity < 128) new_out_buf_capacity = 128;
1364  pNew_buf = MZ_REALLOC(pBuf, new_out_buf_capacity);
1365  if (!pNew_buf) {
1366  MZ_FREE(pBuf); *pOut_len = 0; return NULL;
1367  }
1368  pBuf = pNew_buf; out_buf_capacity = new_out_buf_capacity;
1369  }
1370  return pBuf;
1371 }
1372 
1373 size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags)
1374 {
1375  tinfl_decompressor decomp; tinfl_status status; tinfl_init(&decomp);
1376  status = tinfl_decompress(&decomp, (const mz_uint8 *)pSrc_buf, &src_buf_len, (mz_uint8 *)pOut_buf, (mz_uint8 *)pOut_buf, &out_buf_len, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);
1377  return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED : out_buf_len;
1378 }
1379 
1380 int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)
1381 {
1382  int result = 0;
1383  tinfl_decompressor decomp;
1384  mz_uint8 *pDict = (mz_uint8 *)MZ_MALLOC(TINFL_LZ_DICT_SIZE); size_t in_buf_ofs = 0, dict_ofs = 0;
1385  if (!pDict)
1386  return TINFL_STATUS_FAILED;
1387  tinfl_init(&decomp);
1388  for (; ; ) {
1389  size_t in_buf_size = *pIn_buf_size - in_buf_ofs, dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs;
1390  tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8 *)pIn_buf + in_buf_ofs, &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size,
1392  in_buf_ofs += in_buf_size;
1393  if ((dst_buf_size) && (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user)))
1394  break;
1395  if (status != TINFL_STATUS_HAS_MORE_OUTPUT) {
1396  result = (status == TINFL_STATUS_DONE);
1397  break;
1398  }
1399  dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1);
1400  }
1401  MZ_FREE(pDict);
1402  *pIn_buf_size = in_buf_ofs;
1403  return result;
1404 }
1405 
1406 // ------------------- Low-level Compression (independent from all decompression API's)
1407 
1408 // Purposely making these tables static for faster init and thread safety.
1409 static const mz_uint16 s_tdefl_len_sym[256] = {
1410  257,258,259,260,261,262,263,264,265,265,266,266,267,267,268,268,269,269,269,269,270,270,270,270,271,271,271,271,272,272,272,272,
1411  273,273,273,273,273,273,273,273,274,274,274,274,274,274,274,274,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,276,
1412  277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,
1413  279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,
1414  281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,
1415  282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,
1416  283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,
1417  284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,285 };
1418 
1419 static const mz_uint8 s_tdefl_len_extra[256] = {
1420  0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
1421  4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
1422  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
1423  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0 };
1424 
1425 static const mz_uint8 s_tdefl_small_dist_sym[512] = {
1426  0,1,2,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,
1427  11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,
1428  13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,
1429  14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,
1430  14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
1431  15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,16,16,16,
1432  16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
1433  16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
1434  16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
1435  17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
1436  17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
1437  17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17 };
1438 
1439 static const mz_uint8 s_tdefl_small_dist_extra[512] = {
1440  0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,
1441  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
1442  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
1443  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
1444  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
1445  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
1446  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
1447  7,7,7,7,7,7,7,7 };
1448 
1449 static const mz_uint8 s_tdefl_large_dist_sym[128] = {
1450  0,0,18,19,20,20,21,21,22,22,22,22,23,23,23,23,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,
1451  26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,
1452  28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29 };
1453 
1454 static const mz_uint8 s_tdefl_large_dist_extra[128] = {
1455  0,0,8,8,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
1456  12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
1457  13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 };
1458 
1459 // Radix sorts tdefl_sym_freq[] array by 16-bit key m_key. Returns ptr to sorted values.
1460 typedef struct { mz_uint16 m_key, m_sym_index; } tdefl_sym_freq;
1462 {
1463  mz_uint32 total_passes = 2, pass_shift, pass, i, hist[256 * 2]; tdefl_sym_freq *pCur_syms = pSyms0, *pNew_syms = pSyms1; MZ_CLEAR_OBJ(hist);
1464  for (i = 0; i < num_syms; i++) { mz_uint freq = pSyms0[i].m_key; hist[freq & 0xFF]++; hist[256 + ((freq >> 8) & 0xFF)]++; }
1465  while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256])) total_passes--;
1466  for (pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8) {
1467  const mz_uint32 *pHist = &hist[pass << 8];
1468  mz_uint offsets[256], cur_ofs = 0;
1469  for (i = 0; i < 256; i++) { offsets[i] = cur_ofs; cur_ofs += pHist[i]; }
1470  for (i = 0; i < num_syms; i++) pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] = pCur_syms[i];
1471  { tdefl_sym_freq *t = pCur_syms; pCur_syms = pNew_syms; pNew_syms = t; }
1472  }
1473  return pCur_syms;
1474 }
1475 
1476 // tdefl_calculate_minimum_redundancy() originally written by: Alistair Moffat, alistair@cs.mu.oz.au, Jyrki Katajainen, jyrki@diku.dk, November 1996.
1478 {
1479  int root, leaf, next, avbl, used, dpth;
1480  if (n==0) return; else if (n==1) { A[0].m_key = 1; return; }
1481  A[0].m_key += A[1].m_key; root = 0; leaf = 2;
1482  for (next = 1; next < n-1; next++) {
1483  if (leaf>=n || A[root].m_key<A[leaf].m_key) { A[next].m_key = A[root].m_key; A[root++].m_key = (mz_uint16)next; }
1484  else A[next].m_key = A[leaf++].m_key;
1485  if (leaf>=n || (root<next && A[root].m_key<A[leaf].m_key)) { A[next].m_key = (mz_uint16)(A[next].m_key + A[root].m_key); A[root++].m_key = (mz_uint16)next; }
1486  else A[next].m_key = (mz_uint16)(A[next].m_key + A[leaf++].m_key);
1487  }
1488  A[n-2].m_key = 0; for (next = n-3; next>=0; next--) A[next].m_key = A[A[next].m_key].m_key+1;
1489  avbl = 1; used = dpth = 0; root = n-2; next = n-1;
1490  while (avbl>0) {
1491  while (root>=0 && (int)A[root].m_key==dpth) { used++; root--; }
1492  while (avbl>used) { A[next--].m_key = (mz_uint16)(dpth); avbl--; }
1493  avbl = 2*used; dpth++; used = 0;
1494  }
1495 }
1496 
1497 // Limits canonical Huffman code table's max code size.
1499 static void tdefl_huffman_enforce_max_code_size(int *pNum_codes, int code_list_len, int max_code_size)
1500 {
1501  int i; mz_uint32 total = 0; if (code_list_len <= 1) return;
1502  for (i = max_code_size + 1; i <= TDEFL_MAX_SUPPORTED_HUFF_CODESIZE; ++i) pNum_codes[max_code_size] += pNum_codes[i];
1503  for (i = max_code_size; i > 0; i--) total += (((mz_uint32)pNum_codes[i]) << (max_code_size - i));
1504  while (total != (1UL << max_code_size)) {
1505  pNum_codes[max_code_size]--;
1506  for (i = max_code_size - 1; i > 0; i--) if (pNum_codes[i]) { pNum_codes[i]--; pNum_codes[i + 1] += 2; break; }
1507  total--;
1508  }
1509 }
1510 
1511 static void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num, int table_len, int code_size_limit, int static_table)
1512 {
1513  int i, j, l, num_codes[1 + TDEFL_MAX_SUPPORTED_HUFF_CODESIZE]; mz_uint next_code[TDEFL_MAX_SUPPORTED_HUFF_CODESIZE + 1]; MZ_CLEAR_OBJ(num_codes);
1514  if (static_table) {
1515  for (i = 0; i < table_len; i++) num_codes[d->m_huff_code_sizes[table_num][i]]++;
1516  }
1517  else {
1519  int num_used_syms = 0;
1520  const mz_uint16 *pSym_count = &d->m_huff_count[table_num][0];
1521  for (i = 0; i < table_len; ++i) if (pSym_count[i]) { syms0[num_used_syms].m_key = (mz_uint16)pSym_count[i]; syms0[num_used_syms++].m_sym_index = (mz_uint16)i; }
1522 
1523  pSyms = tdefl_radix_sort_syms(num_used_syms, syms0, syms1); tdefl_calculate_minimum_redundancy(pSyms, num_used_syms);
1524 
1525  for (i = 0; i < num_used_syms; ++i) num_codes[pSyms[i].m_key]++;
1526 
1527  tdefl_huffman_enforce_max_code_size(num_codes, num_used_syms, code_size_limit);
1528 
1529  MZ_CLEAR_OBJ(d->m_huff_code_sizes[table_num]); MZ_CLEAR_OBJ(d->m_huff_codes[table_num]);
1530  for (i = 1, j = num_used_syms; i <= code_size_limit; ++i)
1531  for (l = num_codes[i]; l > 0; l--) d->m_huff_code_sizes[table_num][pSyms[--j].m_sym_index] = (mz_uint8)(i);
1532  }
1533 
1534  next_code[1] = 0; for (j = 0, i = 2; i <= code_size_limit; ++i) next_code[i] = j = ((j + num_codes[i - 1]) << 1);
1535 
1536  for (i = 0; i < table_len; ++i) {
1537  mz_uint rev_code = 0, code, code_size; if ((code_size = d->m_huff_code_sizes[table_num][i]) == 0) continue;
1538  code = next_code[code_size]++; for (l = code_size; l > 0; l--, code >>= 1) rev_code = (rev_code << 1) | (code & 1);
1539  d->m_huff_codes[table_num][i] = (mz_uint16)rev_code;
1540  }
1541 }
1542 
1543 #define TDEFL_PUT_BITS(b, l) do { \
1544  mz_uint bits = b; mz_uint len = l; MZ_ASSERT(bits <= ((1U << len) - 1U)); \
1545  d->m_bit_buffer |= (bits << d->m_bits_in); d->m_bits_in += len; \
1546  while (d->m_bits_in >= 8) { \
1547  if (d->m_pOutput_buf < d->m_pOutput_buf_end) { \
1548  *d->m_pOutput_buf++ = (mz_uint8)(d->m_bit_buffer); \
1549  d->m_bit_buffer >>= 8; \
1550  d->m_bits_in -= 8; \
1551  } \
1552  } \
1553 } MZ_MACRO_END
1554 
1555 #define TDEFL_RLE_PREV_CODE_SIZE() { if (rle_repeat_count) { \
1556  if (rle_repeat_count < 3) { \
1557  d->m_huff_count[2][prev_code_size] = (mz_uint16)(d->m_huff_count[2][prev_code_size] + rle_repeat_count); \
1558  while (rle_repeat_count--) packed_code_sizes[num_packed_code_sizes++] = prev_code_size; \
1559  } else { \
1560  d->m_huff_count[2][16] = (mz_uint16)(d->m_huff_count[2][16] + 1); packed_code_sizes[num_packed_code_sizes++] = 16; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_repeat_count - 3); \
1561 } rle_repeat_count = 0; } }
1562 
1563 #define TDEFL_RLE_ZERO_CODE_SIZE() { if (rle_z_count) { \
1564  if (rle_z_count < 3) { \
1565  d->m_huff_count[2][0] = (mz_uint16)(d->m_huff_count[2][0] + rle_z_count); while (rle_z_count--) packed_code_sizes[num_packed_code_sizes++] = 0; \
1566  } else if (rle_z_count <= 10) { \
1567  d->m_huff_count[2][17] = (mz_uint16)(d->m_huff_count[2][17] + 1); packed_code_sizes[num_packed_code_sizes++] = 17; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 3); \
1568  } else { \
1569  d->m_huff_count[2][18] = (mz_uint16)(d->m_huff_count[2][18] + 1); packed_code_sizes[num_packed_code_sizes++] = 18; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 11); \
1570 } rle_z_count = 0; } }
1571 
1572 static mz_uint8 s_tdefl_packed_code_size_syms_swizzle[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };
1573 
1575 {
1576  int num_lit_codes, num_dist_codes, num_bit_lengths; mz_uint i, total_code_sizes_to_pack, num_packed_code_sizes, rle_z_count, rle_repeat_count, packed_code_sizes_index;
1577  mz_uint8 code_sizes_to_pack[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], packed_code_sizes[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], prev_code_size = 0xFF;
1578 
1579  d->m_huff_count[0][256] = 1;
1580 
1583 
1584  for (num_lit_codes = 286; num_lit_codes > 257; num_lit_codes--) if (d->m_huff_code_sizes[0][num_lit_codes - 1]) break;
1585  for (num_dist_codes = 30; num_dist_codes > 1; num_dist_codes--) if (d->m_huff_code_sizes[1][num_dist_codes - 1]) break;
1586 
1587  memcpy(code_sizes_to_pack, &d->m_huff_code_sizes[0][0], num_lit_codes);
1588  memcpy(code_sizes_to_pack + num_lit_codes, &d->m_huff_code_sizes[1][0], num_dist_codes);
1589  total_code_sizes_to_pack = num_lit_codes + num_dist_codes; num_packed_code_sizes = 0; rle_z_count = 0; rle_repeat_count = 0;
1590 
1591  memset(&d->m_huff_count[2][0], 0, sizeof(d->m_huff_count[2][0]) * TDEFL_MAX_HUFF_SYMBOLS_2);
1592  for (i = 0; i < total_code_sizes_to_pack; ++i) {
1593  mz_uint8 code_size = code_sizes_to_pack[i];
1594  if (!code_size) {
1595  TDEFL_RLE_PREV_CODE_SIZE();
1596  if (++rle_z_count == 138) { TDEFL_RLE_ZERO_CODE_SIZE(); }
1597  }
1598  else {
1599  TDEFL_RLE_ZERO_CODE_SIZE();
1600  if (code_size != prev_code_size) {
1601  TDEFL_RLE_PREV_CODE_SIZE();
1602  d->m_huff_count[2][code_size] = (mz_uint16)(d->m_huff_count[2][code_size] + 1); packed_code_sizes[num_packed_code_sizes++] = code_size;
1603  }
1604  else if (++rle_repeat_count == 6) {
1605  TDEFL_RLE_PREV_CODE_SIZE();
1606  }
1607  }
1608  prev_code_size = code_size;
1609  }
1610  if (rle_repeat_count) { TDEFL_RLE_PREV_CODE_SIZE(); }
1611  else { TDEFL_RLE_ZERO_CODE_SIZE(); }
1612 
1614 
1615  TDEFL_PUT_BITS(2, 2);
1616 
1617  TDEFL_PUT_BITS(num_lit_codes - 257, 5);
1618  TDEFL_PUT_BITS(num_dist_codes - 1, 5);
1619 
1620  for (num_bit_lengths = 18; num_bit_lengths >= 0; num_bit_lengths--) if (d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[num_bit_lengths]]) break;
1621  num_bit_lengths = MZ_MAX(4, (num_bit_lengths + 1)); TDEFL_PUT_BITS(num_bit_lengths - 4, 4);
1622  for (i = 0; static_cast<int>(i) < num_bit_lengths; ++i) TDEFL_PUT_BITS(d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[i]], 3);
1623 
1624  for (packed_code_sizes_index = 0; packed_code_sizes_index < num_packed_code_sizes; ) {
1625  mz_uint code = packed_code_sizes[packed_code_sizes_index++]; MZ_ASSERT(code < TDEFL_MAX_HUFF_SYMBOLS_2);
1626  TDEFL_PUT_BITS(d->m_huff_codes[2][code], d->m_huff_code_sizes[2][code]);
1627  if (code >= 16) TDEFL_PUT_BITS(packed_code_sizes[packed_code_sizes_index++], "\02\03\07"[code - 16]);
1628  }
1629 }
1630 
1632 {
1633  mz_uint i;
1634  mz_uint8 *p = &d->m_huff_code_sizes[0][0];
1635 
1636  for (i = 0; i <= 143; ++i) *p++ = 8;
1637  for (; i <= 255; ++i) *p++ = 9;
1638  for (; i <= 279; ++i) *p++ = 7;
1639  for (; i <= 287; ++i) *p++ = 8;
1640 
1641  memset(d->m_huff_code_sizes[1], 5, 32);
1642 
1643  tdefl_optimize_huffman_table(d, 0, 288, 15, MZ_TRUE);
1644  tdefl_optimize_huffman_table(d, 1, 32, 15, MZ_TRUE);
1645 
1646  TDEFL_PUT_BITS(1, 2);
1647 }
1648 
1649 static const mz_uint mz_bitmasks[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF };
1650 
1651 #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS
1652 static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d)
1653 {
1654  mz_uint flags;
1655  mz_uint8 *pLZ_codes;
1656  mz_uint8 *pOutput_buf = d->m_pOutput_buf;
1657  mz_uint8 *pLZ_code_buf_end = d->m_pLZ_code_buf;
1658  mz_uint64 bit_buffer = d->m_bit_buffer;
1659  mz_uint bits_in = d->m_bits_in;
1660 
1661 #define TDEFL_PUT_BITS_FAST(b, l) { bit_buffer |= (((mz_uint64)(b)) << bits_in); bits_in += (l); }
1662 
1663  flags = 1;
1664  for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < pLZ_code_buf_end; flags >>= 1) {
1665  if (flags == 1)
1666  flags = *pLZ_codes++ | 0x100;
1667 
1668  if (flags & 1) {
1669  mz_uint s0, s1, n0, n1, sym, num_extra_bits;
1670  mz_uint match_len = pLZ_codes[0], match_dist = *(const mz_uint16 *)(pLZ_codes + 1); pLZ_codes += 3;
1671 
1672  MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);
1673  TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);
1674  TDEFL_PUT_BITS_FAST(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]);
1675 
1676  // This sequence coaxes MSVC into using cmov's vs. jmp's.
1677  s0 = s_tdefl_small_dist_sym[match_dist & 511];
1678  n0 = s_tdefl_small_dist_extra[match_dist & 511];
1679  s1 = s_tdefl_large_dist_sym[match_dist >> 8];
1680  n1 = s_tdefl_large_dist_extra[match_dist >> 8];
1681  sym = (match_dist < 512) ? s0 : s1;
1682  num_extra_bits = (match_dist < 512) ? n0 : n1;
1683 
1684  MZ_ASSERT(d->m_huff_code_sizes[1][sym]);
1685  TDEFL_PUT_BITS_FAST(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]);
1686  TDEFL_PUT_BITS_FAST(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits);
1687  }
1688  else {
1689  mz_uint lit = *pLZ_codes++;
1690  MZ_ASSERT(d->m_huff_code_sizes[0][lit]);
1691  TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);
1692 
1693  if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) {
1694  flags >>= 1;
1695  lit = *pLZ_codes++;
1696  MZ_ASSERT(d->m_huff_code_sizes[0][lit]);
1697  TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);
1698 
1699  if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) {
1700  flags >>= 1;
1701  lit = *pLZ_codes++;
1702  MZ_ASSERT(d->m_huff_code_sizes[0][lit]);
1703  TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);
1704  }
1705  }
1706  }
1707 
1708  if (pOutput_buf >= d->m_pOutput_buf_end)
1709  return MZ_FALSE;
1710 
1711  *(mz_uint64 *)pOutput_buf = bit_buffer;
1712  pOutput_buf += (bits_in >> 3);
1713  bit_buffer >>= (bits_in & ~7);
1714  bits_in &= 7;
1715  }
1716 
1717 #undef TDEFL_PUT_BITS_FAST
1718 
1719  d->m_pOutput_buf = pOutput_buf;
1720  d->m_bits_in = 0;
1721  d->m_bit_buffer = 0;
1722 
1723  while (bits_in) {
1724  mz_uint32 n = MZ_MIN(bits_in, 16);
1725  TDEFL_PUT_BITS((mz_uint)bit_buffer & mz_bitmasks[n], n);
1726  bit_buffer >>= n;
1727  bits_in -= n;
1728  }
1729 
1730  TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]);
1731 
1732  return (d->m_pOutput_buf < d->m_pOutput_buf_end);
1733 }
1734 #else
1736 {
1737  mz_uint flags;
1738  mz_uint8 *pLZ_codes;
1739 
1740  flags = 1;
1741  for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < d->m_pLZ_code_buf; flags >>= 1) {
1742  if (flags == 1)
1743  flags = *pLZ_codes++ | 0x100;
1744  if (flags & 1) {
1745  mz_uint sym, num_extra_bits;
1746  mz_uint match_len = pLZ_codes[0], match_dist = (pLZ_codes[1] | (pLZ_codes[2] << 8)); pLZ_codes += 3;
1747 
1748  MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);
1749  TDEFL_PUT_BITS(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]);
1750  TDEFL_PUT_BITS(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]);
1751 
1752  if (match_dist < 512) {
1753  sym = s_tdefl_small_dist_sym[match_dist]; num_extra_bits = s_tdefl_small_dist_extra[match_dist];
1754  }
1755  else {
1756  sym = s_tdefl_large_dist_sym[match_dist >> 8]; num_extra_bits = s_tdefl_large_dist_extra[match_dist >> 8];
1757  }
1758  MZ_ASSERT(d->m_huff_code_sizes[1][sym]);
1759  TDEFL_PUT_BITS(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]);
1760  TDEFL_PUT_BITS(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits);
1761  }
1762  else {
1763  mz_uint lit = *pLZ_codes++;
1764  MZ_ASSERT(d->m_huff_code_sizes[0][lit]);
1765  TDEFL_PUT_BITS(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]);
1766  }
1767  }
1768 
1769  TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]);
1770 
1771  return (d->m_pOutput_buf < d->m_pOutput_buf_end);
1772 }
1773 #endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS
1774 
1776 {
1777  if (static_block)
1779  else
1781  return tdefl_compress_lz_codes(d);
1782 }
1783 
1784 static int tdefl_flush_block(tdefl_compressor *d, int flush)
1785 {
1786  mz_uint saved_bit_buf, saved_bits_in;
1787  mz_uint8 *pSaved_output_buf;
1788  mz_bool comp_block_succeeded = MZ_FALSE;
1789  int n, use_raw_block = ((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) && (d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size;
1790  mz_uint8 *pOutput_buf_start = ((d->m_pPut_buf_func == NULL) && ((*d->m_pOut_buf_size - d->m_out_buf_ofs) >= TDEFL_OUT_BUF_SIZE)) ? ((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs) : d->m_output_buf;
1791 
1792  d->m_pOutput_buf = pOutput_buf_start;
1793  d->m_pOutput_buf_end = d->m_pOutput_buf + TDEFL_OUT_BUF_SIZE - 16;
1794 
1795  MZ_ASSERT(!d->m_output_flush_remaining);
1796  d->m_output_flush_ofs = 0;
1797  d->m_output_flush_remaining = 0;
1798 
1799  *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> d->m_num_flags_left);
1800  d->m_pLZ_code_buf -= (d->m_num_flags_left == 8);
1801 
1802  if ((d->m_flags & TDEFL_WRITE_ZLIB_HEADER) && (!d->m_block_index)) {
1803  TDEFL_PUT_BITS(0x78, 8); TDEFL_PUT_BITS(0x01, 8);
1804  }
1805 
1806  TDEFL_PUT_BITS(flush == TDEFL_FINISH, 1);
1807 
1808  pSaved_output_buf = d->m_pOutput_buf; saved_bit_buf = d->m_bit_buffer; saved_bits_in = d->m_bits_in;
1809 
1810  if (!use_raw_block)
1811  comp_block_succeeded = tdefl_compress_block(d, (d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) || (d->m_total_lz_bytes < 48));
1812 
1813  // If the block gets expanded, forget the current contents of the output buffer and send a raw block instead.
1814  if (((use_raw_block) || ((d->m_total_lz_bytes) && ((d->m_pOutput_buf - pSaved_output_buf + 1U) >= d->m_total_lz_bytes))) &&
1815  ((d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size)) {
1816  mz_uint i; d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in;
1817  TDEFL_PUT_BITS(0, 2);
1818  if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); }
1819  for (i = 2; i; --i, d->m_total_lz_bytes ^= 0xFFFF) {
1820  TDEFL_PUT_BITS(d->m_total_lz_bytes & 0xFFFF, 16);
1821  }
1822  for (i = 0; i < d->m_total_lz_bytes; ++i) {
1823  TDEFL_PUT_BITS(d->m_dict[(d->m_lz_code_buf_dict_pos + i) & TDEFL_LZ_DICT_SIZE_MASK], 8);
1824  }
1825  }
1826  // Check for the extremely unlikely (if not impossible) case of the compressed block not fitting into the output buffer when using dynamic codes.
1827  else if (!comp_block_succeeded) {
1828  d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in;
1829  tdefl_compress_block(d, MZ_TRUE);
1830  }
1831 
1832  if (flush) {
1833  if (flush == TDEFL_FINISH) {
1834  if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); }
1835  if (d->m_flags & TDEFL_WRITE_ZLIB_HEADER) { mz_uint i, a = d->m_adler32; for (i = 0; i < 4; ++i) { TDEFL_PUT_BITS((a >> 24) & 0xFF, 8); a <<= 8; } }
1836  }
1837  else {
1838  mz_uint i, z = 0; TDEFL_PUT_BITS(0, 3); if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } for (i = 2; i; --i, z ^= 0xFFFF) { TDEFL_PUT_BITS(z & 0xFFFF, 16); }
1839  }
1840  }
1841 
1842  MZ_ASSERT(d->m_pOutput_buf < d->m_pOutput_buf_end);
1843 
1844  memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0);
1845  memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1);
1846 
1847  d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8; d->m_lz_code_buf_dict_pos += d->m_total_lz_bytes; d->m_total_lz_bytes = 0; d->m_block_index++;
1848 
1849  if ((n = (int)(d->m_pOutput_buf - pOutput_buf_start)) != 0) {
1850  if (d->m_pPut_buf_func) {
1851  *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf;
1852  if (!(*d->m_pPut_buf_func)(d->m_output_buf, n, d->m_pPut_buf_user))
1853  return (d->m_prev_return_status = TDEFL_STATUS_PUT_BUF_FAILED);
1854  }
1855  else if (pOutput_buf_start == d->m_output_buf) {
1856  int bytes_to_copy = (int)MZ_MIN((size_t)n, (size_t)(*d->m_pOut_buf_size - d->m_out_buf_ofs));
1857  memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf, bytes_to_copy);
1858  d->m_out_buf_ofs += bytes_to_copy;
1859  if ((n -= bytes_to_copy) != 0) {
1860  d->m_output_flush_ofs = bytes_to_copy;
1861  d->m_output_flush_remaining = n;
1862  }
1863  }
1864  else {
1865  d->m_out_buf_ofs += n;
1866  }
1867  }
1868 
1869  return d->m_output_flush_remaining;
1870 }
1871 
1872 #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
1873 #define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16*)(p)
1874 static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len)
1875 {
1876  mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len;
1877  mz_uint num_probes_left = d->m_max_probes[match_len >= 32];
1878  const mz_uint16 *s = (const mz_uint16 *)(d->m_dict + pos), *p, *q;
1879  mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]), s01 = TDEFL_READ_UNALIGNED_WORD(s);
1880  MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return;
1881  for (; ; ) {
1882  for (; ; ) {
1883  if (--num_probes_left == 0) return;
1884 #define TDEFL_PROBE \
1885  next_probe_pos = d->m_next[probe_pos]; \
1886  if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \
1887  probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \
1888  if (TDEFL_READ_UNALIGNED_WORD(&d->m_dict[probe_pos + match_len - 1]) == c01) break;
1889  TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE;
1890  }
1891  if (!dist) {
1892  break;
1893  }
1894  q = (const mz_uint16 *)(d->m_dict + probe_pos);
1895  if (TDEFL_READ_UNALIGNED_WORD(q) != s01) {
1896  continue;
1897  }
1898  p = s; probe_len = 32;
1899  do { } while ((TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&
1900  (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0));
1901  if (!probe_len) {
1902  *pMatch_dist = dist; *pMatch_len = MZ_MIN(max_match_len, (mz_uint)TDEFL_MAX_MATCH_LEN); break;
1903  }
1904  else if ((probe_len = ((mz_uint)(p - s) * 2) + (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q)) > match_len) {
1905  *pMatch_dist = dist; if ((*pMatch_len = match_len = MZ_MIN(max_match_len, probe_len)) == max_match_len) break;
1906  c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]);
1907  }
1908  }
1909 }
1910 #else
1911 static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len)
1912 {
1913  mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len;
1914  mz_uint num_probes_left = d->m_max_probes[match_len >= 32];
1915  const mz_uint8 *s = d->m_dict + pos, *p, *q;
1916  mz_uint8 c0 = d->m_dict[pos + match_len], c1 = d->m_dict[pos + match_len - 1];
1917  MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return;
1918  for (; ; ) {
1919  for (; ; ) {
1920  if (--num_probes_left == 0) return;
1921 #define TDEFL_PROBE \
1922  next_probe_pos = d->m_next[probe_pos]; \
1923  if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \
1924  probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \
1925  if ((d->m_dict[probe_pos + match_len] == c0) && (d->m_dict[probe_pos + match_len - 1] == c1)) break;
1926  TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE;
1927  }
1928  if (!dist) break; p = s; q = d->m_dict + probe_pos; for (probe_len = 0; probe_len < max_match_len; probe_len++) if (*p++ != *q++) break;
1929  if (probe_len > match_len) {
1930  *pMatch_dist = dist; if ((*pMatch_len = match_len = probe_len) == max_match_len) return;
1931  c0 = d->m_dict[pos + match_len]; c1 = d->m_dict[pos + match_len - 1];
1932  }
1933  }
1934 }
1935 #endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
1936 
1937 #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
1938 static mz_bool tdefl_compress_fast(tdefl_compressor *d)
1939 {
1940  // Faster, minimally featured LZRW1-style match+parse loop with better register utilization. Intended for applications where raw throughput is valued more highly than ratio.
1941  mz_uint lookahead_pos = d->m_lookahead_pos, lookahead_size = d->m_lookahead_size, dict_size = d->m_dict_size, total_lz_bytes = d->m_total_lz_bytes, num_flags_left = d->m_num_flags_left;
1942  mz_uint8 *pLZ_code_buf = d->m_pLZ_code_buf, *pLZ_flags = d->m_pLZ_flags;
1943  mz_uint cur_pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK;
1944 
1945  while ((d->m_src_buf_left) || ((d->m_flush) && (lookahead_size))) {
1946  const mz_uint TDEFL_COMP_FAST_LOOKAHEAD_SIZE = 4096;
1947  mz_uint dst_pos = (lookahead_pos + lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK;
1948  mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(d->m_src_buf_left, TDEFL_COMP_FAST_LOOKAHEAD_SIZE - lookahead_size);
1949  d->m_src_buf_left -= num_bytes_to_process;
1950  lookahead_size += num_bytes_to_process;
1951 
1952  while (num_bytes_to_process) {
1953  mz_uint32 n = MZ_MIN(TDEFL_LZ_DICT_SIZE - dst_pos, num_bytes_to_process);
1954  memcpy(d->m_dict + dst_pos, d->m_pSrc, n);
1955  if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1))
1956  memcpy(d->m_dict + TDEFL_LZ_DICT_SIZE + dst_pos, d->m_pSrc, MZ_MIN(n, (TDEFL_MAX_MATCH_LEN - 1) - dst_pos));
1957  d->m_pSrc += n;
1958  dst_pos = (dst_pos + n) & TDEFL_LZ_DICT_SIZE_MASK;
1959  num_bytes_to_process -= n;
1960  }
1961 
1962  dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - lookahead_size, dict_size);
1963  if ((!d->m_flush) && (lookahead_size < TDEFL_COMP_FAST_LOOKAHEAD_SIZE)) break;
1964 
1965  while (lookahead_size >= 4) {
1966  mz_uint cur_match_dist, cur_match_len = 1;
1967  mz_uint8 *pCur_dict = d->m_dict + cur_pos;
1968  mz_uint first_trigram = (*(const mz_uint32 *)pCur_dict) & 0xFFFFFF;
1969  mz_uint hash = (first_trigram ^ (first_trigram >> (24 - (TDEFL_LZ_HASH_BITS - 8)))) & TDEFL_LEVEL1_HASH_SIZE_MASK;
1970  mz_uint probe_pos = d->m_hash[hash];
1971  d->m_hash[hash] = (mz_uint16)lookahead_pos;
1972 
1973  if (((cur_match_dist = (mz_uint16)(lookahead_pos - probe_pos)) <= dict_size) && ((*(const mz_uint32 *)(d->m_dict + (probe_pos &= TDEFL_LZ_DICT_SIZE_MASK)) & 0xFFFFFF) == first_trigram)) {
1974  const mz_uint16 *p = (const mz_uint16 *)pCur_dict;
1975  const mz_uint16 *q = (const mz_uint16 *)(d->m_dict + probe_pos);
1976  mz_uint32 probe_len = 32;
1977  do { } while ((TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&
1978  (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0));
1979  cur_match_len = ((mz_uint)(p - (const mz_uint16 *)pCur_dict) * 2) + (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q);
1980  if (!probe_len)
1981  cur_match_len = cur_match_dist ? TDEFL_MAX_MATCH_LEN : 0;
1982 
1983  if ((cur_match_len < TDEFL_MIN_MATCH_LEN) || ((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U*1024U))) {
1984  cur_match_len = 1;
1985  *pLZ_code_buf++ = (mz_uint8)first_trigram;
1986  *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);
1987  d->m_huff_count[0][(mz_uint8)first_trigram]++;
1988  }
1989  else {
1990  mz_uint32 s0, s1;
1991  cur_match_len = MZ_MIN(cur_match_len, lookahead_size);
1992 
1993  MZ_ASSERT((cur_match_len >= TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 1) && (cur_match_dist <= TDEFL_LZ_DICT_SIZE));
1994 
1995  cur_match_dist--;
1996 
1997  pLZ_code_buf[0] = (mz_uint8)(cur_match_len - TDEFL_MIN_MATCH_LEN);
1998  *(mz_uint16 *)(&pLZ_code_buf[1]) = (mz_uint16)cur_match_dist;
1999  pLZ_code_buf += 3;
2000  *pLZ_flags = (mz_uint8)((*pLZ_flags >> 1) | 0x80);
2001 
2002  s0 = s_tdefl_small_dist_sym[cur_match_dist & 511];
2003  s1 = s_tdefl_large_dist_sym[cur_match_dist >> 8];
2004  d->m_huff_count[1][(cur_match_dist < 512) ? s0 : s1]++;
2005 
2006  d->m_huff_count[0][s_tdefl_len_sym[cur_match_len - TDEFL_MIN_MATCH_LEN]]++;
2007  }
2008  }
2009  else {
2010  *pLZ_code_buf++ = (mz_uint8)first_trigram;
2011  *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);
2012  d->m_huff_count[0][(mz_uint8)first_trigram]++;
2013  }
2014 
2015  if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; }
2016 
2017  total_lz_bytes += cur_match_len;
2018  lookahead_pos += cur_match_len;
2019  dict_size = MZ_MIN(dict_size + cur_match_len, (mz_uint)TDEFL_LZ_DICT_SIZE);
2020  cur_pos = (cur_pos + cur_match_len) & TDEFL_LZ_DICT_SIZE_MASK;
2021  MZ_ASSERT(lookahead_size >= cur_match_len);
2022  lookahead_size -= cur_match_len;
2023 
2024  if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) {
2025  int n;
2026  d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size;
2027  d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left;
2028  if ((n = tdefl_flush_block(d, 0)) != 0)
2029  return (n < 0) ? MZ_FALSE : MZ_TRUE;
2030  total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left;
2031  }
2032  }
2033 
2034  while (lookahead_size) {
2035  mz_uint8 lit = d->m_dict[cur_pos];
2036 
2037  total_lz_bytes++;
2038  *pLZ_code_buf++ = lit;
2039  *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1);
2040  if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; }
2041 
2042  d->m_huff_count[0][lit]++;
2043 
2044  lookahead_pos++;
2045  dict_size = MZ_MIN(dict_size + 1, (mz_uint)TDEFL_LZ_DICT_SIZE);
2046  cur_pos = (cur_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK;
2047  lookahead_size--;
2048 
2049  if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) {
2050  int n;
2051  d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size;
2052  d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left;
2053  if ((n = tdefl_flush_block(d, 0)) != 0)
2054  return (n < 0) ? MZ_FALSE : MZ_TRUE;
2055  total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left;
2056  }
2057  }
2058  }
2059 
2060  d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size;
2061  d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left;
2062  return MZ_TRUE;
2063 }
2064 #endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
2065 
2066 static MZ_FORCEINLINE void tdefl_record_literal(tdefl_compressor *d, mz_uint8 lit)
2067 {
2068  d->m_total_lz_bytes++;
2069  *d->m_pLZ_code_buf++ = lit;
2070  *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> 1); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; }
2071  d->m_huff_count[0][lit]++;
2072 }
2073 
2074 static MZ_FORCEINLINE void tdefl_record_match(tdefl_compressor *d, mz_uint match_len, mz_uint match_dist)
2075 {
2076  mz_uint32 s0, s1;
2077 
2078  MZ_ASSERT((match_len >= TDEFL_MIN_MATCH_LEN) && (match_dist >= 1) && (match_dist <= TDEFL_LZ_DICT_SIZE));
2079 
2080  d->m_total_lz_bytes += match_len;
2081 
2082  d->m_pLZ_code_buf[0] = (mz_uint8)(match_len - TDEFL_MIN_MATCH_LEN);
2083 
2084  match_dist -= 1;
2085  d->m_pLZ_code_buf[1] = (mz_uint8)(match_dist & 0xFF);
2086  d->m_pLZ_code_buf[2] = (mz_uint8)(match_dist >> 8); d->m_pLZ_code_buf += 3;
2087 
2088  *d->m_pLZ_flags = (mz_uint8)((*d->m_pLZ_flags >> 1) | 0x80); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; }
2089 
2090  s0 = s_tdefl_small_dist_sym[match_dist & 511]; s1 = s_tdefl_large_dist_sym[(match_dist >> 8) & 127];
2091  d->m_huff_count[1][(match_dist < 512) ? s0 : s1]++;
2092 
2093  if (match_len >= TDEFL_MIN_MATCH_LEN) d->m_huff_count[0][s_tdefl_len_sym[match_len - TDEFL_MIN_MATCH_LEN]]++;
2094 }
2095 
2097 {
2098  const mz_uint8 *pSrc = d->m_pSrc; size_t src_buf_left = d->m_src_buf_left;
2099  tdefl_flush flush = d->m_flush;
2100 
2101  while ((src_buf_left) || ((flush) && (d->m_lookahead_size))) {
2102  mz_uint len_to_move, cur_match_dist, cur_match_len, cur_pos;
2103  // Update dictionary and hash chains. Keeps the lookahead size equal to TDEFL_MAX_MATCH_LEN.
2104  if ((d->m_lookahead_size + d->m_dict_size) >= (TDEFL_MIN_MATCH_LEN - 1)) {
2105  mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK, ins_pos = d->m_lookahead_pos + d->m_lookahead_size - 2;
2106  mz_uint hash = (d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK];
2107  mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(src_buf_left, TDEFL_MAX_MATCH_LEN - d->m_lookahead_size);
2108  const mz_uint8 *pSrc_end = pSrc + num_bytes_to_process;
2109  src_buf_left -= num_bytes_to_process;
2110  d->m_lookahead_size += num_bytes_to_process;
2111  while (pSrc != pSrc_end) {
2112  mz_uint8 c = *pSrc++; d->m_dict[dst_pos] = c; if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c;
2113  hash = ((hash << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1);
2114  d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos);
2115  dst_pos = (dst_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; ins_pos++;
2116  }
2117  }
2118  else {
2119  while ((src_buf_left) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) {
2120  mz_uint8 c = *pSrc++;
2121  mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK;
2122  src_buf_left--;
2123  d->m_dict[dst_pos] = c;
2124  if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1))
2125  d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c;
2126  if ((++d->m_lookahead_size + d->m_dict_size) >= TDEFL_MIN_MATCH_LEN) {
2127  mz_uint ins_pos = d->m_lookahead_pos + (d->m_lookahead_size - 1) - 2;
2128  mz_uint hash = ((d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << (TDEFL_LZ_HASH_SHIFT * 2)) ^ (d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1);
2129  d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos);
2130  }
2131  }
2132  }
2133  d->m_dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - d->m_lookahead_size, d->m_dict_size);
2134  if ((!flush) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN))
2135  break;
2136 
2137  // Simple lazy/greedy parsing state machine.
2138  len_to_move = 1; cur_match_dist = 0; cur_match_len = d->m_saved_match_len ? d->m_saved_match_len : (TDEFL_MIN_MATCH_LEN - 1); cur_pos = d->m_lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK;
2139  if (d->m_flags & (TDEFL_RLE_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS)) {
2140  if ((d->m_dict_size) && (!(d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) {
2141  mz_uint8 c = d->m_dict[(cur_pos - 1) & TDEFL_LZ_DICT_SIZE_MASK];
2142  cur_match_len = 0; while (cur_match_len < d->m_lookahead_size) { if (d->m_dict[cur_pos + cur_match_len] != c) break; cur_match_len++; }
2143  if (cur_match_len < TDEFL_MIN_MATCH_LEN) cur_match_len = 0; else cur_match_dist = 1;
2144  }
2145  }
2146  else {
2147  tdefl_find_match(d, d->m_lookahead_pos, d->m_dict_size, d->m_lookahead_size, &cur_match_dist, &cur_match_len);
2148  }
2149  if (((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U*1024U)) || (cur_pos == cur_match_dist) || ((d->m_flags & TDEFL_FILTER_MATCHES) && (cur_match_len <= 5))) {
2150  cur_match_dist = cur_match_len = 0;
2151  }
2152  if (d->m_saved_match_len) {
2153  if (cur_match_len > d->m_saved_match_len) {
2154  tdefl_record_literal(d, (mz_uint8)d->m_saved_lit);
2155  if (cur_match_len >= 128) {
2156  tdefl_record_match(d, cur_match_len, cur_match_dist);
2157  d->m_saved_match_len = 0; len_to_move = cur_match_len;
2158  }
2159  else {
2160  d->m_saved_lit = d->m_dict[cur_pos]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len;
2161  }
2162  }
2163  else {
2164  tdefl_record_match(d, d->m_saved_match_len, d->m_saved_match_dist);
2165  len_to_move = d->m_saved_match_len - 1; d->m_saved_match_len = 0;
2166  }
2167  }
2168  else if (!cur_match_dist)
2169  tdefl_record_literal(d, d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]);
2170  else if ((d->m_greedy_parsing) || (d->m_flags & TDEFL_RLE_MATCHES) || (cur_match_len >= 128)) {
2171  tdefl_record_match(d, cur_match_len, cur_match_dist);
2172  len_to_move = cur_match_len;
2173  }
2174  else {
2175  d->m_saved_lit = d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len;
2176  }
2177  // Move the lookahead forward by len_to_move bytes.
2178  d->m_lookahead_pos += len_to_move;
2179  MZ_ASSERT(d->m_lookahead_size >= len_to_move);
2180  d->m_lookahead_size -= len_to_move;
2181  d->m_dict_size = MZ_MIN(d->m_dict_size + len_to_move, (mz_uint)TDEFL_LZ_DICT_SIZE);
2182  // Check if it's time to flush the current LZ codes to the internal output buffer.
2183  if ((d->m_pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) ||
2184  ((d->m_total_lz_bytes > 31*1024) && (((((mz_uint)(d->m_pLZ_code_buf - d->m_lz_code_buf) * 115) >> 7) >= d->m_total_lz_bytes) || (d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS)))) {
2185  int n;
2186  d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left;
2187  if ((n = tdefl_flush_block(d, 0)) != 0)
2188  return (n < 0) ? MZ_FALSE : MZ_TRUE;
2189  }
2190  }
2191 
2192  d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left;
2193  return MZ_TRUE;
2194 }
2195 
2197 {
2198  if (d->m_pIn_buf_size) {
2199  *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf;
2200  }
2201 
2202  if (d->m_pOut_buf_size) {
2203  size_t n = MZ_MIN(*d->m_pOut_buf_size - d->m_out_buf_ofs, d->m_output_flush_remaining);
2204  memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf + d->m_output_flush_ofs, n);
2205  d->m_output_flush_ofs += (mz_uint)n;
2206  d->m_output_flush_remaining -= (mz_uint)n;
2207  d->m_out_buf_ofs += n;
2208 
2209  *d->m_pOut_buf_size = d->m_out_buf_ofs;
2210  }
2211 
2212  return (d->m_finished && !d->m_output_flush_remaining) ? TDEFL_STATUS_DONE : TDEFL_STATUS_OKAY;
2213 }
2214 
2215 tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush)
2216 {
2217  if (!d) {
2218  if (pIn_buf_size) *pIn_buf_size = 0;
2219  if (pOut_buf_size) *pOut_buf_size = 0;
2220  return TDEFL_STATUS_BAD_PARAM;
2221  }
2222 
2223  d->m_pIn_buf = pIn_buf; d->m_pIn_buf_size = pIn_buf_size;
2224  d->m_pOut_buf = pOut_buf; d->m_pOut_buf_size = pOut_buf_size;
2225  d->m_pSrc = (const mz_uint8 *)(pIn_buf); d->m_src_buf_left = pIn_buf_size ? *pIn_buf_size : 0;
2226  d->m_out_buf_ofs = 0;
2227  d->m_flush = flush;
2228 
2229  if (((d->m_pPut_buf_func != NULL) == ((pOut_buf != NULL) || (pOut_buf_size != NULL))) || (d->m_prev_return_status != TDEFL_STATUS_OKAY) ||
2230  (d->m_wants_to_finish && (flush != TDEFL_FINISH)) || (pIn_buf_size && *pIn_buf_size && !pIn_buf) || (pOut_buf_size && *pOut_buf_size && !pOut_buf)) {
2231  if (pIn_buf_size) *pIn_buf_size = 0;
2232  if (pOut_buf_size) *pOut_buf_size = 0;
2233  return (d->m_prev_return_status = TDEFL_STATUS_BAD_PARAM);
2234  }
2235  d->m_wants_to_finish |= (flush == TDEFL_FINISH);
2236 
2237  if ((d->m_output_flush_remaining) || (d->m_finished))
2238  return (d->m_prev_return_status = tdefl_flush_output_buffer(d));
2239 
2240 #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
2241  if (((d->m_flags & TDEFL_MAX_PROBES_MASK) == 1) &&
2242  ((d->m_flags & TDEFL_GREEDY_PARSING_FLAG) != 0) &&
2244  if (!tdefl_compress_fast(d))
2245  return d->m_prev_return_status;
2246  }
2247  else
2248 #endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
2249  {
2250  if (!tdefl_compress_normal(d))
2251  return d->m_prev_return_status;
2252  }
2253 
2254  if ((d->m_flags & (TDEFL_WRITE_ZLIB_HEADER | TDEFL_COMPUTE_ADLER32)) && (pIn_buf))
2255  d->m_adler32 = (mz_uint32)mz_adler32(d->m_adler32, (const mz_uint8 *)pIn_buf, d->m_pSrc - (const mz_uint8 *)pIn_buf);
2256 
2257  if ((flush) && (!d->m_lookahead_size) && (!d->m_src_buf_left) && (!d->m_output_flush_remaining)) {
2258  if (tdefl_flush_block(d, flush) < 0)
2259  return d->m_prev_return_status;
2260  d->m_finished = (flush == TDEFL_FINISH);
2261  if (flush == TDEFL_FULL_FLUSH) { MZ_CLEAR_OBJ(d->m_hash); MZ_CLEAR_OBJ(d->m_next); d->m_dict_size = 0; }
2262  }
2263 
2264  return (d->m_prev_return_status = tdefl_flush_output_buffer(d));
2265 }
2266 
2267 tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush)
2268 {
2269  MZ_ASSERT(d->m_pPut_buf_func); return tdefl_compress(d, pIn_buf, &in_buf_size, NULL, NULL, flush);
2270 }
2271 
2272 tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)
2273 {
2274  d->m_pPut_buf_func = pPut_buf_func; d->m_pPut_buf_user = pPut_buf_user;
2275  d->m_flags = (mz_uint)(flags); d->m_max_probes[0] = 1 + ((flags & 0xFFF) + 2) / 3; d->m_greedy_parsing = (flags & TDEFL_GREEDY_PARSING_FLAG) != 0;
2276  d->m_max_probes[1] = 1 + (((flags & 0xFFF) >> 2) + 2) / 3;
2277  if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG)) MZ_CLEAR_OBJ(d->m_hash);
2278  d->m_lookahead_pos = d->m_lookahead_size = d->m_dict_size = d->m_total_lz_bytes = d->m_lz_code_buf_dict_pos = d->m_bits_in = 0;
2279  d->m_output_flush_ofs = d->m_output_flush_remaining = d->m_finished = d->m_block_index = d->m_bit_buffer = d->m_wants_to_finish = 0;
2280  d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8;
2281  d->m_pOutput_buf = d->m_output_buf; d->m_pOutput_buf_end = d->m_output_buf; d->m_prev_return_status = TDEFL_STATUS_OKAY;
2282  d->m_saved_match_dist = d->m_saved_match_len = d->m_saved_lit = 0; d->m_adler32 = 1;
2283  d->m_pIn_buf = NULL; d->m_pOut_buf = NULL;
2284  d->m_pIn_buf_size = NULL; d->m_pOut_buf_size = NULL;
2285  d->m_flush = TDEFL_NO_FLUSH; d->m_pSrc = NULL; d->m_src_buf_left = 0; d->m_out_buf_ofs = 0;
2286  memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0);
2287  memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1);
2288  return TDEFL_STATUS_OKAY;
2289 }
2290 
2292 {
2293  return d->m_prev_return_status;
2294 }
2295 
2297 {
2298  return d->m_adler32;
2299 }
2300 
2301 mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)
2302 {
2303  tdefl_compressor *pComp; mz_bool succeeded; if (((buf_len) && (!pBuf)) || (!pPut_buf_func)) return MZ_FALSE;
2304  pComp = (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor)); if (!pComp) return MZ_FALSE;
2305  succeeded = (tdefl_init(pComp, pPut_buf_func, pPut_buf_user, flags) == TDEFL_STATUS_OKAY);
2306  succeeded = succeeded && (tdefl_compress_buffer(pComp, pBuf, buf_len, TDEFL_FINISH) == TDEFL_STATUS_DONE);
2307  MZ_FREE(pComp); return succeeded;
2308 }
2309 
2310 typedef struct
2311 {
2312  size_t m_size, m_capacity;
2316 
2317 static mz_bool tdefl_output_buffer_putter(const void *pBuf, int len, void *pUser)
2318 {
2320  size_t new_size = p->m_size + len;
2321  if (new_size > p->m_capacity) {
2322  size_t new_capacity = p->m_capacity; mz_uint8 *pNew_buf; if (!p->m_expandable) return MZ_FALSE;
2323  do { new_capacity = MZ_MAX(128U, new_capacity << 1U); } while (new_size > new_capacity);
2324  pNew_buf = (mz_uint8 *)MZ_REALLOC(p->m_pBuf, new_capacity); if (!pNew_buf) return MZ_FALSE;
2325  p->m_pBuf = pNew_buf; p->m_capacity = new_capacity;
2326  }
2327  memcpy((mz_uint8 *)p->m_pBuf + p->m_size, pBuf, len); p->m_size = new_size;
2328  return MZ_TRUE;
2329 }
2330 
2331 void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags)
2332 {
2333  tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf);
2334  if (!pOut_len) return MZ_FALSE; else *pOut_len = 0;
2335  out_buf.m_expandable = MZ_TRUE;
2336  if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return NULL;
2337  *pOut_len = out_buf.m_size; return out_buf.m_pBuf;
2338 }
2339 
2340 size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags)
2341 {
2342  tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf);
2343  if (!pOut_buf) return 0;
2344  out_buf.m_pBuf = (mz_uint8 *)pOut_buf; out_buf.m_capacity = out_buf_len;
2345  if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return 0;
2346  return out_buf.m_size;
2347 }
2348 
2349 #ifndef MINIZ_NO_ZLIB_APIS
2350 static const mz_uint s_tdefl_num_probes[11] = { 0, 1, 6, 32, 16, 32, 128, 256, 512, 768, 1500 };
2351 
2352 // level may actually range from [0,10] (10 is a "hidden" max level, where we want a bit more compression and it's fine if throughput to fall off a cliff on some files).
2353 mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy)
2354 {
2355  mz_uint comp_flags = s_tdefl_num_probes[(level >= 0) ? MZ_MIN(10, level) : MZ_DEFAULT_LEVEL] | ((level <= 3) ? TDEFL_GREEDY_PARSING_FLAG : 0);
2356  if (window_bits > 0) comp_flags |= TDEFL_WRITE_ZLIB_HEADER;
2357 
2358  if (!level) comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS;
2359  else if (strategy == MZ_FILTERED) comp_flags |= TDEFL_FILTER_MATCHES;
2360  else if (strategy == MZ_HUFFMAN_ONLY) comp_flags &= ~TDEFL_MAX_PROBES_MASK;
2361  else if (strategy == MZ_FIXED) comp_flags |= TDEFL_FORCE_ALL_STATIC_BLOCKS;
2362  else if (strategy == MZ_RLE) comp_flags |= TDEFL_RLE_MATCHES;
2363 
2364  return comp_flags;
2365 }
2366 #endif //MINIZ_NO_ZLIB_APIS
2367 
2368 #ifdef _MSC_VER
2369 #pragma warning (push)
2370 #pragma warning (disable:4204) // nonstandard extension used : non-constant aggregate initializer (also supported by GNU C and C99, so no big deal)
2371 #endif
2372 
2373 // Simple PNG writer function by Alex Evans, 2011. Released into the public domain: https://gist.github.com/908299, more context at
2374 // http://altdevblogaday.org/2011/04/06/a-smaller-jpg-encoder/.
2375 // This is actually a modification of Alex's original code so PNG files generated by this function pass pngcheck.
2376 void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, size_t *pLen_out, mz_uint level, mz_bool flip)
2377 {
2378  // Using a local copy of this array here in case MINIZ_NO_ZLIB_APIS was defined.
2379  static const mz_uint s_tdefl_png_num_probes[11] = { 0, 1, 6, 32, 16, 32, 128, 256, 512, 768, 1500 };
2380  tdefl_compressor *pComp = (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor)); tdefl_output_buffer out_buf; int i, bpl = w * num_chans, y, z; mz_uint32 c; *pLen_out = 0;
2381  if (!pComp) return NULL;
2382  MZ_CLEAR_OBJ(out_buf); out_buf.m_expandable = MZ_TRUE; out_buf.m_capacity = 57+MZ_MAX(64, (1+bpl)*h); if (NULL == (out_buf.m_pBuf = (mz_uint8 *)MZ_MALLOC(out_buf.m_capacity))) { MZ_FREE(pComp); return NULL; }
2383  // write dummy header
2384  for (z = 41; z; --z) tdefl_output_buffer_putter(&z, 1, &out_buf);
2385  // compress image data
2386  tdefl_init(pComp, tdefl_output_buffer_putter, &out_buf, s_tdefl_png_num_probes[MZ_MIN(10, level)] | TDEFL_WRITE_ZLIB_HEADER | (level <= 3 ? TDEFL_GREEDY_PARSING_FLAG : 0));
2387  for (y = 0; y < h; ++y) { tdefl_compress_buffer(pComp, &z, 1, TDEFL_NO_FLUSH); tdefl_compress_buffer(pComp, (mz_uint8 *)pImage + (flip ? (h - 1 - y) : y) * bpl, bpl, TDEFL_NO_FLUSH); }
2388  if (tdefl_compress_buffer(pComp, NULL, 0, TDEFL_FINISH) != TDEFL_STATUS_DONE) { MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; }
2389  // write real header
2390  *pLen_out = out_buf.m_size-41;
2391  {
2392  static const mz_uint8 chans[] = { 0x00, 0x00, 0x04, 0x02, 0x06 };
2393  mz_uint8 pnghdr[41] = { 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
2394  0,0,(mz_uint8)(w>>8),(mz_uint8)w,0,0,(mz_uint8)(h>>8),(mz_uint8)h,8,chans[num_chans],0,0,0,0,0,0,0,
2395  (mz_uint8)(*pLen_out>>24),(mz_uint8)(*pLen_out>>16),(mz_uint8)(*pLen_out>>8),(mz_uint8)*pLen_out,0x49,0x44,0x41,0x54 };
2396  c = (mz_uint32)mz_crc32(MZ_CRC32_INIT, pnghdr+12, 17); for (i = 0; i<4; ++i, c <<= 8) ((mz_uint8 *)(pnghdr+29))[i] = (mz_uint8)(c>>24);
2397  memcpy(out_buf.m_pBuf, pnghdr, 41);
2398  }
2399  // write footer (IDAT CRC-32, followed by IEND chunk)
2400  if (!tdefl_output_buffer_putter("\0\0\0\0\0\0\0\0\x49\x45\x4e\x44\xae\x42\x60\x82", 16, &out_buf)) { *pLen_out = 0; MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; }
2401  c = (mz_uint32)mz_crc32(MZ_CRC32_INIT, out_buf.m_pBuf+41-4, *pLen_out+4); for (i = 0; i<4; ++i, c <<= 8) (out_buf.m_pBuf+out_buf.m_size-16)[i] = (mz_uint8)(c >> 24);
2402  // compute final size of file, grab compressed data buffer and return
2403  *pLen_out += 57; MZ_FREE(pComp); return out_buf.m_pBuf;
2404 }
2405 void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out)
2406 {
2407  // Level 6 corresponds to TDEFL_DEFAULT_MAX_PROBES or MZ_DEFAULT_LEVEL (but we can't depend on MZ_DEFAULT_LEVEL being available in case the zlib API's where #defined out)
2408  return tdefl_write_image_to_png_file_in_memory_ex(pImage, w, h, num_chans, pLen_out, 6, MZ_FALSE);
2409 }
2410 
2411 #ifdef _MSC_VER
2412 #pragma warning (pop)
2413 #endif
2414 
2415 } // namespace buminiz
2416 
2417 #endif // MINIZ_HEADER_FILE_ONLY
int mz_deflateInit(mz_streamp pStream, int level)
Definition: basisu_miniz.h:693
@ TDEFL_MAX_PROBES_MASK
Definition: basisu_miniz.h:460
@ TDEFL_DEFAULT_MAX_PROBES
Definition: basisu_miniz.h:460
@ TDEFL_HUFFMAN_ONLY
Definition: basisu_miniz.h:460
void *const voidpc
Definition: basisu_miniz.h:273
void * tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out)
unsigned int uInt
Definition: basisu_miniz.h:264
tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush)
int mz_deflateEnd(mz_streamp pStream)
Definition: basisu_miniz.h:782
unsigned char mz_validate_uint32[sizeof(mz_uint32)==4 ? 1 :-1]
Definition: basisu_miniz.h:614
mz_ulong mz_crc32(mz_ulong crc, const unsigned char *ptr, size_t buf_len)
Definition: basisu_miniz.h:667
uLong uLongf
Definition: basisu_miniz.h:271
@ MZ_NEED_DICT
Definition: basisu_miniz.h:136
@ MZ_MEM_ERROR
Definition: basisu_miniz.h:136
@ MZ_STREAM_ERROR
Definition: basisu_miniz.h:136
@ MZ_DATA_ERROR
Definition: basisu_miniz.h:136
@ MZ_BUF_ERROR
Definition: basisu_miniz.h:136
@ MZ_PARAM_ERROR
Definition: basisu_miniz.h:136
@ MZ_STREAM_END
Definition: basisu_miniz.h:136
@ MZ_VERSION_ERROR
Definition: basisu_miniz.h:136
static void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num, int table_len, int code_size_limit, int static_table)
@ TDEFL_FINISH
Definition: basisu_miniz.h:542
@ TDEFL_SYNC_FLUSH
Definition: basisu_miniz.h:540
@ TDEFL_FULL_FLUSH
Definition: basisu_miniz.h:541
@ TDEFL_NO_FLUSH
Definition: basisu_miniz.h:539
static int tdefl_flush_block(tdefl_compressor *d, int flush)
int mz_inflateEnd(mz_streamp pStream)
Definition: basisu_miniz.h:978
long long mz_int64
Definition: basisu_miniz.h:344
unsigned int mz_uint32
Definition: basisu_miniz.h:342
static mz_bool tdefl_compress_block(tdefl_compressor *d, mz_bool static_block)
static const mz_uint8 s_tdefl_small_dist_extra[512]
size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags)
mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy)
size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags)
void * tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags)
tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags)
int mz_inflate(mz_streamp pStream, int flush)
Definition: basisu_miniz.h:973
const char * mz_version(void)
Definition: basisu_miniz.h:688
mz_ulong uLong
Definition: basisu_miniz.h:265
@ TDEFL_LZ_HASH_SIZE
Definition: basisu_miniz.h:524
@ TDEFL_LZ_HASH_SHIFT
Definition: basisu_miniz.h:524
@ TDEFL_LZ_CODE_BUF_SIZE
Definition: basisu_miniz.h:524
@ TDEFL_LEVEL1_HASH_SIZE_MASK
Definition: basisu_miniz.h:524
@ TDEFL_OUT_BUF_SIZE
Definition: basisu_miniz.h:524
@ TDEFL_MAX_HUFF_SYMBOLS
Definition: basisu_miniz.h:524
@ TDEFL_LZ_HASH_BITS
Definition: basisu_miniz.h:524
@ TDEFL_LZ_DICT_SIZE_MASK
Definition: basisu_miniz.h:518
@ TDEFL_MAX_HUFF_SYMBOLS_2
Definition: basisu_miniz.h:518
@ TDEFL_MAX_MATCH_LEN
Definition: basisu_miniz.h:518
@ TDEFL_MAX_HUFF_TABLES
Definition: basisu_miniz.h:518
@ TDEFL_MAX_HUFF_SYMBOLS_0
Definition: basisu_miniz.h:518
@ TDEFL_LZ_DICT_SIZE
Definition: basisu_miniz.h:518
@ TDEFL_MAX_HUFF_SYMBOLS_1
Definition: basisu_miniz.h:518
@ TDEFL_MIN_MATCH_LEN
Definition: basisu_miniz.h:518
void * tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags)
static void tdefl_huffman_enforce_max_code_size(int *pNum_codes, int code_list_len, int max_code_size)
static const mz_uint8 s_tdefl_large_dist_extra[128]
int mz_inflateInit2(mz_streamp pStream, int window_bits)
Definition: basisu_miniz.h:851
int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level)
Definition: basisu_miniz.h:806
static const mz_uint8 s_tdefl_small_dist_sym[512]
int mz_deflate(mz_streamp pStream, int flush)
Definition: basisu_miniz.h:737
static const mz_uint8 s_tdefl_len_extra[256]
static mz_bool tdefl_output_buffer_putter(const void *pBuf, int len, void *pUser)
static tdefl_sym_freq * tdefl_radix_sort_syms(mz_uint num_syms, tdefl_sym_freq *pSyms0, tdefl_sym_freq *pSyms1)
static void tdefl_calculate_minimum_redundancy(tdefl_sym_freq *A, int n)
mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len)
Definition: basisu_miniz.h:651
@ TDEFL_NONDETERMINISTIC_PARSING_FLAG
Definition: basisu_miniz.h:477
@ TDEFL_GREEDY_PARSING_FLAG
Definition: basisu_miniz.h:476
@ TDEFL_FILTER_MATCHES
Definition: basisu_miniz.h:479
@ TDEFL_COMPUTE_ADLER32
Definition: basisu_miniz.h:475
@ TDEFL_FORCE_ALL_RAW_BLOCKS
Definition: basisu_miniz.h:481
@ TDEFL_WRITE_ZLIB_HEADER
Definition: basisu_miniz.h:474
@ TDEFL_FORCE_ALL_STATIC_BLOCKS
Definition: basisu_miniz.h:480
@ TDEFL_RLE_MATCHES
Definition: basisu_miniz.h:478
void * voidp
Definition: basisu_miniz.h:272
static void tdefl_start_static_block(tdefl_compressor *d)
@ TDEFL_STATUS_OKAY
Definition: basisu_miniz.h:532
@ TDEFL_STATUS_DONE
Definition: basisu_miniz.h:533
@ TDEFL_STATUS_PUT_BUF_FAILED
Definition: basisu_miniz.h:531
@ TDEFL_STATUS_BAD_PARAM
Definition: basisu_miniz.h:530
static const mz_uint s_tdefl_num_probes[11]
const char * mz_error(int err)
static void tdefl_start_dynamic_block(tdefl_compressor *d)
Byte Bytef
Definition: basisu_miniz.h:266
static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d)
tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)
static mz_bool tdefl_compress_normal(tdefl_compressor *d)
mz_bool(* tdefl_put_buf_func_ptr)(const void *pBuf, int len, void *pUser)
Definition: basisu_miniz.h:513
static MZ_FORCEINLINE void tdefl_record_match(tdefl_compressor *d, mz_uint match_len, mz_uint match_dist)
@ TDEFL_MAX_SUPPORTED_HUFF_CODESIZE
int mz_inflateInit(mz_streamp pStream)
Definition: basisu_miniz.h:882
static const mz_uint16 s_tdefl_len_sym[256]
mz_ulong mz_compressBound(mz_ulong source_len)
Definition: basisu_miniz.h:838
tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d)
static const mz_uint mz_bitmasks[17]
int mz_bool
Definition: basisu_miniz.h:346
unsigned char mz_uint8
Definition: basisu_miniz.h:339
@ MZ_BEST_SPEED
Definition: basisu_miniz.h:139
@ MZ_DEFAULT_LEVEL
Definition: basisu_miniz.h:139
@ MZ_UBER_COMPRESSION
Definition: basisu_miniz.h:139
@ MZ_DEFAULT_COMPRESSION
Definition: basisu_miniz.h:139
@ MZ_BEST_COMPRESSION
Definition: basisu_miniz.h:139
@ MZ_NO_COMPRESSION
Definition: basisu_miniz.h:139
unsigned long mz_ulong
Definition: basisu_miniz.h:98
unsigned short mz_uint16
Definition: basisu_miniz.h:341
unsigned char mz_validate_uint64[sizeof(mz_uint64)==8 ? 1 :-1]
Definition: basisu_miniz.h:615
signed short mz_int16
Definition: basisu_miniz.h:340
static tdefl_status tdefl_flush_output_buffer(tdefl_compressor *d)
static const mz_uint8 s_tdefl_large_dist_sym[128]
int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)
static void def_free_func(void *opaque, void *address)
Definition: basisu_miniz.h:685
@ TINFL_FLAG_COMPUTE_ADLER32
Definition: basisu_miniz.h:370
@ TINFL_FLAG_HAS_MORE_INPUT
Definition: basisu_miniz.h:368
@ TINFL_FLAG_PARSE_ZLIB_HEADER
Definition: basisu_miniz.h:367
@ TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF
Definition: basisu_miniz.h:369
@ MZ_HUFFMAN_ONLY
Definition: basisu_miniz.h:112
@ MZ_DEFAULT_STRATEGY
Definition: basisu_miniz.h:112
mz_uint32 tinfl_bit_buf_t
Definition: basisu_miniz.h:438
unsigned long long mz_uint64
Definition: basisu_miniz.h:345
void mz_free(void *p)
Definition: basisu_miniz.h:677
mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len)
Definition: basisu_miniz.h:792
int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len)
Definition: basisu_miniz.h:833
mz_uint32 tdefl_get_adler32(tdefl_compressor *d)
static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len)
unsigned int mz_uint
Definition: basisu_miniz.h:343
int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy)
Definition: basisu_miniz.h:698
int(* tinfl_put_buf_func_ptr)(const void *pBuf, int len, void *pUser)
Definition: basisu_miniz.h:390
void(* mz_free_func)(void *opaque, void *address)
Definition: basisu_miniz.h:122
int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len)
Definition: basisu_miniz.h:989
int mz_inflate2(mz_streamp pStream, int flush, int adler32_checking)
Definition: basisu_miniz.h:887
struct buminiz::mz_stream_s mz_stream
tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush)
void * tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, size_t *pLen_out, mz_uint level, mz_bool flip)
mz_stream * mz_streamp
Definition: basisu_miniz.h:169
void * voidpf
Definition: basisu_miniz.h:270
static mz_uint8 s_tdefl_packed_code_size_syms_swizzle[]
unsigned char mz_validate_uint16[sizeof(mz_uint16)==2 ? 1 :-1]
Definition: basisu_miniz.h:613
@ MZ_SYNC_FLUSH
Definition: basisu_miniz.h:133
@ MZ_PARTIAL_FLUSH
Definition: basisu_miniz.h:133
@ MZ_FULL_FLUSH
Definition: basisu_miniz.h:133
struct tinfl_decompressor_tag tinfl_decompressor
Definition: basisu_miniz.h:393
@ TINFL_STATUS_ADLER32_MISMATCH
Definition: basisu_miniz.h:402
@ TINFL_STATUS_FAILED
Definition: basisu_miniz.h:403
@ TINFL_STATUS_HAS_MORE_OUTPUT
Definition: basisu_miniz.h:406
@ TINFL_STATUS_DONE
Definition: basisu_miniz.h:404
@ TINFL_STATUS_BAD_PARAM
Definition: basisu_miniz.h:401
@ TINFL_STATUS_NEEDS_MORE_INPUT
Definition: basisu_miniz.h:405
uInt uIntf
Definition: basisu_miniz.h:267
unsigned char Byte
Definition: basisu_miniz.h:263
@ TINFL_FAST_LOOKUP_SIZE
Definition: basisu_miniz.h:421
@ TINFL_MAX_HUFF_SYMBOLS_1
Definition: basisu_miniz.h:420
@ TINFL_MAX_HUFF_TABLES
Definition: basisu_miniz.h:420
@ TINFL_MAX_HUFF_SYMBOLS_0
Definition: basisu_miniz.h:420
@ TINFL_FAST_LOOKUP_BITS
Definition: basisu_miniz.h:421
@ TINFL_MAX_HUFF_SYMBOLS_2
Definition: basisu_miniz.h:420
static MZ_FORCEINLINE void tdefl_record_literal(tdefl_compressor *d, mz_uint8 lit)
char charf
Definition: basisu_miniz.h:268
static void * def_alloc_func(void *opaque, size_t items, size_t size)
Definition: basisu_miniz.h:684
mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)
int mz_deflateReset(mz_streamp pStream)
Definition: basisu_miniz.h:729
void *(* mz_alloc_func)(void *opaque, size_t items, size_t size)
Definition: basisu_miniz.h:121
mz_uint8 m_dict[TINFL_LZ_DICT_SIZE]
Definition: basisu_miniz.h:847
tinfl_status m_last_status
Definition: basisu_miniz.h:848
tinfl_decompressor m_decomp
Definition: basisu_miniz.h:845
mz_free_func zfree
Definition: basisu_miniz.h:161
unsigned int avail_in
Definition: basisu_miniz.h:150
unsigned int avail_out
Definition: basisu_miniz.h:154
struct mz_internal_state * state
Definition: basisu_miniz.h:158
const unsigned char * next_in
Definition: basisu_miniz.h:149
mz_alloc_func zalloc
Definition: basisu_miniz.h:160
unsigned char * next_out
Definition: basisu_miniz.h:153
tdefl_status m_prev_return_status
Definition: basisu_miniz.h:556
tdefl_put_buf_func_ptr m_pPut_buf_func
Definition: basisu_miniz.h:548
const mz_uint8 * m_pSrc
Definition: basisu_miniz.h:561
mz_uint8 m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0+TINFL_MAX_HUFF_SYMBOLS_1+137]
Definition: basisu_miniz.h:448
mz_uint32 m_table_sizes[TINFL_MAX_HUFF_TABLES]
Definition: basisu_miniz.h:444
tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES]
Definition: basisu_miniz.h:447
mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE]
Definition: basisu_miniz.h:427
mz_int16 m_tree[TINFL_MAX_HUFF_SYMBOLS_0 *2]
Definition: basisu_miniz.h:427
mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0]
Definition: basisu_miniz.h:426