File Coverage

zopfli-one.c
Criterion Covered Total %
statement 1247 1589 78.4
branch 752 1220 61.6
condition n/a
subroutine n/a
pod n/a
total 1999 2809 71.1


line stmt bran cond sub pod time code
1             /*
2             Copyright 2011 Google Inc. All Rights Reserved.
3              
4             Licensed under the Apache License, Version 2.0 (the "License");
5             you may not use this file except in compliance with the License.
6             You may obtain a copy of the License at
7              
8             http://www.apache.org/licenses/LICENSE-2.0
9              
10             Unless required by applicable law or agreed to in writing, software
11             distributed under the License is distributed on an "AS IS" BASIS,
12             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13             See the License for the specific language governing permissions and
14             limitations under the License.
15              
16             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
17             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
18             */
19              
20             /* blocksplitter.h */
21             /*
22             Copyright 2011 Google Inc. All Rights Reserved.
23              
24             Licensed under the Apache License, Version 2.0 (the "License");
25             you may not use this file except in compliance with the License.
26             You may obtain a copy of the License at
27              
28             http://www.apache.org/licenses/LICENSE-2.0
29              
30             Unless required by applicable law or agreed to in writing, software
31             distributed under the License is distributed on an "AS IS" BASIS,
32             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
33             See the License for the specific language governing permissions and
34             limitations under the License.
35              
36             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
37             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
38             */
39              
40             /*
41             Functions to choose good boundaries for block splitting. Deflate allows encoding
42             the data in multiple blocks, with a separate Huffman tree for each block. The
43             Huffman tree itself requires some bytes to encode, so by choosing certain
44             blocks, you can either hurt, or enhance compression. These functions choose good
45             ones that enhance it.
46             */
47              
48             #ifndef ZOPFLI_BLOCKSPLITTER_H_
49             #define ZOPFLI_BLOCKSPLITTER_H_
50              
51             #include
52              
53             /* lz77.h */
54             /*
55             Copyright 2011 Google Inc. All Rights Reserved.
56              
57             Licensed under the Apache License, Version 2.0 (the "License");
58             you may not use this file except in compliance with the License.
59             You may obtain a copy of the License at
60              
61             http://www.apache.org/licenses/LICENSE-2.0
62              
63             Unless required by applicable law or agreed to in writing, software
64             distributed under the License is distributed on an "AS IS" BASIS,
65             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
66             See the License for the specific language governing permissions and
67             limitations under the License.
68              
69             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
70             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
71             */
72              
73             /*
74             Functions for basic LZ77 compression and utilities for the "squeeze" LZ77
75             compression.
76             */
77              
78             #ifndef ZOPFLI_LZ77_H_
79             #define ZOPFLI_LZ77_H_
80              
81             #include
82              
83             /* cache.h */
84             /*
85             Copyright 2011 Google Inc. All Rights Reserved.
86              
87             Licensed under the Apache License, Version 2.0 (the "License");
88             you may not use this file except in compliance with the License.
89             You may obtain a copy of the License at
90              
91             http://www.apache.org/licenses/LICENSE-2.0
92              
93             Unless required by applicable law or agreed to in writing, software
94             distributed under the License is distributed on an "AS IS" BASIS,
95             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
96             See the License for the specific language governing permissions and
97             limitations under the License.
98              
99             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
100             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
101             */
102              
103             /*
104             The cache that speeds up ZopfliFindLongestMatch of lz77.c.
105             */
106              
107             #ifndef ZOPFLI_CACHE_H_
108             #define ZOPFLI_CACHE_H_
109              
110             /* util.h */
111             /*
112             Copyright 2011 Google Inc. All Rights Reserved.
113              
114             Licensed under the Apache License, Version 2.0 (the "License");
115             you may not use this file except in compliance with the License.
116             You may obtain a copy of the License at
117              
118             http://www.apache.org/licenses/LICENSE-2.0
119              
120             Unless required by applicable law or agreed to in writing, software
121             distributed under the License is distributed on an "AS IS" BASIS,
122             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123             See the License for the specific language governing permissions and
124             limitations under the License.
125              
126             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
127             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
128             */
129              
130             /*
131             Several utilities, including: #defines to try different compression results,
132             basic deflate specification values and generic program options.
133             */
134              
135             #ifndef ZOPFLI_UTIL_H_
136             #define ZOPFLI_UTIL_H_
137              
138             #include
139             #include
140              
141             /* Minimum and maximum length that can be encoded in deflate. */
142             #define ZOPFLI_MAX_MATCH 258
143             #define ZOPFLI_MIN_MATCH 3
144              
145             /* Number of distinct literal/length and distance symbols in DEFLATE */
146             #define ZOPFLI_NUM_LL 288
147             #define ZOPFLI_NUM_D 32
148              
149             /*
150             The window size for deflate. Must be a power of two. This should be 32768, the
151             maximum possible by the deflate spec. Anything less hurts compression more than
152             speed.
153             */
154             #define ZOPFLI_WINDOW_SIZE 32768
155              
156             /*
157             The window mask used to wrap indices into the window. This is why the
158             window size must be a power of two.
159             */
160             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
161              
162             /*
163             A block structure of huge, non-smart, blocks to divide the input into, to allow
164             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
165             The whole compression algorithm, including the smarter block splitting, will
166             be executed independently on each huge block.
167             Dividing into huge blocks hurts compression, but not much relative to the size.
168             Set it to 0 to disable master blocks.
169             */
170             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
171              
172             /*
173             Used to initialize costs for example
174             */
175             #define ZOPFLI_LARGE_FLOAT 1e30
176              
177             /*
178             For longest match cache. max 256. Uses huge amounts of memory but makes it
179             faster. Uses this many times three bytes per single byte of the input data.
180             This is so because longest match finding has to find the exact distance
181             that belongs to each length for the best lz77 strategy.
182             Good values: e.g. 5, 8.
183             */
184             #define ZOPFLI_CACHE_LENGTH 8
185              
186             /*
187             limit the max hash chain hits for this hash value. This has an effect only
188             on files where the hash value is the same very often. On these files, this
189             gives worse compression (the value should ideally be 32768, which is the
190             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
191             faster on some specific files.
192             Good value: e.g. 8192.
193             */
194             #define ZOPFLI_MAX_CHAIN_HITS 8192
195              
196             /*
197             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
198             consumes a lot of memory but speeds it up. No effect on compression size.
199             */
200             #define ZOPFLI_LONGEST_MATCH_CACHE
201              
202             /*
203             Enable to remember amount of successive identical bytes in the hash chain for
204             finding longest match
205             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
206             This has no effect on the compression result, and enabling it increases speed.
207             */
208             #define ZOPFLI_HASH_SAME
209              
210             /*
211             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
212             best length so far is long enough. This is way faster for files with lots of
213             identical bytes, on which the compressor is otherwise too slow. Regular files
214             are unaffected or maybe a tiny bit slower.
215             This has no effect on the compression result, only on speed.
216             */
217             #define ZOPFLI_HASH_SAME_HASH
218              
219             /*
220             Enable this, to avoid slowness for files which are a repetition of the same
221             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
222             the compression result.
223             */
224             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
225              
226             /*
227             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
228             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
229             varies from file to file.
230             */
231             #define ZOPFLI_LAZY_MATCHING
232              
233             /*
234             Appends value to dynamically allocated memory, doubling its allocation size
235             whenever needed.
236              
237             value: the value to append, type T
238             data: pointer to the dynamic array to append to, type T**
239             size: pointer to the size of the array to append to, type size_t*. This is the
240             size that you consider the array to be, not the internal allocation size.
241             Precondition: allocated size of data is at least a power of two greater than or
242             equal than *size.
243             */
244             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
245             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
246             if (!((*size) & ((*size) - 1))) {\
247             /*double alloc size if it's a power of two*/\
248             void** data_void = reinterpret_cast(data);\
249             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
250             : realloc((*data), (*size) * 2 * sizeof(**data));\
251             }\
252             (*data)[(*size)] = (value);\
253             (*size)++;\
254             }
255             #else /* C gives problems with strict-aliasing rules for (void**) cast */
256             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
257             if (!((*size) & ((*size) - 1))) {\
258             /*double alloc size if it's a power of two*/\
259             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
260             : realloc((*data), (*size) * 2 * sizeof(**data));\
261             }\
262             (*data)[(*size)] = (value);\
263             (*size)++;\
264             }
265             #endif
266              
267              
268             #endif /* ZOPFLI_UTIL_H_ */
269              
270              
271             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
272              
273             /*
274             Cache used by ZopfliFindLongestMatch to remember previously found length/dist
275             values.
276             This is needed because the squeeze runs will ask these values multiple times for
277             the same position.
278             Uses large amounts of memory, since it has to remember the distance belonging
279             to every possible shorter-than-the-best length (the so called "sublen" array).
280             */
281             typedef struct ZopfliLongestMatchCache {
282             unsigned short* length;
283             unsigned short* dist;
284             unsigned char* sublen;
285             } ZopfliLongestMatchCache;
286              
287             /* Initializes the ZopfliLongestMatchCache. */
288             void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc);
289              
290             /* Frees up the memory of the ZopfliLongestMatchCache. */
291             void ZopfliCleanCache(ZopfliLongestMatchCache* lmc);
292              
293             /* Stores sublen array in the cache. */
294             void ZopfliSublenToCache(const unsigned short* sublen,
295             size_t pos, size_t length,
296             ZopfliLongestMatchCache* lmc);
297              
298             /* Extracts sublen array from the cache. */
299             void ZopfliCacheToSublen(const ZopfliLongestMatchCache* lmc,
300             size_t pos, size_t length,
301             unsigned short* sublen);
302             /* Returns the length up to which could be stored in the cache. */
303             unsigned ZopfliMaxCachedSublen(const ZopfliLongestMatchCache* lmc,
304             size_t pos, size_t length);
305              
306             #endif /* ZOPFLI_LONGEST_MATCH_CACHE */
307              
308             #endif /* ZOPFLI_CACHE_H_ */
309              
310             /* hash.h */
311             /*
312             Copyright 2011 Google Inc. All Rights Reserved.
313              
314             Licensed under the Apache License, Version 2.0 (the "License");
315             you may not use this file except in compliance with the License.
316             You may obtain a copy of the License at
317              
318             http://www.apache.org/licenses/LICENSE-2.0
319              
320             Unless required by applicable law or agreed to in writing, software
321             distributed under the License is distributed on an "AS IS" BASIS,
322             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
323             See the License for the specific language governing permissions and
324             limitations under the License.
325              
326             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
327             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
328             */
329              
330             /*
331             The hash for ZopfliFindLongestMatch of lz77.c.
332             */
333              
334             #ifndef ZOPFLI_HASH_H_
335             #define ZOPFLI_HASH_H_
336              
337             /* util.h */
338             /*
339             Copyright 2011 Google Inc. All Rights Reserved.
340              
341             Licensed under the Apache License, Version 2.0 (the "License");
342             you may not use this file except in compliance with the License.
343             You may obtain a copy of the License at
344              
345             http://www.apache.org/licenses/LICENSE-2.0
346              
347             Unless required by applicable law or agreed to in writing, software
348             distributed under the License is distributed on an "AS IS" BASIS,
349             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
350             See the License for the specific language governing permissions and
351             limitations under the License.
352              
353             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
354             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
355             */
356              
357             /*
358             Several utilities, including: #defines to try different compression results,
359             basic deflate specification values and generic program options.
360             */
361              
362             #ifndef ZOPFLI_UTIL_H_
363             #define ZOPFLI_UTIL_H_
364              
365             #include
366             #include
367              
368             /* Minimum and maximum length that can be encoded in deflate. */
369             #define ZOPFLI_MAX_MATCH 258
370             #define ZOPFLI_MIN_MATCH 3
371              
372             /* Number of distinct literal/length and distance symbols in DEFLATE */
373             #define ZOPFLI_NUM_LL 288
374             #define ZOPFLI_NUM_D 32
375              
376             /*
377             The window size for deflate. Must be a power of two. This should be 32768, the
378             maximum possible by the deflate spec. Anything less hurts compression more than
379             speed.
380             */
381             #define ZOPFLI_WINDOW_SIZE 32768
382              
383             /*
384             The window mask used to wrap indices into the window. This is why the
385             window size must be a power of two.
386             */
387             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
388              
389             /*
390             A block structure of huge, non-smart, blocks to divide the input into, to allow
391             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
392             The whole compression algorithm, including the smarter block splitting, will
393             be executed independently on each huge block.
394             Dividing into huge blocks hurts compression, but not much relative to the size.
395             Set it to 0 to disable master blocks.
396             */
397             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
398              
399             /*
400             Used to initialize costs for example
401             */
402             #define ZOPFLI_LARGE_FLOAT 1e30
403              
404             /*
405             For longest match cache. max 256. Uses huge amounts of memory but makes it
406             faster. Uses this many times three bytes per single byte of the input data.
407             This is so because longest match finding has to find the exact distance
408             that belongs to each length for the best lz77 strategy.
409             Good values: e.g. 5, 8.
410             */
411             #define ZOPFLI_CACHE_LENGTH 8
412              
413             /*
414             limit the max hash chain hits for this hash value. This has an effect only
415             on files where the hash value is the same very often. On these files, this
416             gives worse compression (the value should ideally be 32768, which is the
417             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
418             faster on some specific files.
419             Good value: e.g. 8192.
420             */
421             #define ZOPFLI_MAX_CHAIN_HITS 8192
422              
423             /*
424             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
425             consumes a lot of memory but speeds it up. No effect on compression size.
426             */
427             #define ZOPFLI_LONGEST_MATCH_CACHE
428              
429             /*
430             Enable to remember amount of successive identical bytes in the hash chain for
431             finding longest match
432             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
433             This has no effect on the compression result, and enabling it increases speed.
434             */
435             #define ZOPFLI_HASH_SAME
436              
437             /*
438             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
439             best length so far is long enough. This is way faster for files with lots of
440             identical bytes, on which the compressor is otherwise too slow. Regular files
441             are unaffected or maybe a tiny bit slower.
442             This has no effect on the compression result, only on speed.
443             */
444             #define ZOPFLI_HASH_SAME_HASH
445              
446             /*
447             Enable this, to avoid slowness for files which are a repetition of the same
448             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
449             the compression result.
450             */
451             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
452              
453             /*
454             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
455             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
456             varies from file to file.
457             */
458             #define ZOPFLI_LAZY_MATCHING
459              
460             /*
461             Appends value to dynamically allocated memory, doubling its allocation size
462             whenever needed.
463              
464             value: the value to append, type T
465             data: pointer to the dynamic array to append to, type T**
466             size: pointer to the size of the array to append to, type size_t*. This is the
467             size that you consider the array to be, not the internal allocation size.
468             Precondition: allocated size of data is at least a power of two greater than or
469             equal than *size.
470             */
471             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
472             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
473             if (!((*size) & ((*size) - 1))) {\
474             /*double alloc size if it's a power of two*/\
475             void** data_void = reinterpret_cast(data);\
476             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
477             : realloc((*data), (*size) * 2 * sizeof(**data));\
478             }\
479             (*data)[(*size)] = (value);\
480             (*size)++;\
481             }
482             #else /* C gives problems with strict-aliasing rules for (void**) cast */
483             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
484             if (!((*size) & ((*size) - 1))) {\
485             /*double alloc size if it's a power of two*/\
486             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
487             : realloc((*data), (*size) * 2 * sizeof(**data));\
488             }\
489             (*data)[(*size)] = (value);\
490             (*size)++;\
491             }
492             #endif
493              
494              
495             #endif /* ZOPFLI_UTIL_H_ */
496              
497              
498             typedef struct ZopfliHash {
499             int* head; /* Hash value to index of its most recent occurrence. */
500             unsigned short* prev; /* Index to index of prev. occurrence of same hash. */
501             int* hashval; /* Index to hash value at this index. */
502             int val; /* Current hash value. */
503              
504             #ifdef ZOPFLI_HASH_SAME_HASH
505             /* Fields with similar purpose as the above hash, but for the second hash with
506             a value that is calculated differently. */
507             int* head2; /* Hash value to index of its most recent occurrence. */
508             unsigned short* prev2; /* Index to index of prev. occurrence of same hash. */
509             int* hashval2; /* Index to hash value at this index. */
510             int val2; /* Current hash value. */
511             #endif
512              
513             #ifdef ZOPFLI_HASH_SAME
514             unsigned short* same; /* Amount of repetitions of same byte after this .*/
515             #endif
516             } ZopfliHash;
517              
518             /* Allocates ZopfliHash memory. */
519             void ZopfliAllocHash(size_t window_size, ZopfliHash* h);
520              
521             /* Resets all fields of ZopfliHash. */
522             void ZopfliResetHash(size_t window_size, ZopfliHash* h);
523              
524             /* Frees ZopfliHash memory. */
525             void ZopfliCleanHash(ZopfliHash* h);
526              
527             /*
528             Updates the hash values based on the current position in the array. All calls
529             to this must be made for consecutive bytes.
530             */
531             void ZopfliUpdateHash(const unsigned char* array, size_t pos, size_t end,
532             ZopfliHash* h);
533              
534             /*
535             Prepopulates hash:
536             Fills in the initial values in the hash, before ZopfliUpdateHash can be used
537             correctly.
538             */
539             void ZopfliWarmupHash(const unsigned char* array, size_t pos, size_t end,
540             ZopfliHash* h);
541              
542             #endif /* ZOPFLI_HASH_H_ */
543              
544             /* zopfli.h */
545             /*
546             Copyright 2011 Google Inc. All Rights Reserved.
547              
548             Licensed under the Apache License, Version 2.0 (the "License");
549             you may not use this file except in compliance with the License.
550             You may obtain a copy of the License at
551              
552             http://www.apache.org/licenses/LICENSE-2.0
553              
554             Unless required by applicable law or agreed to in writing, software
555             distributed under the License is distributed on an "AS IS" BASIS,
556             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
557             See the License for the specific language governing permissions and
558             limitations under the License.
559              
560             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
561             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
562             */
563              
564             #ifndef ZOPFLI_ZOPFLI_H_
565             #define ZOPFLI_ZOPFLI_H_
566              
567             #include
568             #include /* for size_t */
569              
570             #ifdef __cplusplus
571             extern "C" {
572             #endif
573              
574             /*
575             Options used throughout the program.
576             */
577             typedef struct ZopfliOptions {
578             /* Whether to print output */
579             int verbose;
580              
581             /* Whether to print more detailed output */
582             int verbose_more;
583              
584             /*
585             Maximum amount of times to rerun forward and backward pass to optimize LZ77
586             compression cost. Good values: 10, 15 for small files, 5 for files over
587             several MB in size or it will be too slow.
588             */
589             int numiterations;
590              
591             /*
592             If true, splits the data in multiple deflate blocks with optimal choice
593             for the block boundaries. Block splitting gives better compression. Default:
594             true (1).
595             */
596             int blocksplitting;
597              
598             /*
599             No longer used, left for compatibility.
600             */
601             int blocksplittinglast;
602              
603             /*
604             Maximum amount of blocks to split into (0 for unlimited, but this can give
605             extreme results that hurt compression on some files). Default value: 15.
606             */
607             int blocksplittingmax;
608             } ZopfliOptions;
609              
610             /* Initializes options with default values. */
611             void ZopfliInitOptions(ZopfliOptions* options);
612              
613             /* Output format */
614             typedef enum {
615             ZOPFLI_FORMAT_GZIP,
616             ZOPFLI_FORMAT_ZLIB,
617             ZOPFLI_FORMAT_DEFLATE
618             } ZopfliFormat;
619              
620             /*
621             Compresses according to the given output format and appends the result to the
622             output.
623              
624             options: global program options
625             output_type: the output format to use
626             out: pointer to the dynamic output array to which the result is appended. Must
627             be freed after use
628             outsize: pointer to the dynamic output array size
629             */
630             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
631             const unsigned char* in, size_t insize,
632             unsigned char** out, size_t* outsize);
633              
634             #ifdef __cplusplus
635             } // extern "C"
636             #endif
637              
638             #endif /* ZOPFLI_ZOPFLI_H_ */
639              
640              
641             /*
642             Stores lit/length and dist pairs for LZ77.
643             Parameter litlens: Contains the literal symbols or length values.
644             Parameter dists: Contains the distances. A value is 0 to indicate that there is
645             no dist and the corresponding litlens value is a literal instead of a length.
646             Parameter size: The size of both the litlens and dists arrays.
647             The memory can best be managed by using ZopfliInitLZ77Store to initialize it,
648             ZopfliCleanLZ77Store to destroy it, and ZopfliStoreLitLenDist to append values.
649              
650             */
651             typedef struct ZopfliLZ77Store {
652             unsigned short* litlens; /* Lit or len. */
653             unsigned short* dists; /* If 0: indicates literal in corresponding litlens,
654             if > 0: length in corresponding litlens, this is the distance. */
655             size_t size;
656              
657             const unsigned char* data; /* original data */
658             size_t* pos; /* position in data where this LZ77 command begins */
659              
660             unsigned short* ll_symbol;
661             unsigned short* d_symbol;
662              
663             /* Cumulative histograms wrapping around per chunk. Each chunk has the amount
664             of distinct symbols as length, so using 1 value per LZ77 symbol, we have a
665             precise histogram at every N symbols, and the rest can be calculated by
666             looping through the actual symbols of this chunk. */
667             size_t* ll_counts;
668             size_t* d_counts;
669             } ZopfliLZ77Store;
670              
671             void ZopfliInitLZ77Store(const unsigned char* data, ZopfliLZ77Store* store);
672             void ZopfliCleanLZ77Store(ZopfliLZ77Store* store);
673             void ZopfliCopyLZ77Store(const ZopfliLZ77Store* source, ZopfliLZ77Store* dest);
674             void ZopfliStoreLitLenDist(unsigned short length, unsigned short dist,
675             size_t pos, ZopfliLZ77Store* store);
676             void ZopfliAppendLZ77Store(const ZopfliLZ77Store* store,
677             ZopfliLZ77Store* target);
678             /* Gets the amount of raw bytes that this range of LZ77 symbols spans. */
679             size_t ZopfliLZ77GetByteRange(const ZopfliLZ77Store* lz77,
680             size_t lstart, size_t lend);
681             /* Gets the histogram of lit/len and dist symbols in the given range, using the
682             cumulative histograms, so faster than adding one by one for large range. Does
683             not add the one end symbol of value 256. */
684             void ZopfliLZ77GetHistogram(const ZopfliLZ77Store* lz77,
685             size_t lstart, size_t lend,
686             size_t* ll_counts, size_t* d_counts);
687              
688             /*
689             Some state information for compressing a block.
690             This is currently a bit under-used (with mainly only the longest match cache),
691             but is kept for easy future expansion.
692             */
693             typedef struct ZopfliBlockState {
694             const ZopfliOptions* options;
695              
696             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
697             /* Cache for length/distance pairs found so far. */
698             ZopfliLongestMatchCache* lmc;
699             #endif
700              
701             /* The start (inclusive) and end (not inclusive) of the current block. */
702             size_t blockstart;
703             size_t blockend;
704             } ZopfliBlockState;
705              
706             void ZopfliInitBlockState(const ZopfliOptions* options,
707             size_t blockstart, size_t blockend, int add_lmc,
708             ZopfliBlockState* s);
709             void ZopfliCleanBlockState(ZopfliBlockState* s);
710              
711             /*
712             Finds the longest match (length and corresponding distance) for LZ77
713             compression.
714             Even when not using "sublen", it can be more efficient to provide an array,
715             because only then the caching is used.
716             array: the data
717             pos: position in the data to find the match for
718             size: size of the data
719             limit: limit length to maximum this value (default should be 258). This allows
720             finding a shorter dist for that length (= less extra bits). Must be
721             in the range [ZOPFLI_MIN_MATCH, ZOPFLI_MAX_MATCH].
722             sublen: output array of 259 elements, or null. Has, for each length, the
723             smallest distance required to reach this length. Only 256 of its 259 values
724             are used, the first 3 are ignored (the shortest length is 3. It is purely
725             for convenience that the array is made 3 longer).
726             */
727             void ZopfliFindLongestMatch(
728             ZopfliBlockState *s, const ZopfliHash* h, const unsigned char* array,
729             size_t pos, size_t size, size_t limit,
730             unsigned short* sublen, unsigned short* distance, unsigned short* length);
731              
732             /*
733             Verifies if length and dist are indeed valid, only used for assertion.
734             */
735             void ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
736             unsigned short dist, unsigned short length);
737              
738             /*
739             Does LZ77 using an algorithm similar to gzip, with lazy matching, rather than
740             with the slow but better "squeeze" implementation.
741             The result is placed in the ZopfliLZ77Store.
742             If instart is larger than 0, it uses values before instart as starting
743             dictionary.
744             */
745             void ZopfliLZ77Greedy(ZopfliBlockState* s, const unsigned char* in,
746             size_t instart, size_t inend,
747             ZopfliLZ77Store* store, ZopfliHash* h);
748              
749             #endif /* ZOPFLI_LZ77_H_ */
750              
751             /* zopfli.h */
752             /*
753             Copyright 2011 Google Inc. All Rights Reserved.
754              
755             Licensed under the Apache License, Version 2.0 (the "License");
756             you may not use this file except in compliance with the License.
757             You may obtain a copy of the License at
758              
759             http://www.apache.org/licenses/LICENSE-2.0
760              
761             Unless required by applicable law or agreed to in writing, software
762             distributed under the License is distributed on an "AS IS" BASIS,
763             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
764             See the License for the specific language governing permissions and
765             limitations under the License.
766              
767             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
768             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
769             */
770              
771             #ifndef ZOPFLI_ZOPFLI_H_
772             #define ZOPFLI_ZOPFLI_H_
773              
774             #include
775             #include /* for size_t */
776              
777             #ifdef __cplusplus
778             extern "C" {
779             #endif
780              
781             /*
782             Options used throughout the program.
783             */
784             typedef struct ZopfliOptions {
785             /* Whether to print output */
786             int verbose;
787              
788             /* Whether to print more detailed output */
789             int verbose_more;
790              
791             /*
792             Maximum amount of times to rerun forward and backward pass to optimize LZ77
793             compression cost. Good values: 10, 15 for small files, 5 for files over
794             several MB in size or it will be too slow.
795             */
796             int numiterations;
797              
798             /*
799             If true, splits the data in multiple deflate blocks with optimal choice
800             for the block boundaries. Block splitting gives better compression. Default:
801             true (1).
802             */
803             int blocksplitting;
804              
805             /*
806             No longer used, left for compatibility.
807             */
808             int blocksplittinglast;
809              
810             /*
811             Maximum amount of blocks to split into (0 for unlimited, but this can give
812             extreme results that hurt compression on some files). Default value: 15.
813             */
814             int blocksplittingmax;
815             } ZopfliOptions;
816              
817             /* Initializes options with default values. */
818             void ZopfliInitOptions(ZopfliOptions* options);
819              
820             /* Output format */
821             typedef enum {
822             ZOPFLI_FORMAT_GZIP,
823             ZOPFLI_FORMAT_ZLIB,
824             ZOPFLI_FORMAT_DEFLATE
825             } ZopfliFormat;
826              
827             /*
828             Compresses according to the given output format and appends the result to the
829             output.
830              
831             options: global program options
832             output_type: the output format to use
833             out: pointer to the dynamic output array to which the result is appended. Must
834             be freed after use
835             outsize: pointer to the dynamic output array size
836             */
837             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
838             const unsigned char* in, size_t insize,
839             unsigned char** out, size_t* outsize);
840              
841             #ifdef __cplusplus
842             } // extern "C"
843             #endif
844              
845             #endif /* ZOPFLI_ZOPFLI_H_ */
846              
847              
848              
849             /*
850             Does blocksplitting on LZ77 data.
851             The output splitpoints are indices in the LZ77 data.
852             maxblocks: set a limit to the amount of blocks. Set to 0 to mean no limit.
853             */
854             void ZopfliBlockSplitLZ77(const ZopfliOptions* options,
855             const ZopfliLZ77Store* lz77, size_t maxblocks,
856             size_t** splitpoints, size_t* npoints);
857              
858             /*
859             Does blocksplitting on uncompressed data.
860             The output splitpoints are indices in the uncompressed bytes.
861              
862             options: general program options.
863             in: uncompressed input data
864             instart: where to start splitting
865             inend: where to end splitting (not inclusive)
866             maxblocks: maximum amount of blocks to split into, or 0 for no limit
867             splitpoints: dynamic array to put the resulting split point coordinates into.
868             The coordinates are indices in the input array.
869             npoints: pointer to amount of splitpoints, for the dynamic array. The amount of
870             blocks is the amount of splitpoitns + 1.
871             */
872             void ZopfliBlockSplit(const ZopfliOptions* options,
873             const unsigned char* in, size_t instart, size_t inend,
874             size_t maxblocks, size_t** splitpoints, size_t* npoints);
875              
876             /*
877             Divides the input into equal blocks, does not even take LZ77 lengths into
878             account.
879             */
880             void ZopfliBlockSplitSimple(const unsigned char* in,
881             size_t instart, size_t inend,
882             size_t blocksize,
883             size_t** splitpoints, size_t* npoints);
884              
885             #endif /* ZOPFLI_BLOCKSPLITTER_H_ */
886              
887              
888             #include
889             #include
890             #include
891              
892             /* deflate.h */
893             /*
894             Copyright 2011 Google Inc. All Rights Reserved.
895              
896             Licensed under the Apache License, Version 2.0 (the "License");
897             you may not use this file except in compliance with the License.
898             You may obtain a copy of the License at
899              
900             http://www.apache.org/licenses/LICENSE-2.0
901              
902             Unless required by applicable law or agreed to in writing, software
903             distributed under the License is distributed on an "AS IS" BASIS,
904             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
905             See the License for the specific language governing permissions and
906             limitations under the License.
907              
908             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
909             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
910             */
911              
912             #ifndef ZOPFLI_DEFLATE_H_
913             #define ZOPFLI_DEFLATE_H_
914              
915             /*
916             Functions to compress according to the DEFLATE specification, using the
917             "squeeze" LZ77 compression backend.
918             */
919              
920             /* lz77.h */
921             /*
922             Copyright 2011 Google Inc. All Rights Reserved.
923              
924             Licensed under the Apache License, Version 2.0 (the "License");
925             you may not use this file except in compliance with the License.
926             You may obtain a copy of the License at
927              
928             http://www.apache.org/licenses/LICENSE-2.0
929              
930             Unless required by applicable law or agreed to in writing, software
931             distributed under the License is distributed on an "AS IS" BASIS,
932             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
933             See the License for the specific language governing permissions and
934             limitations under the License.
935              
936             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
937             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
938             */
939              
940             /*
941             Functions for basic LZ77 compression and utilities for the "squeeze" LZ77
942             compression.
943             */
944              
945             #ifndef ZOPFLI_LZ77_H_
946             #define ZOPFLI_LZ77_H_
947              
948             #include
949              
950             /* cache.h */
951             /*
952             Copyright 2011 Google Inc. All Rights Reserved.
953              
954             Licensed under the Apache License, Version 2.0 (the "License");
955             you may not use this file except in compliance with the License.
956             You may obtain a copy of the License at
957              
958             http://www.apache.org/licenses/LICENSE-2.0
959              
960             Unless required by applicable law or agreed to in writing, software
961             distributed under the License is distributed on an "AS IS" BASIS,
962             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
963             See the License for the specific language governing permissions and
964             limitations under the License.
965              
966             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
967             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
968             */
969              
970             /*
971             The cache that speeds up ZopfliFindLongestMatch of lz77.c.
972             */
973              
974             #ifndef ZOPFLI_CACHE_H_
975             #define ZOPFLI_CACHE_H_
976              
977             /* util.h */
978             /*
979             Copyright 2011 Google Inc. All Rights Reserved.
980              
981             Licensed under the Apache License, Version 2.0 (the "License");
982             you may not use this file except in compliance with the License.
983             You may obtain a copy of the License at
984              
985             http://www.apache.org/licenses/LICENSE-2.0
986              
987             Unless required by applicable law or agreed to in writing, software
988             distributed under the License is distributed on an "AS IS" BASIS,
989             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
990             See the License for the specific language governing permissions and
991             limitations under the License.
992              
993             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
994             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
995             */
996              
997             /*
998             Several utilities, including: #defines to try different compression results,
999             basic deflate specification values and generic program options.
1000             */
1001              
1002             #ifndef ZOPFLI_UTIL_H_
1003             #define ZOPFLI_UTIL_H_
1004              
1005             #include
1006             #include
1007              
1008             /* Minimum and maximum length that can be encoded in deflate. */
1009             #define ZOPFLI_MAX_MATCH 258
1010             #define ZOPFLI_MIN_MATCH 3
1011              
1012             /* Number of distinct literal/length and distance symbols in DEFLATE */
1013             #define ZOPFLI_NUM_LL 288
1014             #define ZOPFLI_NUM_D 32
1015              
1016             /*
1017             The window size for deflate. Must be a power of two. This should be 32768, the
1018             maximum possible by the deflate spec. Anything less hurts compression more than
1019             speed.
1020             */
1021             #define ZOPFLI_WINDOW_SIZE 32768
1022              
1023             /*
1024             The window mask used to wrap indices into the window. This is why the
1025             window size must be a power of two.
1026             */
1027             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
1028              
1029             /*
1030             A block structure of huge, non-smart, blocks to divide the input into, to allow
1031             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
1032             The whole compression algorithm, including the smarter block splitting, will
1033             be executed independently on each huge block.
1034             Dividing into huge blocks hurts compression, but not much relative to the size.
1035             Set it to 0 to disable master blocks.
1036             */
1037             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
1038              
1039             /*
1040             Used to initialize costs for example
1041             */
1042             #define ZOPFLI_LARGE_FLOAT 1e30
1043              
1044             /*
1045             For longest match cache. max 256. Uses huge amounts of memory but makes it
1046             faster. Uses this many times three bytes per single byte of the input data.
1047             This is so because longest match finding has to find the exact distance
1048             that belongs to each length for the best lz77 strategy.
1049             Good values: e.g. 5, 8.
1050             */
1051             #define ZOPFLI_CACHE_LENGTH 8
1052              
1053             /*
1054             limit the max hash chain hits for this hash value. This has an effect only
1055             on files where the hash value is the same very often. On these files, this
1056             gives worse compression (the value should ideally be 32768, which is the
1057             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
1058             faster on some specific files.
1059             Good value: e.g. 8192.
1060             */
1061             #define ZOPFLI_MAX_CHAIN_HITS 8192
1062              
1063             /*
1064             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
1065             consumes a lot of memory but speeds it up. No effect on compression size.
1066             */
1067             #define ZOPFLI_LONGEST_MATCH_CACHE
1068              
1069             /*
1070             Enable to remember amount of successive identical bytes in the hash chain for
1071             finding longest match
1072             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
1073             This has no effect on the compression result, and enabling it increases speed.
1074             */
1075             #define ZOPFLI_HASH_SAME
1076              
1077             /*
1078             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
1079             best length so far is long enough. This is way faster for files with lots of
1080             identical bytes, on which the compressor is otherwise too slow. Regular files
1081             are unaffected or maybe a tiny bit slower.
1082             This has no effect on the compression result, only on speed.
1083             */
1084             #define ZOPFLI_HASH_SAME_HASH
1085              
1086             /*
1087             Enable this, to avoid slowness for files which are a repetition of the same
1088             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
1089             the compression result.
1090             */
1091             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
1092              
1093             /*
1094             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
1095             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
1096             varies from file to file.
1097             */
1098             #define ZOPFLI_LAZY_MATCHING
1099              
1100             /*
1101             Appends value to dynamically allocated memory, doubling its allocation size
1102             whenever needed.
1103              
1104             value: the value to append, type T
1105             data: pointer to the dynamic array to append to, type T**
1106             size: pointer to the size of the array to append to, type size_t*. This is the
1107             size that you consider the array to be, not the internal allocation size.
1108             Precondition: allocated size of data is at least a power of two greater than or
1109             equal than *size.
1110             */
1111             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
1112             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
1113             if (!((*size) & ((*size) - 1))) {\
1114             /*double alloc size if it's a power of two*/\
1115             void** data_void = reinterpret_cast(data);\
1116             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
1117             : realloc((*data), (*size) * 2 * sizeof(**data));\
1118             }\
1119             (*data)[(*size)] = (value);\
1120             (*size)++;\
1121             }
1122             #else /* C gives problems with strict-aliasing rules for (void**) cast */
1123             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
1124             if (!((*size) & ((*size) - 1))) {\
1125             /*double alloc size if it's a power of two*/\
1126             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
1127             : realloc((*data), (*size) * 2 * sizeof(**data));\
1128             }\
1129             (*data)[(*size)] = (value);\
1130             (*size)++;\
1131             }
1132             #endif
1133              
1134              
1135             #endif /* ZOPFLI_UTIL_H_ */
1136              
1137              
1138             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
1139              
1140             /*
1141             Cache used by ZopfliFindLongestMatch to remember previously found length/dist
1142             values.
1143             This is needed because the squeeze runs will ask these values multiple times for
1144             the same position.
1145             Uses large amounts of memory, since it has to remember the distance belonging
1146             to every possible shorter-than-the-best length (the so called "sublen" array).
1147             */
1148             typedef struct ZopfliLongestMatchCache {
1149             unsigned short* length;
1150             unsigned short* dist;
1151             unsigned char* sublen;
1152             } ZopfliLongestMatchCache;
1153              
1154             /* Initializes the ZopfliLongestMatchCache. */
1155             void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc);
1156              
1157             /* Frees up the memory of the ZopfliLongestMatchCache. */
1158             void ZopfliCleanCache(ZopfliLongestMatchCache* lmc);
1159              
1160             /* Stores sublen array in the cache. */
1161             void ZopfliSublenToCache(const unsigned short* sublen,
1162             size_t pos, size_t length,
1163             ZopfliLongestMatchCache* lmc);
1164              
1165             /* Extracts sublen array from the cache. */
1166             void ZopfliCacheToSublen(const ZopfliLongestMatchCache* lmc,
1167             size_t pos, size_t length,
1168             unsigned short* sublen);
1169             /* Returns the length up to which could be stored in the cache. */
1170             unsigned ZopfliMaxCachedSublen(const ZopfliLongestMatchCache* lmc,
1171             size_t pos, size_t length);
1172              
1173             #endif /* ZOPFLI_LONGEST_MATCH_CACHE */
1174              
1175             #endif /* ZOPFLI_CACHE_H_ */
1176              
1177             /* hash.h */
1178             /*
1179             Copyright 2011 Google Inc. All Rights Reserved.
1180              
1181             Licensed under the Apache License, Version 2.0 (the "License");
1182             you may not use this file except in compliance with the License.
1183             You may obtain a copy of the License at
1184              
1185             http://www.apache.org/licenses/LICENSE-2.0
1186              
1187             Unless required by applicable law or agreed to in writing, software
1188             distributed under the License is distributed on an "AS IS" BASIS,
1189             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1190             See the License for the specific language governing permissions and
1191             limitations under the License.
1192              
1193             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
1194             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
1195             */
1196              
1197             /*
1198             The hash for ZopfliFindLongestMatch of lz77.c.
1199             */
1200              
1201             #ifndef ZOPFLI_HASH_H_
1202             #define ZOPFLI_HASH_H_
1203              
1204             /* util.h */
1205             /*
1206             Copyright 2011 Google Inc. All Rights Reserved.
1207              
1208             Licensed under the Apache License, Version 2.0 (the "License");
1209             you may not use this file except in compliance with the License.
1210             You may obtain a copy of the License at
1211              
1212             http://www.apache.org/licenses/LICENSE-2.0
1213              
1214             Unless required by applicable law or agreed to in writing, software
1215             distributed under the License is distributed on an "AS IS" BASIS,
1216             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1217             See the License for the specific language governing permissions and
1218             limitations under the License.
1219              
1220             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
1221             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
1222             */
1223              
1224             /*
1225             Several utilities, including: #defines to try different compression results,
1226             basic deflate specification values and generic program options.
1227             */
1228              
1229             #ifndef ZOPFLI_UTIL_H_
1230             #define ZOPFLI_UTIL_H_
1231              
1232             #include
1233             #include
1234              
1235             /* Minimum and maximum length that can be encoded in deflate. */
1236             #define ZOPFLI_MAX_MATCH 258
1237             #define ZOPFLI_MIN_MATCH 3
1238              
1239             /* Number of distinct literal/length and distance symbols in DEFLATE */
1240             #define ZOPFLI_NUM_LL 288
1241             #define ZOPFLI_NUM_D 32
1242              
1243             /*
1244             The window size for deflate. Must be a power of two. This should be 32768, the
1245             maximum possible by the deflate spec. Anything less hurts compression more than
1246             speed.
1247             */
1248             #define ZOPFLI_WINDOW_SIZE 32768
1249              
1250             /*
1251             The window mask used to wrap indices into the window. This is why the
1252             window size must be a power of two.
1253             */
1254             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
1255              
1256             /*
1257             A block structure of huge, non-smart, blocks to divide the input into, to allow
1258             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
1259             The whole compression algorithm, including the smarter block splitting, will
1260             be executed independently on each huge block.
1261             Dividing into huge blocks hurts compression, but not much relative to the size.
1262             Set it to 0 to disable master blocks.
1263             */
1264             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
1265              
1266             /*
1267             Used to initialize costs for example
1268             */
1269             #define ZOPFLI_LARGE_FLOAT 1e30
1270              
1271             /*
1272             For longest match cache. max 256. Uses huge amounts of memory but makes it
1273             faster. Uses this many times three bytes per single byte of the input data.
1274             This is so because longest match finding has to find the exact distance
1275             that belongs to each length for the best lz77 strategy.
1276             Good values: e.g. 5, 8.
1277             */
1278             #define ZOPFLI_CACHE_LENGTH 8
1279              
1280             /*
1281             limit the max hash chain hits for this hash value. This has an effect only
1282             on files where the hash value is the same very often. On these files, this
1283             gives worse compression (the value should ideally be 32768, which is the
1284             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
1285             faster on some specific files.
1286             Good value: e.g. 8192.
1287             */
1288             #define ZOPFLI_MAX_CHAIN_HITS 8192
1289              
1290             /*
1291             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
1292             consumes a lot of memory but speeds it up. No effect on compression size.
1293             */
1294             #define ZOPFLI_LONGEST_MATCH_CACHE
1295              
1296             /*
1297             Enable to remember amount of successive identical bytes in the hash chain for
1298             finding longest match
1299             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
1300             This has no effect on the compression result, and enabling it increases speed.
1301             */
1302             #define ZOPFLI_HASH_SAME
1303              
1304             /*
1305             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
1306             best length so far is long enough. This is way faster for files with lots of
1307             identical bytes, on which the compressor is otherwise too slow. Regular files
1308             are unaffected or maybe a tiny bit slower.
1309             This has no effect on the compression result, only on speed.
1310             */
1311             #define ZOPFLI_HASH_SAME_HASH
1312              
1313             /*
1314             Enable this, to avoid slowness for files which are a repetition of the same
1315             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
1316             the compression result.
1317             */
1318             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
1319              
1320             /*
1321             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
1322             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
1323             varies from file to file.
1324             */
1325             #define ZOPFLI_LAZY_MATCHING
1326              
1327             /*
1328             Appends value to dynamically allocated memory, doubling its allocation size
1329             whenever needed.
1330              
1331             value: the value to append, type T
1332             data: pointer to the dynamic array to append to, type T**
1333             size: pointer to the size of the array to append to, type size_t*. This is the
1334             size that you consider the array to be, not the internal allocation size.
1335             Precondition: allocated size of data is at least a power of two greater than or
1336             equal than *size.
1337             */
1338             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
1339             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
1340             if (!((*size) & ((*size) - 1))) {\
1341             /*double alloc size if it's a power of two*/\
1342             void** data_void = reinterpret_cast(data);\
1343             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
1344             : realloc((*data), (*size) * 2 * sizeof(**data));\
1345             }\
1346             (*data)[(*size)] = (value);\
1347             (*size)++;\
1348             }
1349             #else /* C gives problems with strict-aliasing rules for (void**) cast */
1350             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
1351             if (!((*size) & ((*size) - 1))) {\
1352             /*double alloc size if it's a power of two*/\
1353             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
1354             : realloc((*data), (*size) * 2 * sizeof(**data));\
1355             }\
1356             (*data)[(*size)] = (value);\
1357             (*size)++;\
1358             }
1359             #endif
1360              
1361              
1362             #endif /* ZOPFLI_UTIL_H_ */
1363              
1364              
1365             typedef struct ZopfliHash {
1366             int* head; /* Hash value to index of its most recent occurrence. */
1367             unsigned short* prev; /* Index to index of prev. occurrence of same hash. */
1368             int* hashval; /* Index to hash value at this index. */
1369             int val; /* Current hash value. */
1370              
1371             #ifdef ZOPFLI_HASH_SAME_HASH
1372             /* Fields with similar purpose as the above hash, but for the second hash with
1373             a value that is calculated differently. */
1374             int* head2; /* Hash value to index of its most recent occurrence. */
1375             unsigned short* prev2; /* Index to index of prev. occurrence of same hash. */
1376             int* hashval2; /* Index to hash value at this index. */
1377             int val2; /* Current hash value. */
1378             #endif
1379              
1380             #ifdef ZOPFLI_HASH_SAME
1381             unsigned short* same; /* Amount of repetitions of same byte after this .*/
1382             #endif
1383             } ZopfliHash;
1384              
1385             /* Allocates ZopfliHash memory. */
1386             void ZopfliAllocHash(size_t window_size, ZopfliHash* h);
1387              
1388             /* Resets all fields of ZopfliHash. */
1389             void ZopfliResetHash(size_t window_size, ZopfliHash* h);
1390              
1391             /* Frees ZopfliHash memory. */
1392             void ZopfliCleanHash(ZopfliHash* h);
1393              
1394             /*
1395             Updates the hash values based on the current position in the array. All calls
1396             to this must be made for consecutive bytes.
1397             */
1398             void ZopfliUpdateHash(const unsigned char* array, size_t pos, size_t end,
1399             ZopfliHash* h);
1400              
1401             /*
1402             Prepopulates hash:
1403             Fills in the initial values in the hash, before ZopfliUpdateHash can be used
1404             correctly.
1405             */
1406             void ZopfliWarmupHash(const unsigned char* array, size_t pos, size_t end,
1407             ZopfliHash* h);
1408              
1409             #endif /* ZOPFLI_HASH_H_ */
1410              
1411             /* zopfli.h */
1412             /*
1413             Copyright 2011 Google Inc. All Rights Reserved.
1414              
1415             Licensed under the Apache License, Version 2.0 (the "License");
1416             you may not use this file except in compliance with the License.
1417             You may obtain a copy of the License at
1418              
1419             http://www.apache.org/licenses/LICENSE-2.0
1420              
1421             Unless required by applicable law or agreed to in writing, software
1422             distributed under the License is distributed on an "AS IS" BASIS,
1423             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1424             See the License for the specific language governing permissions and
1425             limitations under the License.
1426              
1427             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
1428             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
1429             */
1430              
1431             #ifndef ZOPFLI_ZOPFLI_H_
1432             #define ZOPFLI_ZOPFLI_H_
1433              
1434             #include
1435             #include /* for size_t */
1436              
1437             #ifdef __cplusplus
1438             extern "C" {
1439             #endif
1440              
1441             /*
1442             Options used throughout the program.
1443             */
1444             typedef struct ZopfliOptions {
1445             /* Whether to print output */
1446             int verbose;
1447              
1448             /* Whether to print more detailed output */
1449             int verbose_more;
1450              
1451             /*
1452             Maximum amount of times to rerun forward and backward pass to optimize LZ77
1453             compression cost. Good values: 10, 15 for small files, 5 for files over
1454             several MB in size or it will be too slow.
1455             */
1456             int numiterations;
1457              
1458             /*
1459             If true, splits the data in multiple deflate blocks with optimal choice
1460             for the block boundaries. Block splitting gives better compression. Default:
1461             true (1).
1462             */
1463             int blocksplitting;
1464              
1465             /*
1466             No longer used, left for compatibility.
1467             */
1468             int blocksplittinglast;
1469              
1470             /*
1471             Maximum amount of blocks to split into (0 for unlimited, but this can give
1472             extreme results that hurt compression on some files). Default value: 15.
1473             */
1474             int blocksplittingmax;
1475             } ZopfliOptions;
1476              
1477             /* Initializes options with default values. */
1478             void ZopfliInitOptions(ZopfliOptions* options);
1479              
1480             /* Output format */
1481             typedef enum {
1482             ZOPFLI_FORMAT_GZIP,
1483             ZOPFLI_FORMAT_ZLIB,
1484             ZOPFLI_FORMAT_DEFLATE
1485             } ZopfliFormat;
1486              
1487             /*
1488             Compresses according to the given output format and appends the result to the
1489             output.
1490              
1491             options: global program options
1492             output_type: the output format to use
1493             out: pointer to the dynamic output array to which the result is appended. Must
1494             be freed after use
1495             outsize: pointer to the dynamic output array size
1496             */
1497             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
1498             const unsigned char* in, size_t insize,
1499             unsigned char** out, size_t* outsize);
1500              
1501             #ifdef __cplusplus
1502             } // extern "C"
1503             #endif
1504              
1505             #endif /* ZOPFLI_ZOPFLI_H_ */
1506              
1507              
1508             /*
1509             Stores lit/length and dist pairs for LZ77.
1510             Parameter litlens: Contains the literal symbols or length values.
1511             Parameter dists: Contains the distances. A value is 0 to indicate that there is
1512             no dist and the corresponding litlens value is a literal instead of a length.
1513             Parameter size: The size of both the litlens and dists arrays.
1514             The memory can best be managed by using ZopfliInitLZ77Store to initialize it,
1515             ZopfliCleanLZ77Store to destroy it, and ZopfliStoreLitLenDist to append values.
1516              
1517             */
1518             typedef struct ZopfliLZ77Store {
1519             unsigned short* litlens; /* Lit or len. */
1520             unsigned short* dists; /* If 0: indicates literal in corresponding litlens,
1521             if > 0: length in corresponding litlens, this is the distance. */
1522             size_t size;
1523              
1524             const unsigned char* data; /* original data */
1525             size_t* pos; /* position in data where this LZ77 command begins */
1526              
1527             unsigned short* ll_symbol;
1528             unsigned short* d_symbol;
1529              
1530             /* Cumulative histograms wrapping around per chunk. Each chunk has the amount
1531             of distinct symbols as length, so using 1 value per LZ77 symbol, we have a
1532             precise histogram at every N symbols, and the rest can be calculated by
1533             looping through the actual symbols of this chunk. */
1534             size_t* ll_counts;
1535             size_t* d_counts;
1536             } ZopfliLZ77Store;
1537              
1538             void ZopfliInitLZ77Store(const unsigned char* data, ZopfliLZ77Store* store);
1539             void ZopfliCleanLZ77Store(ZopfliLZ77Store* store);
1540             void ZopfliCopyLZ77Store(const ZopfliLZ77Store* source, ZopfliLZ77Store* dest);
1541             void ZopfliStoreLitLenDist(unsigned short length, unsigned short dist,
1542             size_t pos, ZopfliLZ77Store* store);
1543             void ZopfliAppendLZ77Store(const ZopfliLZ77Store* store,
1544             ZopfliLZ77Store* target);
1545             /* Gets the amount of raw bytes that this range of LZ77 symbols spans. */
1546             size_t ZopfliLZ77GetByteRange(const ZopfliLZ77Store* lz77,
1547             size_t lstart, size_t lend);
1548             /* Gets the histogram of lit/len and dist symbols in the given range, using the
1549             cumulative histograms, so faster than adding one by one for large range. Does
1550             not add the one end symbol of value 256. */
1551             void ZopfliLZ77GetHistogram(const ZopfliLZ77Store* lz77,
1552             size_t lstart, size_t lend,
1553             size_t* ll_counts, size_t* d_counts);
1554              
1555             /*
1556             Some state information for compressing a block.
1557             This is currently a bit under-used (with mainly only the longest match cache),
1558             but is kept for easy future expansion.
1559             */
1560             typedef struct ZopfliBlockState {
1561             const ZopfliOptions* options;
1562              
1563             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
1564             /* Cache for length/distance pairs found so far. */
1565             ZopfliLongestMatchCache* lmc;
1566             #endif
1567              
1568             /* The start (inclusive) and end (not inclusive) of the current block. */
1569             size_t blockstart;
1570             size_t blockend;
1571             } ZopfliBlockState;
1572              
1573             void ZopfliInitBlockState(const ZopfliOptions* options,
1574             size_t blockstart, size_t blockend, int add_lmc,
1575             ZopfliBlockState* s);
1576             void ZopfliCleanBlockState(ZopfliBlockState* s);
1577              
1578             /*
1579             Finds the longest match (length and corresponding distance) for LZ77
1580             compression.
1581             Even when not using "sublen", it can be more efficient to provide an array,
1582             because only then the caching is used.
1583             array: the data
1584             pos: position in the data to find the match for
1585             size: size of the data
1586             limit: limit length to maximum this value (default should be 258). This allows
1587             finding a shorter dist for that length (= less extra bits). Must be
1588             in the range [ZOPFLI_MIN_MATCH, ZOPFLI_MAX_MATCH].
1589             sublen: output array of 259 elements, or null. Has, for each length, the
1590             smallest distance required to reach this length. Only 256 of its 259 values
1591             are used, the first 3 are ignored (the shortest length is 3. It is purely
1592             for convenience that the array is made 3 longer).
1593             */
1594             void ZopfliFindLongestMatch(
1595             ZopfliBlockState *s, const ZopfliHash* h, const unsigned char* array,
1596             size_t pos, size_t size, size_t limit,
1597             unsigned short* sublen, unsigned short* distance, unsigned short* length);
1598              
1599             /*
1600             Verifies if length and dist are indeed valid, only used for assertion.
1601             */
1602             void ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
1603             unsigned short dist, unsigned short length);
1604              
1605             /*
1606             Does LZ77 using an algorithm similar to gzip, with lazy matching, rather than
1607             with the slow but better "squeeze" implementation.
1608             The result is placed in the ZopfliLZ77Store.
1609             If instart is larger than 0, it uses values before instart as starting
1610             dictionary.
1611             */
1612             void ZopfliLZ77Greedy(ZopfliBlockState* s, const unsigned char* in,
1613             size_t instart, size_t inend,
1614             ZopfliLZ77Store* store, ZopfliHash* h);
1615              
1616             #endif /* ZOPFLI_LZ77_H_ */
1617              
1618             /* zopfli.h */
1619             /*
1620             Copyright 2011 Google Inc. All Rights Reserved.
1621              
1622             Licensed under the Apache License, Version 2.0 (the "License");
1623             you may not use this file except in compliance with the License.
1624             You may obtain a copy of the License at
1625              
1626             http://www.apache.org/licenses/LICENSE-2.0
1627              
1628             Unless required by applicable law or agreed to in writing, software
1629             distributed under the License is distributed on an "AS IS" BASIS,
1630             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1631             See the License for the specific language governing permissions and
1632             limitations under the License.
1633              
1634             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
1635             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
1636             */
1637              
1638             #ifndef ZOPFLI_ZOPFLI_H_
1639             #define ZOPFLI_ZOPFLI_H_
1640              
1641             #include
1642             #include /* for size_t */
1643              
1644             #ifdef __cplusplus
1645             extern "C" {
1646             #endif
1647              
1648             /*
1649             Options used throughout the program.
1650             */
1651             typedef struct ZopfliOptions {
1652             /* Whether to print output */
1653             int verbose;
1654              
1655             /* Whether to print more detailed output */
1656             int verbose_more;
1657              
1658             /*
1659             Maximum amount of times to rerun forward and backward pass to optimize LZ77
1660             compression cost. Good values: 10, 15 for small files, 5 for files over
1661             several MB in size or it will be too slow.
1662             */
1663             int numiterations;
1664              
1665             /*
1666             If true, splits the data in multiple deflate blocks with optimal choice
1667             for the block boundaries. Block splitting gives better compression. Default:
1668             true (1).
1669             */
1670             int blocksplitting;
1671              
1672             /*
1673             No longer used, left for compatibility.
1674             */
1675             int blocksplittinglast;
1676              
1677             /*
1678             Maximum amount of blocks to split into (0 for unlimited, but this can give
1679             extreme results that hurt compression on some files). Default value: 15.
1680             */
1681             int blocksplittingmax;
1682             } ZopfliOptions;
1683              
1684             /* Initializes options with default values. */
1685             void ZopfliInitOptions(ZopfliOptions* options);
1686              
1687             /* Output format */
1688             typedef enum {
1689             ZOPFLI_FORMAT_GZIP,
1690             ZOPFLI_FORMAT_ZLIB,
1691             ZOPFLI_FORMAT_DEFLATE
1692             } ZopfliFormat;
1693              
1694             /*
1695             Compresses according to the given output format and appends the result to the
1696             output.
1697              
1698             options: global program options
1699             output_type: the output format to use
1700             out: pointer to the dynamic output array to which the result is appended. Must
1701             be freed after use
1702             outsize: pointer to the dynamic output array size
1703             */
1704             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
1705             const unsigned char* in, size_t insize,
1706             unsigned char** out, size_t* outsize);
1707              
1708             #ifdef __cplusplus
1709             } // extern "C"
1710             #endif
1711              
1712             #endif /* ZOPFLI_ZOPFLI_H_ */
1713              
1714              
1715             #ifdef __cplusplus
1716             extern "C" {
1717             #endif
1718              
1719             /*
1720             Compresses according to the deflate specification and append the compressed
1721             result to the output.
1722             This function will usually output multiple deflate blocks. If final is 1, then
1723             the final bit will be set on the last block.
1724              
1725             options: global program options
1726             btype: the deflate block type. Use 2 for best compression.
1727             -0: non compressed blocks (00)
1728             -1: blocks with fixed tree (01)
1729             -2: blocks with dynamic tree (10)
1730             final: whether this is the last section of the input, sets the final bit to the
1731             last deflate block.
1732             in: the input bytes
1733             insize: number of input bytes
1734             bp: bit pointer for the output array. This must initially be 0, and for
1735             consecutive calls must be reused (it can have values from 0-7). This is
1736             because deflate appends blocks as bit-based data, rather than on byte
1737             boundaries.
1738             out: pointer to the dynamic output array to which the result is appended. Must
1739             be freed after use.
1740             outsize: pointer to the dynamic output array size.
1741             */
1742             void ZopfliDeflate(const ZopfliOptions* options, int btype, int final,
1743             const unsigned char* in, size_t insize,
1744             unsigned char* bp, unsigned char** out, size_t* outsize);
1745              
1746             /*
1747             Like ZopfliDeflate, but allows to specify start and end byte with instart and
1748             inend. Only that part is compressed, but earlier bytes are still used for the
1749             back window.
1750             */
1751             void ZopfliDeflatePart(const ZopfliOptions* options, int btype, int final,
1752             const unsigned char* in, size_t instart, size_t inend,
1753             unsigned char* bp, unsigned char** out,
1754             size_t* outsize);
1755              
1756             /*
1757             Calculates block size in bits.
1758             litlens: lz77 lit/lengths
1759             dists: ll77 distances
1760             lstart: start of block
1761             lend: end of block (not inclusive)
1762             */
1763             double ZopfliCalculateBlockSize(const ZopfliLZ77Store* lz77,
1764             size_t lstart, size_t lend, int btype);
1765              
1766             /*
1767             Calculates block size in bits, automatically using the best btype.
1768             */
1769             double ZopfliCalculateBlockSizeAutoType(const ZopfliLZ77Store* lz77,
1770             size_t lstart, size_t lend);
1771              
1772             #ifdef __cplusplus
1773             } // extern "C"
1774             #endif
1775              
1776             #endif /* ZOPFLI_DEFLATE_H_ */
1777              
1778             /* squeeze.h */
1779             /*
1780             Copyright 2011 Google Inc. All Rights Reserved.
1781              
1782             Licensed under the Apache License, Version 2.0 (the "License");
1783             you may not use this file except in compliance with the License.
1784             You may obtain a copy of the License at
1785              
1786             http://www.apache.org/licenses/LICENSE-2.0
1787              
1788             Unless required by applicable law or agreed to in writing, software
1789             distributed under the License is distributed on an "AS IS" BASIS,
1790             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1791             See the License for the specific language governing permissions and
1792             limitations under the License.
1793              
1794             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
1795             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
1796             */
1797              
1798             /*
1799             The squeeze functions do enhanced LZ77 compression by optimal parsing with a
1800             cost model, rather than greedily choosing the longest length or using a single
1801             step of lazy matching like regular implementations.
1802              
1803             Since the cost model is based on the Huffman tree that can only be calculated
1804             after the LZ77 data is generated, there is a chicken and egg problem, and
1805             multiple runs are done with updated cost models to converge to a better
1806             solution.
1807             */
1808              
1809             #ifndef ZOPFLI_SQUEEZE_H_
1810             #define ZOPFLI_SQUEEZE_H_
1811              
1812             /* lz77.h */
1813             /*
1814             Copyright 2011 Google Inc. All Rights Reserved.
1815              
1816             Licensed under the Apache License, Version 2.0 (the "License");
1817             you may not use this file except in compliance with the License.
1818             You may obtain a copy of the License at
1819              
1820             http://www.apache.org/licenses/LICENSE-2.0
1821              
1822             Unless required by applicable law or agreed to in writing, software
1823             distributed under the License is distributed on an "AS IS" BASIS,
1824             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1825             See the License for the specific language governing permissions and
1826             limitations under the License.
1827              
1828             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
1829             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
1830             */
1831              
1832             /*
1833             Functions for basic LZ77 compression and utilities for the "squeeze" LZ77
1834             compression.
1835             */
1836              
1837             #ifndef ZOPFLI_LZ77_H_
1838             #define ZOPFLI_LZ77_H_
1839              
1840             #include
1841              
1842             /* cache.h */
1843             /*
1844             Copyright 2011 Google Inc. All Rights Reserved.
1845              
1846             Licensed under the Apache License, Version 2.0 (the "License");
1847             you may not use this file except in compliance with the License.
1848             You may obtain a copy of the License at
1849              
1850             http://www.apache.org/licenses/LICENSE-2.0
1851              
1852             Unless required by applicable law or agreed to in writing, software
1853             distributed under the License is distributed on an "AS IS" BASIS,
1854             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1855             See the License for the specific language governing permissions and
1856             limitations under the License.
1857              
1858             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
1859             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
1860             */
1861              
1862             /*
1863             The cache that speeds up ZopfliFindLongestMatch of lz77.c.
1864             */
1865              
1866             #ifndef ZOPFLI_CACHE_H_
1867             #define ZOPFLI_CACHE_H_
1868              
1869             /* util.h */
1870             /*
1871             Copyright 2011 Google Inc. All Rights Reserved.
1872              
1873             Licensed under the Apache License, Version 2.0 (the "License");
1874             you may not use this file except in compliance with the License.
1875             You may obtain a copy of the License at
1876              
1877             http://www.apache.org/licenses/LICENSE-2.0
1878              
1879             Unless required by applicable law or agreed to in writing, software
1880             distributed under the License is distributed on an "AS IS" BASIS,
1881             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1882             See the License for the specific language governing permissions and
1883             limitations under the License.
1884              
1885             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
1886             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
1887             */
1888              
1889             /*
1890             Several utilities, including: #defines to try different compression results,
1891             basic deflate specification values and generic program options.
1892             */
1893              
1894             #ifndef ZOPFLI_UTIL_H_
1895             #define ZOPFLI_UTIL_H_
1896              
1897             #include
1898             #include
1899              
1900             /* Minimum and maximum length that can be encoded in deflate. */
1901             #define ZOPFLI_MAX_MATCH 258
1902             #define ZOPFLI_MIN_MATCH 3
1903              
1904             /* Number of distinct literal/length and distance symbols in DEFLATE */
1905             #define ZOPFLI_NUM_LL 288
1906             #define ZOPFLI_NUM_D 32
1907              
1908             /*
1909             The window size for deflate. Must be a power of two. This should be 32768, the
1910             maximum possible by the deflate spec. Anything less hurts compression more than
1911             speed.
1912             */
1913             #define ZOPFLI_WINDOW_SIZE 32768
1914              
1915             /*
1916             The window mask used to wrap indices into the window. This is why the
1917             window size must be a power of two.
1918             */
1919             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
1920              
1921             /*
1922             A block structure of huge, non-smart, blocks to divide the input into, to allow
1923             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
1924             The whole compression algorithm, including the smarter block splitting, will
1925             be executed independently on each huge block.
1926             Dividing into huge blocks hurts compression, but not much relative to the size.
1927             Set it to 0 to disable master blocks.
1928             */
1929             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
1930              
1931             /*
1932             Used to initialize costs for example
1933             */
1934             #define ZOPFLI_LARGE_FLOAT 1e30
1935              
1936             /*
1937             For longest match cache. max 256. Uses huge amounts of memory but makes it
1938             faster. Uses this many times three bytes per single byte of the input data.
1939             This is so because longest match finding has to find the exact distance
1940             that belongs to each length for the best lz77 strategy.
1941             Good values: e.g. 5, 8.
1942             */
1943             #define ZOPFLI_CACHE_LENGTH 8
1944              
1945             /*
1946             limit the max hash chain hits for this hash value. This has an effect only
1947             on files where the hash value is the same very often. On these files, this
1948             gives worse compression (the value should ideally be 32768, which is the
1949             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
1950             faster on some specific files.
1951             Good value: e.g. 8192.
1952             */
1953             #define ZOPFLI_MAX_CHAIN_HITS 8192
1954              
1955             /*
1956             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
1957             consumes a lot of memory but speeds it up. No effect on compression size.
1958             */
1959             #define ZOPFLI_LONGEST_MATCH_CACHE
1960              
1961             /*
1962             Enable to remember amount of successive identical bytes in the hash chain for
1963             finding longest match
1964             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
1965             This has no effect on the compression result, and enabling it increases speed.
1966             */
1967             #define ZOPFLI_HASH_SAME
1968              
1969             /*
1970             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
1971             best length so far is long enough. This is way faster for files with lots of
1972             identical bytes, on which the compressor is otherwise too slow. Regular files
1973             are unaffected or maybe a tiny bit slower.
1974             This has no effect on the compression result, only on speed.
1975             */
1976             #define ZOPFLI_HASH_SAME_HASH
1977              
1978             /*
1979             Enable this, to avoid slowness for files which are a repetition of the same
1980             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
1981             the compression result.
1982             */
1983             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
1984              
1985             /*
1986             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
1987             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
1988             varies from file to file.
1989             */
1990             #define ZOPFLI_LAZY_MATCHING
1991              
1992             /*
1993             Appends value to dynamically allocated memory, doubling its allocation size
1994             whenever needed.
1995              
1996             value: the value to append, type T
1997             data: pointer to the dynamic array to append to, type T**
1998             size: pointer to the size of the array to append to, type size_t*. This is the
1999             size that you consider the array to be, not the internal allocation size.
2000             Precondition: allocated size of data is at least a power of two greater than or
2001             equal than *size.
2002             */
2003             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
2004             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
2005             if (!((*size) & ((*size) - 1))) {\
2006             /*double alloc size if it's a power of two*/\
2007             void** data_void = reinterpret_cast(data);\
2008             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
2009             : realloc((*data), (*size) * 2 * sizeof(**data));\
2010             }\
2011             (*data)[(*size)] = (value);\
2012             (*size)++;\
2013             }
2014             #else /* C gives problems with strict-aliasing rules for (void**) cast */
2015             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
2016             if (!((*size) & ((*size) - 1))) {\
2017             /*double alloc size if it's a power of two*/\
2018             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
2019             : realloc((*data), (*size) * 2 * sizeof(**data));\
2020             }\
2021             (*data)[(*size)] = (value);\
2022             (*size)++;\
2023             }
2024             #endif
2025              
2026              
2027             #endif /* ZOPFLI_UTIL_H_ */
2028              
2029              
2030             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
2031              
2032             /*
2033             Cache used by ZopfliFindLongestMatch to remember previously found length/dist
2034             values.
2035             This is needed because the squeeze runs will ask these values multiple times for
2036             the same position.
2037             Uses large amounts of memory, since it has to remember the distance belonging
2038             to every possible shorter-than-the-best length (the so called "sublen" array).
2039             */
2040             typedef struct ZopfliLongestMatchCache {
2041             unsigned short* length;
2042             unsigned short* dist;
2043             unsigned char* sublen;
2044             } ZopfliLongestMatchCache;
2045              
2046             /* Initializes the ZopfliLongestMatchCache. */
2047             void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc);
2048              
2049             /* Frees up the memory of the ZopfliLongestMatchCache. */
2050             void ZopfliCleanCache(ZopfliLongestMatchCache* lmc);
2051              
2052             /* Stores sublen array in the cache. */
2053             void ZopfliSublenToCache(const unsigned short* sublen,
2054             size_t pos, size_t length,
2055             ZopfliLongestMatchCache* lmc);
2056              
2057             /* Extracts sublen array from the cache. */
2058             void ZopfliCacheToSublen(const ZopfliLongestMatchCache* lmc,
2059             size_t pos, size_t length,
2060             unsigned short* sublen);
2061             /* Returns the length up to which could be stored in the cache. */
2062             unsigned ZopfliMaxCachedSublen(const ZopfliLongestMatchCache* lmc,
2063             size_t pos, size_t length);
2064              
2065             #endif /* ZOPFLI_LONGEST_MATCH_CACHE */
2066              
2067             #endif /* ZOPFLI_CACHE_H_ */
2068              
2069             /* hash.h */
2070             /*
2071             Copyright 2011 Google Inc. All Rights Reserved.
2072              
2073             Licensed under the Apache License, Version 2.0 (the "License");
2074             you may not use this file except in compliance with the License.
2075             You may obtain a copy of the License at
2076              
2077             http://www.apache.org/licenses/LICENSE-2.0
2078              
2079             Unless required by applicable law or agreed to in writing, software
2080             distributed under the License is distributed on an "AS IS" BASIS,
2081             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2082             See the License for the specific language governing permissions and
2083             limitations under the License.
2084              
2085             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
2086             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
2087             */
2088              
2089             /*
2090             The hash for ZopfliFindLongestMatch of lz77.c.
2091             */
2092              
2093             #ifndef ZOPFLI_HASH_H_
2094             #define ZOPFLI_HASH_H_
2095              
2096             /* util.h */
2097             /*
2098             Copyright 2011 Google Inc. All Rights Reserved.
2099              
2100             Licensed under the Apache License, Version 2.0 (the "License");
2101             you may not use this file except in compliance with the License.
2102             You may obtain a copy of the License at
2103              
2104             http://www.apache.org/licenses/LICENSE-2.0
2105              
2106             Unless required by applicable law or agreed to in writing, software
2107             distributed under the License is distributed on an "AS IS" BASIS,
2108             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2109             See the License for the specific language governing permissions and
2110             limitations under the License.
2111              
2112             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
2113             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
2114             */
2115              
2116             /*
2117             Several utilities, including: #defines to try different compression results,
2118             basic deflate specification values and generic program options.
2119             */
2120              
2121             #ifndef ZOPFLI_UTIL_H_
2122             #define ZOPFLI_UTIL_H_
2123              
2124             #include
2125             #include
2126              
2127             /* Minimum and maximum length that can be encoded in deflate. */
2128             #define ZOPFLI_MAX_MATCH 258
2129             #define ZOPFLI_MIN_MATCH 3
2130              
2131             /* Number of distinct literal/length and distance symbols in DEFLATE */
2132             #define ZOPFLI_NUM_LL 288
2133             #define ZOPFLI_NUM_D 32
2134              
2135             /*
2136             The window size for deflate. Must be a power of two. This should be 32768, the
2137             maximum possible by the deflate spec. Anything less hurts compression more than
2138             speed.
2139             */
2140             #define ZOPFLI_WINDOW_SIZE 32768
2141              
2142             /*
2143             The window mask used to wrap indices into the window. This is why the
2144             window size must be a power of two.
2145             */
2146             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
2147              
2148             /*
2149             A block structure of huge, non-smart, blocks to divide the input into, to allow
2150             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
2151             The whole compression algorithm, including the smarter block splitting, will
2152             be executed independently on each huge block.
2153             Dividing into huge blocks hurts compression, but not much relative to the size.
2154             Set it to 0 to disable master blocks.
2155             */
2156             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
2157              
2158             /*
2159             Used to initialize costs for example
2160             */
2161             #define ZOPFLI_LARGE_FLOAT 1e30
2162              
2163             /*
2164             For longest match cache. max 256. Uses huge amounts of memory but makes it
2165             faster. Uses this many times three bytes per single byte of the input data.
2166             This is so because longest match finding has to find the exact distance
2167             that belongs to each length for the best lz77 strategy.
2168             Good values: e.g. 5, 8.
2169             */
2170             #define ZOPFLI_CACHE_LENGTH 8
2171              
2172             /*
2173             limit the max hash chain hits for this hash value. This has an effect only
2174             on files where the hash value is the same very often. On these files, this
2175             gives worse compression (the value should ideally be 32768, which is the
2176             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
2177             faster on some specific files.
2178             Good value: e.g. 8192.
2179             */
2180             #define ZOPFLI_MAX_CHAIN_HITS 8192
2181              
2182             /*
2183             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
2184             consumes a lot of memory but speeds it up. No effect on compression size.
2185             */
2186             #define ZOPFLI_LONGEST_MATCH_CACHE
2187              
2188             /*
2189             Enable to remember amount of successive identical bytes in the hash chain for
2190             finding longest match
2191             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
2192             This has no effect on the compression result, and enabling it increases speed.
2193             */
2194             #define ZOPFLI_HASH_SAME
2195              
2196             /*
2197             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
2198             best length so far is long enough. This is way faster for files with lots of
2199             identical bytes, on which the compressor is otherwise too slow. Regular files
2200             are unaffected or maybe a tiny bit slower.
2201             This has no effect on the compression result, only on speed.
2202             */
2203             #define ZOPFLI_HASH_SAME_HASH
2204              
2205             /*
2206             Enable this, to avoid slowness for files which are a repetition of the same
2207             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
2208             the compression result.
2209             */
2210             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
2211              
2212             /*
2213             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
2214             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
2215             varies from file to file.
2216             */
2217             #define ZOPFLI_LAZY_MATCHING
2218              
2219             /*
2220             Appends value to dynamically allocated memory, doubling its allocation size
2221             whenever needed.
2222              
2223             value: the value to append, type T
2224             data: pointer to the dynamic array to append to, type T**
2225             size: pointer to the size of the array to append to, type size_t*. This is the
2226             size that you consider the array to be, not the internal allocation size.
2227             Precondition: allocated size of data is at least a power of two greater than or
2228             equal than *size.
2229             */
2230             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
2231             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
2232             if (!((*size) & ((*size) - 1))) {\
2233             /*double alloc size if it's a power of two*/\
2234             void** data_void = reinterpret_cast(data);\
2235             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
2236             : realloc((*data), (*size) * 2 * sizeof(**data));\
2237             }\
2238             (*data)[(*size)] = (value);\
2239             (*size)++;\
2240             }
2241             #else /* C gives problems with strict-aliasing rules for (void**) cast */
2242             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
2243             if (!((*size) & ((*size) - 1))) {\
2244             /*double alloc size if it's a power of two*/\
2245             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
2246             : realloc((*data), (*size) * 2 * sizeof(**data));\
2247             }\
2248             (*data)[(*size)] = (value);\
2249             (*size)++;\
2250             }
2251             #endif
2252              
2253              
2254             #endif /* ZOPFLI_UTIL_H_ */
2255              
2256              
2257             typedef struct ZopfliHash {
2258             int* head; /* Hash value to index of its most recent occurrence. */
2259             unsigned short* prev; /* Index to index of prev. occurrence of same hash. */
2260             int* hashval; /* Index to hash value at this index. */
2261             int val; /* Current hash value. */
2262              
2263             #ifdef ZOPFLI_HASH_SAME_HASH
2264             /* Fields with similar purpose as the above hash, but for the second hash with
2265             a value that is calculated differently. */
2266             int* head2; /* Hash value to index of its most recent occurrence. */
2267             unsigned short* prev2; /* Index to index of prev. occurrence of same hash. */
2268             int* hashval2; /* Index to hash value at this index. */
2269             int val2; /* Current hash value. */
2270             #endif
2271              
2272             #ifdef ZOPFLI_HASH_SAME
2273             unsigned short* same; /* Amount of repetitions of same byte after this .*/
2274             #endif
2275             } ZopfliHash;
2276              
2277             /* Allocates ZopfliHash memory. */
2278             void ZopfliAllocHash(size_t window_size, ZopfliHash* h);
2279              
2280             /* Resets all fields of ZopfliHash. */
2281             void ZopfliResetHash(size_t window_size, ZopfliHash* h);
2282              
2283             /* Frees ZopfliHash memory. */
2284             void ZopfliCleanHash(ZopfliHash* h);
2285              
2286             /*
2287             Updates the hash values based on the current position in the array. All calls
2288             to this must be made for consecutive bytes.
2289             */
2290             void ZopfliUpdateHash(const unsigned char* array, size_t pos, size_t end,
2291             ZopfliHash* h);
2292              
2293             /*
2294             Prepopulates hash:
2295             Fills in the initial values in the hash, before ZopfliUpdateHash can be used
2296             correctly.
2297             */
2298             void ZopfliWarmupHash(const unsigned char* array, size_t pos, size_t end,
2299             ZopfliHash* h);
2300              
2301             #endif /* ZOPFLI_HASH_H_ */
2302              
2303             /* zopfli.h */
2304             /*
2305             Copyright 2011 Google Inc. All Rights Reserved.
2306              
2307             Licensed under the Apache License, Version 2.0 (the "License");
2308             you may not use this file except in compliance with the License.
2309             You may obtain a copy of the License at
2310              
2311             http://www.apache.org/licenses/LICENSE-2.0
2312              
2313             Unless required by applicable law or agreed to in writing, software
2314             distributed under the License is distributed on an "AS IS" BASIS,
2315             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2316             See the License for the specific language governing permissions and
2317             limitations under the License.
2318              
2319             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
2320             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
2321             */
2322              
2323             #ifndef ZOPFLI_ZOPFLI_H_
2324             #define ZOPFLI_ZOPFLI_H_
2325              
2326             #include
2327             #include /* for size_t */
2328              
2329             #ifdef __cplusplus
2330             extern "C" {
2331             #endif
2332              
2333             /*
2334             Options used throughout the program.
2335             */
2336             typedef struct ZopfliOptions {
2337             /* Whether to print output */
2338             int verbose;
2339              
2340             /* Whether to print more detailed output */
2341             int verbose_more;
2342              
2343             /*
2344             Maximum amount of times to rerun forward and backward pass to optimize LZ77
2345             compression cost. Good values: 10, 15 for small files, 5 for files over
2346             several MB in size or it will be too slow.
2347             */
2348             int numiterations;
2349              
2350             /*
2351             If true, splits the data in multiple deflate blocks with optimal choice
2352             for the block boundaries. Block splitting gives better compression. Default:
2353             true (1).
2354             */
2355             int blocksplitting;
2356              
2357             /*
2358             No longer used, left for compatibility.
2359             */
2360             int blocksplittinglast;
2361              
2362             /*
2363             Maximum amount of blocks to split into (0 for unlimited, but this can give
2364             extreme results that hurt compression on some files). Default value: 15.
2365             */
2366             int blocksplittingmax;
2367             } ZopfliOptions;
2368              
2369             /* Initializes options with default values. */
2370             void ZopfliInitOptions(ZopfliOptions* options);
2371              
2372             /* Output format */
2373             typedef enum {
2374             ZOPFLI_FORMAT_GZIP,
2375             ZOPFLI_FORMAT_ZLIB,
2376             ZOPFLI_FORMAT_DEFLATE
2377             } ZopfliFormat;
2378              
2379             /*
2380             Compresses according to the given output format and appends the result to the
2381             output.
2382              
2383             options: global program options
2384             output_type: the output format to use
2385             out: pointer to the dynamic output array to which the result is appended. Must
2386             be freed after use
2387             outsize: pointer to the dynamic output array size
2388             */
2389             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
2390             const unsigned char* in, size_t insize,
2391             unsigned char** out, size_t* outsize);
2392              
2393             #ifdef __cplusplus
2394             } // extern "C"
2395             #endif
2396              
2397             #endif /* ZOPFLI_ZOPFLI_H_ */
2398              
2399              
2400             /*
2401             Stores lit/length and dist pairs for LZ77.
2402             Parameter litlens: Contains the literal symbols or length values.
2403             Parameter dists: Contains the distances. A value is 0 to indicate that there is
2404             no dist and the corresponding litlens value is a literal instead of a length.
2405             Parameter size: The size of both the litlens and dists arrays.
2406             The memory can best be managed by using ZopfliInitLZ77Store to initialize it,
2407             ZopfliCleanLZ77Store to destroy it, and ZopfliStoreLitLenDist to append values.
2408              
2409             */
2410             typedef struct ZopfliLZ77Store {
2411             unsigned short* litlens; /* Lit or len. */
2412             unsigned short* dists; /* If 0: indicates literal in corresponding litlens,
2413             if > 0: length in corresponding litlens, this is the distance. */
2414             size_t size;
2415              
2416             const unsigned char* data; /* original data */
2417             size_t* pos; /* position in data where this LZ77 command begins */
2418              
2419             unsigned short* ll_symbol;
2420             unsigned short* d_symbol;
2421              
2422             /* Cumulative histograms wrapping around per chunk. Each chunk has the amount
2423             of distinct symbols as length, so using 1 value per LZ77 symbol, we have a
2424             precise histogram at every N symbols, and the rest can be calculated by
2425             looping through the actual symbols of this chunk. */
2426             size_t* ll_counts;
2427             size_t* d_counts;
2428             } ZopfliLZ77Store;
2429              
2430             void ZopfliInitLZ77Store(const unsigned char* data, ZopfliLZ77Store* store);
2431             void ZopfliCleanLZ77Store(ZopfliLZ77Store* store);
2432             void ZopfliCopyLZ77Store(const ZopfliLZ77Store* source, ZopfliLZ77Store* dest);
2433             void ZopfliStoreLitLenDist(unsigned short length, unsigned short dist,
2434             size_t pos, ZopfliLZ77Store* store);
2435             void ZopfliAppendLZ77Store(const ZopfliLZ77Store* store,
2436             ZopfliLZ77Store* target);
2437             /* Gets the amount of raw bytes that this range of LZ77 symbols spans. */
2438             size_t ZopfliLZ77GetByteRange(const ZopfliLZ77Store* lz77,
2439             size_t lstart, size_t lend);
2440             /* Gets the histogram of lit/len and dist symbols in the given range, using the
2441             cumulative histograms, so faster than adding one by one for large range. Does
2442             not add the one end symbol of value 256. */
2443             void ZopfliLZ77GetHistogram(const ZopfliLZ77Store* lz77,
2444             size_t lstart, size_t lend,
2445             size_t* ll_counts, size_t* d_counts);
2446              
2447             /*
2448             Some state information for compressing a block.
2449             This is currently a bit under-used (with mainly only the longest match cache),
2450             but is kept for easy future expansion.
2451             */
2452             typedef struct ZopfliBlockState {
2453             const ZopfliOptions* options;
2454              
2455             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
2456             /* Cache for length/distance pairs found so far. */
2457             ZopfliLongestMatchCache* lmc;
2458             #endif
2459              
2460             /* The start (inclusive) and end (not inclusive) of the current block. */
2461             size_t blockstart;
2462             size_t blockend;
2463             } ZopfliBlockState;
2464              
2465             void ZopfliInitBlockState(const ZopfliOptions* options,
2466             size_t blockstart, size_t blockend, int add_lmc,
2467             ZopfliBlockState* s);
2468             void ZopfliCleanBlockState(ZopfliBlockState* s);
2469              
2470             /*
2471             Finds the longest match (length and corresponding distance) for LZ77
2472             compression.
2473             Even when not using "sublen", it can be more efficient to provide an array,
2474             because only then the caching is used.
2475             array: the data
2476             pos: position in the data to find the match for
2477             size: size of the data
2478             limit: limit length to maximum this value (default should be 258). This allows
2479             finding a shorter dist for that length (= less extra bits). Must be
2480             in the range [ZOPFLI_MIN_MATCH, ZOPFLI_MAX_MATCH].
2481             sublen: output array of 259 elements, or null. Has, for each length, the
2482             smallest distance required to reach this length. Only 256 of its 259 values
2483             are used, the first 3 are ignored (the shortest length is 3. It is purely
2484             for convenience that the array is made 3 longer).
2485             */
2486             void ZopfliFindLongestMatch(
2487             ZopfliBlockState *s, const ZopfliHash* h, const unsigned char* array,
2488             size_t pos, size_t size, size_t limit,
2489             unsigned short* sublen, unsigned short* distance, unsigned short* length);
2490              
2491             /*
2492             Verifies if length and dist are indeed valid, only used for assertion.
2493             */
2494             void ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
2495             unsigned short dist, unsigned short length);
2496              
2497             /*
2498             Does LZ77 using an algorithm similar to gzip, with lazy matching, rather than
2499             with the slow but better "squeeze" implementation.
2500             The result is placed in the ZopfliLZ77Store.
2501             If instart is larger than 0, it uses values before instart as starting
2502             dictionary.
2503             */
2504             void ZopfliLZ77Greedy(ZopfliBlockState* s, const unsigned char* in,
2505             size_t instart, size_t inend,
2506             ZopfliLZ77Store* store, ZopfliHash* h);
2507              
2508             #endif /* ZOPFLI_LZ77_H_ */
2509              
2510              
2511             /*
2512             Calculates lit/len and dist pairs for given data.
2513             If instart is larger than 0, it uses values before instart as starting
2514             dictionary.
2515             */
2516             void ZopfliLZ77Optimal(ZopfliBlockState *s,
2517             const unsigned char* in, size_t instart, size_t inend,
2518             int numiterations,
2519             ZopfliLZ77Store* store);
2520              
2521             /*
2522             Does the same as ZopfliLZ77Optimal, but optimized for the fixed tree of the
2523             deflate standard.
2524             The fixed tree never gives the best compression. But this gives the best
2525             possible LZ77 encoding possible with the fixed tree.
2526             This does not create or output any fixed tree, only LZ77 data optimized for
2527             using with a fixed tree.
2528             If instart is larger than 0, it uses values before instart as starting
2529             dictionary.
2530             */
2531             void ZopfliLZ77OptimalFixed(ZopfliBlockState *s,
2532             const unsigned char* in,
2533             size_t instart, size_t inend,
2534             ZopfliLZ77Store* store);
2535              
2536             #endif /* ZOPFLI_SQUEEZE_H_ */
2537              
2538             /* tree.h */
2539             /*
2540             Copyright 2011 Google Inc. All Rights Reserved.
2541              
2542             Licensed under the Apache License, Version 2.0 (the "License");
2543             you may not use this file except in compliance with the License.
2544             You may obtain a copy of the License at
2545              
2546             http://www.apache.org/licenses/LICENSE-2.0
2547              
2548             Unless required by applicable law or agreed to in writing, software
2549             distributed under the License is distributed on an "AS IS" BASIS,
2550             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2551             See the License for the specific language governing permissions and
2552             limitations under the License.
2553              
2554             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
2555             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
2556             */
2557              
2558             /*
2559             Utilities for creating and using Huffman trees.
2560             */
2561              
2562             #ifndef ZOPFLI_TREE_H_
2563             #define ZOPFLI_TREE_H_
2564              
2565             #include
2566              
2567             /*
2568             Calculates the bitlengths for the Huffman tree, based on the counts of each
2569             symbol.
2570             */
2571             void ZopfliCalculateBitLengths(const size_t* count, size_t n, int maxbits,
2572             unsigned *bitlengths);
2573              
2574             /*
2575             Converts a series of Huffman tree bitlengths, to the bit values of the symbols.
2576             */
2577             void ZopfliLengthsToSymbols(const unsigned* lengths, size_t n, unsigned maxbits,
2578             unsigned* symbols);
2579              
2580             /*
2581             Calculates the entropy of each symbol, based on the counts of each symbol. The
2582             result is similar to the result of ZopfliCalculateBitLengths, but with the
2583             actual theoritical bit lengths according to the entropy. Since the resulting
2584             values are fractional, they cannot be used to encode the tree specified by
2585             DEFLATE.
2586             */
2587             void ZopfliCalculateEntropy(const size_t* count, size_t n, double* bitlengths);
2588              
2589             #endif /* ZOPFLI_TREE_H_ */
2590              
2591             /* util.h */
2592             /*
2593             Copyright 2011 Google Inc. All Rights Reserved.
2594              
2595             Licensed under the Apache License, Version 2.0 (the "License");
2596             you may not use this file except in compliance with the License.
2597             You may obtain a copy of the License at
2598              
2599             http://www.apache.org/licenses/LICENSE-2.0
2600              
2601             Unless required by applicable law or agreed to in writing, software
2602             distributed under the License is distributed on an "AS IS" BASIS,
2603             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2604             See the License for the specific language governing permissions and
2605             limitations under the License.
2606              
2607             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
2608             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
2609             */
2610              
2611             /*
2612             Several utilities, including: #defines to try different compression results,
2613             basic deflate specification values and generic program options.
2614             */
2615              
2616             #ifndef ZOPFLI_UTIL_H_
2617             #define ZOPFLI_UTIL_H_
2618              
2619             #include
2620             #include
2621              
2622             /* Minimum and maximum length that can be encoded in deflate. */
2623             #define ZOPFLI_MAX_MATCH 258
2624             #define ZOPFLI_MIN_MATCH 3
2625              
2626             /* Number of distinct literal/length and distance symbols in DEFLATE */
2627             #define ZOPFLI_NUM_LL 288
2628             #define ZOPFLI_NUM_D 32
2629              
2630             /*
2631             The window size for deflate. Must be a power of two. This should be 32768, the
2632             maximum possible by the deflate spec. Anything less hurts compression more than
2633             speed.
2634             */
2635             #define ZOPFLI_WINDOW_SIZE 32768
2636              
2637             /*
2638             The window mask used to wrap indices into the window. This is why the
2639             window size must be a power of two.
2640             */
2641             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
2642              
2643             /*
2644             A block structure of huge, non-smart, blocks to divide the input into, to allow
2645             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
2646             The whole compression algorithm, including the smarter block splitting, will
2647             be executed independently on each huge block.
2648             Dividing into huge blocks hurts compression, but not much relative to the size.
2649             Set it to 0 to disable master blocks.
2650             */
2651             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
2652              
2653             /*
2654             Used to initialize costs for example
2655             */
2656             #define ZOPFLI_LARGE_FLOAT 1e30
2657              
2658             /*
2659             For longest match cache. max 256. Uses huge amounts of memory but makes it
2660             faster. Uses this many times three bytes per single byte of the input data.
2661             This is so because longest match finding has to find the exact distance
2662             that belongs to each length for the best lz77 strategy.
2663             Good values: e.g. 5, 8.
2664             */
2665             #define ZOPFLI_CACHE_LENGTH 8
2666              
2667             /*
2668             limit the max hash chain hits for this hash value. This has an effect only
2669             on files where the hash value is the same very often. On these files, this
2670             gives worse compression (the value should ideally be 32768, which is the
2671             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
2672             faster on some specific files.
2673             Good value: e.g. 8192.
2674             */
2675             #define ZOPFLI_MAX_CHAIN_HITS 8192
2676              
2677             /*
2678             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
2679             consumes a lot of memory but speeds it up. No effect on compression size.
2680             */
2681             #define ZOPFLI_LONGEST_MATCH_CACHE
2682              
2683             /*
2684             Enable to remember amount of successive identical bytes in the hash chain for
2685             finding longest match
2686             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
2687             This has no effect on the compression result, and enabling it increases speed.
2688             */
2689             #define ZOPFLI_HASH_SAME
2690              
2691             /*
2692             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
2693             best length so far is long enough. This is way faster for files with lots of
2694             identical bytes, on which the compressor is otherwise too slow. Regular files
2695             are unaffected or maybe a tiny bit slower.
2696             This has no effect on the compression result, only on speed.
2697             */
2698             #define ZOPFLI_HASH_SAME_HASH
2699              
2700             /*
2701             Enable this, to avoid slowness for files which are a repetition of the same
2702             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
2703             the compression result.
2704             */
2705             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
2706              
2707             /*
2708             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
2709             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
2710             varies from file to file.
2711             */
2712             #define ZOPFLI_LAZY_MATCHING
2713              
2714             /*
2715             Appends value to dynamically allocated memory, doubling its allocation size
2716             whenever needed.
2717              
2718             value: the value to append, type T
2719             data: pointer to the dynamic array to append to, type T**
2720             size: pointer to the size of the array to append to, type size_t*. This is the
2721             size that you consider the array to be, not the internal allocation size.
2722             Precondition: allocated size of data is at least a power of two greater than or
2723             equal than *size.
2724             */
2725             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
2726             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
2727             if (!((*size) & ((*size) - 1))) {\
2728             /*double alloc size if it's a power of two*/\
2729             void** data_void = reinterpret_cast(data);\
2730             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
2731             : realloc((*data), (*size) * 2 * sizeof(**data));\
2732             }\
2733             (*data)[(*size)] = (value);\
2734             (*size)++;\
2735             }
2736             #else /* C gives problems with strict-aliasing rules for (void**) cast */
2737             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
2738             if (!((*size) & ((*size) - 1))) {\
2739             /*double alloc size if it's a power of two*/\
2740             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
2741             : realloc((*data), (*size) * 2 * sizeof(**data));\
2742             }\
2743             (*data)[(*size)] = (value);\
2744             (*size)++;\
2745             }
2746             #endif
2747              
2748              
2749             #endif /* ZOPFLI_UTIL_H_ */
2750              
2751              
2752             /*
2753             The "f" for the FindMinimum function below.
2754             i: the current parameter of f(i)
2755             context: for your implementation
2756             */
2757             typedef double FindMinimumFun(size_t i, void* context);
2758              
2759             /*
2760             Finds minimum of function f(i) where is is of type size_t, f(i) is of type
2761             double, i is in range start-end (excluding end).
2762             Outputs the minimum value in *smallest and returns the index of this value.
2763             */
2764 4           static size_t FindMinimum(FindMinimumFun f, void* context,
2765             size_t start, size_t end, double* smallest) {
2766 4 50         if (end - start < 1024) {
2767 4           double best = ZOPFLI_LARGE_FLOAT;
2768 4           size_t result = start;
2769             size_t i;
2770 98 100         for (i = start; i < end; i++) {
2771 94           double v = f(i, context);
2772 94 100         if (v < best) {
2773 7           best = v;
2774 7           result = i;
2775             }
2776             }
2777 4           *smallest = best;
2778 4           return result;
2779             } else {
2780             /* Try to find minimum faster by recursively checking multiple points. */
2781             #define NUM 9 /* Good value: 9. */
2782             size_t i;
2783             size_t p[NUM];
2784             double vp[NUM];
2785             size_t besti;
2786             double best;
2787 0           double lastbest = ZOPFLI_LARGE_FLOAT;
2788 0           size_t pos = start;
2789              
2790             for (;;) {
2791 0 0         if (end - start <= NUM) break;
2792              
2793 0 0         for (i = 0; i < NUM; i++) {
2794 0           p[i] = start + (i + 1) * ((end - start) / (NUM + 1));
2795 0           vp[i] = f(p[i], context);
2796             }
2797 0           besti = 0;
2798 0           best = vp[0];
2799 0 0         for (i = 1; i < NUM; i++) {
2800 0 0         if (vp[i] < best) {
2801 0           best = vp[i];
2802 0           besti = i;
2803             }
2804             }
2805 0 0         if (best > lastbest) break;
2806              
2807 0 0         start = besti == 0 ? start : p[besti - 1];
2808 0 0         end = besti == NUM - 1 ? end : p[besti + 1];
2809              
2810 0           pos = p[besti];
2811 0           lastbest = best;
2812 0           }
2813 0           *smallest = lastbest;
2814 0           return pos;
2815             #undef NUM
2816             }
2817             }
2818              
2819             /*
2820             Returns estimated cost of a block in bits. It includes the size to encode the
2821             tree and the size to encode all literal, length and distance symbols and their
2822             extra bits.
2823              
2824             litlens: lz77 lit/lengths
2825             dists: ll77 distances
2826             lstart: start of block
2827             lend: end of block (not inclusive)
2828             */
2829 192           static double EstimateCost(const ZopfliLZ77Store* lz77,
2830             size_t lstart, size_t lend) {
2831 192           return ZopfliCalculateBlockSizeAutoType(lz77, lstart, lend);
2832             }
2833              
2834             typedef struct SplitCostContext {
2835             const ZopfliLZ77Store* lz77;
2836             size_t start;
2837             size_t end;
2838             } SplitCostContext;
2839              
2840              
2841             /*
2842             Gets the cost which is the sum of the cost of the left and the right section
2843             of the data.
2844             type: FindMinimumFun
2845             */
2846 94           static double SplitCost(size_t i, void* context) {
2847 94           SplitCostContext* c = (SplitCostContext*)context;
2848 94           return EstimateCost(c->lz77, c->start, i) + EstimateCost(c->lz77, i, c->end);
2849             }
2850              
2851 1           static void AddSorted(size_t value, size_t** out, size_t* outsize) {
2852             size_t i;
2853 1 50         ZOPFLI_APPEND_DATA(value, out, outsize);
    50          
2854 1 50         for (i = 0; i + 1 < *outsize; i++) {
2855 0 0         if ((*out)[i] > value) {
2856             size_t j;
2857 0 0         for (j = *outsize - 1; j > i; j--) {
2858 0           (*out)[j] = (*out)[j - 1];
2859             }
2860 0           (*out)[i] = value;
2861 0           break;
2862             }
2863             }
2864 1           }
2865              
2866             /*
2867             Prints the block split points as decimal and hex values in the terminal.
2868             */
2869 0           static void PrintBlockSplitPoints(const ZopfliLZ77Store* lz77,
2870             const size_t* lz77splitpoints,
2871             size_t nlz77points) {
2872 0           size_t* splitpoints = 0;
2873 0           size_t npoints = 0;
2874             size_t i;
2875             /* The input is given as lz77 indices, but we want to see the uncompressed
2876             index values. */
2877 0           size_t pos = 0;
2878 0 0         if (nlz77points > 0) {
2879 0 0         for (i = 0; i < lz77->size; i++) {
2880 0 0         size_t length = lz77->dists[i] == 0 ? 1 : lz77->litlens[i];
2881 0 0         if (lz77splitpoints[npoints] == i) {
2882 0 0         ZOPFLI_APPEND_DATA(pos, &splitpoints, &npoints);
    0          
2883 0 0         if (npoints == nlz77points) break;
2884             }
2885 0           pos += length;
2886             }
2887             }
2888             assert(npoints == nlz77points);
2889              
2890 0           fprintf(stderr, "block split points: ");
2891 0 0         for (i = 0; i < npoints; i++) {
2892 0           fprintf(stderr, "%d ", (int)splitpoints[i]);
2893             }
2894 0           fprintf(stderr, "(hex:");
2895 0 0         for (i = 0; i < npoints; i++) {
2896 0           fprintf(stderr, " %x", (int)splitpoints[i]);
2897             }
2898 0           fprintf(stderr, ")\n");
2899              
2900 0           free(splitpoints);
2901 0           }
2902              
2903             /*
2904             Finds next block to try to split, the largest of the available ones.
2905             The largest is chosen to make sure that if only a limited amount of blocks is
2906             requested, their sizes are spread evenly.
2907             lz77size: the size of the LL77 data, which is the size of the done array here.
2908             done: array indicating which blocks starting at that position are no longer
2909             splittable (splitting them increases rather than decreases cost).
2910             splitpoints: the splitpoints found so far.
2911             npoints: the amount of splitpoints found so far.
2912             lstart: output variable, giving start of block.
2913             lend: output variable, giving end of block.
2914             returns 1 if a block was found, 0 if no block found (all are done).
2915             */
2916 4           static int FindLargestSplittableBlock(
2917             size_t lz77size, const unsigned char* done,
2918             const size_t* splitpoints, size_t npoints,
2919             size_t* lstart, size_t* lend) {
2920 4           size_t longest = 0;
2921 4           int found = 0;
2922             size_t i;
2923 10 100         for (i = 0; i <= npoints; i++) {
2924 6 100         size_t start = i == 0 ? 0 : splitpoints[i - 1];
2925 6 100         size_t end = i == npoints ? lz77size - 1 : splitpoints[i];
2926 6 100         if (!done[start] && end - start > longest) {
    50          
2927 3           *lstart = start;
2928 3           *lend = end;
2929 3           found = 1;
2930 3           longest = end - start;
2931             }
2932             }
2933 4           return found;
2934             }
2935              
2936 3           void ZopfliBlockSplitLZ77(const ZopfliOptions* options,
2937             const ZopfliLZ77Store* lz77, size_t maxblocks,
2938             size_t** splitpoints, size_t* npoints) {
2939             size_t lstart, lend;
2940             size_t i;
2941 3           size_t llpos = 0;
2942 3           size_t numblocks = 1;
2943             unsigned char* done;
2944             double splitcost, origcost;
2945              
2946 3 50         if (lz77->size < 10) return; /* This code fails on tiny files. */
2947              
2948 3           done = (unsigned char*)malloc(lz77->size);
2949 3 50         if (!done) exit(-1); /* Allocation failed. */
2950 67 100         for (i = 0; i < lz77->size; i++) done[i] = 0;
2951              
2952 3           lstart = 0;
2953 3           lend = lz77->size;
2954             for (;;) {
2955             SplitCostContext c;
2956              
2957 4 50         if (maxblocks > 0 && numblocks >= maxblocks) {
    50          
2958 0           break;
2959             }
2960              
2961 4           c.lz77 = lz77;
2962 4           c.start = lstart;
2963 4           c.end = lend;
2964             assert(lstart < lend);
2965 4           llpos = FindMinimum(SplitCost, &c, lstart + 1, lend, &splitcost);
2966              
2967             assert(llpos > lstart);
2968             assert(llpos < lend);
2969              
2970 4           origcost = EstimateCost(lz77, lstart, lend);
2971              
2972 4 100         if (splitcost > origcost || llpos == lstart + 1 || llpos == lend) {
    50          
    50          
2973 3           done[lstart] = 1;
2974             } else {
2975 1           AddSorted(llpos, splitpoints, npoints);
2976 1           numblocks++;
2977             }
2978              
2979 4 100         if (!FindLargestSplittableBlock(
2980             lz77->size, done, *splitpoints, *npoints, &lstart, &lend)) {
2981 2           break; /* No further split will probably reduce compression. */
2982             }
2983              
2984 2 100         if (lend - lstart < 10) {
2985 1           break;
2986             }
2987 1           }
2988              
2989 3 50         if (options->verbose) {
2990 0           PrintBlockSplitPoints(lz77, *splitpoints, *npoints);
2991             }
2992              
2993 3           free(done);
2994             }
2995              
2996 3           void ZopfliBlockSplit(const ZopfliOptions* options,
2997             const unsigned char* in, size_t instart, size_t inend,
2998             size_t maxblocks, size_t** splitpoints, size_t* npoints) {
2999 3           size_t pos = 0;
3000             size_t i;
3001             ZopfliBlockState s;
3002 3           size_t* lz77splitpoints = 0;
3003 3           size_t nlz77points = 0;
3004             ZopfliLZ77Store store;
3005             ZopfliHash hash;
3006 3           ZopfliHash* h = &hash;
3007              
3008 3           ZopfliInitLZ77Store(in, &store);
3009 3           ZopfliInitBlockState(options, instart, inend, 0, &s);
3010 3           ZopfliAllocHash(ZOPFLI_WINDOW_SIZE, h);
3011              
3012 3           *npoints = 0;
3013 3           *splitpoints = 0;
3014              
3015             /* Unintuitively, Using a simple LZ77 method here instead of ZopfliLZ77Optimal
3016             results in better blocks. */
3017 3           ZopfliLZ77Greedy(&s, in, instart, inend, &store, h);
3018              
3019 3           ZopfliBlockSplitLZ77(options,
3020             &store, maxblocks,
3021             &lz77splitpoints, &nlz77points);
3022              
3023             /* Convert LZ77 positions to positions in the uncompressed input. */
3024 3           pos = instart;
3025 3 100         if (nlz77points > 0) {
3026 10 50         for (i = 0; i < store.size; i++) {
3027 10 100         size_t length = store.dists[i] == 0 ? 1 : store.litlens[i];
3028 10 100         if (lz77splitpoints[*npoints] == i) {
3029 1 50         ZOPFLI_APPEND_DATA(pos, splitpoints, npoints);
    50          
3030 1 50         if (*npoints == nlz77points) break;
3031             }
3032 9           pos += length;
3033             }
3034             }
3035             assert(*npoints == nlz77points);
3036              
3037 3           free(lz77splitpoints);
3038 3           ZopfliCleanBlockState(&s);
3039 3           ZopfliCleanLZ77Store(&store);
3040 3           ZopfliCleanHash(h);
3041 3           }
3042              
3043 0           void ZopfliBlockSplitSimple(const unsigned char* in,
3044             size_t instart, size_t inend,
3045             size_t blocksize,
3046             size_t** splitpoints, size_t* npoints) {
3047 0           size_t i = instart;
3048 0 0         while (i < inend) {
3049 0 0         ZOPFLI_APPEND_DATA(i, splitpoints, npoints);
    0          
3050 0           i += blocksize;
3051             }
3052             (void)in;
3053 0           }
3054             /*
3055             Copyright 2011 Google Inc. All Rights Reserved.
3056              
3057             Licensed under the Apache License, Version 2.0 (the "License");
3058             you may not use this file except in compliance with the License.
3059             You may obtain a copy of the License at
3060              
3061             http://www.apache.org/licenses/LICENSE-2.0
3062              
3063             Unless required by applicable law or agreed to in writing, software
3064             distributed under the License is distributed on an "AS IS" BASIS,
3065             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3066             See the License for the specific language governing permissions and
3067             limitations under the License.
3068              
3069             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
3070             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
3071             */
3072              
3073             /* cache.h */
3074             /*
3075             Copyright 2011 Google Inc. All Rights Reserved.
3076              
3077             Licensed under the Apache License, Version 2.0 (the "License");
3078             you may not use this file except in compliance with the License.
3079             You may obtain a copy of the License at
3080              
3081             http://www.apache.org/licenses/LICENSE-2.0
3082              
3083             Unless required by applicable law or agreed to in writing, software
3084             distributed under the License is distributed on an "AS IS" BASIS,
3085             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3086             See the License for the specific language governing permissions and
3087             limitations under the License.
3088              
3089             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
3090             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
3091             */
3092              
3093             /*
3094             The cache that speeds up ZopfliFindLongestMatch of lz77.c.
3095             */
3096              
3097             #ifndef ZOPFLI_CACHE_H_
3098             #define ZOPFLI_CACHE_H_
3099              
3100             /* util.h */
3101             /*
3102             Copyright 2011 Google Inc. All Rights Reserved.
3103              
3104             Licensed under the Apache License, Version 2.0 (the "License");
3105             you may not use this file except in compliance with the License.
3106             You may obtain a copy of the License at
3107              
3108             http://www.apache.org/licenses/LICENSE-2.0
3109              
3110             Unless required by applicable law or agreed to in writing, software
3111             distributed under the License is distributed on an "AS IS" BASIS,
3112             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3113             See the License for the specific language governing permissions and
3114             limitations under the License.
3115              
3116             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
3117             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
3118             */
3119              
3120             /*
3121             Several utilities, including: #defines to try different compression results,
3122             basic deflate specification values and generic program options.
3123             */
3124              
3125             #ifndef ZOPFLI_UTIL_H_
3126             #define ZOPFLI_UTIL_H_
3127              
3128             #include
3129             #include
3130              
3131             /* Minimum and maximum length that can be encoded in deflate. */
3132             #define ZOPFLI_MAX_MATCH 258
3133             #define ZOPFLI_MIN_MATCH 3
3134              
3135             /* Number of distinct literal/length and distance symbols in DEFLATE */
3136             #define ZOPFLI_NUM_LL 288
3137             #define ZOPFLI_NUM_D 32
3138              
3139             /*
3140             The window size for deflate. Must be a power of two. This should be 32768, the
3141             maximum possible by the deflate spec. Anything less hurts compression more than
3142             speed.
3143             */
3144             #define ZOPFLI_WINDOW_SIZE 32768
3145              
3146             /*
3147             The window mask used to wrap indices into the window. This is why the
3148             window size must be a power of two.
3149             */
3150             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
3151              
3152             /*
3153             A block structure of huge, non-smart, blocks to divide the input into, to allow
3154             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
3155             The whole compression algorithm, including the smarter block splitting, will
3156             be executed independently on each huge block.
3157             Dividing into huge blocks hurts compression, but not much relative to the size.
3158             Set it to 0 to disable master blocks.
3159             */
3160             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
3161              
3162             /*
3163             Used to initialize costs for example
3164             */
3165             #define ZOPFLI_LARGE_FLOAT 1e30
3166              
3167             /*
3168             For longest match cache. max 256. Uses huge amounts of memory but makes it
3169             faster. Uses this many times three bytes per single byte of the input data.
3170             This is so because longest match finding has to find the exact distance
3171             that belongs to each length for the best lz77 strategy.
3172             Good values: e.g. 5, 8.
3173             */
3174             #define ZOPFLI_CACHE_LENGTH 8
3175              
3176             /*
3177             limit the max hash chain hits for this hash value. This has an effect only
3178             on files where the hash value is the same very often. On these files, this
3179             gives worse compression (the value should ideally be 32768, which is the
3180             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
3181             faster on some specific files.
3182             Good value: e.g. 8192.
3183             */
3184             #define ZOPFLI_MAX_CHAIN_HITS 8192
3185              
3186             /*
3187             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
3188             consumes a lot of memory but speeds it up. No effect on compression size.
3189             */
3190             #define ZOPFLI_LONGEST_MATCH_CACHE
3191              
3192             /*
3193             Enable to remember amount of successive identical bytes in the hash chain for
3194             finding longest match
3195             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
3196             This has no effect on the compression result, and enabling it increases speed.
3197             */
3198             #define ZOPFLI_HASH_SAME
3199              
3200             /*
3201             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
3202             best length so far is long enough. This is way faster for files with lots of
3203             identical bytes, on which the compressor is otherwise too slow. Regular files
3204             are unaffected or maybe a tiny bit slower.
3205             This has no effect on the compression result, only on speed.
3206             */
3207             #define ZOPFLI_HASH_SAME_HASH
3208              
3209             /*
3210             Enable this, to avoid slowness for files which are a repetition of the same
3211             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
3212             the compression result.
3213             */
3214             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
3215              
3216             /*
3217             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
3218             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
3219             varies from file to file.
3220             */
3221             #define ZOPFLI_LAZY_MATCHING
3222              
3223             /*
3224             Appends value to dynamically allocated memory, doubling its allocation size
3225             whenever needed.
3226              
3227             value: the value to append, type T
3228             data: pointer to the dynamic array to append to, type T**
3229             size: pointer to the size of the array to append to, type size_t*. This is the
3230             size that you consider the array to be, not the internal allocation size.
3231             Precondition: allocated size of data is at least a power of two greater than or
3232             equal than *size.
3233             */
3234             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
3235             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
3236             if (!((*size) & ((*size) - 1))) {\
3237             /*double alloc size if it's a power of two*/\
3238             void** data_void = reinterpret_cast(data);\
3239             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
3240             : realloc((*data), (*size) * 2 * sizeof(**data));\
3241             }\
3242             (*data)[(*size)] = (value);\
3243             (*size)++;\
3244             }
3245             #else /* C gives problems with strict-aliasing rules for (void**) cast */
3246             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
3247             if (!((*size) & ((*size) - 1))) {\
3248             /*double alloc size if it's a power of two*/\
3249             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
3250             : realloc((*data), (*size) * 2 * sizeof(**data));\
3251             }\
3252             (*data)[(*size)] = (value);\
3253             (*size)++;\
3254             }
3255             #endif
3256              
3257              
3258             #endif /* ZOPFLI_UTIL_H_ */
3259              
3260              
3261             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
3262              
3263             /*
3264             Cache used by ZopfliFindLongestMatch to remember previously found length/dist
3265             values.
3266             This is needed because the squeeze runs will ask these values multiple times for
3267             the same position.
3268             Uses large amounts of memory, since it has to remember the distance belonging
3269             to every possible shorter-than-the-best length (the so called "sublen" array).
3270             */
3271             typedef struct ZopfliLongestMatchCache {
3272             unsigned short* length;
3273             unsigned short* dist;
3274             unsigned char* sublen;
3275             } ZopfliLongestMatchCache;
3276              
3277             /* Initializes the ZopfliLongestMatchCache. */
3278             void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc);
3279              
3280             /* Frees up the memory of the ZopfliLongestMatchCache. */
3281             void ZopfliCleanCache(ZopfliLongestMatchCache* lmc);
3282              
3283             /* Stores sublen array in the cache. */
3284             void ZopfliSublenToCache(const unsigned short* sublen,
3285             size_t pos, size_t length,
3286             ZopfliLongestMatchCache* lmc);
3287              
3288             /* Extracts sublen array from the cache. */
3289             void ZopfliCacheToSublen(const ZopfliLongestMatchCache* lmc,
3290             size_t pos, size_t length,
3291             unsigned short* sublen);
3292             /* Returns the length up to which could be stored in the cache. */
3293             unsigned ZopfliMaxCachedSublen(const ZopfliLongestMatchCache* lmc,
3294             size_t pos, size_t length);
3295              
3296             #endif /* ZOPFLI_LONGEST_MATCH_CACHE */
3297              
3298             #endif /* ZOPFLI_CACHE_H_ */
3299              
3300              
3301             #include
3302             #include
3303             #include
3304              
3305             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
3306              
3307 8           void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc) {
3308             size_t i;
3309 8           lmc->length = (unsigned short*)malloc(sizeof(unsigned short) * blocksize);
3310 8           lmc->dist = (unsigned short*)malloc(sizeof(unsigned short) * blocksize);
3311             /* Rather large amount of memory. */
3312 8           lmc->sublen = (unsigned char*)malloc((unsigned long) (ZOPFLI_CACHE_LENGTH * 3 * blocksize));
3313 8 50         if(lmc->sublen == NULL) {
3314 0           fprintf(stderr,
3315             "Error: Out of memory. Tried allocating %lu bytes of memory.\n",
3316 0           (unsigned long) (ZOPFLI_CACHE_LENGTH * 3 * blocksize));
3317 0           exit (EXIT_FAILURE);
3318             }
3319              
3320             /* length > 0 and dist 0 is invalid combination, which indicates on purpose
3321             that this cache value is not filled in yet. */
3322 18368 100         for (i = 0; i < blocksize; i++) lmc->length[i] = 1;
3323 18368 100         for (i = 0; i < blocksize; i++) lmc->dist[i] = 0;
3324 440648 100         for (i = 0; i < ZOPFLI_CACHE_LENGTH * blocksize * 3; i++) lmc->sublen[i] = 0;
3325 8           }
3326              
3327 8           void ZopfliCleanCache(ZopfliLongestMatchCache* lmc) {
3328 8           free(lmc->length);
3329 8           free(lmc->dist);
3330 8           free(lmc->sublen);
3331 8           }
3332              
3333 17468           void ZopfliSublenToCache(const unsigned short* sublen,
3334             size_t pos, size_t length,
3335             ZopfliLongestMatchCache* lmc) {
3336             size_t i;
3337 17468           size_t j = 0;
3338 17468           unsigned bestlength = 0;
3339             unsigned char* cache;
3340              
3341             #if ZOPFLI_CACHE_LENGTH == 0
3342             return;
3343             #endif
3344              
3345 17468           cache = &lmc->sublen[ZOPFLI_CACHE_LENGTH * pos * 3];
3346 17468 50         if (length < 3) return;
3347 4489276 100         for (i = 3; i <= length; i++) {
3348 4471808 100         if (i == length || sublen[i] != sublen[i + 1]) {
    50          
3349 17468           cache[j * 3] = i - 3;
3350 17468           cache[j * 3 + 1] = sublen[i] % 256;
3351 17468           cache[j * 3 + 2] = (sublen[i] >> 8) % 256;
3352 17468           bestlength = i;
3353 17468           j++;
3354 17468 50         if (j >= ZOPFLI_CACHE_LENGTH) break;
3355             }
3356             }
3357 17468 50         if (j < ZOPFLI_CACHE_LENGTH) {
3358             assert(bestlength == length);
3359 17468           cache[(ZOPFLI_CACHE_LENGTH - 1) * 3] = bestlength - 3;
3360             } else {
3361             assert(bestlength <= length);
3362             }
3363             assert(bestlength == ZopfliMaxCachedSublen(lmc, pos, length));
3364             }
3365              
3366 122310           void ZopfliCacheToSublen(const ZopfliLongestMatchCache* lmc,
3367             size_t pos, size_t length,
3368             unsigned short* sublen) {
3369             size_t i, j;
3370 122310           unsigned maxlength = ZopfliMaxCachedSublen(lmc, pos, length);
3371 122310           unsigned prevlength = 0;
3372             unsigned char* cache;
3373             #if ZOPFLI_CACHE_LENGTH == 0
3374             return;
3375             #endif
3376 122310 50         if (length < 3) return;
3377 122310           cache = &lmc->sublen[ZOPFLI_CACHE_LENGTH * pos * 3];
3378 122310 50         for (j = 0; j < ZOPFLI_CACHE_LENGTH; j++) {
3379 122310           unsigned length = cache[j * 3] + 3;
3380 122310           unsigned dist = cache[j * 3 + 1] + 256 * cache[j * 3 + 2];
3381 31800600 100         for (i = prevlength; i <= length; i++) {
3382 31678290           sublen[i] = dist;
3383             }
3384 122310 50         if (length == maxlength) break;
3385 0           prevlength = length + 1;
3386             }
3387             }
3388              
3389             /*
3390             Returns the length up to which could be stored in the cache.
3391             */
3392 244620           unsigned ZopfliMaxCachedSublen(const ZopfliLongestMatchCache* lmc,
3393             size_t pos, size_t length) {
3394             unsigned char* cache;
3395             #if ZOPFLI_CACHE_LENGTH == 0
3396             return 0;
3397             #endif
3398 244620           cache = &lmc->sublen[ZOPFLI_CACHE_LENGTH * pos * 3];
3399             (void)length;
3400 244620 50         if (cache[1] == 0 && cache[2] == 0) return 0; /* No sublen cached. */
    0          
3401 244620           return cache[(ZOPFLI_CACHE_LENGTH - 1) * 3] + 3;
3402             }
3403              
3404             #endif /* ZOPFLI_LONGEST_MATCH_CACHE */
3405             /*
3406             Copyright 2011 Google Inc. All Rights Reserved.
3407              
3408             Licensed under the Apache License, Version 2.0 (the "License");
3409             you may not use this file except in compliance with the License.
3410             You may obtain a copy of the License at
3411              
3412             http://www.apache.org/licenses/LICENSE-2.0
3413              
3414             Unless required by applicable law or agreed to in writing, software
3415             distributed under the License is distributed on an "AS IS" BASIS,
3416             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3417             See the License for the specific language governing permissions and
3418             limitations under the License.
3419              
3420             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
3421             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
3422             */
3423              
3424             /* deflate.h */
3425             /*
3426             Copyright 2011 Google Inc. All Rights Reserved.
3427              
3428             Licensed under the Apache License, Version 2.0 (the "License");
3429             you may not use this file except in compliance with the License.
3430             You may obtain a copy of the License at
3431              
3432             http://www.apache.org/licenses/LICENSE-2.0
3433              
3434             Unless required by applicable law or agreed to in writing, software
3435             distributed under the License is distributed on an "AS IS" BASIS,
3436             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3437             See the License for the specific language governing permissions and
3438             limitations under the License.
3439              
3440             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
3441             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
3442             */
3443              
3444             #ifndef ZOPFLI_DEFLATE_H_
3445             #define ZOPFLI_DEFLATE_H_
3446              
3447             /*
3448             Functions to compress according to the DEFLATE specification, using the
3449             "squeeze" LZ77 compression backend.
3450             */
3451              
3452             /* lz77.h */
3453             /*
3454             Copyright 2011 Google Inc. All Rights Reserved.
3455              
3456             Licensed under the Apache License, Version 2.0 (the "License");
3457             you may not use this file except in compliance with the License.
3458             You may obtain a copy of the License at
3459              
3460             http://www.apache.org/licenses/LICENSE-2.0
3461              
3462             Unless required by applicable law or agreed to in writing, software
3463             distributed under the License is distributed on an "AS IS" BASIS,
3464             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3465             See the License for the specific language governing permissions and
3466             limitations under the License.
3467              
3468             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
3469             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
3470             */
3471              
3472             /*
3473             Functions for basic LZ77 compression and utilities for the "squeeze" LZ77
3474             compression.
3475             */
3476              
3477             #ifndef ZOPFLI_LZ77_H_
3478             #define ZOPFLI_LZ77_H_
3479              
3480             #include
3481              
3482             /* cache.h */
3483             /*
3484             Copyright 2011 Google Inc. All Rights Reserved.
3485              
3486             Licensed under the Apache License, Version 2.0 (the "License");
3487             you may not use this file except in compliance with the License.
3488             You may obtain a copy of the License at
3489              
3490             http://www.apache.org/licenses/LICENSE-2.0
3491              
3492             Unless required by applicable law or agreed to in writing, software
3493             distributed under the License is distributed on an "AS IS" BASIS,
3494             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3495             See the License for the specific language governing permissions and
3496             limitations under the License.
3497              
3498             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
3499             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
3500             */
3501              
3502             /*
3503             The cache that speeds up ZopfliFindLongestMatch of lz77.c.
3504             */
3505              
3506             #ifndef ZOPFLI_CACHE_H_
3507             #define ZOPFLI_CACHE_H_
3508              
3509             /* util.h */
3510             /*
3511             Copyright 2011 Google Inc. All Rights Reserved.
3512              
3513             Licensed under the Apache License, Version 2.0 (the "License");
3514             you may not use this file except in compliance with the License.
3515             You may obtain a copy of the License at
3516              
3517             http://www.apache.org/licenses/LICENSE-2.0
3518              
3519             Unless required by applicable law or agreed to in writing, software
3520             distributed under the License is distributed on an "AS IS" BASIS,
3521             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3522             See the License for the specific language governing permissions and
3523             limitations under the License.
3524              
3525             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
3526             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
3527             */
3528              
3529             /*
3530             Several utilities, including: #defines to try different compression results,
3531             basic deflate specification values and generic program options.
3532             */
3533              
3534             #ifndef ZOPFLI_UTIL_H_
3535             #define ZOPFLI_UTIL_H_
3536              
3537             #include
3538             #include
3539              
3540             /* Minimum and maximum length that can be encoded in deflate. */
3541             #define ZOPFLI_MAX_MATCH 258
3542             #define ZOPFLI_MIN_MATCH 3
3543              
3544             /* Number of distinct literal/length and distance symbols in DEFLATE */
3545             #define ZOPFLI_NUM_LL 288
3546             #define ZOPFLI_NUM_D 32
3547              
3548             /*
3549             The window size for deflate. Must be a power of two. This should be 32768, the
3550             maximum possible by the deflate spec. Anything less hurts compression more than
3551             speed.
3552             */
3553             #define ZOPFLI_WINDOW_SIZE 32768
3554              
3555             /*
3556             The window mask used to wrap indices into the window. This is why the
3557             window size must be a power of two.
3558             */
3559             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
3560              
3561             /*
3562             A block structure of huge, non-smart, blocks to divide the input into, to allow
3563             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
3564             The whole compression algorithm, including the smarter block splitting, will
3565             be executed independently on each huge block.
3566             Dividing into huge blocks hurts compression, but not much relative to the size.
3567             Set it to 0 to disable master blocks.
3568             */
3569             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
3570              
3571             /*
3572             Used to initialize costs for example
3573             */
3574             #define ZOPFLI_LARGE_FLOAT 1e30
3575              
3576             /*
3577             For longest match cache. max 256. Uses huge amounts of memory but makes it
3578             faster. Uses this many times three bytes per single byte of the input data.
3579             This is so because longest match finding has to find the exact distance
3580             that belongs to each length for the best lz77 strategy.
3581             Good values: e.g. 5, 8.
3582             */
3583             #define ZOPFLI_CACHE_LENGTH 8
3584              
3585             /*
3586             limit the max hash chain hits for this hash value. This has an effect only
3587             on files where the hash value is the same very often. On these files, this
3588             gives worse compression (the value should ideally be 32768, which is the
3589             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
3590             faster on some specific files.
3591             Good value: e.g. 8192.
3592             */
3593             #define ZOPFLI_MAX_CHAIN_HITS 8192
3594              
3595             /*
3596             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
3597             consumes a lot of memory but speeds it up. No effect on compression size.
3598             */
3599             #define ZOPFLI_LONGEST_MATCH_CACHE
3600              
3601             /*
3602             Enable to remember amount of successive identical bytes in the hash chain for
3603             finding longest match
3604             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
3605             This has no effect on the compression result, and enabling it increases speed.
3606             */
3607             #define ZOPFLI_HASH_SAME
3608              
3609             /*
3610             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
3611             best length so far is long enough. This is way faster for files with lots of
3612             identical bytes, on which the compressor is otherwise too slow. Regular files
3613             are unaffected or maybe a tiny bit slower.
3614             This has no effect on the compression result, only on speed.
3615             */
3616             #define ZOPFLI_HASH_SAME_HASH
3617              
3618             /*
3619             Enable this, to avoid slowness for files which are a repetition of the same
3620             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
3621             the compression result.
3622             */
3623             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
3624              
3625             /*
3626             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
3627             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
3628             varies from file to file.
3629             */
3630             #define ZOPFLI_LAZY_MATCHING
3631              
3632             /*
3633             Appends value to dynamically allocated memory, doubling its allocation size
3634             whenever needed.
3635              
3636             value: the value to append, type T
3637             data: pointer to the dynamic array to append to, type T**
3638             size: pointer to the size of the array to append to, type size_t*. This is the
3639             size that you consider the array to be, not the internal allocation size.
3640             Precondition: allocated size of data is at least a power of two greater than or
3641             equal than *size.
3642             */
3643             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
3644             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
3645             if (!((*size) & ((*size) - 1))) {\
3646             /*double alloc size if it's a power of two*/\
3647             void** data_void = reinterpret_cast(data);\
3648             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
3649             : realloc((*data), (*size) * 2 * sizeof(**data));\
3650             }\
3651             (*data)[(*size)] = (value);\
3652             (*size)++;\
3653             }
3654             #else /* C gives problems with strict-aliasing rules for (void**) cast */
3655             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
3656             if (!((*size) & ((*size) - 1))) {\
3657             /*double alloc size if it's a power of two*/\
3658             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
3659             : realloc((*data), (*size) * 2 * sizeof(**data));\
3660             }\
3661             (*data)[(*size)] = (value);\
3662             (*size)++;\
3663             }
3664             #endif
3665              
3666              
3667             #endif /* ZOPFLI_UTIL_H_ */
3668              
3669              
3670             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
3671              
3672             /*
3673             Cache used by ZopfliFindLongestMatch to remember previously found length/dist
3674             values.
3675             This is needed because the squeeze runs will ask these values multiple times for
3676             the same position.
3677             Uses large amounts of memory, since it has to remember the distance belonging
3678             to every possible shorter-than-the-best length (the so called "sublen" array).
3679             */
3680             typedef struct ZopfliLongestMatchCache {
3681             unsigned short* length;
3682             unsigned short* dist;
3683             unsigned char* sublen;
3684             } ZopfliLongestMatchCache;
3685              
3686             /* Initializes the ZopfliLongestMatchCache. */
3687             void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc);
3688              
3689             /* Frees up the memory of the ZopfliLongestMatchCache. */
3690             void ZopfliCleanCache(ZopfliLongestMatchCache* lmc);
3691              
3692             /* Stores sublen array in the cache. */
3693             void ZopfliSublenToCache(const unsigned short* sublen,
3694             size_t pos, size_t length,
3695             ZopfliLongestMatchCache* lmc);
3696              
3697             /* Extracts sublen array from the cache. */
3698             void ZopfliCacheToSublen(const ZopfliLongestMatchCache* lmc,
3699             size_t pos, size_t length,
3700             unsigned short* sublen);
3701             /* Returns the length up to which could be stored in the cache. */
3702             unsigned ZopfliMaxCachedSublen(const ZopfliLongestMatchCache* lmc,
3703             size_t pos, size_t length);
3704              
3705             #endif /* ZOPFLI_LONGEST_MATCH_CACHE */
3706              
3707             #endif /* ZOPFLI_CACHE_H_ */
3708              
3709             /* hash.h */
3710             /*
3711             Copyright 2011 Google Inc. All Rights Reserved.
3712              
3713             Licensed under the Apache License, Version 2.0 (the "License");
3714             you may not use this file except in compliance with the License.
3715             You may obtain a copy of the License at
3716              
3717             http://www.apache.org/licenses/LICENSE-2.0
3718              
3719             Unless required by applicable law or agreed to in writing, software
3720             distributed under the License is distributed on an "AS IS" BASIS,
3721             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3722             See the License for the specific language governing permissions and
3723             limitations under the License.
3724              
3725             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
3726             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
3727             */
3728              
3729             /*
3730             The hash for ZopfliFindLongestMatch of lz77.c.
3731             */
3732              
3733             #ifndef ZOPFLI_HASH_H_
3734             #define ZOPFLI_HASH_H_
3735              
3736             /* util.h */
3737             /*
3738             Copyright 2011 Google Inc. All Rights Reserved.
3739              
3740             Licensed under the Apache License, Version 2.0 (the "License");
3741             you may not use this file except in compliance with the License.
3742             You may obtain a copy of the License at
3743              
3744             http://www.apache.org/licenses/LICENSE-2.0
3745              
3746             Unless required by applicable law or agreed to in writing, software
3747             distributed under the License is distributed on an "AS IS" BASIS,
3748             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3749             See the License for the specific language governing permissions and
3750             limitations under the License.
3751              
3752             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
3753             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
3754             */
3755              
3756             /*
3757             Several utilities, including: #defines to try different compression results,
3758             basic deflate specification values and generic program options.
3759             */
3760              
3761             #ifndef ZOPFLI_UTIL_H_
3762             #define ZOPFLI_UTIL_H_
3763              
3764             #include
3765             #include
3766              
3767             /* Minimum and maximum length that can be encoded in deflate. */
3768             #define ZOPFLI_MAX_MATCH 258
3769             #define ZOPFLI_MIN_MATCH 3
3770              
3771             /* Number of distinct literal/length and distance symbols in DEFLATE */
3772             #define ZOPFLI_NUM_LL 288
3773             #define ZOPFLI_NUM_D 32
3774              
3775             /*
3776             The window size for deflate. Must be a power of two. This should be 32768, the
3777             maximum possible by the deflate spec. Anything less hurts compression more than
3778             speed.
3779             */
3780             #define ZOPFLI_WINDOW_SIZE 32768
3781              
3782             /*
3783             The window mask used to wrap indices into the window. This is why the
3784             window size must be a power of two.
3785             */
3786             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
3787              
3788             /*
3789             A block structure of huge, non-smart, blocks to divide the input into, to allow
3790             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
3791             The whole compression algorithm, including the smarter block splitting, will
3792             be executed independently on each huge block.
3793             Dividing into huge blocks hurts compression, but not much relative to the size.
3794             Set it to 0 to disable master blocks.
3795             */
3796             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
3797              
3798             /*
3799             Used to initialize costs for example
3800             */
3801             #define ZOPFLI_LARGE_FLOAT 1e30
3802              
3803             /*
3804             For longest match cache. max 256. Uses huge amounts of memory but makes it
3805             faster. Uses this many times three bytes per single byte of the input data.
3806             This is so because longest match finding has to find the exact distance
3807             that belongs to each length for the best lz77 strategy.
3808             Good values: e.g. 5, 8.
3809             */
3810             #define ZOPFLI_CACHE_LENGTH 8
3811              
3812             /*
3813             limit the max hash chain hits for this hash value. This has an effect only
3814             on files where the hash value is the same very often. On these files, this
3815             gives worse compression (the value should ideally be 32768, which is the
3816             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
3817             faster on some specific files.
3818             Good value: e.g. 8192.
3819             */
3820             #define ZOPFLI_MAX_CHAIN_HITS 8192
3821              
3822             /*
3823             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
3824             consumes a lot of memory but speeds it up. No effect on compression size.
3825             */
3826             #define ZOPFLI_LONGEST_MATCH_CACHE
3827              
3828             /*
3829             Enable to remember amount of successive identical bytes in the hash chain for
3830             finding longest match
3831             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
3832             This has no effect on the compression result, and enabling it increases speed.
3833             */
3834             #define ZOPFLI_HASH_SAME
3835              
3836             /*
3837             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
3838             best length so far is long enough. This is way faster for files with lots of
3839             identical bytes, on which the compressor is otherwise too slow. Regular files
3840             are unaffected or maybe a tiny bit slower.
3841             This has no effect on the compression result, only on speed.
3842             */
3843             #define ZOPFLI_HASH_SAME_HASH
3844              
3845             /*
3846             Enable this, to avoid slowness for files which are a repetition of the same
3847             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
3848             the compression result.
3849             */
3850             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
3851              
3852             /*
3853             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
3854             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
3855             varies from file to file.
3856             */
3857             #define ZOPFLI_LAZY_MATCHING
3858              
3859             /*
3860             Appends value to dynamically allocated memory, doubling its allocation size
3861             whenever needed.
3862              
3863             value: the value to append, type T
3864             data: pointer to the dynamic array to append to, type T**
3865             size: pointer to the size of the array to append to, type size_t*. This is the
3866             size that you consider the array to be, not the internal allocation size.
3867             Precondition: allocated size of data is at least a power of two greater than or
3868             equal than *size.
3869             */
3870             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
3871             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
3872             if (!((*size) & ((*size) - 1))) {\
3873             /*double alloc size if it's a power of two*/\
3874             void** data_void = reinterpret_cast(data);\
3875             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
3876             : realloc((*data), (*size) * 2 * sizeof(**data));\
3877             }\
3878             (*data)[(*size)] = (value);\
3879             (*size)++;\
3880             }
3881             #else /* C gives problems with strict-aliasing rules for (void**) cast */
3882             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
3883             if (!((*size) & ((*size) - 1))) {\
3884             /*double alloc size if it's a power of two*/\
3885             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
3886             : realloc((*data), (*size) * 2 * sizeof(**data));\
3887             }\
3888             (*data)[(*size)] = (value);\
3889             (*size)++;\
3890             }
3891             #endif
3892              
3893              
3894             #endif /* ZOPFLI_UTIL_H_ */
3895              
3896              
3897             typedef struct ZopfliHash {
3898             int* head; /* Hash value to index of its most recent occurrence. */
3899             unsigned short* prev; /* Index to index of prev. occurrence of same hash. */
3900             int* hashval; /* Index to hash value at this index. */
3901             int val; /* Current hash value. */
3902              
3903             #ifdef ZOPFLI_HASH_SAME_HASH
3904             /* Fields with similar purpose as the above hash, but for the second hash with
3905             a value that is calculated differently. */
3906             int* head2; /* Hash value to index of its most recent occurrence. */
3907             unsigned short* prev2; /* Index to index of prev. occurrence of same hash. */
3908             int* hashval2; /* Index to hash value at this index. */
3909             int val2; /* Current hash value. */
3910             #endif
3911              
3912             #ifdef ZOPFLI_HASH_SAME
3913             unsigned short* same; /* Amount of repetitions of same byte after this .*/
3914             #endif
3915             } ZopfliHash;
3916              
3917             /* Allocates ZopfliHash memory. */
3918             void ZopfliAllocHash(size_t window_size, ZopfliHash* h);
3919              
3920             /* Resets all fields of ZopfliHash. */
3921             void ZopfliResetHash(size_t window_size, ZopfliHash* h);
3922              
3923             /* Frees ZopfliHash memory. */
3924             void ZopfliCleanHash(ZopfliHash* h);
3925              
3926             /*
3927             Updates the hash values based on the current position in the array. All calls
3928             to this must be made for consecutive bytes.
3929             */
3930             void ZopfliUpdateHash(const unsigned char* array, size_t pos, size_t end,
3931             ZopfliHash* h);
3932              
3933             /*
3934             Prepopulates hash:
3935             Fills in the initial values in the hash, before ZopfliUpdateHash can be used
3936             correctly.
3937             */
3938             void ZopfliWarmupHash(const unsigned char* array, size_t pos, size_t end,
3939             ZopfliHash* h);
3940              
3941             #endif /* ZOPFLI_HASH_H_ */
3942              
3943             /* zopfli.h */
3944             /*
3945             Copyright 2011 Google Inc. All Rights Reserved.
3946              
3947             Licensed under the Apache License, Version 2.0 (the "License");
3948             you may not use this file except in compliance with the License.
3949             You may obtain a copy of the License at
3950              
3951             http://www.apache.org/licenses/LICENSE-2.0
3952              
3953             Unless required by applicable law or agreed to in writing, software
3954             distributed under the License is distributed on an "AS IS" BASIS,
3955             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3956             See the License for the specific language governing permissions and
3957             limitations under the License.
3958              
3959             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
3960             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
3961             */
3962              
3963             #ifndef ZOPFLI_ZOPFLI_H_
3964             #define ZOPFLI_ZOPFLI_H_
3965              
3966             #include
3967             #include /* for size_t */
3968              
3969             #ifdef __cplusplus
3970             extern "C" {
3971             #endif
3972              
3973             /*
3974             Options used throughout the program.
3975             */
3976             typedef struct ZopfliOptions {
3977             /* Whether to print output */
3978             int verbose;
3979              
3980             /* Whether to print more detailed output */
3981             int verbose_more;
3982              
3983             /*
3984             Maximum amount of times to rerun forward and backward pass to optimize LZ77
3985             compression cost. Good values: 10, 15 for small files, 5 for files over
3986             several MB in size or it will be too slow.
3987             */
3988             int numiterations;
3989              
3990             /*
3991             If true, splits the data in multiple deflate blocks with optimal choice
3992             for the block boundaries. Block splitting gives better compression. Default:
3993             true (1).
3994             */
3995             int blocksplitting;
3996              
3997             /*
3998             No longer used, left for compatibility.
3999             */
4000             int blocksplittinglast;
4001              
4002             /*
4003             Maximum amount of blocks to split into (0 for unlimited, but this can give
4004             extreme results that hurt compression on some files). Default value: 15.
4005             */
4006             int blocksplittingmax;
4007             } ZopfliOptions;
4008              
4009             /* Initializes options with default values. */
4010             void ZopfliInitOptions(ZopfliOptions* options);
4011              
4012             /* Output format */
4013             typedef enum {
4014             ZOPFLI_FORMAT_GZIP,
4015             ZOPFLI_FORMAT_ZLIB,
4016             ZOPFLI_FORMAT_DEFLATE
4017             } ZopfliFormat;
4018              
4019             /*
4020             Compresses according to the given output format and appends the result to the
4021             output.
4022              
4023             options: global program options
4024             output_type: the output format to use
4025             out: pointer to the dynamic output array to which the result is appended. Must
4026             be freed after use
4027             outsize: pointer to the dynamic output array size
4028             */
4029             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
4030             const unsigned char* in, size_t insize,
4031             unsigned char** out, size_t* outsize);
4032              
4033             #ifdef __cplusplus
4034             } // extern "C"
4035             #endif
4036              
4037             #endif /* ZOPFLI_ZOPFLI_H_ */
4038              
4039              
4040             /*
4041             Stores lit/length and dist pairs for LZ77.
4042             Parameter litlens: Contains the literal symbols or length values.
4043             Parameter dists: Contains the distances. A value is 0 to indicate that there is
4044             no dist and the corresponding litlens value is a literal instead of a length.
4045             Parameter size: The size of both the litlens and dists arrays.
4046             The memory can best be managed by using ZopfliInitLZ77Store to initialize it,
4047             ZopfliCleanLZ77Store to destroy it, and ZopfliStoreLitLenDist to append values.
4048              
4049             */
4050             typedef struct ZopfliLZ77Store {
4051             unsigned short* litlens; /* Lit or len. */
4052             unsigned short* dists; /* If 0: indicates literal in corresponding litlens,
4053             if > 0: length in corresponding litlens, this is the distance. */
4054             size_t size;
4055              
4056             const unsigned char* data; /* original data */
4057             size_t* pos; /* position in data where this LZ77 command begins */
4058              
4059             unsigned short* ll_symbol;
4060             unsigned short* d_symbol;
4061              
4062             /* Cumulative histograms wrapping around per chunk. Each chunk has the amount
4063             of distinct symbols as length, so using 1 value per LZ77 symbol, we have a
4064             precise histogram at every N symbols, and the rest can be calculated by
4065             looping through the actual symbols of this chunk. */
4066             size_t* ll_counts;
4067             size_t* d_counts;
4068             } ZopfliLZ77Store;
4069              
4070             void ZopfliInitLZ77Store(const unsigned char* data, ZopfliLZ77Store* store);
4071             void ZopfliCleanLZ77Store(ZopfliLZ77Store* store);
4072             void ZopfliCopyLZ77Store(const ZopfliLZ77Store* source, ZopfliLZ77Store* dest);
4073             void ZopfliStoreLitLenDist(unsigned short length, unsigned short dist,
4074             size_t pos, ZopfliLZ77Store* store);
4075             void ZopfliAppendLZ77Store(const ZopfliLZ77Store* store,
4076             ZopfliLZ77Store* target);
4077             /* Gets the amount of raw bytes that this range of LZ77 symbols spans. */
4078             size_t ZopfliLZ77GetByteRange(const ZopfliLZ77Store* lz77,
4079             size_t lstart, size_t lend);
4080             /* Gets the histogram of lit/len and dist symbols in the given range, using the
4081             cumulative histograms, so faster than adding one by one for large range. Does
4082             not add the one end symbol of value 256. */
4083             void ZopfliLZ77GetHistogram(const ZopfliLZ77Store* lz77,
4084             size_t lstart, size_t lend,
4085             size_t* ll_counts, size_t* d_counts);
4086              
4087             /*
4088             Some state information for compressing a block.
4089             This is currently a bit under-used (with mainly only the longest match cache),
4090             but is kept for easy future expansion.
4091             */
4092             typedef struct ZopfliBlockState {
4093             const ZopfliOptions* options;
4094              
4095             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
4096             /* Cache for length/distance pairs found so far. */
4097             ZopfliLongestMatchCache* lmc;
4098             #endif
4099              
4100             /* The start (inclusive) and end (not inclusive) of the current block. */
4101             size_t blockstart;
4102             size_t blockend;
4103             } ZopfliBlockState;
4104              
4105             void ZopfliInitBlockState(const ZopfliOptions* options,
4106             size_t blockstart, size_t blockend, int add_lmc,
4107             ZopfliBlockState* s);
4108             void ZopfliCleanBlockState(ZopfliBlockState* s);
4109              
4110             /*
4111             Finds the longest match (length and corresponding distance) for LZ77
4112             compression.
4113             Even when not using "sublen", it can be more efficient to provide an array,
4114             because only then the caching is used.
4115             array: the data
4116             pos: position in the data to find the match for
4117             size: size of the data
4118             limit: limit length to maximum this value (default should be 258). This allows
4119             finding a shorter dist for that length (= less extra bits). Must be
4120             in the range [ZOPFLI_MIN_MATCH, ZOPFLI_MAX_MATCH].
4121             sublen: output array of 259 elements, or null. Has, for each length, the
4122             smallest distance required to reach this length. Only 256 of its 259 values
4123             are used, the first 3 are ignored (the shortest length is 3. It is purely
4124             for convenience that the array is made 3 longer).
4125             */
4126             void ZopfliFindLongestMatch(
4127             ZopfliBlockState *s, const ZopfliHash* h, const unsigned char* array,
4128             size_t pos, size_t size, size_t limit,
4129             unsigned short* sublen, unsigned short* distance, unsigned short* length);
4130              
4131             /*
4132             Verifies if length and dist are indeed valid, only used for assertion.
4133             */
4134             void ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
4135             unsigned short dist, unsigned short length);
4136              
4137             /*
4138             Does LZ77 using an algorithm similar to gzip, with lazy matching, rather than
4139             with the slow but better "squeeze" implementation.
4140             The result is placed in the ZopfliLZ77Store.
4141             If instart is larger than 0, it uses values before instart as starting
4142             dictionary.
4143             */
4144             void ZopfliLZ77Greedy(ZopfliBlockState* s, const unsigned char* in,
4145             size_t instart, size_t inend,
4146             ZopfliLZ77Store* store, ZopfliHash* h);
4147              
4148             #endif /* ZOPFLI_LZ77_H_ */
4149              
4150             /* zopfli.h */
4151             /*
4152             Copyright 2011 Google Inc. All Rights Reserved.
4153              
4154             Licensed under the Apache License, Version 2.0 (the "License");
4155             you may not use this file except in compliance with the License.
4156             You may obtain a copy of the License at
4157              
4158             http://www.apache.org/licenses/LICENSE-2.0
4159              
4160             Unless required by applicable law or agreed to in writing, software
4161             distributed under the License is distributed on an "AS IS" BASIS,
4162             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4163             See the License for the specific language governing permissions and
4164             limitations under the License.
4165              
4166             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
4167             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
4168             */
4169              
4170             #ifndef ZOPFLI_ZOPFLI_H_
4171             #define ZOPFLI_ZOPFLI_H_
4172              
4173             #include
4174             #include /* for size_t */
4175              
4176             #ifdef __cplusplus
4177             extern "C" {
4178             #endif
4179              
4180             /*
4181             Options used throughout the program.
4182             */
4183             typedef struct ZopfliOptions {
4184             /* Whether to print output */
4185             int verbose;
4186              
4187             /* Whether to print more detailed output */
4188             int verbose_more;
4189              
4190             /*
4191             Maximum amount of times to rerun forward and backward pass to optimize LZ77
4192             compression cost. Good values: 10, 15 for small files, 5 for files over
4193             several MB in size or it will be too slow.
4194             */
4195             int numiterations;
4196              
4197             /*
4198             If true, splits the data in multiple deflate blocks with optimal choice
4199             for the block boundaries. Block splitting gives better compression. Default:
4200             true (1).
4201             */
4202             int blocksplitting;
4203              
4204             /*
4205             No longer used, left for compatibility.
4206             */
4207             int blocksplittinglast;
4208              
4209             /*
4210             Maximum amount of blocks to split into (0 for unlimited, but this can give
4211             extreme results that hurt compression on some files). Default value: 15.
4212             */
4213             int blocksplittingmax;
4214             } ZopfliOptions;
4215              
4216             /* Initializes options with default values. */
4217             void ZopfliInitOptions(ZopfliOptions* options);
4218              
4219             /* Output format */
4220             typedef enum {
4221             ZOPFLI_FORMAT_GZIP,
4222             ZOPFLI_FORMAT_ZLIB,
4223             ZOPFLI_FORMAT_DEFLATE
4224             } ZopfliFormat;
4225              
4226             /*
4227             Compresses according to the given output format and appends the result to the
4228             output.
4229              
4230             options: global program options
4231             output_type: the output format to use
4232             out: pointer to the dynamic output array to which the result is appended. Must
4233             be freed after use
4234             outsize: pointer to the dynamic output array size
4235             */
4236             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
4237             const unsigned char* in, size_t insize,
4238             unsigned char** out, size_t* outsize);
4239              
4240             #ifdef __cplusplus
4241             } // extern "C"
4242             #endif
4243              
4244             #endif /* ZOPFLI_ZOPFLI_H_ */
4245              
4246              
4247             #ifdef __cplusplus
4248             extern "C" {
4249             #endif
4250              
4251             /*
4252             Compresses according to the deflate specification and append the compressed
4253             result to the output.
4254             This function will usually output multiple deflate blocks. If final is 1, then
4255             the final bit will be set on the last block.
4256              
4257             options: global program options
4258             btype: the deflate block type. Use 2 for best compression.
4259             -0: non compressed blocks (00)
4260             -1: blocks with fixed tree (01)
4261             -2: blocks with dynamic tree (10)
4262             final: whether this is the last section of the input, sets the final bit to the
4263             last deflate block.
4264             in: the input bytes
4265             insize: number of input bytes
4266             bp: bit pointer for the output array. This must initially be 0, and for
4267             consecutive calls must be reused (it can have values from 0-7). This is
4268             because deflate appends blocks as bit-based data, rather than on byte
4269             boundaries.
4270             out: pointer to the dynamic output array to which the result is appended. Must
4271             be freed after use.
4272             outsize: pointer to the dynamic output array size.
4273             */
4274             void ZopfliDeflate(const ZopfliOptions* options, int btype, int final,
4275             const unsigned char* in, size_t insize,
4276             unsigned char* bp, unsigned char** out, size_t* outsize);
4277              
4278             /*
4279             Like ZopfliDeflate, but allows to specify start and end byte with instart and
4280             inend. Only that part is compressed, but earlier bytes are still used for the
4281             back window.
4282             */
4283             void ZopfliDeflatePart(const ZopfliOptions* options, int btype, int final,
4284             const unsigned char* in, size_t instart, size_t inend,
4285             unsigned char* bp, unsigned char** out,
4286             size_t* outsize);
4287              
4288             /*
4289             Calculates block size in bits.
4290             litlens: lz77 lit/lengths
4291             dists: ll77 distances
4292             lstart: start of block
4293             lend: end of block (not inclusive)
4294             */
4295             double ZopfliCalculateBlockSize(const ZopfliLZ77Store* lz77,
4296             size_t lstart, size_t lend, int btype);
4297              
4298             /*
4299             Calculates block size in bits, automatically using the best btype.
4300             */
4301             double ZopfliCalculateBlockSizeAutoType(const ZopfliLZ77Store* lz77,
4302             size_t lstart, size_t lend);
4303              
4304             #ifdef __cplusplus
4305             } // extern "C"
4306             #endif
4307              
4308             #endif /* ZOPFLI_DEFLATE_H_ */
4309              
4310              
4311             #include
4312             #include
4313             #include
4314              
4315             /* blocksplitter.h */
4316             /*
4317             Copyright 2011 Google Inc. All Rights Reserved.
4318              
4319             Licensed under the Apache License, Version 2.0 (the "License");
4320             you may not use this file except in compliance with the License.
4321             You may obtain a copy of the License at
4322              
4323             http://www.apache.org/licenses/LICENSE-2.0
4324              
4325             Unless required by applicable law or agreed to in writing, software
4326             distributed under the License is distributed on an "AS IS" BASIS,
4327             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4328             See the License for the specific language governing permissions and
4329             limitations under the License.
4330              
4331             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
4332             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
4333             */
4334              
4335             /*
4336             Functions to choose good boundaries for block splitting. Deflate allows encoding
4337             the data in multiple blocks, with a separate Huffman tree for each block. The
4338             Huffman tree itself requires some bytes to encode, so by choosing certain
4339             blocks, you can either hurt, or enhance compression. These functions choose good
4340             ones that enhance it.
4341             */
4342              
4343             #ifndef ZOPFLI_BLOCKSPLITTER_H_
4344             #define ZOPFLI_BLOCKSPLITTER_H_
4345              
4346             #include
4347              
4348             /* lz77.h */
4349             /*
4350             Copyright 2011 Google Inc. All Rights Reserved.
4351              
4352             Licensed under the Apache License, Version 2.0 (the "License");
4353             you may not use this file except in compliance with the License.
4354             You may obtain a copy of the License at
4355              
4356             http://www.apache.org/licenses/LICENSE-2.0
4357              
4358             Unless required by applicable law or agreed to in writing, software
4359             distributed under the License is distributed on an "AS IS" BASIS,
4360             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4361             See the License for the specific language governing permissions and
4362             limitations under the License.
4363              
4364             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
4365             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
4366             */
4367              
4368             /*
4369             Functions for basic LZ77 compression and utilities for the "squeeze" LZ77
4370             compression.
4371             */
4372              
4373             #ifndef ZOPFLI_LZ77_H_
4374             #define ZOPFLI_LZ77_H_
4375              
4376             #include
4377              
4378             /* cache.h */
4379             /*
4380             Copyright 2011 Google Inc. All Rights Reserved.
4381              
4382             Licensed under the Apache License, Version 2.0 (the "License");
4383             you may not use this file except in compliance with the License.
4384             You may obtain a copy of the License at
4385              
4386             http://www.apache.org/licenses/LICENSE-2.0
4387              
4388             Unless required by applicable law or agreed to in writing, software
4389             distributed under the License is distributed on an "AS IS" BASIS,
4390             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4391             See the License for the specific language governing permissions and
4392             limitations under the License.
4393              
4394             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
4395             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
4396             */
4397              
4398             /*
4399             The cache that speeds up ZopfliFindLongestMatch of lz77.c.
4400             */
4401              
4402             #ifndef ZOPFLI_CACHE_H_
4403             #define ZOPFLI_CACHE_H_
4404              
4405             /* util.h */
4406             /*
4407             Copyright 2011 Google Inc. All Rights Reserved.
4408              
4409             Licensed under the Apache License, Version 2.0 (the "License");
4410             you may not use this file except in compliance with the License.
4411             You may obtain a copy of the License at
4412              
4413             http://www.apache.org/licenses/LICENSE-2.0
4414              
4415             Unless required by applicable law or agreed to in writing, software
4416             distributed under the License is distributed on an "AS IS" BASIS,
4417             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4418             See the License for the specific language governing permissions and
4419             limitations under the License.
4420              
4421             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
4422             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
4423             */
4424              
4425             /*
4426             Several utilities, including: #defines to try different compression results,
4427             basic deflate specification values and generic program options.
4428             */
4429              
4430             #ifndef ZOPFLI_UTIL_H_
4431             #define ZOPFLI_UTIL_H_
4432              
4433             #include
4434             #include
4435              
4436             /* Minimum and maximum length that can be encoded in deflate. */
4437             #define ZOPFLI_MAX_MATCH 258
4438             #define ZOPFLI_MIN_MATCH 3
4439              
4440             /* Number of distinct literal/length and distance symbols in DEFLATE */
4441             #define ZOPFLI_NUM_LL 288
4442             #define ZOPFLI_NUM_D 32
4443              
4444             /*
4445             The window size for deflate. Must be a power of two. This should be 32768, the
4446             maximum possible by the deflate spec. Anything less hurts compression more than
4447             speed.
4448             */
4449             #define ZOPFLI_WINDOW_SIZE 32768
4450              
4451             /*
4452             The window mask used to wrap indices into the window. This is why the
4453             window size must be a power of two.
4454             */
4455             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
4456              
4457             /*
4458             A block structure of huge, non-smart, blocks to divide the input into, to allow
4459             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
4460             The whole compression algorithm, including the smarter block splitting, will
4461             be executed independently on each huge block.
4462             Dividing into huge blocks hurts compression, but not much relative to the size.
4463             Set it to 0 to disable master blocks.
4464             */
4465             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
4466              
4467             /*
4468             Used to initialize costs for example
4469             */
4470             #define ZOPFLI_LARGE_FLOAT 1e30
4471              
4472             /*
4473             For longest match cache. max 256. Uses huge amounts of memory but makes it
4474             faster. Uses this many times three bytes per single byte of the input data.
4475             This is so because longest match finding has to find the exact distance
4476             that belongs to each length for the best lz77 strategy.
4477             Good values: e.g. 5, 8.
4478             */
4479             #define ZOPFLI_CACHE_LENGTH 8
4480              
4481             /*
4482             limit the max hash chain hits for this hash value. This has an effect only
4483             on files where the hash value is the same very often. On these files, this
4484             gives worse compression (the value should ideally be 32768, which is the
4485             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
4486             faster on some specific files.
4487             Good value: e.g. 8192.
4488             */
4489             #define ZOPFLI_MAX_CHAIN_HITS 8192
4490              
4491             /*
4492             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
4493             consumes a lot of memory but speeds it up. No effect on compression size.
4494             */
4495             #define ZOPFLI_LONGEST_MATCH_CACHE
4496              
4497             /*
4498             Enable to remember amount of successive identical bytes in the hash chain for
4499             finding longest match
4500             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
4501             This has no effect on the compression result, and enabling it increases speed.
4502             */
4503             #define ZOPFLI_HASH_SAME
4504              
4505             /*
4506             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
4507             best length so far is long enough. This is way faster for files with lots of
4508             identical bytes, on which the compressor is otherwise too slow. Regular files
4509             are unaffected or maybe a tiny bit slower.
4510             This has no effect on the compression result, only on speed.
4511             */
4512             #define ZOPFLI_HASH_SAME_HASH
4513              
4514             /*
4515             Enable this, to avoid slowness for files which are a repetition of the same
4516             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
4517             the compression result.
4518             */
4519             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
4520              
4521             /*
4522             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
4523             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
4524             varies from file to file.
4525             */
4526             #define ZOPFLI_LAZY_MATCHING
4527              
4528             /*
4529             Appends value to dynamically allocated memory, doubling its allocation size
4530             whenever needed.
4531              
4532             value: the value to append, type T
4533             data: pointer to the dynamic array to append to, type T**
4534             size: pointer to the size of the array to append to, type size_t*. This is the
4535             size that you consider the array to be, not the internal allocation size.
4536             Precondition: allocated size of data is at least a power of two greater than or
4537             equal than *size.
4538             */
4539             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
4540             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
4541             if (!((*size) & ((*size) - 1))) {\
4542             /*double alloc size if it's a power of two*/\
4543             void** data_void = reinterpret_cast(data);\
4544             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
4545             : realloc((*data), (*size) * 2 * sizeof(**data));\
4546             }\
4547             (*data)[(*size)] = (value);\
4548             (*size)++;\
4549             }
4550             #else /* C gives problems with strict-aliasing rules for (void**) cast */
4551             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
4552             if (!((*size) & ((*size) - 1))) {\
4553             /*double alloc size if it's a power of two*/\
4554             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
4555             : realloc((*data), (*size) * 2 * sizeof(**data));\
4556             }\
4557             (*data)[(*size)] = (value);\
4558             (*size)++;\
4559             }
4560             #endif
4561              
4562              
4563             #endif /* ZOPFLI_UTIL_H_ */
4564              
4565              
4566             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
4567              
4568             /*
4569             Cache used by ZopfliFindLongestMatch to remember previously found length/dist
4570             values.
4571             This is needed because the squeeze runs will ask these values multiple times for
4572             the same position.
4573             Uses large amounts of memory, since it has to remember the distance belonging
4574             to every possible shorter-than-the-best length (the so called "sublen" array).
4575             */
4576             typedef struct ZopfliLongestMatchCache {
4577             unsigned short* length;
4578             unsigned short* dist;
4579             unsigned char* sublen;
4580             } ZopfliLongestMatchCache;
4581              
4582             /* Initializes the ZopfliLongestMatchCache. */
4583             void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc);
4584              
4585             /* Frees up the memory of the ZopfliLongestMatchCache. */
4586             void ZopfliCleanCache(ZopfliLongestMatchCache* lmc);
4587              
4588             /* Stores sublen array in the cache. */
4589             void ZopfliSublenToCache(const unsigned short* sublen,
4590             size_t pos, size_t length,
4591             ZopfliLongestMatchCache* lmc);
4592              
4593             /* Extracts sublen array from the cache. */
4594             void ZopfliCacheToSublen(const ZopfliLongestMatchCache* lmc,
4595             size_t pos, size_t length,
4596             unsigned short* sublen);
4597             /* Returns the length up to which could be stored in the cache. */
4598             unsigned ZopfliMaxCachedSublen(const ZopfliLongestMatchCache* lmc,
4599             size_t pos, size_t length);
4600              
4601             #endif /* ZOPFLI_LONGEST_MATCH_CACHE */
4602              
4603             #endif /* ZOPFLI_CACHE_H_ */
4604              
4605             /* hash.h */
4606             /*
4607             Copyright 2011 Google Inc. All Rights Reserved.
4608              
4609             Licensed under the Apache License, Version 2.0 (the "License");
4610             you may not use this file except in compliance with the License.
4611             You may obtain a copy of the License at
4612              
4613             http://www.apache.org/licenses/LICENSE-2.0
4614              
4615             Unless required by applicable law or agreed to in writing, software
4616             distributed under the License is distributed on an "AS IS" BASIS,
4617             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4618             See the License for the specific language governing permissions and
4619             limitations under the License.
4620              
4621             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
4622             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
4623             */
4624              
4625             /*
4626             The hash for ZopfliFindLongestMatch of lz77.c.
4627             */
4628              
4629             #ifndef ZOPFLI_HASH_H_
4630             #define ZOPFLI_HASH_H_
4631              
4632             /* util.h */
4633             /*
4634             Copyright 2011 Google Inc. All Rights Reserved.
4635              
4636             Licensed under the Apache License, Version 2.0 (the "License");
4637             you may not use this file except in compliance with the License.
4638             You may obtain a copy of the License at
4639              
4640             http://www.apache.org/licenses/LICENSE-2.0
4641              
4642             Unless required by applicable law or agreed to in writing, software
4643             distributed under the License is distributed on an "AS IS" BASIS,
4644             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4645             See the License for the specific language governing permissions and
4646             limitations under the License.
4647              
4648             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
4649             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
4650             */
4651              
4652             /*
4653             Several utilities, including: #defines to try different compression results,
4654             basic deflate specification values and generic program options.
4655             */
4656              
4657             #ifndef ZOPFLI_UTIL_H_
4658             #define ZOPFLI_UTIL_H_
4659              
4660             #include
4661             #include
4662              
4663             /* Minimum and maximum length that can be encoded in deflate. */
4664             #define ZOPFLI_MAX_MATCH 258
4665             #define ZOPFLI_MIN_MATCH 3
4666              
4667             /* Number of distinct literal/length and distance symbols in DEFLATE */
4668             #define ZOPFLI_NUM_LL 288
4669             #define ZOPFLI_NUM_D 32
4670              
4671             /*
4672             The window size for deflate. Must be a power of two. This should be 32768, the
4673             maximum possible by the deflate spec. Anything less hurts compression more than
4674             speed.
4675             */
4676             #define ZOPFLI_WINDOW_SIZE 32768
4677              
4678             /*
4679             The window mask used to wrap indices into the window. This is why the
4680             window size must be a power of two.
4681             */
4682             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
4683              
4684             /*
4685             A block structure of huge, non-smart, blocks to divide the input into, to allow
4686             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
4687             The whole compression algorithm, including the smarter block splitting, will
4688             be executed independently on each huge block.
4689             Dividing into huge blocks hurts compression, but not much relative to the size.
4690             Set it to 0 to disable master blocks.
4691             */
4692             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
4693              
4694             /*
4695             Used to initialize costs for example
4696             */
4697             #define ZOPFLI_LARGE_FLOAT 1e30
4698              
4699             /*
4700             For longest match cache. max 256. Uses huge amounts of memory but makes it
4701             faster. Uses this many times three bytes per single byte of the input data.
4702             This is so because longest match finding has to find the exact distance
4703             that belongs to each length for the best lz77 strategy.
4704             Good values: e.g. 5, 8.
4705             */
4706             #define ZOPFLI_CACHE_LENGTH 8
4707              
4708             /*
4709             limit the max hash chain hits for this hash value. This has an effect only
4710             on files where the hash value is the same very often. On these files, this
4711             gives worse compression (the value should ideally be 32768, which is the
4712             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
4713             faster on some specific files.
4714             Good value: e.g. 8192.
4715             */
4716             #define ZOPFLI_MAX_CHAIN_HITS 8192
4717              
4718             /*
4719             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
4720             consumes a lot of memory but speeds it up. No effect on compression size.
4721             */
4722             #define ZOPFLI_LONGEST_MATCH_CACHE
4723              
4724             /*
4725             Enable to remember amount of successive identical bytes in the hash chain for
4726             finding longest match
4727             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
4728             This has no effect on the compression result, and enabling it increases speed.
4729             */
4730             #define ZOPFLI_HASH_SAME
4731              
4732             /*
4733             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
4734             best length so far is long enough. This is way faster for files with lots of
4735             identical bytes, on which the compressor is otherwise too slow. Regular files
4736             are unaffected or maybe a tiny bit slower.
4737             This has no effect on the compression result, only on speed.
4738             */
4739             #define ZOPFLI_HASH_SAME_HASH
4740              
4741             /*
4742             Enable this, to avoid slowness for files which are a repetition of the same
4743             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
4744             the compression result.
4745             */
4746             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
4747              
4748             /*
4749             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
4750             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
4751             varies from file to file.
4752             */
4753             #define ZOPFLI_LAZY_MATCHING
4754              
4755             /*
4756             Appends value to dynamically allocated memory, doubling its allocation size
4757             whenever needed.
4758              
4759             value: the value to append, type T
4760             data: pointer to the dynamic array to append to, type T**
4761             size: pointer to the size of the array to append to, type size_t*. This is the
4762             size that you consider the array to be, not the internal allocation size.
4763             Precondition: allocated size of data is at least a power of two greater than or
4764             equal than *size.
4765             */
4766             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
4767             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
4768             if (!((*size) & ((*size) - 1))) {\
4769             /*double alloc size if it's a power of two*/\
4770             void** data_void = reinterpret_cast(data);\
4771             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
4772             : realloc((*data), (*size) * 2 * sizeof(**data));\
4773             }\
4774             (*data)[(*size)] = (value);\
4775             (*size)++;\
4776             }
4777             #else /* C gives problems with strict-aliasing rules for (void**) cast */
4778             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
4779             if (!((*size) & ((*size) - 1))) {\
4780             /*double alloc size if it's a power of two*/\
4781             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
4782             : realloc((*data), (*size) * 2 * sizeof(**data));\
4783             }\
4784             (*data)[(*size)] = (value);\
4785             (*size)++;\
4786             }
4787             #endif
4788              
4789              
4790             #endif /* ZOPFLI_UTIL_H_ */
4791              
4792              
4793             typedef struct ZopfliHash {
4794             int* head; /* Hash value to index of its most recent occurrence. */
4795             unsigned short* prev; /* Index to index of prev. occurrence of same hash. */
4796             int* hashval; /* Index to hash value at this index. */
4797             int val; /* Current hash value. */
4798              
4799             #ifdef ZOPFLI_HASH_SAME_HASH
4800             /* Fields with similar purpose as the above hash, but for the second hash with
4801             a value that is calculated differently. */
4802             int* head2; /* Hash value to index of its most recent occurrence. */
4803             unsigned short* prev2; /* Index to index of prev. occurrence of same hash. */
4804             int* hashval2; /* Index to hash value at this index. */
4805             int val2; /* Current hash value. */
4806             #endif
4807              
4808             #ifdef ZOPFLI_HASH_SAME
4809             unsigned short* same; /* Amount of repetitions of same byte after this .*/
4810             #endif
4811             } ZopfliHash;
4812              
4813             /* Allocates ZopfliHash memory. */
4814             void ZopfliAllocHash(size_t window_size, ZopfliHash* h);
4815              
4816             /* Resets all fields of ZopfliHash. */
4817             void ZopfliResetHash(size_t window_size, ZopfliHash* h);
4818              
4819             /* Frees ZopfliHash memory. */
4820             void ZopfliCleanHash(ZopfliHash* h);
4821              
4822             /*
4823             Updates the hash values based on the current position in the array. All calls
4824             to this must be made for consecutive bytes.
4825             */
4826             void ZopfliUpdateHash(const unsigned char* array, size_t pos, size_t end,
4827             ZopfliHash* h);
4828              
4829             /*
4830             Prepopulates hash:
4831             Fills in the initial values in the hash, before ZopfliUpdateHash can be used
4832             correctly.
4833             */
4834             void ZopfliWarmupHash(const unsigned char* array, size_t pos, size_t end,
4835             ZopfliHash* h);
4836              
4837             #endif /* ZOPFLI_HASH_H_ */
4838              
4839             /* zopfli.h */
4840             /*
4841             Copyright 2011 Google Inc. All Rights Reserved.
4842              
4843             Licensed under the Apache License, Version 2.0 (the "License");
4844             you may not use this file except in compliance with the License.
4845             You may obtain a copy of the License at
4846              
4847             http://www.apache.org/licenses/LICENSE-2.0
4848              
4849             Unless required by applicable law or agreed to in writing, software
4850             distributed under the License is distributed on an "AS IS" BASIS,
4851             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4852             See the License for the specific language governing permissions and
4853             limitations under the License.
4854              
4855             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
4856             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
4857             */
4858              
4859             #ifndef ZOPFLI_ZOPFLI_H_
4860             #define ZOPFLI_ZOPFLI_H_
4861              
4862             #include
4863             #include /* for size_t */
4864              
4865             #ifdef __cplusplus
4866             extern "C" {
4867             #endif
4868              
4869             /*
4870             Options used throughout the program.
4871             */
4872             typedef struct ZopfliOptions {
4873             /* Whether to print output */
4874             int verbose;
4875              
4876             /* Whether to print more detailed output */
4877             int verbose_more;
4878              
4879             /*
4880             Maximum amount of times to rerun forward and backward pass to optimize LZ77
4881             compression cost. Good values: 10, 15 for small files, 5 for files over
4882             several MB in size or it will be too slow.
4883             */
4884             int numiterations;
4885              
4886             /*
4887             If true, splits the data in multiple deflate blocks with optimal choice
4888             for the block boundaries. Block splitting gives better compression. Default:
4889             true (1).
4890             */
4891             int blocksplitting;
4892              
4893             /*
4894             No longer used, left for compatibility.
4895             */
4896             int blocksplittinglast;
4897              
4898             /*
4899             Maximum amount of blocks to split into (0 for unlimited, but this can give
4900             extreme results that hurt compression on some files). Default value: 15.
4901             */
4902             int blocksplittingmax;
4903             } ZopfliOptions;
4904              
4905             /* Initializes options with default values. */
4906             void ZopfliInitOptions(ZopfliOptions* options);
4907              
4908             /* Output format */
4909             typedef enum {
4910             ZOPFLI_FORMAT_GZIP,
4911             ZOPFLI_FORMAT_ZLIB,
4912             ZOPFLI_FORMAT_DEFLATE
4913             } ZopfliFormat;
4914              
4915             /*
4916             Compresses according to the given output format and appends the result to the
4917             output.
4918              
4919             options: global program options
4920             output_type: the output format to use
4921             out: pointer to the dynamic output array to which the result is appended. Must
4922             be freed after use
4923             outsize: pointer to the dynamic output array size
4924             */
4925             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
4926             const unsigned char* in, size_t insize,
4927             unsigned char** out, size_t* outsize);
4928              
4929             #ifdef __cplusplus
4930             } // extern "C"
4931             #endif
4932              
4933             #endif /* ZOPFLI_ZOPFLI_H_ */
4934              
4935              
4936             /*
4937             Stores lit/length and dist pairs for LZ77.
4938             Parameter litlens: Contains the literal symbols or length values.
4939             Parameter dists: Contains the distances. A value is 0 to indicate that there is
4940             no dist and the corresponding litlens value is a literal instead of a length.
4941             Parameter size: The size of both the litlens and dists arrays.
4942             The memory can best be managed by using ZopfliInitLZ77Store to initialize it,
4943             ZopfliCleanLZ77Store to destroy it, and ZopfliStoreLitLenDist to append values.
4944              
4945             */
4946             typedef struct ZopfliLZ77Store {
4947             unsigned short* litlens; /* Lit or len. */
4948             unsigned short* dists; /* If 0: indicates literal in corresponding litlens,
4949             if > 0: length in corresponding litlens, this is the distance. */
4950             size_t size;
4951              
4952             const unsigned char* data; /* original data */
4953             size_t* pos; /* position in data where this LZ77 command begins */
4954              
4955             unsigned short* ll_symbol;
4956             unsigned short* d_symbol;
4957              
4958             /* Cumulative histograms wrapping around per chunk. Each chunk has the amount
4959             of distinct symbols as length, so using 1 value per LZ77 symbol, we have a
4960             precise histogram at every N symbols, and the rest can be calculated by
4961             looping through the actual symbols of this chunk. */
4962             size_t* ll_counts;
4963             size_t* d_counts;
4964             } ZopfliLZ77Store;
4965              
4966             void ZopfliInitLZ77Store(const unsigned char* data, ZopfliLZ77Store* store);
4967             void ZopfliCleanLZ77Store(ZopfliLZ77Store* store);
4968             void ZopfliCopyLZ77Store(const ZopfliLZ77Store* source, ZopfliLZ77Store* dest);
4969             void ZopfliStoreLitLenDist(unsigned short length, unsigned short dist,
4970             size_t pos, ZopfliLZ77Store* store);
4971             void ZopfliAppendLZ77Store(const ZopfliLZ77Store* store,
4972             ZopfliLZ77Store* target);
4973             /* Gets the amount of raw bytes that this range of LZ77 symbols spans. */
4974             size_t ZopfliLZ77GetByteRange(const ZopfliLZ77Store* lz77,
4975             size_t lstart, size_t lend);
4976             /* Gets the histogram of lit/len and dist symbols in the given range, using the
4977             cumulative histograms, so faster than adding one by one for large range. Does
4978             not add the one end symbol of value 256. */
4979             void ZopfliLZ77GetHistogram(const ZopfliLZ77Store* lz77,
4980             size_t lstart, size_t lend,
4981             size_t* ll_counts, size_t* d_counts);
4982              
4983             /*
4984             Some state information for compressing a block.
4985             This is currently a bit under-used (with mainly only the longest match cache),
4986             but is kept for easy future expansion.
4987             */
4988             typedef struct ZopfliBlockState {
4989             const ZopfliOptions* options;
4990              
4991             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
4992             /* Cache for length/distance pairs found so far. */
4993             ZopfliLongestMatchCache* lmc;
4994             #endif
4995              
4996             /* The start (inclusive) and end (not inclusive) of the current block. */
4997             size_t blockstart;
4998             size_t blockend;
4999             } ZopfliBlockState;
5000              
5001             void ZopfliInitBlockState(const ZopfliOptions* options,
5002             size_t blockstart, size_t blockend, int add_lmc,
5003             ZopfliBlockState* s);
5004             void ZopfliCleanBlockState(ZopfliBlockState* s);
5005              
5006             /*
5007             Finds the longest match (length and corresponding distance) for LZ77
5008             compression.
5009             Even when not using "sublen", it can be more efficient to provide an array,
5010             because only then the caching is used.
5011             array: the data
5012             pos: position in the data to find the match for
5013             size: size of the data
5014             limit: limit length to maximum this value (default should be 258). This allows
5015             finding a shorter dist for that length (= less extra bits). Must be
5016             in the range [ZOPFLI_MIN_MATCH, ZOPFLI_MAX_MATCH].
5017             sublen: output array of 259 elements, or null. Has, for each length, the
5018             smallest distance required to reach this length. Only 256 of its 259 values
5019             are used, the first 3 are ignored (the shortest length is 3. It is purely
5020             for convenience that the array is made 3 longer).
5021             */
5022             void ZopfliFindLongestMatch(
5023             ZopfliBlockState *s, const ZopfliHash* h, const unsigned char* array,
5024             size_t pos, size_t size, size_t limit,
5025             unsigned short* sublen, unsigned short* distance, unsigned short* length);
5026              
5027             /*
5028             Verifies if length and dist are indeed valid, only used for assertion.
5029             */
5030             void ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
5031             unsigned short dist, unsigned short length);
5032              
5033             /*
5034             Does LZ77 using an algorithm similar to gzip, with lazy matching, rather than
5035             with the slow but better "squeeze" implementation.
5036             The result is placed in the ZopfliLZ77Store.
5037             If instart is larger than 0, it uses values before instart as starting
5038             dictionary.
5039             */
5040             void ZopfliLZ77Greedy(ZopfliBlockState* s, const unsigned char* in,
5041             size_t instart, size_t inend,
5042             ZopfliLZ77Store* store, ZopfliHash* h);
5043              
5044             #endif /* ZOPFLI_LZ77_H_ */
5045              
5046             /* zopfli.h */
5047             /*
5048             Copyright 2011 Google Inc. All Rights Reserved.
5049              
5050             Licensed under the Apache License, Version 2.0 (the "License");
5051             you may not use this file except in compliance with the License.
5052             You may obtain a copy of the License at
5053              
5054             http://www.apache.org/licenses/LICENSE-2.0
5055              
5056             Unless required by applicable law or agreed to in writing, software
5057             distributed under the License is distributed on an "AS IS" BASIS,
5058             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5059             See the License for the specific language governing permissions and
5060             limitations under the License.
5061              
5062             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
5063             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
5064             */
5065              
5066             #ifndef ZOPFLI_ZOPFLI_H_
5067             #define ZOPFLI_ZOPFLI_H_
5068              
5069             #include
5070             #include /* for size_t */
5071              
5072             #ifdef __cplusplus
5073             extern "C" {
5074             #endif
5075              
5076             /*
5077             Options used throughout the program.
5078             */
5079             typedef struct ZopfliOptions {
5080             /* Whether to print output */
5081             int verbose;
5082              
5083             /* Whether to print more detailed output */
5084             int verbose_more;
5085              
5086             /*
5087             Maximum amount of times to rerun forward and backward pass to optimize LZ77
5088             compression cost. Good values: 10, 15 for small files, 5 for files over
5089             several MB in size or it will be too slow.
5090             */
5091             int numiterations;
5092              
5093             /*
5094             If true, splits the data in multiple deflate blocks with optimal choice
5095             for the block boundaries. Block splitting gives better compression. Default:
5096             true (1).
5097             */
5098             int blocksplitting;
5099              
5100             /*
5101             No longer used, left for compatibility.
5102             */
5103             int blocksplittinglast;
5104              
5105             /*
5106             Maximum amount of blocks to split into (0 for unlimited, but this can give
5107             extreme results that hurt compression on some files). Default value: 15.
5108             */
5109             int blocksplittingmax;
5110             } ZopfliOptions;
5111              
5112             /* Initializes options with default values. */
5113             void ZopfliInitOptions(ZopfliOptions* options);
5114              
5115             /* Output format */
5116             typedef enum {
5117             ZOPFLI_FORMAT_GZIP,
5118             ZOPFLI_FORMAT_ZLIB,
5119             ZOPFLI_FORMAT_DEFLATE
5120             } ZopfliFormat;
5121              
5122             /*
5123             Compresses according to the given output format and appends the result to the
5124             output.
5125              
5126             options: global program options
5127             output_type: the output format to use
5128             out: pointer to the dynamic output array to which the result is appended. Must
5129             be freed after use
5130             outsize: pointer to the dynamic output array size
5131             */
5132             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
5133             const unsigned char* in, size_t insize,
5134             unsigned char** out, size_t* outsize);
5135              
5136             #ifdef __cplusplus
5137             } // extern "C"
5138             #endif
5139              
5140             #endif /* ZOPFLI_ZOPFLI_H_ */
5141              
5142              
5143              
5144             /*
5145             Does blocksplitting on LZ77 data.
5146             The output splitpoints are indices in the LZ77 data.
5147             maxblocks: set a limit to the amount of blocks. Set to 0 to mean no limit.
5148             */
5149             void ZopfliBlockSplitLZ77(const ZopfliOptions* options,
5150             const ZopfliLZ77Store* lz77, size_t maxblocks,
5151             size_t** splitpoints, size_t* npoints);
5152              
5153             /*
5154             Does blocksplitting on uncompressed data.
5155             The output splitpoints are indices in the uncompressed bytes.
5156              
5157             options: general program options.
5158             in: uncompressed input data
5159             instart: where to start splitting
5160             inend: where to end splitting (not inclusive)
5161             maxblocks: maximum amount of blocks to split into, or 0 for no limit
5162             splitpoints: dynamic array to put the resulting split point coordinates into.
5163             The coordinates are indices in the input array.
5164             npoints: pointer to amount of splitpoints, for the dynamic array. The amount of
5165             blocks is the amount of splitpoitns + 1.
5166             */
5167             void ZopfliBlockSplit(const ZopfliOptions* options,
5168             const unsigned char* in, size_t instart, size_t inend,
5169             size_t maxblocks, size_t** splitpoints, size_t* npoints);
5170              
5171             /*
5172             Divides the input into equal blocks, does not even take LZ77 lengths into
5173             account.
5174             */
5175             void ZopfliBlockSplitSimple(const unsigned char* in,
5176             size_t instart, size_t inend,
5177             size_t blocksize,
5178             size_t** splitpoints, size_t* npoints);
5179              
5180             #endif /* ZOPFLI_BLOCKSPLITTER_H_ */
5181              
5182             /* squeeze.h */
5183             /*
5184             Copyright 2011 Google Inc. All Rights Reserved.
5185              
5186             Licensed under the Apache License, Version 2.0 (the "License");
5187             you may not use this file except in compliance with the License.
5188             You may obtain a copy of the License at
5189              
5190             http://www.apache.org/licenses/LICENSE-2.0
5191              
5192             Unless required by applicable law or agreed to in writing, software
5193             distributed under the License is distributed on an "AS IS" BASIS,
5194             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5195             See the License for the specific language governing permissions and
5196             limitations under the License.
5197              
5198             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
5199             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
5200             */
5201              
5202             /*
5203             The squeeze functions do enhanced LZ77 compression by optimal parsing with a
5204             cost model, rather than greedily choosing the longest length or using a single
5205             step of lazy matching like regular implementations.
5206              
5207             Since the cost model is based on the Huffman tree that can only be calculated
5208             after the LZ77 data is generated, there is a chicken and egg problem, and
5209             multiple runs are done with updated cost models to converge to a better
5210             solution.
5211             */
5212              
5213             #ifndef ZOPFLI_SQUEEZE_H_
5214             #define ZOPFLI_SQUEEZE_H_
5215              
5216             /* lz77.h */
5217             /*
5218             Copyright 2011 Google Inc. All Rights Reserved.
5219              
5220             Licensed under the Apache License, Version 2.0 (the "License");
5221             you may not use this file except in compliance with the License.
5222             You may obtain a copy of the License at
5223              
5224             http://www.apache.org/licenses/LICENSE-2.0
5225              
5226             Unless required by applicable law or agreed to in writing, software
5227             distributed under the License is distributed on an "AS IS" BASIS,
5228             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5229             See the License for the specific language governing permissions and
5230             limitations under the License.
5231              
5232             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
5233             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
5234             */
5235              
5236             /*
5237             Functions for basic LZ77 compression and utilities for the "squeeze" LZ77
5238             compression.
5239             */
5240              
5241             #ifndef ZOPFLI_LZ77_H_
5242             #define ZOPFLI_LZ77_H_
5243              
5244             #include
5245              
5246             /* cache.h */
5247             /*
5248             Copyright 2011 Google Inc. All Rights Reserved.
5249              
5250             Licensed under the Apache License, Version 2.0 (the "License");
5251             you may not use this file except in compliance with the License.
5252             You may obtain a copy of the License at
5253              
5254             http://www.apache.org/licenses/LICENSE-2.0
5255              
5256             Unless required by applicable law or agreed to in writing, software
5257             distributed under the License is distributed on an "AS IS" BASIS,
5258             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5259             See the License for the specific language governing permissions and
5260             limitations under the License.
5261              
5262             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
5263             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
5264             */
5265              
5266             /*
5267             The cache that speeds up ZopfliFindLongestMatch of lz77.c.
5268             */
5269              
5270             #ifndef ZOPFLI_CACHE_H_
5271             #define ZOPFLI_CACHE_H_
5272              
5273             /* util.h */
5274             /*
5275             Copyright 2011 Google Inc. All Rights Reserved.
5276              
5277             Licensed under the Apache License, Version 2.0 (the "License");
5278             you may not use this file except in compliance with the License.
5279             You may obtain a copy of the License at
5280              
5281             http://www.apache.org/licenses/LICENSE-2.0
5282              
5283             Unless required by applicable law or agreed to in writing, software
5284             distributed under the License is distributed on an "AS IS" BASIS,
5285             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5286             See the License for the specific language governing permissions and
5287             limitations under the License.
5288              
5289             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
5290             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
5291             */
5292              
5293             /*
5294             Several utilities, including: #defines to try different compression results,
5295             basic deflate specification values and generic program options.
5296             */
5297              
5298             #ifndef ZOPFLI_UTIL_H_
5299             #define ZOPFLI_UTIL_H_
5300              
5301             #include
5302             #include
5303              
5304             /* Minimum and maximum length that can be encoded in deflate. */
5305             #define ZOPFLI_MAX_MATCH 258
5306             #define ZOPFLI_MIN_MATCH 3
5307              
5308             /* Number of distinct literal/length and distance symbols in DEFLATE */
5309             #define ZOPFLI_NUM_LL 288
5310             #define ZOPFLI_NUM_D 32
5311              
5312             /*
5313             The window size for deflate. Must be a power of two. This should be 32768, the
5314             maximum possible by the deflate spec. Anything less hurts compression more than
5315             speed.
5316             */
5317             #define ZOPFLI_WINDOW_SIZE 32768
5318              
5319             /*
5320             The window mask used to wrap indices into the window. This is why the
5321             window size must be a power of two.
5322             */
5323             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
5324              
5325             /*
5326             A block structure of huge, non-smart, blocks to divide the input into, to allow
5327             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
5328             The whole compression algorithm, including the smarter block splitting, will
5329             be executed independently on each huge block.
5330             Dividing into huge blocks hurts compression, but not much relative to the size.
5331             Set it to 0 to disable master blocks.
5332             */
5333             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
5334              
5335             /*
5336             Used to initialize costs for example
5337             */
5338             #define ZOPFLI_LARGE_FLOAT 1e30
5339              
5340             /*
5341             For longest match cache. max 256. Uses huge amounts of memory but makes it
5342             faster. Uses this many times three bytes per single byte of the input data.
5343             This is so because longest match finding has to find the exact distance
5344             that belongs to each length for the best lz77 strategy.
5345             Good values: e.g. 5, 8.
5346             */
5347             #define ZOPFLI_CACHE_LENGTH 8
5348              
5349             /*
5350             limit the max hash chain hits for this hash value. This has an effect only
5351             on files where the hash value is the same very often. On these files, this
5352             gives worse compression (the value should ideally be 32768, which is the
5353             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
5354             faster on some specific files.
5355             Good value: e.g. 8192.
5356             */
5357             #define ZOPFLI_MAX_CHAIN_HITS 8192
5358              
5359             /*
5360             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
5361             consumes a lot of memory but speeds it up. No effect on compression size.
5362             */
5363             #define ZOPFLI_LONGEST_MATCH_CACHE
5364              
5365             /*
5366             Enable to remember amount of successive identical bytes in the hash chain for
5367             finding longest match
5368             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
5369             This has no effect on the compression result, and enabling it increases speed.
5370             */
5371             #define ZOPFLI_HASH_SAME
5372              
5373             /*
5374             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
5375             best length so far is long enough. This is way faster for files with lots of
5376             identical bytes, on which the compressor is otherwise too slow. Regular files
5377             are unaffected or maybe a tiny bit slower.
5378             This has no effect on the compression result, only on speed.
5379             */
5380             #define ZOPFLI_HASH_SAME_HASH
5381              
5382             /*
5383             Enable this, to avoid slowness for files which are a repetition of the same
5384             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
5385             the compression result.
5386             */
5387             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
5388              
5389             /*
5390             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
5391             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
5392             varies from file to file.
5393             */
5394             #define ZOPFLI_LAZY_MATCHING
5395              
5396             /*
5397             Appends value to dynamically allocated memory, doubling its allocation size
5398             whenever needed.
5399              
5400             value: the value to append, type T
5401             data: pointer to the dynamic array to append to, type T**
5402             size: pointer to the size of the array to append to, type size_t*. This is the
5403             size that you consider the array to be, not the internal allocation size.
5404             Precondition: allocated size of data is at least a power of two greater than or
5405             equal than *size.
5406             */
5407             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
5408             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
5409             if (!((*size) & ((*size) - 1))) {\
5410             /*double alloc size if it's a power of two*/\
5411             void** data_void = reinterpret_cast(data);\
5412             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
5413             : realloc((*data), (*size) * 2 * sizeof(**data));\
5414             }\
5415             (*data)[(*size)] = (value);\
5416             (*size)++;\
5417             }
5418             #else /* C gives problems with strict-aliasing rules for (void**) cast */
5419             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
5420             if (!((*size) & ((*size) - 1))) {\
5421             /*double alloc size if it's a power of two*/\
5422             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
5423             : realloc((*data), (*size) * 2 * sizeof(**data));\
5424             }\
5425             (*data)[(*size)] = (value);\
5426             (*size)++;\
5427             }
5428             #endif
5429              
5430              
5431             #endif /* ZOPFLI_UTIL_H_ */
5432              
5433              
5434             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
5435              
5436             /*
5437             Cache used by ZopfliFindLongestMatch to remember previously found length/dist
5438             values.
5439             This is needed because the squeeze runs will ask these values multiple times for
5440             the same position.
5441             Uses large amounts of memory, since it has to remember the distance belonging
5442             to every possible shorter-than-the-best length (the so called "sublen" array).
5443             */
5444             typedef struct ZopfliLongestMatchCache {
5445             unsigned short* length;
5446             unsigned short* dist;
5447             unsigned char* sublen;
5448             } ZopfliLongestMatchCache;
5449              
5450             /* Initializes the ZopfliLongestMatchCache. */
5451             void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc);
5452              
5453             /* Frees up the memory of the ZopfliLongestMatchCache. */
5454             void ZopfliCleanCache(ZopfliLongestMatchCache* lmc);
5455              
5456             /* Stores sublen array in the cache. */
5457             void ZopfliSublenToCache(const unsigned short* sublen,
5458             size_t pos, size_t length,
5459             ZopfliLongestMatchCache* lmc);
5460              
5461             /* Extracts sublen array from the cache. */
5462             void ZopfliCacheToSublen(const ZopfliLongestMatchCache* lmc,
5463             size_t pos, size_t length,
5464             unsigned short* sublen);
5465             /* Returns the length up to which could be stored in the cache. */
5466             unsigned ZopfliMaxCachedSublen(const ZopfliLongestMatchCache* lmc,
5467             size_t pos, size_t length);
5468              
5469             #endif /* ZOPFLI_LONGEST_MATCH_CACHE */
5470              
5471             #endif /* ZOPFLI_CACHE_H_ */
5472              
5473             /* hash.h */
5474             /*
5475             Copyright 2011 Google Inc. All Rights Reserved.
5476              
5477             Licensed under the Apache License, Version 2.0 (the "License");
5478             you may not use this file except in compliance with the License.
5479             You may obtain a copy of the License at
5480              
5481             http://www.apache.org/licenses/LICENSE-2.0
5482              
5483             Unless required by applicable law or agreed to in writing, software
5484             distributed under the License is distributed on an "AS IS" BASIS,
5485             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5486             See the License for the specific language governing permissions and
5487             limitations under the License.
5488              
5489             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
5490             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
5491             */
5492              
5493             /*
5494             The hash for ZopfliFindLongestMatch of lz77.c.
5495             */
5496              
5497             #ifndef ZOPFLI_HASH_H_
5498             #define ZOPFLI_HASH_H_
5499              
5500             /* util.h */
5501             /*
5502             Copyright 2011 Google Inc. All Rights Reserved.
5503              
5504             Licensed under the Apache License, Version 2.0 (the "License");
5505             you may not use this file except in compliance with the License.
5506             You may obtain a copy of the License at
5507              
5508             http://www.apache.org/licenses/LICENSE-2.0
5509              
5510             Unless required by applicable law or agreed to in writing, software
5511             distributed under the License is distributed on an "AS IS" BASIS,
5512             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5513             See the License for the specific language governing permissions and
5514             limitations under the License.
5515              
5516             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
5517             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
5518             */
5519              
5520             /*
5521             Several utilities, including: #defines to try different compression results,
5522             basic deflate specification values and generic program options.
5523             */
5524              
5525             #ifndef ZOPFLI_UTIL_H_
5526             #define ZOPFLI_UTIL_H_
5527              
5528             #include
5529             #include
5530              
5531             /* Minimum and maximum length that can be encoded in deflate. */
5532             #define ZOPFLI_MAX_MATCH 258
5533             #define ZOPFLI_MIN_MATCH 3
5534              
5535             /* Number of distinct literal/length and distance symbols in DEFLATE */
5536             #define ZOPFLI_NUM_LL 288
5537             #define ZOPFLI_NUM_D 32
5538              
5539             /*
5540             The window size for deflate. Must be a power of two. This should be 32768, the
5541             maximum possible by the deflate spec. Anything less hurts compression more than
5542             speed.
5543             */
5544             #define ZOPFLI_WINDOW_SIZE 32768
5545              
5546             /*
5547             The window mask used to wrap indices into the window. This is why the
5548             window size must be a power of two.
5549             */
5550             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
5551              
5552             /*
5553             A block structure of huge, non-smart, blocks to divide the input into, to allow
5554             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
5555             The whole compression algorithm, including the smarter block splitting, will
5556             be executed independently on each huge block.
5557             Dividing into huge blocks hurts compression, but not much relative to the size.
5558             Set it to 0 to disable master blocks.
5559             */
5560             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
5561              
5562             /*
5563             Used to initialize costs for example
5564             */
5565             #define ZOPFLI_LARGE_FLOAT 1e30
5566              
5567             /*
5568             For longest match cache. max 256. Uses huge amounts of memory but makes it
5569             faster. Uses this many times three bytes per single byte of the input data.
5570             This is so because longest match finding has to find the exact distance
5571             that belongs to each length for the best lz77 strategy.
5572             Good values: e.g. 5, 8.
5573             */
5574             #define ZOPFLI_CACHE_LENGTH 8
5575              
5576             /*
5577             limit the max hash chain hits for this hash value. This has an effect only
5578             on files where the hash value is the same very often. On these files, this
5579             gives worse compression (the value should ideally be 32768, which is the
5580             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
5581             faster on some specific files.
5582             Good value: e.g. 8192.
5583             */
5584             #define ZOPFLI_MAX_CHAIN_HITS 8192
5585              
5586             /*
5587             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
5588             consumes a lot of memory but speeds it up. No effect on compression size.
5589             */
5590             #define ZOPFLI_LONGEST_MATCH_CACHE
5591              
5592             /*
5593             Enable to remember amount of successive identical bytes in the hash chain for
5594             finding longest match
5595             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
5596             This has no effect on the compression result, and enabling it increases speed.
5597             */
5598             #define ZOPFLI_HASH_SAME
5599              
5600             /*
5601             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
5602             best length so far is long enough. This is way faster for files with lots of
5603             identical bytes, on which the compressor is otherwise too slow. Regular files
5604             are unaffected or maybe a tiny bit slower.
5605             This has no effect on the compression result, only on speed.
5606             */
5607             #define ZOPFLI_HASH_SAME_HASH
5608              
5609             /*
5610             Enable this, to avoid slowness for files which are a repetition of the same
5611             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
5612             the compression result.
5613             */
5614             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
5615              
5616             /*
5617             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
5618             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
5619             varies from file to file.
5620             */
5621             #define ZOPFLI_LAZY_MATCHING
5622              
5623             /*
5624             Appends value to dynamically allocated memory, doubling its allocation size
5625             whenever needed.
5626              
5627             value: the value to append, type T
5628             data: pointer to the dynamic array to append to, type T**
5629             size: pointer to the size of the array to append to, type size_t*. This is the
5630             size that you consider the array to be, not the internal allocation size.
5631             Precondition: allocated size of data is at least a power of two greater than or
5632             equal than *size.
5633             */
5634             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
5635             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
5636             if (!((*size) & ((*size) - 1))) {\
5637             /*double alloc size if it's a power of two*/\
5638             void** data_void = reinterpret_cast(data);\
5639             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
5640             : realloc((*data), (*size) * 2 * sizeof(**data));\
5641             }\
5642             (*data)[(*size)] = (value);\
5643             (*size)++;\
5644             }
5645             #else /* C gives problems with strict-aliasing rules for (void**) cast */
5646             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
5647             if (!((*size) & ((*size) - 1))) {\
5648             /*double alloc size if it's a power of two*/\
5649             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
5650             : realloc((*data), (*size) * 2 * sizeof(**data));\
5651             }\
5652             (*data)[(*size)] = (value);\
5653             (*size)++;\
5654             }
5655             #endif
5656              
5657              
5658             #endif /* ZOPFLI_UTIL_H_ */
5659              
5660              
5661             typedef struct ZopfliHash {
5662             int* head; /* Hash value to index of its most recent occurrence. */
5663             unsigned short* prev; /* Index to index of prev. occurrence of same hash. */
5664             int* hashval; /* Index to hash value at this index. */
5665             int val; /* Current hash value. */
5666              
5667             #ifdef ZOPFLI_HASH_SAME_HASH
5668             /* Fields with similar purpose as the above hash, but for the second hash with
5669             a value that is calculated differently. */
5670             int* head2; /* Hash value to index of its most recent occurrence. */
5671             unsigned short* prev2; /* Index to index of prev. occurrence of same hash. */
5672             int* hashval2; /* Index to hash value at this index. */
5673             int val2; /* Current hash value. */
5674             #endif
5675              
5676             #ifdef ZOPFLI_HASH_SAME
5677             unsigned short* same; /* Amount of repetitions of same byte after this .*/
5678             #endif
5679             } ZopfliHash;
5680              
5681             /* Allocates ZopfliHash memory. */
5682             void ZopfliAllocHash(size_t window_size, ZopfliHash* h);
5683              
5684             /* Resets all fields of ZopfliHash. */
5685             void ZopfliResetHash(size_t window_size, ZopfliHash* h);
5686              
5687             /* Frees ZopfliHash memory. */
5688             void ZopfliCleanHash(ZopfliHash* h);
5689              
5690             /*
5691             Updates the hash values based on the current position in the array. All calls
5692             to this must be made for consecutive bytes.
5693             */
5694             void ZopfliUpdateHash(const unsigned char* array, size_t pos, size_t end,
5695             ZopfliHash* h);
5696              
5697             /*
5698             Prepopulates hash:
5699             Fills in the initial values in the hash, before ZopfliUpdateHash can be used
5700             correctly.
5701             */
5702             void ZopfliWarmupHash(const unsigned char* array, size_t pos, size_t end,
5703             ZopfliHash* h);
5704              
5705             #endif /* ZOPFLI_HASH_H_ */
5706              
5707             /* zopfli.h */
5708             /*
5709             Copyright 2011 Google Inc. All Rights Reserved.
5710              
5711             Licensed under the Apache License, Version 2.0 (the "License");
5712             you may not use this file except in compliance with the License.
5713             You may obtain a copy of the License at
5714              
5715             http://www.apache.org/licenses/LICENSE-2.0
5716              
5717             Unless required by applicable law or agreed to in writing, software
5718             distributed under the License is distributed on an "AS IS" BASIS,
5719             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5720             See the License for the specific language governing permissions and
5721             limitations under the License.
5722              
5723             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
5724             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
5725             */
5726              
5727             #ifndef ZOPFLI_ZOPFLI_H_
5728             #define ZOPFLI_ZOPFLI_H_
5729              
5730             #include
5731             #include /* for size_t */
5732              
5733             #ifdef __cplusplus
5734             extern "C" {
5735             #endif
5736              
5737             /*
5738             Options used throughout the program.
5739             */
5740             typedef struct ZopfliOptions {
5741             /* Whether to print output */
5742             int verbose;
5743              
5744             /* Whether to print more detailed output */
5745             int verbose_more;
5746              
5747             /*
5748             Maximum amount of times to rerun forward and backward pass to optimize LZ77
5749             compression cost. Good values: 10, 15 for small files, 5 for files over
5750             several MB in size or it will be too slow.
5751             */
5752             int numiterations;
5753              
5754             /*
5755             If true, splits the data in multiple deflate blocks with optimal choice
5756             for the block boundaries. Block splitting gives better compression. Default:
5757             true (1).
5758             */
5759             int blocksplitting;
5760              
5761             /*
5762             No longer used, left for compatibility.
5763             */
5764             int blocksplittinglast;
5765              
5766             /*
5767             Maximum amount of blocks to split into (0 for unlimited, but this can give
5768             extreme results that hurt compression on some files). Default value: 15.
5769             */
5770             int blocksplittingmax;
5771             } ZopfliOptions;
5772              
5773             /* Initializes options with default values. */
5774             void ZopfliInitOptions(ZopfliOptions* options);
5775              
5776             /* Output format */
5777             typedef enum {
5778             ZOPFLI_FORMAT_GZIP,
5779             ZOPFLI_FORMAT_ZLIB,
5780             ZOPFLI_FORMAT_DEFLATE
5781             } ZopfliFormat;
5782              
5783             /*
5784             Compresses according to the given output format and appends the result to the
5785             output.
5786              
5787             options: global program options
5788             output_type: the output format to use
5789             out: pointer to the dynamic output array to which the result is appended. Must
5790             be freed after use
5791             outsize: pointer to the dynamic output array size
5792             */
5793             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
5794             const unsigned char* in, size_t insize,
5795             unsigned char** out, size_t* outsize);
5796              
5797             #ifdef __cplusplus
5798             } // extern "C"
5799             #endif
5800              
5801             #endif /* ZOPFLI_ZOPFLI_H_ */
5802              
5803              
5804             /*
5805             Stores lit/length and dist pairs for LZ77.
5806             Parameter litlens: Contains the literal symbols or length values.
5807             Parameter dists: Contains the distances. A value is 0 to indicate that there is
5808             no dist and the corresponding litlens value is a literal instead of a length.
5809             Parameter size: The size of both the litlens and dists arrays.
5810             The memory can best be managed by using ZopfliInitLZ77Store to initialize it,
5811             ZopfliCleanLZ77Store to destroy it, and ZopfliStoreLitLenDist to append values.
5812              
5813             */
5814             typedef struct ZopfliLZ77Store {
5815             unsigned short* litlens; /* Lit or len. */
5816             unsigned short* dists; /* If 0: indicates literal in corresponding litlens,
5817             if > 0: length in corresponding litlens, this is the distance. */
5818             size_t size;
5819              
5820             const unsigned char* data; /* original data */
5821             size_t* pos; /* position in data where this LZ77 command begins */
5822              
5823             unsigned short* ll_symbol;
5824             unsigned short* d_symbol;
5825              
5826             /* Cumulative histograms wrapping around per chunk. Each chunk has the amount
5827             of distinct symbols as length, so using 1 value per LZ77 symbol, we have a
5828             precise histogram at every N symbols, and the rest can be calculated by
5829             looping through the actual symbols of this chunk. */
5830             size_t* ll_counts;
5831             size_t* d_counts;
5832             } ZopfliLZ77Store;
5833              
5834             void ZopfliInitLZ77Store(const unsigned char* data, ZopfliLZ77Store* store);
5835             void ZopfliCleanLZ77Store(ZopfliLZ77Store* store);
5836             void ZopfliCopyLZ77Store(const ZopfliLZ77Store* source, ZopfliLZ77Store* dest);
5837             void ZopfliStoreLitLenDist(unsigned short length, unsigned short dist,
5838             size_t pos, ZopfliLZ77Store* store);
5839             void ZopfliAppendLZ77Store(const ZopfliLZ77Store* store,
5840             ZopfliLZ77Store* target);
5841             /* Gets the amount of raw bytes that this range of LZ77 symbols spans. */
5842             size_t ZopfliLZ77GetByteRange(const ZopfliLZ77Store* lz77,
5843             size_t lstart, size_t lend);
5844             /* Gets the histogram of lit/len and dist symbols in the given range, using the
5845             cumulative histograms, so faster than adding one by one for large range. Does
5846             not add the one end symbol of value 256. */
5847             void ZopfliLZ77GetHistogram(const ZopfliLZ77Store* lz77,
5848             size_t lstart, size_t lend,
5849             size_t* ll_counts, size_t* d_counts);
5850              
5851             /*
5852             Some state information for compressing a block.
5853             This is currently a bit under-used (with mainly only the longest match cache),
5854             but is kept for easy future expansion.
5855             */
5856             typedef struct ZopfliBlockState {
5857             const ZopfliOptions* options;
5858              
5859             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
5860             /* Cache for length/distance pairs found so far. */
5861             ZopfliLongestMatchCache* lmc;
5862             #endif
5863              
5864             /* The start (inclusive) and end (not inclusive) of the current block. */
5865             size_t blockstart;
5866             size_t blockend;
5867             } ZopfliBlockState;
5868              
5869             void ZopfliInitBlockState(const ZopfliOptions* options,
5870             size_t blockstart, size_t blockend, int add_lmc,
5871             ZopfliBlockState* s);
5872             void ZopfliCleanBlockState(ZopfliBlockState* s);
5873              
5874             /*
5875             Finds the longest match (length and corresponding distance) for LZ77
5876             compression.
5877             Even when not using "sublen", it can be more efficient to provide an array,
5878             because only then the caching is used.
5879             array: the data
5880             pos: position in the data to find the match for
5881             size: size of the data
5882             limit: limit length to maximum this value (default should be 258). This allows
5883             finding a shorter dist for that length (= less extra bits). Must be
5884             in the range [ZOPFLI_MIN_MATCH, ZOPFLI_MAX_MATCH].
5885             sublen: output array of 259 elements, or null. Has, for each length, the
5886             smallest distance required to reach this length. Only 256 of its 259 values
5887             are used, the first 3 are ignored (the shortest length is 3. It is purely
5888             for convenience that the array is made 3 longer).
5889             */
5890             void ZopfliFindLongestMatch(
5891             ZopfliBlockState *s, const ZopfliHash* h, const unsigned char* array,
5892             size_t pos, size_t size, size_t limit,
5893             unsigned short* sublen, unsigned short* distance, unsigned short* length);
5894              
5895             /*
5896             Verifies if length and dist are indeed valid, only used for assertion.
5897             */
5898             void ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
5899             unsigned short dist, unsigned short length);
5900              
5901             /*
5902             Does LZ77 using an algorithm similar to gzip, with lazy matching, rather than
5903             with the slow but better "squeeze" implementation.
5904             The result is placed in the ZopfliLZ77Store.
5905             If instart is larger than 0, it uses values before instart as starting
5906             dictionary.
5907             */
5908             void ZopfliLZ77Greedy(ZopfliBlockState* s, const unsigned char* in,
5909             size_t instart, size_t inend,
5910             ZopfliLZ77Store* store, ZopfliHash* h);
5911              
5912             #endif /* ZOPFLI_LZ77_H_ */
5913              
5914              
5915             /*
5916             Calculates lit/len and dist pairs for given data.
5917             If instart is larger than 0, it uses values before instart as starting
5918             dictionary.
5919             */
5920             void ZopfliLZ77Optimal(ZopfliBlockState *s,
5921             const unsigned char* in, size_t instart, size_t inend,
5922             int numiterations,
5923             ZopfliLZ77Store* store);
5924              
5925             /*
5926             Does the same as ZopfliLZ77Optimal, but optimized for the fixed tree of the
5927             deflate standard.
5928             The fixed tree never gives the best compression. But this gives the best
5929             possible LZ77 encoding possible with the fixed tree.
5930             This does not create or output any fixed tree, only LZ77 data optimized for
5931             using with a fixed tree.
5932             If instart is larger than 0, it uses values before instart as starting
5933             dictionary.
5934             */
5935             void ZopfliLZ77OptimalFixed(ZopfliBlockState *s,
5936             const unsigned char* in,
5937             size_t instart, size_t inend,
5938             ZopfliLZ77Store* store);
5939              
5940             #endif /* ZOPFLI_SQUEEZE_H_ */
5941              
5942             /* symbols.h */
5943             /*
5944             Copyright 2016 Google Inc. All Rights Reserved.
5945              
5946             Licensed under the Apache License, Version 2.0 (the "License");
5947             you may not use this file except in compliance with the License.
5948             You may obtain a copy of the License at
5949              
5950             http://www.apache.org/licenses/LICENSE-2.0
5951              
5952             Unless required by applicable law or agreed to in writing, software
5953             distributed under the License is distributed on an "AS IS" BASIS,
5954             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5955             See the License for the specific language governing permissions and
5956             limitations under the License.
5957              
5958             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
5959             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
5960             */
5961              
5962             /*
5963             Utilities for using the lz77 symbols of the deflate spec.
5964             */
5965              
5966             #ifndef ZOPFLI_SYMBOLS_H_
5967             #define ZOPFLI_SYMBOLS_H_
5968              
5969             /* __has_builtin available in clang */
5970             #ifdef __has_builtin
5971             # if __has_builtin(__builtin_clz)
5972             # define ZOPFLI_HAS_BUILTIN_CLZ
5973             # endif
5974             /* __builtin_clz available beginning with GCC 3.4 */
5975             #elif __GNUC__ * 100 + __GNUC_MINOR__ >= 304
5976             # define ZOPFLI_HAS_BUILTIN_CLZ
5977             #endif
5978              
5979             /* Gets the amount of extra bits for the given dist, cfr. the DEFLATE spec. */
5980 8504032           static int ZopfliGetDistExtraBits(int dist) {
5981             #ifdef ZOPFLI_HAS_BUILTIN_CLZ
5982             if (dist < 5) return 0;
5983             return (31 ^ __builtin_clz(dist - 1)) - 1; /* log2(dist - 1) - 1 */
5984             #else
5985 8504032 100         if (dist < 5) return 0;
5986 8487340 100         else if (dist < 9) return 1;
5987 8487212 100         else if (dist < 17) return 2;
5988 1408 100         else if (dist < 33) return 3;
5989 1280 100         else if (dist < 65) return 4;
5990 1152 100         else if (dist < 129) return 5;
5991 1024 100         else if (dist < 257) return 6;
5992 896 100         else if (dist < 513) return 7;
5993 768 100         else if (dist < 1025) return 8;
5994 640 100         else if (dist < 2049) return 9;
5995 512 100         else if (dist < 4097) return 10;
5996 384 100         else if (dist < 8193) return 11;
5997 256 100         else if (dist < 16385) return 12;
5998 128           else return 13;
5999             #endif
6000             }
6001              
6002             /* Gets value of the extra bits for the given dist, cfr. the DEFLATE spec. */
6003 37           static int ZopfliGetDistExtraBitsValue(int dist) {
6004             #ifdef ZOPFLI_HAS_BUILTIN_CLZ
6005             if (dist < 5) {
6006             return 0;
6007             } else {
6008             int l = 31 ^ __builtin_clz(dist - 1); /* log2(dist - 1) */
6009             return (dist - (1 + (1 << l))) & ((1 << (l - 1)) - 1);
6010             }
6011             #else
6012 37 50         if (dist < 5) return 0;
6013 37 50         else if (dist < 9) return (dist - 5) & 1;
6014 37 50         else if (dist < 17) return (dist - 9) & 3;
6015 0 0         else if (dist < 33) return (dist - 17) & 7;
6016 0 0         else if (dist < 65) return (dist - 33) & 15;
6017 0 0         else if (dist < 129) return (dist - 65) & 31;
6018 0 0         else if (dist < 257) return (dist - 129) & 63;
6019 0 0         else if (dist < 513) return (dist - 257) & 127;
6020 0 0         else if (dist < 1025) return (dist - 513) & 255;
6021 0 0         else if (dist < 2049) return (dist - 1025) & 511;
6022 0 0         else if (dist < 4097) return (dist - 2049) & 1023;
6023 0 0         else if (dist < 8193) return (dist - 4097) & 2047;
6024 0 0         else if (dist < 16385) return (dist - 8193) & 4095;
6025 0           else return (dist - 16385) & 8191;
6026             #endif
6027             }
6028              
6029             /* Gets the symbol for the given dist, cfr. the DEFLATE spec. */
6030 7721071           static int ZopfliGetDistSymbol(int dist) {
6031             #ifdef ZOPFLI_HAS_BUILTIN_CLZ
6032             if (dist < 5) {
6033             return dist - 1;
6034             } else {
6035             int l = (31 ^ __builtin_clz(dist - 1)); /* log2(dist - 1) */
6036             int r = ((dist - 1) >> (l - 1)) & 1;
6037             return l * 2 + r;
6038             }
6039             #else
6040 7721071 100         if (dist < 193) {
6041 7720171 100         if (dist < 13) { /* dist 0..13. */
6042 7719691 100         if (dist < 5) return dist - 1;
6043 7704043 100         else if (dist < 7) return 4;
6044 7703983 100         else if (dist < 9) return 5;
6045 7703923           else return 6;
6046             } else { /* dist 13..193. */
6047 480 100         if (dist < 17) return 7;
6048 420 100         else if (dist < 25) return 8;
6049 360 100         else if (dist < 33) return 9;
6050 300 100         else if (dist < 49) return 10;
6051 240 100         else if (dist < 65) return 11;
6052 180 100         else if (dist < 97) return 12;
6053 120 100         else if (dist < 129) return 13;
6054 60           else return 14;
6055             }
6056             } else {
6057 900 100         if (dist < 2049) { /* dist 193..2049. */
6058 420 100         if (dist < 257) return 15;
6059 360 100         else if (dist < 385) return 16;
6060 300 100         else if (dist < 513) return 17;
6061 240 100         else if (dist < 769) return 18;
6062 180 100         else if (dist < 1025) return 19;
6063 120 100         else if (dist < 1537) return 20;
6064 60           else return 21;
6065             } else { /* dist 2049..32768. */
6066 480 100         if (dist < 3073) return 22;
6067 420 100         else if (dist < 4097) return 23;
6068 360 100         else if (dist < 6145) return 24;
6069 300 100         else if (dist < 8193) return 25;
6070 240 100         else if (dist < 12289) return 26;
6071 180 100         else if (dist < 16385) return 27;
6072 120 100         else if (dist < 24577) return 28;
6073 60           else return 29;
6074             }
6075             }
6076             #endif
6077             }
6078              
6079             /* Gets the amount of extra bits for the given length, cfr. the DEFLATE spec. */
6080 8504032           static int ZopfliGetLengthExtraBits(int l) {
6081             static const int table[259] = {
6082             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
6083             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
6084             3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
6085             3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
6086             4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
6087             4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
6088             4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
6089             4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
6090             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6091             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6092             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6093             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6094             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6095             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6096             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6097             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0
6098             };
6099 8504032           return table[l];
6100             }
6101              
6102             /* Gets value of the extra bits for the given length, cfr. the DEFLATE spec. */
6103 37           static int ZopfliGetLengthExtraBitsValue(int l) {
6104             static const int table[259] = {
6105             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 0,
6106             1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5,
6107             6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6,
6108             7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
6109             13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2,
6110             3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
6111             10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
6112             29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
6113             18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6,
6114             7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
6115             27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
6116             16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 0
6117             };
6118 37           return table[l];
6119             }
6120              
6121             /*
6122             Gets the symbol for the given length, cfr. the DEFLATE spec.
6123             Returns the symbol in the range [257-285] (inclusive)
6124             */
6125 8515617           static int ZopfliGetLengthSymbol(int l) {
6126             static const int table[259] = {
6127             0, 0, 0, 257, 258, 259, 260, 261, 262, 263, 264,
6128             265, 265, 266, 266, 267, 267, 268, 268,
6129             269, 269, 269, 269, 270, 270, 270, 270,
6130             271, 271, 271, 271, 272, 272, 272, 272,
6131             273, 273, 273, 273, 273, 273, 273, 273,
6132             274, 274, 274, 274, 274, 274, 274, 274,
6133             275, 275, 275, 275, 275, 275, 275, 275,
6134             276, 276, 276, 276, 276, 276, 276, 276,
6135             277, 277, 277, 277, 277, 277, 277, 277,
6136             277, 277, 277, 277, 277, 277, 277, 277,
6137             278, 278, 278, 278, 278, 278, 278, 278,
6138             278, 278, 278, 278, 278, 278, 278, 278,
6139             279, 279, 279, 279, 279, 279, 279, 279,
6140             279, 279, 279, 279, 279, 279, 279, 279,
6141             280, 280, 280, 280, 280, 280, 280, 280,
6142             280, 280, 280, 280, 280, 280, 280, 280,
6143             281, 281, 281, 281, 281, 281, 281, 281,
6144             281, 281, 281, 281, 281, 281, 281, 281,
6145             281, 281, 281, 281, 281, 281, 281, 281,
6146             281, 281, 281, 281, 281, 281, 281, 281,
6147             282, 282, 282, 282, 282, 282, 282, 282,
6148             282, 282, 282, 282, 282, 282, 282, 282,
6149             282, 282, 282, 282, 282, 282, 282, 282,
6150             282, 282, 282, 282, 282, 282, 282, 282,
6151             283, 283, 283, 283, 283, 283, 283, 283,
6152             283, 283, 283, 283, 283, 283, 283, 283,
6153             283, 283, 283, 283, 283, 283, 283, 283,
6154             283, 283, 283, 283, 283, 283, 283, 283,
6155             284, 284, 284, 284, 284, 284, 284, 284,
6156             284, 284, 284, 284, 284, 284, 284, 284,
6157             284, 284, 284, 284, 284, 284, 284, 284,
6158             284, 284, 284, 284, 284, 284, 284, 285
6159             };
6160 8515617           return table[l];
6161             }
6162              
6163             /* Gets the amount of extra bits for the given length symbol. */
6164 9587           static int ZopfliGetLengthSymbolExtraBits(int s) {
6165             static const int table[29] = {
6166             0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
6167             3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0
6168             };
6169 9587           return table[s - 257];
6170             }
6171              
6172             /* Gets the amount of extra bits for the given distance symbol. */
6173 9587           static int ZopfliGetDistSymbolExtraBits(int s) {
6174             static const int table[30] = {
6175             0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
6176             9, 9, 10, 10, 11, 11, 12, 12, 13, 13
6177             };
6178 9587           return table[s];
6179             }
6180              
6181             #endif /* ZOPFLI_SYMBOLS_H_ */
6182              
6183             /* tree.h */
6184             /*
6185             Copyright 2011 Google Inc. All Rights Reserved.
6186              
6187             Licensed under the Apache License, Version 2.0 (the "License");
6188             you may not use this file except in compliance with the License.
6189             You may obtain a copy of the License at
6190              
6191             http://www.apache.org/licenses/LICENSE-2.0
6192              
6193             Unless required by applicable law or agreed to in writing, software
6194             distributed under the License is distributed on an "AS IS" BASIS,
6195             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
6196             See the License for the specific language governing permissions and
6197             limitations under the License.
6198              
6199             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
6200             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
6201             */
6202              
6203             /*
6204             Utilities for creating and using Huffman trees.
6205             */
6206              
6207             #ifndef ZOPFLI_TREE_H_
6208             #define ZOPFLI_TREE_H_
6209              
6210             #include
6211              
6212             /*
6213             Calculates the bitlengths for the Huffman tree, based on the counts of each
6214             symbol.
6215             */
6216             void ZopfliCalculateBitLengths(const size_t* count, size_t n, int maxbits,
6217             unsigned *bitlengths);
6218              
6219             /*
6220             Converts a series of Huffman tree bitlengths, to the bit values of the symbols.
6221             */
6222             void ZopfliLengthsToSymbols(const unsigned* lengths, size_t n, unsigned maxbits,
6223             unsigned* symbols);
6224              
6225             /*
6226             Calculates the entropy of each symbol, based on the counts of each symbol. The
6227             result is similar to the result of ZopfliCalculateBitLengths, but with the
6228             actual theoritical bit lengths according to the entropy. Since the resulting
6229             values are fractional, they cannot be used to encode the tree specified by
6230             DEFLATE.
6231             */
6232             void ZopfliCalculateEntropy(const size_t* count, size_t n, double* bitlengths);
6233              
6234             #endif /* ZOPFLI_TREE_H_ */
6235              
6236              
6237             /*
6238             bp = bitpointer, always in range [0, 7].
6239             The outsize is number of necessary bytes to encode the bits.
6240             Given the value of bp and the amount of bytes, the amount of bits represented
6241             is not simply bytesize * 8 + bp because even representing one bit requires a
6242             whole byte. It is: (bp == 0) ? (bytesize * 8) : ((bytesize - 1) * 8 + bp)
6243             */
6244 12           static void AddBit(int bit,
6245             unsigned char* bp, unsigned char** out, size_t* outsize) {
6246 12 100         if (*bp == 0) ZOPFLI_APPEND_DATA(0, out, outsize);
    50          
    0          
6247 12           (*out)[*outsize - 1] |= bit << *bp;
6248 12           *bp = (*bp + 1) & 7;
6249 12           }
6250              
6251 99           static void AddBits(unsigned symbol, unsigned length,
6252             unsigned char* bp, unsigned char** out, size_t* outsize) {
6253             /* TODO(lode): make more efficient (add more bits at once). */
6254             unsigned i;
6255 278 100         for (i = 0; i < length; i++) {
6256 179           unsigned bit = (symbol >> i) & 1;
6257 179 100         if (*bp == 0) ZOPFLI_APPEND_DATA(0, out, outsize);
    100          
    50          
6258 179           (*out)[*outsize - 1] |= bit << *bp;
6259 179           *bp = (*bp + 1) & 7;
6260             }
6261 99           }
6262              
6263             /*
6264             Adds bits, like AddBits, but the order is inverted. The deflate specification
6265             uses both orders in one standard.
6266             */
6267 115           static void AddHuffmanBits(unsigned symbol, unsigned length,
6268             unsigned char* bp, unsigned char** out,
6269             size_t* outsize) {
6270             /* TODO(lode): make more efficient (add more bits at once). */
6271             unsigned i;
6272 471 100         for (i = 0; i < length; i++) {
6273 356           unsigned bit = (symbol >> (length - i - 1)) & 1;
6274 356 100         if (*bp == 0) ZOPFLI_APPEND_DATA(0, out, outsize);
    100          
    50          
6275 356           (*out)[*outsize - 1] |= bit << *bp;
6276 356           *bp = (*bp + 1) & 7;
6277             }
6278 115           }
6279              
6280             /*
6281             Ensures there are at least 2 distance codes to support buggy decoders.
6282             Zlib 1.2.1 and below have a bug where it fails if there isn't at least 1
6283             distance code (with length > 0), even though it's valid according to the
6284             deflate spec to have 0 distance codes. On top of that, some mobile phones
6285             require at least two distance codes. To support these decoders too (but
6286             potentially at the cost of a few bytes), add dummy code lengths of 1.
6287             References to this bug can be found in the changelog of
6288             Zlib 1.2.2 and here: http://www.jonof.id.au/forum/index.php?topic=515.0.
6289              
6290             d_lengths: the 32 lengths of the distance codes.
6291             */
6292 522           static void PatchDistanceCodesForBuggyDecoders(unsigned* d_lengths) {
6293 522           int num_dist_codes = 0; /* Amount of non-zero distance codes */
6294             int i;
6295 16182 100         for (i = 0; i < 30 /* Ignore the two unused codes from the spec */; i++) {
6296 15660 100         if (d_lengths[i]) num_dist_codes++;
6297 15660 50         if (num_dist_codes >= 2) return; /* Two or more codes is fine. */
6298             }
6299              
6300 522 100         if (num_dist_codes == 0) {
6301 88           d_lengths[0] = d_lengths[1] = 1;
6302 434 50         } else if (num_dist_codes == 1) {
6303 434 50         d_lengths[d_lengths[0] ? 1 : 0] = 1;
6304             }
6305             }
6306              
6307             /*
6308             Encodes the Huffman tree and returns how many bits its encoding takes. If out
6309             is a null pointer, only returns the size and runs faster.
6310             */
6311 4185           static size_t EncodeTree(const unsigned* ll_lengths,
6312             const unsigned* d_lengths,
6313             int use_16, int use_17, int use_18,
6314             unsigned char* bp,
6315             unsigned char** out, size_t* outsize) {
6316             unsigned lld_total; /* Total amount of literal, length, distance codes. */
6317             /* Runlength encoded version of lengths of litlen and dist trees. */
6318 4185           unsigned* rle = 0;
6319 4185           unsigned* rle_bits = 0; /* Extra bits for rle values 16, 17 and 18. */
6320 4185           size_t rle_size = 0; /* Size of rle array. */
6321 4185           size_t rle_bits_size = 0; /* Should have same value as rle_size. */
6322 4185           unsigned hlit = 29; /* 286 - 257 */
6323 4185           unsigned hdist = 29; /* 32 - 1, but gzip does not like hdist > 29.*/
6324             unsigned hclen;
6325             unsigned hlit2;
6326             size_t i, j;
6327             size_t clcounts[19];
6328             unsigned clcl[19]; /* Code length code lengths. */
6329             unsigned clsymbols[19];
6330             /* The order in which code length code lengths are encoded as per deflate. */
6331             static const unsigned order[19] = {
6332             16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
6333             };
6334 4185           int size_only = !out;
6335 4185           size_t result_size = 0;
6336              
6337 83700 100         for(i = 0; i < 19; i++) clcounts[i] = 0;
6338              
6339             /* Trim zeros. */
6340 31545 100         while (hlit > 0 && ll_lengths[257 + hlit - 1] == 0) hlit--;
    100          
6341 103960 50         while (hdist > 0 && d_lengths[1 + hdist - 1] == 0) hdist--;
    100          
6342 4185           hlit2 = hlit + 257;
6343              
6344 4185           lld_total = hlit2 + hdist + 1;
6345              
6346 194678 100         for (i = 0; i < lld_total; i++) {
6347             /* This is an encoding of a huffman tree, so now the length is a symbol */
6348 190493 100         unsigned char symbol = i < hlit2 ? ll_lengths[i] : d_lengths[i - hlit2];
6349 190493           unsigned count = 1;
6350 190493 100         if(use_16 || (symbol == 0 && (use_17 || use_18))) {
    100          
    100          
    100          
6351 2058650 100         for (j = i + 1; j < lld_total && symbol ==
    100          
6352 2033111 100         (j < hlit2 ? ll_lengths[j] : d_lengths[j - hlit2]); j++) {
6353 1004832           count++;
6354             }
6355             }
6356 190493           i += count - 1;
6357              
6358             /* Repetitions of zeroes */
6359 190493 100         if (symbol == 0 && count >= 3) {
    100          
6360 13583 100         if (use_18) {
6361 13714 100         while (count >= 11) {
6362 5951           unsigned count2 = count > 138 ? 138 : count;
6363 5951 100         if (!size_only) {
6364 3 100         ZOPFLI_APPEND_DATA(18, &rle, &rle_size);
    100          
6365 3 100         ZOPFLI_APPEND_DATA(count2 - 11, &rle_bits, &rle_bits_size);
    100          
6366             }
6367 5951           clcounts[18]++;
6368 5951           count -= count2;
6369             }
6370             }
6371 13583 100         if (use_17) {
6372 39232 100         while (count >= 3) {
6373 31469           unsigned count2 = count > 10 ? 10 : count;
6374 31469 100         if (!size_only) {
6375 1 50         ZOPFLI_APPEND_DATA(17, &rle, &rle_size);
    50          
6376 1 50         ZOPFLI_APPEND_DATA(count2 - 3, &rle_bits, &rle_bits_size);
    50          
6377             }
6378 31469           clcounts[17]++;
6379 31469           count -= count2;
6380             }
6381             }
6382             }
6383              
6384             /* Repetitions of any symbol */
6385 190493 100         if (use_16 && count >= 4) {
    100          
6386 3176           count--; /* Since the first one is hardcoded. */
6387 3176           clcounts[symbol]++;
6388 3176 50         if (!size_only) {
6389 0 0         ZOPFLI_APPEND_DATA(symbol, &rle, &rle_size);
    0          
6390 0 0         ZOPFLI_APPEND_DATA(0, &rle_bits, &rle_bits_size);
    0          
6391             }
6392 29087 100         while (count >= 3) {
6393 25911           unsigned count2 = count > 6 ? 6 : count;
6394 25911 50         if (!size_only) {
6395 0 0         ZOPFLI_APPEND_DATA(16, &rle, &rle_size);
    0          
6396 0 0         ZOPFLI_APPEND_DATA(count2 - 3, &rle_bits, &rle_bits_size);
    0          
6397             }
6398 25911           clcounts[16]++;
6399 25911           count -= count2;
6400             }
6401             }
6402              
6403             /* No or insufficient repetition */
6404 190493           clcounts[symbol] += count;
6405 376401 100         while (count > 0) {
6406 185908 100         if (!size_only) {
6407 6 100         ZOPFLI_APPEND_DATA(symbol, &rle, &rle_size);
    50          
6408 6 100         ZOPFLI_APPEND_DATA(0, &rle_bits, &rle_bits_size);
    50          
6409             }
6410 185908           count--;
6411             }
6412             }
6413              
6414 4185           ZopfliCalculateBitLengths(clcounts, 19, 7, clcl);
6415 4185 100         if (!size_only) ZopfliLengthsToSymbols(clcl, 19, 7, clsymbols);
6416              
6417 4185           hclen = 15;
6418             /* Trim zeros. */
6419 8370 50         while (hclen > 0 && clcounts[order[hclen + 4 - 1]] == 0) hclen--;
    100          
6420              
6421 4185 100         if (!size_only) {
6422 1           AddBits(hlit, 5, bp, out, outsize);
6423 1           AddBits(hdist, 5, bp, out, outsize);
6424 1           AddBits(hclen, 4, bp, out, outsize);
6425              
6426 19 100         for (i = 0; i < hclen + 4; i++) {
6427 18           AddBits(clcl[order[i]], 3, bp, out, outsize);
6428             }
6429              
6430 11 100         for (i = 0; i < rle_size; i++) {
6431 10           unsigned symbol = clsymbols[rle[i]];
6432 10           AddHuffmanBits(symbol, clcl[rle[i]], bp, out, outsize);
6433             /* Extra bits. */
6434 10 50         if (rle[i] == 16) AddBits(rle_bits[i], 2, bp, out, outsize);
6435 10 100         else if (rle[i] == 17) AddBits(rle_bits[i], 3, bp, out, outsize);
6436 9 100         else if (rle[i] == 18) AddBits(rle_bits[i], 7, bp, out, outsize);
6437             }
6438             }
6439              
6440 4185           result_size += 14; /* hlit, hdist, hclen bits */
6441 4185           result_size += (hclen + 4) * 3; /* clcl bits */
6442 83700 100         for(i = 0; i < 19; i++) {
6443 79515           result_size += clcl[i] * clcounts[i];
6444             }
6445             /* Extra bits. */
6446 4185           result_size += clcounts[16] * 2;
6447 4185           result_size += clcounts[17] * 3;
6448 4185           result_size += clcounts[18] * 7;
6449              
6450             /* Note: in case of "size_only" these are null pointers so no effect. */
6451 4185           free(rle);
6452 4185           free(rle_bits);
6453              
6454 4185           return result_size;
6455             }
6456              
6457 1           static void AddDynamicTree(const unsigned* ll_lengths,
6458             const unsigned* d_lengths,
6459             unsigned char* bp,
6460             unsigned char** out, size_t* outsize) {
6461             int i;
6462 1           int best = 0;
6463 1           size_t bestsize = 0;
6464              
6465 9 100         for(i = 0; i < 8; i++) {
6466 8           size_t size = EncodeTree(ll_lengths, d_lengths,
6467             i & 1, i & 2, i & 4,
6468             0, 0, 0);
6469 8 100         if (bestsize == 0 || size < bestsize) {
    100          
6470 5           bestsize = size;
6471 5           best = i;
6472             }
6473             }
6474              
6475 1           EncodeTree(ll_lengths, d_lengths,
6476             best & 1, best & 2, best & 4,
6477             bp, out, outsize);
6478 1           }
6479              
6480             /*
6481             Gives the exact size of the tree, in bits, as it will be encoded in DEFLATE.
6482             */
6483 522           static size_t CalculateTreeSize(const unsigned* ll_lengths,
6484             const unsigned* d_lengths) {
6485 522           size_t result = 0;
6486             int i;
6487              
6488 4698 100         for(i = 0; i < 8; i++) {
6489 4176           size_t size = EncodeTree(ll_lengths, d_lengths,
6490             i & 1, i & 2, i & 4,
6491             0, 0, 0);
6492 4176 100         if (result == 0 || size < result) result = size;
    100          
6493             }
6494              
6495 522           return result;
6496             }
6497              
6498             /*
6499             Adds all lit/len and dist codes from the lists as huffman symbols. Does not add
6500             end code 256. expected_data_size is the uncompressed block size, used for
6501             assert, but you can set it to 0 to not do the assertion.
6502             */
6503 4           static void AddLZ77Data(const ZopfliLZ77Store* lz77,
6504             size_t lstart, size_t lend,
6505             size_t expected_data_size,
6506             const unsigned* ll_symbols, const unsigned* ll_lengths,
6507             const unsigned* d_symbols, const unsigned* d_lengths,
6508             unsigned char* bp,
6509             unsigned char** out, size_t* outsize) {
6510 4           size_t testlength = 0;
6511             size_t i;
6512              
6513 68 100         for (i = lstart; i < lend; i++) {
6514 64           unsigned dist = lz77->dists[i];
6515 64           unsigned litlen = lz77->litlens[i];
6516 64 100         if (dist == 0) {
6517             assert(litlen < 256);
6518             assert(ll_lengths[litlen] > 0);
6519 27           AddHuffmanBits(ll_symbols[litlen], ll_lengths[litlen], bp, out, outsize);
6520 27           testlength++;
6521             } else {
6522 37           unsigned lls = ZopfliGetLengthSymbol(litlen);
6523 37           unsigned ds = ZopfliGetDistSymbol(dist);
6524             assert(litlen >= 3 && litlen <= 288);
6525             assert(ll_lengths[lls] > 0);
6526             assert(d_lengths[ds] > 0);
6527 37           AddHuffmanBits(ll_symbols[lls], ll_lengths[lls], bp, out, outsize);
6528 37           AddBits(ZopfliGetLengthExtraBitsValue(litlen),
6529 37           ZopfliGetLengthExtraBits(litlen),
6530             bp, out, outsize);
6531 37           AddHuffmanBits(d_symbols[ds], d_lengths[ds], bp, out, outsize);
6532 37           AddBits(ZopfliGetDistExtraBitsValue(dist),
6533 37           ZopfliGetDistExtraBits(dist),
6534             bp, out, outsize);
6535 37           testlength += litlen;
6536             }
6537             }
6538             assert(expected_data_size == 0 || testlength == expected_data_size);
6539 4           }
6540              
6541 207           static void GetFixedTree(unsigned* ll_lengths, unsigned* d_lengths) {
6542             size_t i;
6543 30015 100         for (i = 0; i < 144; i++) ll_lengths[i] = 8;
6544 23391 100         for (i = 144; i < 256; i++) ll_lengths[i] = 9;
6545 5175 100         for (i = 256; i < 280; i++) ll_lengths[i] = 7;
6546 1863 100         for (i = 280; i < 288; i++) ll_lengths[i] = 8;
6547 6831 100         for (i = 0; i < 32; i++) d_lengths[i] = 5;
6548 207           }
6549              
6550             /*
6551             Same as CalculateBlockSymbolSize, but for block size smaller than histogram
6552             size.
6553             */
6554 726           static size_t CalculateBlockSymbolSizeSmall(const unsigned* ll_lengths,
6555             const unsigned* d_lengths,
6556             const ZopfliLZ77Store* lz77,
6557             size_t lstart, size_t lend) {
6558 726           size_t result = 0;
6559             size_t i;
6560 13040 100         for (i = lstart; i < lend; i++) {
6561             assert(i < lz77->size);
6562             assert(lz77->litlens[i] < 259);
6563 12314 100         if (lz77->dists[i] == 0) {
6564 2727           result += ll_lengths[lz77->litlens[i]];
6565             } else {
6566 9587           int ll_symbol = ZopfliGetLengthSymbol(lz77->litlens[i]);
6567 9587           int d_symbol = ZopfliGetDistSymbol(lz77->dists[i]);
6568 9587           result += ll_lengths[ll_symbol];
6569 9587           result += d_lengths[d_symbol];
6570 9587           result += ZopfliGetLengthSymbolExtraBits(ll_symbol);
6571 9587           result += ZopfliGetDistSymbolExtraBits(d_symbol);
6572             }
6573             }
6574 726           result += ll_lengths[256]; /*end symbol*/
6575 726           return result;
6576             }
6577              
6578             /*
6579             Same as CalculateBlockSymbolSize, but with the histogram provided by the caller.
6580             */
6581 522           static size_t CalculateBlockSymbolSizeGivenCounts(const size_t* ll_counts,
6582             const size_t* d_counts,
6583             const unsigned* ll_lengths,
6584             const unsigned* d_lengths,
6585             const ZopfliLZ77Store* lz77,
6586             size_t lstart, size_t lend) {
6587 522           size_t result = 0;
6588             size_t i;
6589 522 50         if (lstart + ZOPFLI_NUM_LL * 3 > lend) {
6590 522           return CalculateBlockSymbolSizeSmall(
6591             ll_lengths, d_lengths, lz77, lstart, lend);
6592             } else {
6593 0 0         for (i = 0; i < 256; i++) {
6594 0           result += ll_lengths[i] * ll_counts[i];
6595             }
6596 0 0         for (i = 257; i < 286; i++) {
6597 0           result += ll_lengths[i] * ll_counts[i];
6598 0           result += ZopfliGetLengthSymbolExtraBits(i) * ll_counts[i];
6599             }
6600 0 0         for (i = 0; i < 30; i++) {
6601 0           result += d_lengths[i] * d_counts[i];
6602 0           result += ZopfliGetDistSymbolExtraBits(i) * d_counts[i];
6603             }
6604 0           result += ll_lengths[256]; /*end symbol*/
6605 0           return result;
6606             }
6607             }
6608              
6609             /*
6610             Calculates size of the part after the header and tree of an LZ77 block, in bits.
6611             */
6612 204           static size_t CalculateBlockSymbolSize(const unsigned* ll_lengths,
6613             const unsigned* d_lengths,
6614             const ZopfliLZ77Store* lz77,
6615             size_t lstart, size_t lend) {
6616 204 50         if (lstart + ZOPFLI_NUM_LL * 3 > lend) {
6617 204           return CalculateBlockSymbolSizeSmall(
6618             ll_lengths, d_lengths, lz77, lstart, lend);
6619             } else {
6620             size_t ll_counts[ZOPFLI_NUM_LL];
6621             size_t d_counts[ZOPFLI_NUM_D];
6622 0           ZopfliLZ77GetHistogram(lz77, lstart, lend, ll_counts, d_counts);
6623 0           return CalculateBlockSymbolSizeGivenCounts(
6624             ll_counts, d_counts, ll_lengths, d_lengths, lz77, lstart, lend);
6625             }
6626             }
6627              
6628 2705           static size_t AbsDiff(size_t x, size_t y) {
6629 2705 100         if (x > y)
6630 790           return x - y;
6631             else
6632 1915           return y - x;
6633             }
6634              
6635             /*
6636             Changes the population counts in a way that the consequent Huffman tree
6637             compression, especially its rle-part, will be more likely to compress this data
6638             more efficiently. length contains the size of the histogram.
6639             */
6640 522           void OptimizeHuffmanForRle(int length, size_t* counts) {
6641             int i, k, stride;
6642             size_t symbol, sum, limit;
6643             int* good_for_rle;
6644              
6645             /* 1) We don't want to touch the trailing zeros. We may break the
6646             rules of the format by adding more data in the distance codes. */
6647 9587 50         for (; length >= 0; --length) {
6648 9587 100         if (length == 0) {
6649 44           return;
6650             }
6651 9543 100         if (counts[length - 1] != 0) {
6652             /* Now counts[0..length - 1] does not have trailing zeros. */
6653 478           break;
6654             }
6655             }
6656             /* 2) Let's mark all population counts that already can be encoded
6657             with an rle code.*/
6658 478           good_for_rle = (int*)malloc((unsigned)length * sizeof(int));
6659 74933 100         for (i = 0; i < length; ++i) good_for_rle[i] = 0;
6660              
6661             /* Let's not spoil any of the existing good rle codes.
6662             Mark any seq of 0's that is longer than 5 as a good_for_rle.
6663             Mark any seq of non-0's that is longer than 7 as a good_for_rle.*/
6664 478           symbol = counts[0];
6665 478           stride = 0;
6666 75411 100         for (i = 0; i < length + 1; ++i) {
6667 74933 100         if (i == length || counts[i] != symbol) {
    100          
6668 2546 100         if ((symbol == 0 && stride >= 5) || (symbol != 0 && stride >= 7)) {
    100          
    100          
    50          
6669 72602 100         for (k = 0; k < stride; ++k) {
6670 71750           good_for_rle[i - k - 1] = 1;
6671             }
6672             }
6673 2546           stride = 1;
6674 4614 100         if (i != length) {
6675 2068           symbol = counts[i];
6676             }
6677             } else {
6678 72387           ++stride;
6679             }
6680             }
6681              
6682             /* 3) Let's replace those population counts that lead to more rle codes. */
6683 478           stride = 0;
6684 478           limit = counts[0];
6685 478           sum = 0;
6686 75411 100         for (i = 0; i < length + 1; ++i) {
6687 74933 100         if (i == length || good_for_rle[i]
    100          
6688             /* Heuristic for selecting the stride ranges to collapse. */
6689 2705 100         || AbsDiff(counts[i], limit) >= 4) {
6690 72576 100         if (stride >= 4 || (stride >= 3 && sum == 0)) {
    100          
    50          
6691             /* The stride must end, collapse what we have, if we have enough (4). */
6692 135           int count = (sum + stride / 2) / stride;
6693 135 100         if (count < 1) count = 1;
6694 135 50         if (sum == 0) {
6695             /* Don't make an all zeros stride to be upgraded to ones. */
6696 0           count = 0;
6697             }
6698 2146 100         for (k = 0; k < stride; ++k) {
6699             /* We don't want to change value at counts[i],
6700             that is already belonging to the next stride. Thus - 1. */
6701 2011           counts[i - k - 1] = count;
6702             }
6703             }
6704 72576           stride = 0;
6705 72576           sum = 0;
6706 72576 100         if (i < length - 3) {
6707             /* All interesting strides have a count of at least 4,
6708             at least when non-zeros. */
6709 70916           limit = (counts[i] + counts[i + 1] +
6710 141832           counts[i + 2] + counts[i + 3] + 2) / 4;
6711 1660 100         } else if (i < length) {
6712 1182           limit = counts[i];
6713             } else {
6714 478           limit = 0;
6715             }
6716             }
6717 74933           ++stride;
6718 74933 100         if (i != length) {
6719 74455           sum += counts[i];
6720             }
6721             }
6722              
6723 478           free(good_for_rle);
6724             }
6725              
6726             /*
6727             Tries out OptimizeHuffmanForRle for this block, if the result is smaller,
6728             uses it, otherwise keeps the original. Returns size of encoded tree and data in
6729             bits, not including the 3-bit block header.
6730             */
6731 261           static double TryOptimizeHuffmanForRle(
6732             const ZopfliLZ77Store* lz77, size_t lstart, size_t lend,
6733             const size_t* ll_counts, const size_t* d_counts,
6734             unsigned* ll_lengths, unsigned* d_lengths) {
6735             size_t ll_counts2[ZOPFLI_NUM_LL];
6736             size_t d_counts2[ZOPFLI_NUM_D];
6737             unsigned ll_lengths2[ZOPFLI_NUM_LL];
6738             unsigned d_lengths2[ZOPFLI_NUM_D];
6739             double treesize;
6740             double datasize;
6741             double treesize2;
6742             double datasize2;
6743              
6744 261           treesize = CalculateTreeSize(ll_lengths, d_lengths);
6745 261           datasize = CalculateBlockSymbolSizeGivenCounts(ll_counts, d_counts,
6746             ll_lengths, d_lengths, lz77, lstart, lend);
6747              
6748 261           memcpy(ll_counts2, ll_counts, sizeof(ll_counts2));
6749 261           memcpy(d_counts2, d_counts, sizeof(d_counts2));
6750 261           OptimizeHuffmanForRle(ZOPFLI_NUM_LL, ll_counts2);
6751 261           OptimizeHuffmanForRle(ZOPFLI_NUM_D, d_counts2);
6752 261           ZopfliCalculateBitLengths(ll_counts2, ZOPFLI_NUM_LL, 15, ll_lengths2);
6753 261           ZopfliCalculateBitLengths(d_counts2, ZOPFLI_NUM_D, 15, d_lengths2);
6754 261           PatchDistanceCodesForBuggyDecoders(d_lengths2);
6755              
6756 261           treesize2 = CalculateTreeSize(ll_lengths2, d_lengths2);
6757 261           datasize2 = CalculateBlockSymbolSizeGivenCounts(ll_counts, d_counts,
6758             ll_lengths2, d_lengths2, lz77, lstart, lend);
6759              
6760 261 100         if (treesize2 + datasize2 < treesize + datasize) {
6761 95           memcpy(ll_lengths, ll_lengths2, sizeof(ll_lengths2));
6762 95           memcpy(d_lengths, d_lengths2, sizeof(d_lengths2));
6763 95           return treesize2 + datasize2;
6764             }
6765 261           return treesize + datasize;
6766             }
6767              
6768             /*
6769             Calculates the bit lengths for the symbols for dynamic blocks. Chooses bit
6770             lengths that give the smallest size of tree encoding + encoding of all the
6771             symbols to have smallest output size. This are not necessarily the ideal Huffman
6772             bit lengths. Returns size of encoded tree and data in bits, not including the
6773             3-bit block header.
6774             */
6775 261           static double GetDynamicLengths(const ZopfliLZ77Store* lz77,
6776             size_t lstart, size_t lend,
6777             unsigned* ll_lengths, unsigned* d_lengths) {
6778             size_t ll_counts[ZOPFLI_NUM_LL];
6779             size_t d_counts[ZOPFLI_NUM_D];
6780              
6781 261           ZopfliLZ77GetHistogram(lz77, lstart, lend, ll_counts, d_counts);
6782 261           ll_counts[256] = 1; /* End symbol. */
6783 261           ZopfliCalculateBitLengths(ll_counts, ZOPFLI_NUM_LL, 15, ll_lengths);
6784 261           ZopfliCalculateBitLengths(d_counts, ZOPFLI_NUM_D, 15, d_lengths);
6785 261           PatchDistanceCodesForBuggyDecoders(d_lengths);
6786 261           return TryOptimizeHuffmanForRle(
6787             lz77, lstart, lend, ll_counts, d_counts, ll_lengths, d_lengths);
6788             }
6789              
6790 664           double ZopfliCalculateBlockSize(const ZopfliLZ77Store* lz77,
6791             size_t lstart, size_t lend, int btype) {
6792             unsigned ll_lengths[ZOPFLI_NUM_LL];
6793             unsigned d_lengths[ZOPFLI_NUM_D];
6794              
6795 664           double result = 3; /* bfinal and btype bits */
6796              
6797 664 100         if (btype == 0) {
6798 200           size_t length = ZopfliLZ77GetByteRange(lz77, lstart, lend);
6799 200           size_t rem = length % 65535;
6800 200 50         size_t blocks = length / 65535 + (rem ? 1 : 0);
6801             /* An uncompressed block must actually be split into multiple blocks if it's
6802             larger than 65535 bytes long. Eeach block header is 5 bytes: 3 bits,
6803             padding, LEN and NLEN (potential less padding for first one ignored). */
6804 200           return blocks * 5 * 8 + length * 8;
6805 464 100         } if (btype == 1) {
6806 204           GetFixedTree(ll_lengths, d_lengths);
6807 204           result += CalculateBlockSymbolSize(
6808             ll_lengths, d_lengths, lz77, lstart, lend);
6809             } else {
6810 260           result += GetDynamicLengths(lz77, lstart, lend, ll_lengths, d_lengths);
6811             }
6812              
6813 664           return result;
6814             }
6815              
6816 196           double ZopfliCalculateBlockSizeAutoType(const ZopfliLZ77Store* lz77,
6817             size_t lstart, size_t lend) {
6818 196           double uncompressedcost = ZopfliCalculateBlockSize(lz77, lstart, lend, 0);
6819             /* Don't do the expensive fixed cost calculation for larger blocks that are
6820             unlikely to use it. */
6821 392           double fixedcost = (lz77->size > 1000) ?
6822 196 50         uncompressedcost : ZopfliCalculateBlockSize(lz77, lstart, lend, 1);
6823 196           double dyncost = ZopfliCalculateBlockSize(lz77, lstart, lend, 2);
6824 196 0         return (uncompressedcost < fixedcost && uncompressedcost < dyncost)
6825             ? uncompressedcost
6826 196 50         : (fixedcost < dyncost ? fixedcost : dyncost);
    100          
6827             }
6828              
6829             /* Since an uncompressed block can be max 65535 in size, it actually adds
6830             multible blocks if needed. */
6831 0           static void AddNonCompressedBlock(const ZopfliOptions* options, int final,
6832             const unsigned char* in, size_t instart,
6833             size_t inend,
6834             unsigned char* bp,
6835             unsigned char** out, size_t* outsize) {
6836 0           size_t pos = instart;
6837             (void)options;
6838             for (;;) {
6839             size_t i;
6840 0           unsigned short blocksize = 65535;
6841             unsigned short nlen;
6842             int currentfinal;
6843              
6844 0 0         if (pos + blocksize > inend) blocksize = inend - pos;
6845 0           currentfinal = pos + blocksize >= inend;
6846              
6847 0           nlen = ~blocksize;
6848              
6849 0 0         AddBit(final && currentfinal, bp, out, outsize);
    0          
6850             /* BTYPE 00 */
6851 0           AddBit(0, bp, out, outsize);
6852 0           AddBit(0, bp, out, outsize);
6853              
6854             /* Any bits of input up to the next byte boundary are ignored. */
6855 0           *bp = 0;
6856              
6857 0 0         ZOPFLI_APPEND_DATA(blocksize % 256, out, outsize);
    0          
6858 0 0         ZOPFLI_APPEND_DATA((blocksize / 256) % 256, out, outsize);
    0          
6859 0 0         ZOPFLI_APPEND_DATA(nlen % 256, out, outsize);
    0          
6860 0 0         ZOPFLI_APPEND_DATA((nlen / 256) % 256, out, outsize);
    0          
6861              
6862 0 0         for (i = 0; i < blocksize; i++) {
6863 0 0         ZOPFLI_APPEND_DATA(in[pos + i], out, outsize);
    0          
6864             }
6865              
6866 0 0         if (currentfinal) break;
6867 0           pos += blocksize;
6868 0           }
6869 0           }
6870              
6871             /*
6872             Adds a deflate block with the given LZ77 data to the output.
6873             options: global program options
6874             btype: the block type, must be 1 or 2
6875             final: whether to set the "final" bit on this block, must be the last block
6876             litlens: literal/length array of the LZ77 data, in the same format as in
6877             ZopfliLZ77Store.
6878             dists: distance array of the LZ77 data, in the same format as in
6879             ZopfliLZ77Store.
6880             lstart: where to start in the LZ77 data
6881             lend: where to end in the LZ77 data (not inclusive)
6882             expected_data_size: the uncompressed block size, used for assert, but you can
6883             set it to 0 to not do the assertion.
6884             bp: output bit pointer
6885             out: dynamic output array to append to
6886             outsize: dynamic output array size
6887             */
6888 4           static void AddLZ77Block(const ZopfliOptions* options, int btype, int final,
6889             const ZopfliLZ77Store* lz77,
6890             size_t lstart, size_t lend,
6891             size_t expected_data_size,
6892             unsigned char* bp,
6893             unsigned char** out, size_t* outsize) {
6894             unsigned ll_lengths[ZOPFLI_NUM_LL];
6895             unsigned d_lengths[ZOPFLI_NUM_D];
6896             unsigned ll_symbols[ZOPFLI_NUM_LL];
6897             unsigned d_symbols[ZOPFLI_NUM_D];
6898 4           size_t detect_block_size = *outsize;
6899             size_t compressed_size;
6900 4           size_t uncompressed_size = 0;
6901             size_t i;
6902 4 50         if (btype == 0) {
6903 0           size_t length = ZopfliLZ77GetByteRange(lz77, lstart, lend);
6904 0 0         size_t pos = lstart == lend ? 0 : lz77->pos[lstart];
6905 0           size_t end = pos + length;
6906 0           AddNonCompressedBlock(options, final,
6907             lz77->data, pos, end, bp, out, outsize);
6908 0           return;
6909             }
6910              
6911 4           AddBit(final, bp, out, outsize);
6912 4           AddBit(btype & 1, bp, out, outsize);
6913 4           AddBit((btype & 2) >> 1, bp, out, outsize);
6914              
6915 4 100         if (btype == 1) {
6916             /* Fixed block. */
6917 3           GetFixedTree(ll_lengths, d_lengths);
6918             } else {
6919             /* Dynamic block. */
6920             unsigned detect_tree_size;
6921             assert(btype == 2);
6922              
6923 1           GetDynamicLengths(lz77, lstart, lend, ll_lengths, d_lengths);
6924              
6925 1           detect_tree_size = *outsize;
6926 1           AddDynamicTree(ll_lengths, d_lengths, bp, out, outsize);
6927 1 50         if (options->verbose) {
6928 0           fprintf(stderr, "treesize: %d\n", (int)(*outsize - detect_tree_size));
6929             }
6930             }
6931              
6932 4           ZopfliLengthsToSymbols(ll_lengths, ZOPFLI_NUM_LL, 15, ll_symbols);
6933 4           ZopfliLengthsToSymbols(d_lengths, ZOPFLI_NUM_D, 15, d_symbols);
6934              
6935 4           detect_block_size = *outsize;
6936 4           AddLZ77Data(lz77, lstart, lend, expected_data_size,
6937             ll_symbols, ll_lengths, d_symbols, d_lengths,
6938             bp, out, outsize);
6939             /* End symbol. */
6940 4           AddHuffmanBits(ll_symbols[256], ll_lengths[256], bp, out, outsize);
6941              
6942 68 100         for (i = lstart; i < lend; i++) {
6943 64 100         uncompressed_size += lz77->dists[i] == 0 ? 1 : lz77->litlens[i];
6944             }
6945 4           compressed_size = *outsize - detect_block_size;
6946 4 50         if (options->verbose) {
6947 4           fprintf(stderr, "compressed block size: %d (%dk) (unc: %d)\n",
6948 0           (int)compressed_size, (int)(compressed_size / 1024),
6949             (int)(uncompressed_size));
6950             }
6951             }
6952              
6953 4           static void AddLZ77BlockAutoType(const ZopfliOptions* options, int final,
6954             const ZopfliLZ77Store* lz77,
6955             size_t lstart, size_t lend,
6956             size_t expected_data_size,
6957             unsigned char* bp,
6958             unsigned char** out, size_t* outsize) {
6959 4           double uncompressedcost = ZopfliCalculateBlockSize(lz77, lstart, lend, 0);
6960 4           double fixedcost = ZopfliCalculateBlockSize(lz77, lstart, lend, 1);
6961 4           double dyncost = ZopfliCalculateBlockSize(lz77, lstart, lend, 2);
6962              
6963             /* Whether to perform the expensive calculation of creating an optimal block
6964             with fixed huffman tree to check if smaller. Only do this for small blocks or
6965             blocks which already are pretty good with fixed huffman tree. */
6966 4 50         int expensivefixed = (lz77->size < 1000) || fixedcost <= dyncost * 1.1;
    0          
6967              
6968             ZopfliLZ77Store fixedstore;
6969 4 50         if (lstart == lend) {
6970             /* Smallest empty block is represented by fixed block */
6971 0           AddBits(final, 1, bp, out, outsize);
6972 0           AddBits(1, 2, bp, out, outsize); /* btype 01 */
6973 0           AddBits(0, 7, bp, out, outsize); /* end symbol has code 0000000 */
6974 0           return;
6975             }
6976 4           ZopfliInitLZ77Store(lz77->data, &fixedstore);
6977 4 50         if (expensivefixed) {
6978             /* Recalculate the LZ77 with ZopfliLZ77OptimalFixed */
6979 4           size_t instart = lz77->pos[lstart];
6980 4           size_t inend = instart + ZopfliLZ77GetByteRange(lz77, lstart, lend);
6981              
6982             ZopfliBlockState s;
6983 4           ZopfliInitBlockState(options, instart, inend, 1, &s);
6984 4           ZopfliLZ77OptimalFixed(&s, lz77->data, instart, inend, &fixedstore);
6985 4           fixedcost = ZopfliCalculateBlockSize(&fixedstore, 0, fixedstore.size, 1);
6986 4           ZopfliCleanBlockState(&s);
6987             }
6988              
6989 4 50         if (uncompressedcost < fixedcost && uncompressedcost < dyncost) {
    0          
6990 0           AddLZ77Block(options, 0, final, lz77, lstart, lend,
6991             expected_data_size, bp, out, outsize);
6992 4 100         } else if (fixedcost < dyncost) {
6993 3 50         if (expensivefixed) {
6994 3           AddLZ77Block(options, 1, final, &fixedstore, 0, fixedstore.size,
6995             expected_data_size, bp, out, outsize);
6996             } else {
6997 3           AddLZ77Block(options, 1, final, lz77, lstart, lend,
6998             expected_data_size, bp, out, outsize);
6999             }
7000             } else {
7001 1           AddLZ77Block(options, 2, final, lz77, lstart, lend,
7002             expected_data_size, bp, out, outsize);
7003             }
7004              
7005 4           ZopfliCleanLZ77Store(&fixedstore);
7006             }
7007              
7008             /*
7009             Deflate a part, to allow ZopfliDeflate() to use multiple master blocks if
7010             needed.
7011             It is possible to call this function multiple times in a row, shifting
7012             instart and inend to next bytes of the data. If instart is larger than 0, then
7013             previous bytes are used as the initial dictionary for LZ77.
7014             This function will usually output multiple deflate blocks. If final is 1, then
7015             the final bit will be set on the last block.
7016             */
7017 3           void ZopfliDeflatePart(const ZopfliOptions* options, int btype, int final,
7018             const unsigned char* in, size_t instart, size_t inend,
7019             unsigned char* bp, unsigned char** out,
7020             size_t* outsize) {
7021             size_t i;
7022             /* byte coordinates rather than lz77 index */
7023 3           size_t* splitpoints_uncompressed = 0;
7024 3           size_t npoints = 0;
7025 3           size_t* splitpoints = 0;
7026 3           double totalcost = 0;
7027             ZopfliLZ77Store lz77;
7028              
7029             /* If btype=2 is specified, it tries all block types. If a lesser btype is
7030             given, then however it forces that one. Neither of the lesser types needs
7031             block splitting as they have no dynamic huffman trees. */
7032 3 50         if (btype == 0) {
7033 0           AddNonCompressedBlock(options, final, in, instart, inend, bp, out, outsize);
7034 0           return;
7035 3 50         } else if (btype == 1) {
7036             ZopfliLZ77Store store;
7037             ZopfliBlockState s;
7038 0           ZopfliInitLZ77Store(in, &store);
7039 0           ZopfliInitBlockState(options, instart, inend, 1, &s);
7040              
7041 0           ZopfliLZ77OptimalFixed(&s, in, instart, inend, &store);
7042 0           AddLZ77Block(options, btype, final, &store, 0, store.size, 0,
7043             bp, out, outsize);
7044              
7045 0           ZopfliCleanBlockState(&s);
7046 0           ZopfliCleanLZ77Store(&store);
7047 0           return;
7048             }
7049              
7050              
7051 3 50         if (options->blocksplitting) {
7052 3           ZopfliBlockSplit(options, in, instart, inend,
7053 3           options->blocksplittingmax,
7054             &splitpoints_uncompressed, &npoints);
7055 3           splitpoints = (size_t*)malloc(sizeof(*splitpoints) * npoints);
7056             }
7057              
7058 3           ZopfliInitLZ77Store(in, &lz77);
7059              
7060 7 100         for (i = 0; i <= npoints; i++) {
7061 4 100         size_t start = i == 0 ? instart : splitpoints_uncompressed[i - 1];
7062 4 100         size_t end = i == npoints ? inend : splitpoints_uncompressed[i];
7063             ZopfliBlockState s;
7064             ZopfliLZ77Store store;
7065 4           ZopfliInitLZ77Store(in, &store);
7066 4           ZopfliInitBlockState(options, start, end, 1, &s);
7067 4           ZopfliLZ77Optimal(&s, in, start, end, options->numiterations, &store);
7068 4           totalcost += ZopfliCalculateBlockSizeAutoType(&store, 0, store.size);
7069              
7070 4           ZopfliAppendLZ77Store(&store, &lz77);
7071 4 100         if (i < npoints) splitpoints[i] = lz77.size;
7072              
7073 4           ZopfliCleanBlockState(&s);
7074 4           ZopfliCleanLZ77Store(&store);
7075             }
7076              
7077             /* Second block splitting attempt */
7078 3 50         if (options->blocksplitting && npoints > 1) {
    50          
7079 0           size_t* splitpoints2 = 0;
7080 0           size_t npoints2 = 0;
7081 0           double totalcost2 = 0;
7082              
7083 0           ZopfliBlockSplitLZ77(options, &lz77,
7084 0           options->blocksplittingmax, &splitpoints2, &npoints2);
7085              
7086 0 0         for (i = 0; i <= npoints2; i++) {
7087 0 0         size_t start = i == 0 ? 0 : splitpoints2[i - 1];
7088 0 0         size_t end = i == npoints2 ? lz77.size : splitpoints2[i];
7089 0           totalcost2 += ZopfliCalculateBlockSizeAutoType(&lz77, start, end);
7090             }
7091              
7092 0 0         if (totalcost2 < totalcost) {
7093 0           free(splitpoints);
7094 0           splitpoints = splitpoints2;
7095 0           npoints = npoints2;
7096             } else {
7097 0           free(splitpoints2);
7098             }
7099             }
7100              
7101 7 100         for (i = 0; i <= npoints; i++) {
7102 4 100         size_t start = i == 0 ? 0 : splitpoints[i - 1];
7103 4 100         size_t end = i == npoints ? lz77.size : splitpoints[i];
7104 4 100         AddLZ77BlockAutoType(options, i == npoints && final,
    50          
7105             &lz77, start, end, 0,
7106             bp, out, outsize);
7107             }
7108              
7109 3           ZopfliCleanLZ77Store(&lz77);
7110 3           free(splitpoints);
7111 3           free(splitpoints_uncompressed);
7112             }
7113              
7114 3           void ZopfliDeflate(const ZopfliOptions* options, int btype, int final,
7115             const unsigned char* in, size_t insize,
7116             unsigned char* bp, unsigned char** out, size_t* outsize) {
7117 3           size_t offset = *outsize;
7118             #if ZOPFLI_MASTER_BLOCK_SIZE == 0
7119             ZopfliDeflatePart(options, btype, final, in, 0, insize, bp, out, outsize);
7120             #else
7121 3           size_t i = 0;
7122             do {
7123 3           int masterfinal = (i + ZOPFLI_MASTER_BLOCK_SIZE >= insize);
7124 3 50         int final2 = final && masterfinal;
    50          
7125 3 50         size_t size = masterfinal ? insize - i : ZOPFLI_MASTER_BLOCK_SIZE;
7126 3           ZopfliDeflatePart(options, btype, final2,
7127             in, i, i + size, bp, out, outsize);
7128 3           i += size;
7129 3 50         } while (i < insize);
7130             #endif
7131 3 50         if (options->verbose) {
7132 0           fprintf(stderr,
7133             "Original Size: %lu, Deflate: %lu, Compression: %f%% Removed\n",
7134 0           (unsigned long)insize, (unsigned long)(*outsize - offset),
7135 0           100.0 * (double)(insize - (*outsize - offset)) / (double)insize);
7136             }
7137 3           }
7138             /*
7139             Copyright 2013 Google Inc. All Rights Reserved.
7140              
7141             Licensed under the Apache License, Version 2.0 (the "License");
7142             you may not use this file except in compliance with the License.
7143             You may obtain a copy of the License at
7144              
7145             http://www.apache.org/licenses/LICENSE-2.0
7146              
7147             Unless required by applicable law or agreed to in writing, software
7148             distributed under the License is distributed on an "AS IS" BASIS,
7149             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7150             See the License for the specific language governing permissions and
7151             limitations under the License.
7152              
7153             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
7154             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
7155             */
7156              
7157             /* gzip_container.h */
7158             /*
7159             Copyright 2013 Google Inc. All Rights Reserved.
7160              
7161             Licensed under the Apache License, Version 2.0 (the "License");
7162             you may not use this file except in compliance with the License.
7163             You may obtain a copy of the License at
7164              
7165             http://www.apache.org/licenses/LICENSE-2.0
7166              
7167             Unless required by applicable law or agreed to in writing, software
7168             distributed under the License is distributed on an "AS IS" BASIS,
7169             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7170             See the License for the specific language governing permissions and
7171             limitations under the License.
7172              
7173             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
7174             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
7175             */
7176              
7177             #ifndef ZOPFLI_GZIP_H_
7178             #define ZOPFLI_GZIP_H_
7179              
7180             /*
7181             Functions to compress according to the Gzip specification.
7182             */
7183              
7184             /* zopfli.h */
7185             /*
7186             Copyright 2011 Google Inc. All Rights Reserved.
7187              
7188             Licensed under the Apache License, Version 2.0 (the "License");
7189             you may not use this file except in compliance with the License.
7190             You may obtain a copy of the License at
7191              
7192             http://www.apache.org/licenses/LICENSE-2.0
7193              
7194             Unless required by applicable law or agreed to in writing, software
7195             distributed under the License is distributed on an "AS IS" BASIS,
7196             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7197             See the License for the specific language governing permissions and
7198             limitations under the License.
7199              
7200             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
7201             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
7202             */
7203              
7204             #ifndef ZOPFLI_ZOPFLI_H_
7205             #define ZOPFLI_ZOPFLI_H_
7206              
7207             #include
7208             #include /* for size_t */
7209              
7210             #ifdef __cplusplus
7211             extern "C" {
7212             #endif
7213              
7214             /*
7215             Options used throughout the program.
7216             */
7217             typedef struct ZopfliOptions {
7218             /* Whether to print output */
7219             int verbose;
7220              
7221             /* Whether to print more detailed output */
7222             int verbose_more;
7223              
7224             /*
7225             Maximum amount of times to rerun forward and backward pass to optimize LZ77
7226             compression cost. Good values: 10, 15 for small files, 5 for files over
7227             several MB in size or it will be too slow.
7228             */
7229             int numiterations;
7230              
7231             /*
7232             If true, splits the data in multiple deflate blocks with optimal choice
7233             for the block boundaries. Block splitting gives better compression. Default:
7234             true (1).
7235             */
7236             int blocksplitting;
7237              
7238             /*
7239             No longer used, left for compatibility.
7240             */
7241             int blocksplittinglast;
7242              
7243             /*
7244             Maximum amount of blocks to split into (0 for unlimited, but this can give
7245             extreme results that hurt compression on some files). Default value: 15.
7246             */
7247             int blocksplittingmax;
7248             } ZopfliOptions;
7249              
7250             /* Initializes options with default values. */
7251             void ZopfliInitOptions(ZopfliOptions* options);
7252              
7253             /* Output format */
7254             typedef enum {
7255             ZOPFLI_FORMAT_GZIP,
7256             ZOPFLI_FORMAT_ZLIB,
7257             ZOPFLI_FORMAT_DEFLATE
7258             } ZopfliFormat;
7259              
7260             /*
7261             Compresses according to the given output format and appends the result to the
7262             output.
7263              
7264             options: global program options
7265             output_type: the output format to use
7266             out: pointer to the dynamic output array to which the result is appended. Must
7267             be freed after use
7268             outsize: pointer to the dynamic output array size
7269             */
7270             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
7271             const unsigned char* in, size_t insize,
7272             unsigned char** out, size_t* outsize);
7273              
7274             #ifdef __cplusplus
7275             } // extern "C"
7276             #endif
7277              
7278             #endif /* ZOPFLI_ZOPFLI_H_ */
7279              
7280              
7281             #ifdef __cplusplus
7282             extern "C" {
7283             #endif
7284              
7285             /*
7286             Compresses according to the gzip specification and append the compressed
7287             result to the output.
7288              
7289             options: global program options
7290             out: pointer to the dynamic output array to which the result is appended. Must
7291             be freed after use.
7292             outsize: pointer to the dynamic output array size.
7293             */
7294             void ZopfliGzipCompress(const ZopfliOptions* options,
7295             const unsigned char* in, size_t insize,
7296             unsigned char** out, size_t* outsize);
7297              
7298             #ifdef __cplusplus
7299             } // extern "C"
7300             #endif
7301              
7302             #endif /* ZOPFLI_GZIP_H_ */
7303              
7304             /* util.h */
7305             /*
7306             Copyright 2011 Google Inc. All Rights Reserved.
7307              
7308             Licensed under the Apache License, Version 2.0 (the "License");
7309             you may not use this file except in compliance with the License.
7310             You may obtain a copy of the License at
7311              
7312             http://www.apache.org/licenses/LICENSE-2.0
7313              
7314             Unless required by applicable law or agreed to in writing, software
7315             distributed under the License is distributed on an "AS IS" BASIS,
7316             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7317             See the License for the specific language governing permissions and
7318             limitations under the License.
7319              
7320             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
7321             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
7322             */
7323              
7324             /*
7325             Several utilities, including: #defines to try different compression results,
7326             basic deflate specification values and generic program options.
7327             */
7328              
7329             #ifndef ZOPFLI_UTIL_H_
7330             #define ZOPFLI_UTIL_H_
7331              
7332             #include
7333             #include
7334              
7335             /* Minimum and maximum length that can be encoded in deflate. */
7336             #define ZOPFLI_MAX_MATCH 258
7337             #define ZOPFLI_MIN_MATCH 3
7338              
7339             /* Number of distinct literal/length and distance symbols in DEFLATE */
7340             #define ZOPFLI_NUM_LL 288
7341             #define ZOPFLI_NUM_D 32
7342              
7343             /*
7344             The window size for deflate. Must be a power of two. This should be 32768, the
7345             maximum possible by the deflate spec. Anything less hurts compression more than
7346             speed.
7347             */
7348             #define ZOPFLI_WINDOW_SIZE 32768
7349              
7350             /*
7351             The window mask used to wrap indices into the window. This is why the
7352             window size must be a power of two.
7353             */
7354             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
7355              
7356             /*
7357             A block structure of huge, non-smart, blocks to divide the input into, to allow
7358             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
7359             The whole compression algorithm, including the smarter block splitting, will
7360             be executed independently on each huge block.
7361             Dividing into huge blocks hurts compression, but not much relative to the size.
7362             Set it to 0 to disable master blocks.
7363             */
7364             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
7365              
7366             /*
7367             Used to initialize costs for example
7368             */
7369             #define ZOPFLI_LARGE_FLOAT 1e30
7370              
7371             /*
7372             For longest match cache. max 256. Uses huge amounts of memory but makes it
7373             faster. Uses this many times three bytes per single byte of the input data.
7374             This is so because longest match finding has to find the exact distance
7375             that belongs to each length for the best lz77 strategy.
7376             Good values: e.g. 5, 8.
7377             */
7378             #define ZOPFLI_CACHE_LENGTH 8
7379              
7380             /*
7381             limit the max hash chain hits for this hash value. This has an effect only
7382             on files where the hash value is the same very often. On these files, this
7383             gives worse compression (the value should ideally be 32768, which is the
7384             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
7385             faster on some specific files.
7386             Good value: e.g. 8192.
7387             */
7388             #define ZOPFLI_MAX_CHAIN_HITS 8192
7389              
7390             /*
7391             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
7392             consumes a lot of memory but speeds it up. No effect on compression size.
7393             */
7394             #define ZOPFLI_LONGEST_MATCH_CACHE
7395              
7396             /*
7397             Enable to remember amount of successive identical bytes in the hash chain for
7398             finding longest match
7399             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
7400             This has no effect on the compression result, and enabling it increases speed.
7401             */
7402             #define ZOPFLI_HASH_SAME
7403              
7404             /*
7405             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
7406             best length so far is long enough. This is way faster for files with lots of
7407             identical bytes, on which the compressor is otherwise too slow. Regular files
7408             are unaffected or maybe a tiny bit slower.
7409             This has no effect on the compression result, only on speed.
7410             */
7411             #define ZOPFLI_HASH_SAME_HASH
7412              
7413             /*
7414             Enable this, to avoid slowness for files which are a repetition of the same
7415             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
7416             the compression result.
7417             */
7418             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
7419              
7420             /*
7421             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
7422             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
7423             varies from file to file.
7424             */
7425             #define ZOPFLI_LAZY_MATCHING
7426              
7427             /*
7428             Appends value to dynamically allocated memory, doubling its allocation size
7429             whenever needed.
7430              
7431             value: the value to append, type T
7432             data: pointer to the dynamic array to append to, type T**
7433             size: pointer to the size of the array to append to, type size_t*. This is the
7434             size that you consider the array to be, not the internal allocation size.
7435             Precondition: allocated size of data is at least a power of two greater than or
7436             equal than *size.
7437             */
7438             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
7439             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
7440             if (!((*size) & ((*size) - 1))) {\
7441             /*double alloc size if it's a power of two*/\
7442             void** data_void = reinterpret_cast(data);\
7443             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
7444             : realloc((*data), (*size) * 2 * sizeof(**data));\
7445             }\
7446             (*data)[(*size)] = (value);\
7447             (*size)++;\
7448             }
7449             #else /* C gives problems with strict-aliasing rules for (void**) cast */
7450             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
7451             if (!((*size) & ((*size) - 1))) {\
7452             /*double alloc size if it's a power of two*/\
7453             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
7454             : realloc((*data), (*size) * 2 * sizeof(**data));\
7455             }\
7456             (*data)[(*size)] = (value);\
7457             (*size)++;\
7458             }
7459             #endif
7460              
7461              
7462             #endif /* ZOPFLI_UTIL_H_ */
7463              
7464              
7465             #include
7466              
7467             /* deflate.h */
7468             /*
7469             Copyright 2011 Google Inc. All Rights Reserved.
7470              
7471             Licensed under the Apache License, Version 2.0 (the "License");
7472             you may not use this file except in compliance with the License.
7473             You may obtain a copy of the License at
7474              
7475             http://www.apache.org/licenses/LICENSE-2.0
7476              
7477             Unless required by applicable law or agreed to in writing, software
7478             distributed under the License is distributed on an "AS IS" BASIS,
7479             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7480             See the License for the specific language governing permissions and
7481             limitations under the License.
7482              
7483             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
7484             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
7485             */
7486              
7487             #ifndef ZOPFLI_DEFLATE_H_
7488             #define ZOPFLI_DEFLATE_H_
7489              
7490             /*
7491             Functions to compress according to the DEFLATE specification, using the
7492             "squeeze" LZ77 compression backend.
7493             */
7494              
7495             /* lz77.h */
7496             /*
7497             Copyright 2011 Google Inc. All Rights Reserved.
7498              
7499             Licensed under the Apache License, Version 2.0 (the "License");
7500             you may not use this file except in compliance with the License.
7501             You may obtain a copy of the License at
7502              
7503             http://www.apache.org/licenses/LICENSE-2.0
7504              
7505             Unless required by applicable law or agreed to in writing, software
7506             distributed under the License is distributed on an "AS IS" BASIS,
7507             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7508             See the License for the specific language governing permissions and
7509             limitations under the License.
7510              
7511             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
7512             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
7513             */
7514              
7515             /*
7516             Functions for basic LZ77 compression and utilities for the "squeeze" LZ77
7517             compression.
7518             */
7519              
7520             #ifndef ZOPFLI_LZ77_H_
7521             #define ZOPFLI_LZ77_H_
7522              
7523             #include
7524              
7525             /* cache.h */
7526             /*
7527             Copyright 2011 Google Inc. All Rights Reserved.
7528              
7529             Licensed under the Apache License, Version 2.0 (the "License");
7530             you may not use this file except in compliance with the License.
7531             You may obtain a copy of the License at
7532              
7533             http://www.apache.org/licenses/LICENSE-2.0
7534              
7535             Unless required by applicable law or agreed to in writing, software
7536             distributed under the License is distributed on an "AS IS" BASIS,
7537             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7538             See the License for the specific language governing permissions and
7539             limitations under the License.
7540              
7541             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
7542             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
7543             */
7544              
7545             /*
7546             The cache that speeds up ZopfliFindLongestMatch of lz77.c.
7547             */
7548              
7549             #ifndef ZOPFLI_CACHE_H_
7550             #define ZOPFLI_CACHE_H_
7551              
7552             /* util.h */
7553             /*
7554             Copyright 2011 Google Inc. All Rights Reserved.
7555              
7556             Licensed under the Apache License, Version 2.0 (the "License");
7557             you may not use this file except in compliance with the License.
7558             You may obtain a copy of the License at
7559              
7560             http://www.apache.org/licenses/LICENSE-2.0
7561              
7562             Unless required by applicable law or agreed to in writing, software
7563             distributed under the License is distributed on an "AS IS" BASIS,
7564             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7565             See the License for the specific language governing permissions and
7566             limitations under the License.
7567              
7568             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
7569             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
7570             */
7571              
7572             /*
7573             Several utilities, including: #defines to try different compression results,
7574             basic deflate specification values and generic program options.
7575             */
7576              
7577             #ifndef ZOPFLI_UTIL_H_
7578             #define ZOPFLI_UTIL_H_
7579              
7580             #include
7581             #include
7582              
7583             /* Minimum and maximum length that can be encoded in deflate. */
7584             #define ZOPFLI_MAX_MATCH 258
7585             #define ZOPFLI_MIN_MATCH 3
7586              
7587             /* Number of distinct literal/length and distance symbols in DEFLATE */
7588             #define ZOPFLI_NUM_LL 288
7589             #define ZOPFLI_NUM_D 32
7590              
7591             /*
7592             The window size for deflate. Must be a power of two. This should be 32768, the
7593             maximum possible by the deflate spec. Anything less hurts compression more than
7594             speed.
7595             */
7596             #define ZOPFLI_WINDOW_SIZE 32768
7597              
7598             /*
7599             The window mask used to wrap indices into the window. This is why the
7600             window size must be a power of two.
7601             */
7602             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
7603              
7604             /*
7605             A block structure of huge, non-smart, blocks to divide the input into, to allow
7606             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
7607             The whole compression algorithm, including the smarter block splitting, will
7608             be executed independently on each huge block.
7609             Dividing into huge blocks hurts compression, but not much relative to the size.
7610             Set it to 0 to disable master blocks.
7611             */
7612             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
7613              
7614             /*
7615             Used to initialize costs for example
7616             */
7617             #define ZOPFLI_LARGE_FLOAT 1e30
7618              
7619             /*
7620             For longest match cache. max 256. Uses huge amounts of memory but makes it
7621             faster. Uses this many times three bytes per single byte of the input data.
7622             This is so because longest match finding has to find the exact distance
7623             that belongs to each length for the best lz77 strategy.
7624             Good values: e.g. 5, 8.
7625             */
7626             #define ZOPFLI_CACHE_LENGTH 8
7627              
7628             /*
7629             limit the max hash chain hits for this hash value. This has an effect only
7630             on files where the hash value is the same very often. On these files, this
7631             gives worse compression (the value should ideally be 32768, which is the
7632             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
7633             faster on some specific files.
7634             Good value: e.g. 8192.
7635             */
7636             #define ZOPFLI_MAX_CHAIN_HITS 8192
7637              
7638             /*
7639             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
7640             consumes a lot of memory but speeds it up. No effect on compression size.
7641             */
7642             #define ZOPFLI_LONGEST_MATCH_CACHE
7643              
7644             /*
7645             Enable to remember amount of successive identical bytes in the hash chain for
7646             finding longest match
7647             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
7648             This has no effect on the compression result, and enabling it increases speed.
7649             */
7650             #define ZOPFLI_HASH_SAME
7651              
7652             /*
7653             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
7654             best length so far is long enough. This is way faster for files with lots of
7655             identical bytes, on which the compressor is otherwise too slow. Regular files
7656             are unaffected or maybe a tiny bit slower.
7657             This has no effect on the compression result, only on speed.
7658             */
7659             #define ZOPFLI_HASH_SAME_HASH
7660              
7661             /*
7662             Enable this, to avoid slowness for files which are a repetition of the same
7663             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
7664             the compression result.
7665             */
7666             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
7667              
7668             /*
7669             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
7670             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
7671             varies from file to file.
7672             */
7673             #define ZOPFLI_LAZY_MATCHING
7674              
7675             /*
7676             Appends value to dynamically allocated memory, doubling its allocation size
7677             whenever needed.
7678              
7679             value: the value to append, type T
7680             data: pointer to the dynamic array to append to, type T**
7681             size: pointer to the size of the array to append to, type size_t*. This is the
7682             size that you consider the array to be, not the internal allocation size.
7683             Precondition: allocated size of data is at least a power of two greater than or
7684             equal than *size.
7685             */
7686             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
7687             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
7688             if (!((*size) & ((*size) - 1))) {\
7689             /*double alloc size if it's a power of two*/\
7690             void** data_void = reinterpret_cast(data);\
7691             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
7692             : realloc((*data), (*size) * 2 * sizeof(**data));\
7693             }\
7694             (*data)[(*size)] = (value);\
7695             (*size)++;\
7696             }
7697             #else /* C gives problems with strict-aliasing rules for (void**) cast */
7698             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
7699             if (!((*size) & ((*size) - 1))) {\
7700             /*double alloc size if it's a power of two*/\
7701             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
7702             : realloc((*data), (*size) * 2 * sizeof(**data));\
7703             }\
7704             (*data)[(*size)] = (value);\
7705             (*size)++;\
7706             }
7707             #endif
7708              
7709              
7710             #endif /* ZOPFLI_UTIL_H_ */
7711              
7712              
7713             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
7714              
7715             /*
7716             Cache used by ZopfliFindLongestMatch to remember previously found length/dist
7717             values.
7718             This is needed because the squeeze runs will ask these values multiple times for
7719             the same position.
7720             Uses large amounts of memory, since it has to remember the distance belonging
7721             to every possible shorter-than-the-best length (the so called "sublen" array).
7722             */
7723             typedef struct ZopfliLongestMatchCache {
7724             unsigned short* length;
7725             unsigned short* dist;
7726             unsigned char* sublen;
7727             } ZopfliLongestMatchCache;
7728              
7729             /* Initializes the ZopfliLongestMatchCache. */
7730             void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc);
7731              
7732             /* Frees up the memory of the ZopfliLongestMatchCache. */
7733             void ZopfliCleanCache(ZopfliLongestMatchCache* lmc);
7734              
7735             /* Stores sublen array in the cache. */
7736             void ZopfliSublenToCache(const unsigned short* sublen,
7737             size_t pos, size_t length,
7738             ZopfliLongestMatchCache* lmc);
7739              
7740             /* Extracts sublen array from the cache. */
7741             void ZopfliCacheToSublen(const ZopfliLongestMatchCache* lmc,
7742             size_t pos, size_t length,
7743             unsigned short* sublen);
7744             /* Returns the length up to which could be stored in the cache. */
7745             unsigned ZopfliMaxCachedSublen(const ZopfliLongestMatchCache* lmc,
7746             size_t pos, size_t length);
7747              
7748             #endif /* ZOPFLI_LONGEST_MATCH_CACHE */
7749              
7750             #endif /* ZOPFLI_CACHE_H_ */
7751              
7752             /* hash.h */
7753             /*
7754             Copyright 2011 Google Inc. All Rights Reserved.
7755              
7756             Licensed under the Apache License, Version 2.0 (the "License");
7757             you may not use this file except in compliance with the License.
7758             You may obtain a copy of the License at
7759              
7760             http://www.apache.org/licenses/LICENSE-2.0
7761              
7762             Unless required by applicable law or agreed to in writing, software
7763             distributed under the License is distributed on an "AS IS" BASIS,
7764             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7765             See the License for the specific language governing permissions and
7766             limitations under the License.
7767              
7768             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
7769             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
7770             */
7771              
7772             /*
7773             The hash for ZopfliFindLongestMatch of lz77.c.
7774             */
7775              
7776             #ifndef ZOPFLI_HASH_H_
7777             #define ZOPFLI_HASH_H_
7778              
7779             /* util.h */
7780             /*
7781             Copyright 2011 Google Inc. All Rights Reserved.
7782              
7783             Licensed under the Apache License, Version 2.0 (the "License");
7784             you may not use this file except in compliance with the License.
7785             You may obtain a copy of the License at
7786              
7787             http://www.apache.org/licenses/LICENSE-2.0
7788              
7789             Unless required by applicable law or agreed to in writing, software
7790             distributed under the License is distributed on an "AS IS" BASIS,
7791             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7792             See the License for the specific language governing permissions and
7793             limitations under the License.
7794              
7795             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
7796             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
7797             */
7798              
7799             /*
7800             Several utilities, including: #defines to try different compression results,
7801             basic deflate specification values and generic program options.
7802             */
7803              
7804             #ifndef ZOPFLI_UTIL_H_
7805             #define ZOPFLI_UTIL_H_
7806              
7807             #include
7808             #include
7809              
7810             /* Minimum and maximum length that can be encoded in deflate. */
7811             #define ZOPFLI_MAX_MATCH 258
7812             #define ZOPFLI_MIN_MATCH 3
7813              
7814             /* Number of distinct literal/length and distance symbols in DEFLATE */
7815             #define ZOPFLI_NUM_LL 288
7816             #define ZOPFLI_NUM_D 32
7817              
7818             /*
7819             The window size for deflate. Must be a power of two. This should be 32768, the
7820             maximum possible by the deflate spec. Anything less hurts compression more than
7821             speed.
7822             */
7823             #define ZOPFLI_WINDOW_SIZE 32768
7824              
7825             /*
7826             The window mask used to wrap indices into the window. This is why the
7827             window size must be a power of two.
7828             */
7829             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
7830              
7831             /*
7832             A block structure of huge, non-smart, blocks to divide the input into, to allow
7833             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
7834             The whole compression algorithm, including the smarter block splitting, will
7835             be executed independently on each huge block.
7836             Dividing into huge blocks hurts compression, but not much relative to the size.
7837             Set it to 0 to disable master blocks.
7838             */
7839             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
7840              
7841             /*
7842             Used to initialize costs for example
7843             */
7844             #define ZOPFLI_LARGE_FLOAT 1e30
7845              
7846             /*
7847             For longest match cache. max 256. Uses huge amounts of memory but makes it
7848             faster. Uses this many times three bytes per single byte of the input data.
7849             This is so because longest match finding has to find the exact distance
7850             that belongs to each length for the best lz77 strategy.
7851             Good values: e.g. 5, 8.
7852             */
7853             #define ZOPFLI_CACHE_LENGTH 8
7854              
7855             /*
7856             limit the max hash chain hits for this hash value. This has an effect only
7857             on files where the hash value is the same very often. On these files, this
7858             gives worse compression (the value should ideally be 32768, which is the
7859             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
7860             faster on some specific files.
7861             Good value: e.g. 8192.
7862             */
7863             #define ZOPFLI_MAX_CHAIN_HITS 8192
7864              
7865             /*
7866             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
7867             consumes a lot of memory but speeds it up. No effect on compression size.
7868             */
7869             #define ZOPFLI_LONGEST_MATCH_CACHE
7870              
7871             /*
7872             Enable to remember amount of successive identical bytes in the hash chain for
7873             finding longest match
7874             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
7875             This has no effect on the compression result, and enabling it increases speed.
7876             */
7877             #define ZOPFLI_HASH_SAME
7878              
7879             /*
7880             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
7881             best length so far is long enough. This is way faster for files with lots of
7882             identical bytes, on which the compressor is otherwise too slow. Regular files
7883             are unaffected or maybe a tiny bit slower.
7884             This has no effect on the compression result, only on speed.
7885             */
7886             #define ZOPFLI_HASH_SAME_HASH
7887              
7888             /*
7889             Enable this, to avoid slowness for files which are a repetition of the same
7890             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
7891             the compression result.
7892             */
7893             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
7894              
7895             /*
7896             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
7897             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
7898             varies from file to file.
7899             */
7900             #define ZOPFLI_LAZY_MATCHING
7901              
7902             /*
7903             Appends value to dynamically allocated memory, doubling its allocation size
7904             whenever needed.
7905              
7906             value: the value to append, type T
7907             data: pointer to the dynamic array to append to, type T**
7908             size: pointer to the size of the array to append to, type size_t*. This is the
7909             size that you consider the array to be, not the internal allocation size.
7910             Precondition: allocated size of data is at least a power of two greater than or
7911             equal than *size.
7912             */
7913             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
7914             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
7915             if (!((*size) & ((*size) - 1))) {\
7916             /*double alloc size if it's a power of two*/\
7917             void** data_void = reinterpret_cast(data);\
7918             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
7919             : realloc((*data), (*size) * 2 * sizeof(**data));\
7920             }\
7921             (*data)[(*size)] = (value);\
7922             (*size)++;\
7923             }
7924             #else /* C gives problems with strict-aliasing rules for (void**) cast */
7925             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
7926             if (!((*size) & ((*size) - 1))) {\
7927             /*double alloc size if it's a power of two*/\
7928             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
7929             : realloc((*data), (*size) * 2 * sizeof(**data));\
7930             }\
7931             (*data)[(*size)] = (value);\
7932             (*size)++;\
7933             }
7934             #endif
7935              
7936              
7937             #endif /* ZOPFLI_UTIL_H_ */
7938              
7939              
7940             typedef struct ZopfliHash {
7941             int* head; /* Hash value to index of its most recent occurrence. */
7942             unsigned short* prev; /* Index to index of prev. occurrence of same hash. */
7943             int* hashval; /* Index to hash value at this index. */
7944             int val; /* Current hash value. */
7945              
7946             #ifdef ZOPFLI_HASH_SAME_HASH
7947             /* Fields with similar purpose as the above hash, but for the second hash with
7948             a value that is calculated differently. */
7949             int* head2; /* Hash value to index of its most recent occurrence. */
7950             unsigned short* prev2; /* Index to index of prev. occurrence of same hash. */
7951             int* hashval2; /* Index to hash value at this index. */
7952             int val2; /* Current hash value. */
7953             #endif
7954              
7955             #ifdef ZOPFLI_HASH_SAME
7956             unsigned short* same; /* Amount of repetitions of same byte after this .*/
7957             #endif
7958             } ZopfliHash;
7959              
7960             /* Allocates ZopfliHash memory. */
7961             void ZopfliAllocHash(size_t window_size, ZopfliHash* h);
7962              
7963             /* Resets all fields of ZopfliHash. */
7964             void ZopfliResetHash(size_t window_size, ZopfliHash* h);
7965              
7966             /* Frees ZopfliHash memory. */
7967             void ZopfliCleanHash(ZopfliHash* h);
7968              
7969             /*
7970             Updates the hash values based on the current position in the array. All calls
7971             to this must be made for consecutive bytes.
7972             */
7973             void ZopfliUpdateHash(const unsigned char* array, size_t pos, size_t end,
7974             ZopfliHash* h);
7975              
7976             /*
7977             Prepopulates hash:
7978             Fills in the initial values in the hash, before ZopfliUpdateHash can be used
7979             correctly.
7980             */
7981             void ZopfliWarmupHash(const unsigned char* array, size_t pos, size_t end,
7982             ZopfliHash* h);
7983              
7984             #endif /* ZOPFLI_HASH_H_ */
7985              
7986             /* zopfli.h */
7987             /*
7988             Copyright 2011 Google Inc. All Rights Reserved.
7989              
7990             Licensed under the Apache License, Version 2.0 (the "License");
7991             you may not use this file except in compliance with the License.
7992             You may obtain a copy of the License at
7993              
7994             http://www.apache.org/licenses/LICENSE-2.0
7995              
7996             Unless required by applicable law or agreed to in writing, software
7997             distributed under the License is distributed on an "AS IS" BASIS,
7998             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7999             See the License for the specific language governing permissions and
8000             limitations under the License.
8001              
8002             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
8003             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
8004             */
8005              
8006             #ifndef ZOPFLI_ZOPFLI_H_
8007             #define ZOPFLI_ZOPFLI_H_
8008              
8009             #include
8010             #include /* for size_t */
8011              
8012             #ifdef __cplusplus
8013             extern "C" {
8014             #endif
8015              
8016             /*
8017             Options used throughout the program.
8018             */
8019             typedef struct ZopfliOptions {
8020             /* Whether to print output */
8021             int verbose;
8022              
8023             /* Whether to print more detailed output */
8024             int verbose_more;
8025              
8026             /*
8027             Maximum amount of times to rerun forward and backward pass to optimize LZ77
8028             compression cost. Good values: 10, 15 for small files, 5 for files over
8029             several MB in size or it will be too slow.
8030             */
8031             int numiterations;
8032              
8033             /*
8034             If true, splits the data in multiple deflate blocks with optimal choice
8035             for the block boundaries. Block splitting gives better compression. Default:
8036             true (1).
8037             */
8038             int blocksplitting;
8039              
8040             /*
8041             No longer used, left for compatibility.
8042             */
8043             int blocksplittinglast;
8044              
8045             /*
8046             Maximum amount of blocks to split into (0 for unlimited, but this can give
8047             extreme results that hurt compression on some files). Default value: 15.
8048             */
8049             int blocksplittingmax;
8050             } ZopfliOptions;
8051              
8052             /* Initializes options with default values. */
8053             void ZopfliInitOptions(ZopfliOptions* options);
8054              
8055             /* Output format */
8056             typedef enum {
8057             ZOPFLI_FORMAT_GZIP,
8058             ZOPFLI_FORMAT_ZLIB,
8059             ZOPFLI_FORMAT_DEFLATE
8060             } ZopfliFormat;
8061              
8062             /*
8063             Compresses according to the given output format and appends the result to the
8064             output.
8065              
8066             options: global program options
8067             output_type: the output format to use
8068             out: pointer to the dynamic output array to which the result is appended. Must
8069             be freed after use
8070             outsize: pointer to the dynamic output array size
8071             */
8072             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
8073             const unsigned char* in, size_t insize,
8074             unsigned char** out, size_t* outsize);
8075              
8076             #ifdef __cplusplus
8077             } // extern "C"
8078             #endif
8079              
8080             #endif /* ZOPFLI_ZOPFLI_H_ */
8081              
8082              
8083             /*
8084             Stores lit/length and dist pairs for LZ77.
8085             Parameter litlens: Contains the literal symbols or length values.
8086             Parameter dists: Contains the distances. A value is 0 to indicate that there is
8087             no dist and the corresponding litlens value is a literal instead of a length.
8088             Parameter size: The size of both the litlens and dists arrays.
8089             The memory can best be managed by using ZopfliInitLZ77Store to initialize it,
8090             ZopfliCleanLZ77Store to destroy it, and ZopfliStoreLitLenDist to append values.
8091              
8092             */
8093             typedef struct ZopfliLZ77Store {
8094             unsigned short* litlens; /* Lit or len. */
8095             unsigned short* dists; /* If 0: indicates literal in corresponding litlens,
8096             if > 0: length in corresponding litlens, this is the distance. */
8097             size_t size;
8098              
8099             const unsigned char* data; /* original data */
8100             size_t* pos; /* position in data where this LZ77 command begins */
8101              
8102             unsigned short* ll_symbol;
8103             unsigned short* d_symbol;
8104              
8105             /* Cumulative histograms wrapping around per chunk. Each chunk has the amount
8106             of distinct symbols as length, so using 1 value per LZ77 symbol, we have a
8107             precise histogram at every N symbols, and the rest can be calculated by
8108             looping through the actual symbols of this chunk. */
8109             size_t* ll_counts;
8110             size_t* d_counts;
8111             } ZopfliLZ77Store;
8112              
8113             void ZopfliInitLZ77Store(const unsigned char* data, ZopfliLZ77Store* store);
8114             void ZopfliCleanLZ77Store(ZopfliLZ77Store* store);
8115             void ZopfliCopyLZ77Store(const ZopfliLZ77Store* source, ZopfliLZ77Store* dest);
8116             void ZopfliStoreLitLenDist(unsigned short length, unsigned short dist,
8117             size_t pos, ZopfliLZ77Store* store);
8118             void ZopfliAppendLZ77Store(const ZopfliLZ77Store* store,
8119             ZopfliLZ77Store* target);
8120             /* Gets the amount of raw bytes that this range of LZ77 symbols spans. */
8121             size_t ZopfliLZ77GetByteRange(const ZopfliLZ77Store* lz77,
8122             size_t lstart, size_t lend);
8123             /* Gets the histogram of lit/len and dist symbols in the given range, using the
8124             cumulative histograms, so faster than adding one by one for large range. Does
8125             not add the one end symbol of value 256. */
8126             void ZopfliLZ77GetHistogram(const ZopfliLZ77Store* lz77,
8127             size_t lstart, size_t lend,
8128             size_t* ll_counts, size_t* d_counts);
8129              
8130             /*
8131             Some state information for compressing a block.
8132             This is currently a bit under-used (with mainly only the longest match cache),
8133             but is kept for easy future expansion.
8134             */
8135             typedef struct ZopfliBlockState {
8136             const ZopfliOptions* options;
8137              
8138             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
8139             /* Cache for length/distance pairs found so far. */
8140             ZopfliLongestMatchCache* lmc;
8141             #endif
8142              
8143             /* The start (inclusive) and end (not inclusive) of the current block. */
8144             size_t blockstart;
8145             size_t blockend;
8146             } ZopfliBlockState;
8147              
8148             void ZopfliInitBlockState(const ZopfliOptions* options,
8149             size_t blockstart, size_t blockend, int add_lmc,
8150             ZopfliBlockState* s);
8151             void ZopfliCleanBlockState(ZopfliBlockState* s);
8152              
8153             /*
8154             Finds the longest match (length and corresponding distance) for LZ77
8155             compression.
8156             Even when not using "sublen", it can be more efficient to provide an array,
8157             because only then the caching is used.
8158             array: the data
8159             pos: position in the data to find the match for
8160             size: size of the data
8161             limit: limit length to maximum this value (default should be 258). This allows
8162             finding a shorter dist for that length (= less extra bits). Must be
8163             in the range [ZOPFLI_MIN_MATCH, ZOPFLI_MAX_MATCH].
8164             sublen: output array of 259 elements, or null. Has, for each length, the
8165             smallest distance required to reach this length. Only 256 of its 259 values
8166             are used, the first 3 are ignored (the shortest length is 3. It is purely
8167             for convenience that the array is made 3 longer).
8168             */
8169             void ZopfliFindLongestMatch(
8170             ZopfliBlockState *s, const ZopfliHash* h, const unsigned char* array,
8171             size_t pos, size_t size, size_t limit,
8172             unsigned short* sublen, unsigned short* distance, unsigned short* length);
8173              
8174             /*
8175             Verifies if length and dist are indeed valid, only used for assertion.
8176             */
8177             void ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
8178             unsigned short dist, unsigned short length);
8179              
8180             /*
8181             Does LZ77 using an algorithm similar to gzip, with lazy matching, rather than
8182             with the slow but better "squeeze" implementation.
8183             The result is placed in the ZopfliLZ77Store.
8184             If instart is larger than 0, it uses values before instart as starting
8185             dictionary.
8186             */
8187             void ZopfliLZ77Greedy(ZopfliBlockState* s, const unsigned char* in,
8188             size_t instart, size_t inend,
8189             ZopfliLZ77Store* store, ZopfliHash* h);
8190              
8191             #endif /* ZOPFLI_LZ77_H_ */
8192              
8193             /* zopfli.h */
8194             /*
8195             Copyright 2011 Google Inc. All Rights Reserved.
8196              
8197             Licensed under the Apache License, Version 2.0 (the "License");
8198             you may not use this file except in compliance with the License.
8199             You may obtain a copy of the License at
8200              
8201             http://www.apache.org/licenses/LICENSE-2.0
8202              
8203             Unless required by applicable law or agreed to in writing, software
8204             distributed under the License is distributed on an "AS IS" BASIS,
8205             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8206             See the License for the specific language governing permissions and
8207             limitations under the License.
8208              
8209             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
8210             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
8211             */
8212              
8213             #ifndef ZOPFLI_ZOPFLI_H_
8214             #define ZOPFLI_ZOPFLI_H_
8215              
8216             #include
8217             #include /* for size_t */
8218              
8219             #ifdef __cplusplus
8220             extern "C" {
8221             #endif
8222              
8223             /*
8224             Options used throughout the program.
8225             */
8226             typedef struct ZopfliOptions {
8227             /* Whether to print output */
8228             int verbose;
8229              
8230             /* Whether to print more detailed output */
8231             int verbose_more;
8232              
8233             /*
8234             Maximum amount of times to rerun forward and backward pass to optimize LZ77
8235             compression cost. Good values: 10, 15 for small files, 5 for files over
8236             several MB in size or it will be too slow.
8237             */
8238             int numiterations;
8239              
8240             /*
8241             If true, splits the data in multiple deflate blocks with optimal choice
8242             for the block boundaries. Block splitting gives better compression. Default:
8243             true (1).
8244             */
8245             int blocksplitting;
8246              
8247             /*
8248             No longer used, left for compatibility.
8249             */
8250             int blocksplittinglast;
8251              
8252             /*
8253             Maximum amount of blocks to split into (0 for unlimited, but this can give
8254             extreme results that hurt compression on some files). Default value: 15.
8255             */
8256             int blocksplittingmax;
8257             } ZopfliOptions;
8258              
8259             /* Initializes options with default values. */
8260             void ZopfliInitOptions(ZopfliOptions* options);
8261              
8262             /* Output format */
8263             typedef enum {
8264             ZOPFLI_FORMAT_GZIP,
8265             ZOPFLI_FORMAT_ZLIB,
8266             ZOPFLI_FORMAT_DEFLATE
8267             } ZopfliFormat;
8268              
8269             /*
8270             Compresses according to the given output format and appends the result to the
8271             output.
8272              
8273             options: global program options
8274             output_type: the output format to use
8275             out: pointer to the dynamic output array to which the result is appended. Must
8276             be freed after use
8277             outsize: pointer to the dynamic output array size
8278             */
8279             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
8280             const unsigned char* in, size_t insize,
8281             unsigned char** out, size_t* outsize);
8282              
8283             #ifdef __cplusplus
8284             } // extern "C"
8285             #endif
8286              
8287             #endif /* ZOPFLI_ZOPFLI_H_ */
8288              
8289              
8290             #ifdef __cplusplus
8291             extern "C" {
8292             #endif
8293              
8294             /*
8295             Compresses according to the deflate specification and append the compressed
8296             result to the output.
8297             This function will usually output multiple deflate blocks. If final is 1, then
8298             the final bit will be set on the last block.
8299              
8300             options: global program options
8301             btype: the deflate block type. Use 2 for best compression.
8302             -0: non compressed blocks (00)
8303             -1: blocks with fixed tree (01)
8304             -2: blocks with dynamic tree (10)
8305             final: whether this is the last section of the input, sets the final bit to the
8306             last deflate block.
8307             in: the input bytes
8308             insize: number of input bytes
8309             bp: bit pointer for the output array. This must initially be 0, and for
8310             consecutive calls must be reused (it can have values from 0-7). This is
8311             because deflate appends blocks as bit-based data, rather than on byte
8312             boundaries.
8313             out: pointer to the dynamic output array to which the result is appended. Must
8314             be freed after use.
8315             outsize: pointer to the dynamic output array size.
8316             */
8317             void ZopfliDeflate(const ZopfliOptions* options, int btype, int final,
8318             const unsigned char* in, size_t insize,
8319             unsigned char* bp, unsigned char** out, size_t* outsize);
8320              
8321             /*
8322             Like ZopfliDeflate, but allows to specify start and end byte with instart and
8323             inend. Only that part is compressed, but earlier bytes are still used for the
8324             back window.
8325             */
8326             void ZopfliDeflatePart(const ZopfliOptions* options, int btype, int final,
8327             const unsigned char* in, size_t instart, size_t inend,
8328             unsigned char* bp, unsigned char** out,
8329             size_t* outsize);
8330              
8331             /*
8332             Calculates block size in bits.
8333             litlens: lz77 lit/lengths
8334             dists: ll77 distances
8335             lstart: start of block
8336             lend: end of block (not inclusive)
8337             */
8338             double ZopfliCalculateBlockSize(const ZopfliLZ77Store* lz77,
8339             size_t lstart, size_t lend, int btype);
8340              
8341             /*
8342             Calculates block size in bits, automatically using the best btype.
8343             */
8344             double ZopfliCalculateBlockSizeAutoType(const ZopfliLZ77Store* lz77,
8345             size_t lstart, size_t lend);
8346              
8347             #ifdef __cplusplus
8348             } // extern "C"
8349             #endif
8350              
8351             #endif /* ZOPFLI_DEFLATE_H_ */
8352              
8353              
8354             /* CRC polynomial: 0xedb88320 */
8355             static const unsigned long crc32_table[256] = {
8356             0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u,
8357             3915621685u, 2657392035u, 249268274u, 2044508324u, 3772115230u, 2547177864u,
8358             162941995u, 2125561021u, 3887607047u, 2428444049u, 498536548u, 1789927666u,
8359             4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u,
8360             325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u,
8361             4195302755u, 2366115317u, 997073096u, 1281953886u, 3579855332u, 2724688242u,
8362             1006888145u, 1258607687u, 3524101629u, 2768942443u, 901097722u, 1119000684u,
8363             3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u,
8364             651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u,
8365             3485111705u, 3099436303u, 671266974u, 1594198024u, 3322730930u, 2970347812u,
8366             795835527u, 1483230225u, 3244367275u, 3060149565u, 1994146192u, 31158534u,
8367             2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u,
8368             2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u,
8369             2439277719u, 3865271297u, 1802195444u, 476864866u, 2238001368u, 4066508878u,
8370             1812370925u, 453092731u, 2181625025u, 4111451223u, 1706088902u, 314042704u,
8371             2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u,
8372             1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u,
8373             2765210733u, 3554079995u, 1131014506u, 879679996u, 2909243462u, 3663771856u,
8374             1141124467u, 855842277u, 2852801631u, 3708648649u, 1342533948u, 654459306u,
8375             3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u,
8376             1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u,
8377             3082640443u, 3233442989u, 3988292384u, 2596254646u, 62317068u, 1957810842u,
8378             3939845945u, 2647816111u, 81470997u, 1943803523u, 3814918930u, 2489596804u,
8379             225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u,
8380             4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u,
8381             426522225u, 1852507879u, 4275313526u, 2312317920u, 282753626u, 1742555852u,
8382             4189708143u, 2394877945u, 397917763u, 1622183637u, 3604390888u, 2714866558u,
8383             953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u,
8384             3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u,
8385             829329135u, 1181335161u, 3412177804u, 3160834842u, 628085408u, 1382605366u,
8386             3423369109u, 3138078467u, 570562233u, 1426400815u, 3317316542u, 2998733608u,
8387             733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u,
8388             2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u,
8389             1913087877u, 83908371u, 2512341634u, 3803740692u, 2075208622u, 213261112u,
8390             2463272603u, 3855990285u, 2094854071u, 198958881u, 2262029012u, 4057260610u,
8391             1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u,
8392             2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u,
8393             1634467795u, 376229701u, 2685067896u, 3608007406u, 1308918612u, 956543938u,
8394             2808555105u, 3495958263u, 1231636301u, 1047427035u, 2932959818u, 3654703836u,
8395             1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u,
8396             3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u,
8397             1423857449u, 601450431u, 3009837614u, 3294710456u, 1567103746u, 711928724u,
8398             3020668471u, 3272380065u, 1510334235u, 755167117u
8399             };
8400              
8401             /* Returns the CRC32 */
8402 3           static unsigned long CRC(const unsigned char* data, size_t size) {
8403 3           unsigned long result = 0xffffffffu;
8404 9183 100         for (; size > 0; size--) {
8405 9180           result = crc32_table[(result ^ *(data++)) & 0xff] ^ (result >> 8);
8406             }
8407 3           return result ^ 0xffffffffu;
8408             }
8409              
8410             /* Compresses the data according to the gzip specification, RFC 1952. */
8411 3           void ZopfliGzipCompress(const ZopfliOptions* options,
8412             const unsigned char* in, size_t insize,
8413             unsigned char** out, size_t* outsize) {
8414 3           unsigned long crcvalue = CRC(in, insize);
8415 3           unsigned char bp = 0;
8416              
8417 3 50         ZOPFLI_APPEND_DATA(31, out, outsize); /* ID1 */
    50          
8418 3 50         ZOPFLI_APPEND_DATA(139, out, outsize); /* ID2 */
    50          
8419 3 50         ZOPFLI_APPEND_DATA(8, out, outsize); /* CM */
    50          
8420 3 50         ZOPFLI_APPEND_DATA(0, out, outsize); /* FLG */
    0          
8421             /* MTIME */
8422 3 50         ZOPFLI_APPEND_DATA(0, out, outsize);
    50          
8423 3 50         ZOPFLI_APPEND_DATA(0, out, outsize);
    0          
8424 3 50         ZOPFLI_APPEND_DATA(0, out, outsize);
    0          
8425 3 50         ZOPFLI_APPEND_DATA(0, out, outsize);
    0          
8426              
8427 3 50         ZOPFLI_APPEND_DATA(2, out, outsize); /* XFL, 2 indicates best compression. */
    50          
8428 3 50         ZOPFLI_APPEND_DATA(3, out, outsize); /* OS follows Unix conventions. */
    0          
8429              
8430 3           ZopfliDeflate(options, 2 /* Dynamic block */, 1,
8431             in, insize, &bp, out, outsize);
8432              
8433             /* CRC */
8434 3 50         ZOPFLI_APPEND_DATA(crcvalue % 256, out, outsize);
    0          
8435 3 50         ZOPFLI_APPEND_DATA((crcvalue >> 8) % 256, out, outsize);
    0          
8436 3 50         ZOPFLI_APPEND_DATA((crcvalue >> 16) % 256, out, outsize);
    0          
8437 3 50         ZOPFLI_APPEND_DATA((crcvalue >> 24) % 256, out, outsize);
    0          
8438              
8439             /* ISIZE */
8440 3 50         ZOPFLI_APPEND_DATA(insize % 256, out, outsize);
    0          
8441 3 50         ZOPFLI_APPEND_DATA((insize >> 8) % 256, out, outsize);
    0          
8442 3 50         ZOPFLI_APPEND_DATA((insize >> 16) % 256, out, outsize);
    0          
8443 3 50         ZOPFLI_APPEND_DATA((insize >> 24) % 256, out, outsize);
    0          
8444              
8445 3 50         if (options->verbose) {
8446 0           fprintf(stderr,
8447             "Original Size: %d, Gzip: %d, Compression: %f%% Removed\n",
8448 0           (int)insize, (int)*outsize,
8449 0           100.0 * (double)(insize - *outsize) / (double)insize);
8450             }
8451 3           }
8452             /*
8453             Copyright 2011 Google Inc. All Rights Reserved.
8454              
8455             Licensed under the Apache License, Version 2.0 (the "License");
8456             you may not use this file except in compliance with the License.
8457             You may obtain a copy of the License at
8458              
8459             http://www.apache.org/licenses/LICENSE-2.0
8460              
8461             Unless required by applicable law or agreed to in writing, software
8462             distributed under the License is distributed on an "AS IS" BASIS,
8463             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8464             See the License for the specific language governing permissions and
8465             limitations under the License.
8466              
8467             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
8468             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
8469             */
8470              
8471             /* hash.h */
8472             /*
8473             Copyright 2011 Google Inc. All Rights Reserved.
8474              
8475             Licensed under the Apache License, Version 2.0 (the "License");
8476             you may not use this file except in compliance with the License.
8477             You may obtain a copy of the License at
8478              
8479             http://www.apache.org/licenses/LICENSE-2.0
8480              
8481             Unless required by applicable law or agreed to in writing, software
8482             distributed under the License is distributed on an "AS IS" BASIS,
8483             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8484             See the License for the specific language governing permissions and
8485             limitations under the License.
8486              
8487             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
8488             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
8489             */
8490              
8491             /*
8492             The hash for ZopfliFindLongestMatch of lz77.c.
8493             */
8494              
8495             #ifndef ZOPFLI_HASH_H_
8496             #define ZOPFLI_HASH_H_
8497              
8498             /* util.h */
8499             /*
8500             Copyright 2011 Google Inc. All Rights Reserved.
8501              
8502             Licensed under the Apache License, Version 2.0 (the "License");
8503             you may not use this file except in compliance with the License.
8504             You may obtain a copy of the License at
8505              
8506             http://www.apache.org/licenses/LICENSE-2.0
8507              
8508             Unless required by applicable law or agreed to in writing, software
8509             distributed under the License is distributed on an "AS IS" BASIS,
8510             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8511             See the License for the specific language governing permissions and
8512             limitations under the License.
8513              
8514             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
8515             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
8516             */
8517              
8518             /*
8519             Several utilities, including: #defines to try different compression results,
8520             basic deflate specification values and generic program options.
8521             */
8522              
8523             #ifndef ZOPFLI_UTIL_H_
8524             #define ZOPFLI_UTIL_H_
8525              
8526             #include
8527             #include
8528              
8529             /* Minimum and maximum length that can be encoded in deflate. */
8530             #define ZOPFLI_MAX_MATCH 258
8531             #define ZOPFLI_MIN_MATCH 3
8532              
8533             /* Number of distinct literal/length and distance symbols in DEFLATE */
8534             #define ZOPFLI_NUM_LL 288
8535             #define ZOPFLI_NUM_D 32
8536              
8537             /*
8538             The window size for deflate. Must be a power of two. This should be 32768, the
8539             maximum possible by the deflate spec. Anything less hurts compression more than
8540             speed.
8541             */
8542             #define ZOPFLI_WINDOW_SIZE 32768
8543              
8544             /*
8545             The window mask used to wrap indices into the window. This is why the
8546             window size must be a power of two.
8547             */
8548             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
8549              
8550             /*
8551             A block structure of huge, non-smart, blocks to divide the input into, to allow
8552             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
8553             The whole compression algorithm, including the smarter block splitting, will
8554             be executed independently on each huge block.
8555             Dividing into huge blocks hurts compression, but not much relative to the size.
8556             Set it to 0 to disable master blocks.
8557             */
8558             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
8559              
8560             /*
8561             Used to initialize costs for example
8562             */
8563             #define ZOPFLI_LARGE_FLOAT 1e30
8564              
8565             /*
8566             For longest match cache. max 256. Uses huge amounts of memory but makes it
8567             faster. Uses this many times three bytes per single byte of the input data.
8568             This is so because longest match finding has to find the exact distance
8569             that belongs to each length for the best lz77 strategy.
8570             Good values: e.g. 5, 8.
8571             */
8572             #define ZOPFLI_CACHE_LENGTH 8
8573              
8574             /*
8575             limit the max hash chain hits for this hash value. This has an effect only
8576             on files where the hash value is the same very often. On these files, this
8577             gives worse compression (the value should ideally be 32768, which is the
8578             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
8579             faster on some specific files.
8580             Good value: e.g. 8192.
8581             */
8582             #define ZOPFLI_MAX_CHAIN_HITS 8192
8583              
8584             /*
8585             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
8586             consumes a lot of memory but speeds it up. No effect on compression size.
8587             */
8588             #define ZOPFLI_LONGEST_MATCH_CACHE
8589              
8590             /*
8591             Enable to remember amount of successive identical bytes in the hash chain for
8592             finding longest match
8593             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
8594             This has no effect on the compression result, and enabling it increases speed.
8595             */
8596             #define ZOPFLI_HASH_SAME
8597              
8598             /*
8599             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
8600             best length so far is long enough. This is way faster for files with lots of
8601             identical bytes, on which the compressor is otherwise too slow. Regular files
8602             are unaffected or maybe a tiny bit slower.
8603             This has no effect on the compression result, only on speed.
8604             */
8605             #define ZOPFLI_HASH_SAME_HASH
8606              
8607             /*
8608             Enable this, to avoid slowness for files which are a repetition of the same
8609             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
8610             the compression result.
8611             */
8612             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
8613              
8614             /*
8615             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
8616             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
8617             varies from file to file.
8618             */
8619             #define ZOPFLI_LAZY_MATCHING
8620              
8621             /*
8622             Appends value to dynamically allocated memory, doubling its allocation size
8623             whenever needed.
8624              
8625             value: the value to append, type T
8626             data: pointer to the dynamic array to append to, type T**
8627             size: pointer to the size of the array to append to, type size_t*. This is the
8628             size that you consider the array to be, not the internal allocation size.
8629             Precondition: allocated size of data is at least a power of two greater than or
8630             equal than *size.
8631             */
8632             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
8633             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
8634             if (!((*size) & ((*size) - 1))) {\
8635             /*double alloc size if it's a power of two*/\
8636             void** data_void = reinterpret_cast(data);\
8637             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
8638             : realloc((*data), (*size) * 2 * sizeof(**data));\
8639             }\
8640             (*data)[(*size)] = (value);\
8641             (*size)++;\
8642             }
8643             #else /* C gives problems with strict-aliasing rules for (void**) cast */
8644             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
8645             if (!((*size) & ((*size) - 1))) {\
8646             /*double alloc size if it's a power of two*/\
8647             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
8648             : realloc((*data), (*size) * 2 * sizeof(**data));\
8649             }\
8650             (*data)[(*size)] = (value);\
8651             (*size)++;\
8652             }
8653             #endif
8654              
8655              
8656             #endif /* ZOPFLI_UTIL_H_ */
8657              
8658              
8659             typedef struct ZopfliHash {
8660             int* head; /* Hash value to index of its most recent occurrence. */
8661             unsigned short* prev; /* Index to index of prev. occurrence of same hash. */
8662             int* hashval; /* Index to hash value at this index. */
8663             int val; /* Current hash value. */
8664              
8665             #ifdef ZOPFLI_HASH_SAME_HASH
8666             /* Fields with similar purpose as the above hash, but for the second hash with
8667             a value that is calculated differently. */
8668             int* head2; /* Hash value to index of its most recent occurrence. */
8669             unsigned short* prev2; /* Index to index of prev. occurrence of same hash. */
8670             int* hashval2; /* Index to hash value at this index. */
8671             int val2; /* Current hash value. */
8672             #endif
8673              
8674             #ifdef ZOPFLI_HASH_SAME
8675             unsigned short* same; /* Amount of repetitions of same byte after this .*/
8676             #endif
8677             } ZopfliHash;
8678              
8679             /* Allocates ZopfliHash memory. */
8680             void ZopfliAllocHash(size_t window_size, ZopfliHash* h);
8681              
8682             /* Resets all fields of ZopfliHash. */
8683             void ZopfliResetHash(size_t window_size, ZopfliHash* h);
8684              
8685             /* Frees ZopfliHash memory. */
8686             void ZopfliCleanHash(ZopfliHash* h);
8687              
8688             /*
8689             Updates the hash values based on the current position in the array. All calls
8690             to this must be made for consecutive bytes.
8691             */
8692             void ZopfliUpdateHash(const unsigned char* array, size_t pos, size_t end,
8693             ZopfliHash* h);
8694              
8695             /*
8696             Prepopulates hash:
8697             Fills in the initial values in the hash, before ZopfliUpdateHash can be used
8698             correctly.
8699             */
8700             void ZopfliWarmupHash(const unsigned char* array, size_t pos, size_t end,
8701             ZopfliHash* h);
8702              
8703             #endif /* ZOPFLI_HASH_H_ */
8704              
8705              
8706             #include
8707             #include
8708             #include
8709              
8710             #define HASH_SHIFT 5
8711             #define HASH_MASK 32767
8712              
8713 11           void ZopfliAllocHash(size_t window_size, ZopfliHash* h) {
8714 11           h->head = (int*)malloc(sizeof(*h->head) * 65536);
8715 11           h->prev = (unsigned short*)malloc(sizeof(*h->prev) * window_size);
8716 11           h->hashval = (int*)malloc(sizeof(*h->hashval) * window_size);
8717              
8718             #ifdef ZOPFLI_HASH_SAME
8719 11           h->same = (unsigned short*)malloc(sizeof(*h->same) * window_size);
8720             #endif
8721              
8722             #ifdef ZOPFLI_HASH_SAME_HASH
8723 11           h->head2 = (int*)malloc(sizeof(*h->head2) * 65536);
8724 11           h->prev2 = (unsigned short*)malloc(sizeof(*h->prev2) * window_size);
8725 11           h->hashval2 = (int*)malloc(sizeof(*h->hashval2) * window_size);
8726             #endif
8727 11           }
8728              
8729 135           void ZopfliResetHash(size_t window_size, ZopfliHash* h) {
8730             size_t i;
8731              
8732 135           h->val = 0;
8733 8847495 100         for (i = 0; i < 65536; i++) {
8734 8847360           h->head[i] = -1; /* -1 indicates no head so far. */
8735             }
8736 4423815 100         for (i = 0; i < window_size; i++) {
8737 4423680           h->prev[i] = i; /* If prev[j] == j, then prev[j] is uninitialized. */
8738 4423680           h->hashval[i] = -1;
8739             }
8740              
8741             #ifdef ZOPFLI_HASH_SAME
8742 4423815 100         for (i = 0; i < window_size; i++) {
8743 4423680           h->same[i] = 0;
8744             }
8745             #endif
8746              
8747             #ifdef ZOPFLI_HASH_SAME_HASH
8748 135           h->val2 = 0;
8749 8847495 100         for (i = 0; i < 65536; i++) {
8750 8847360           h->head2[i] = -1;
8751             }
8752 4423815 100         for (i = 0; i < window_size; i++) {
8753 4423680           h->prev2[i] = i;
8754 4423680           h->hashval2[i] = -1;
8755             }
8756             #endif
8757 135           }
8758              
8759 11           void ZopfliCleanHash(ZopfliHash* h) {
8760 11           free(h->head);
8761 11           free(h->prev);
8762 11           free(h->hashval);
8763              
8764             #ifdef ZOPFLI_HASH_SAME_HASH
8765 11           free(h->head2);
8766 11           free(h->prev2);
8767 11           free(h->hashval2);
8768             #endif
8769              
8770             #ifdef ZOPFLI_HASH_SAME
8771 11           free(h->same);
8772             #endif
8773 11           }
8774              
8775             /*
8776             Update the sliding hash value with the given byte. All calls to this function
8777             must be made on consecutive input characters. Since the hash value exists out
8778             of multiple input bytes, a few warmups with this function are needed initially.
8779             */
8780 312687           static void UpdateHashValue(ZopfliHash* h, unsigned char c) {
8781 312687           h->val = (((h->val) << HASH_SHIFT) ^ (c)) & HASH_MASK;
8782 312687           }
8783              
8784 312417           void ZopfliUpdateHash(const unsigned char* array, size_t pos, size_t end,
8785             ZopfliHash* h) {
8786 312417           unsigned short hpos = pos & ZOPFLI_WINDOW_MASK;
8787             #ifdef ZOPFLI_HASH_SAME
8788 312417           size_t amount = 0;
8789             #endif
8790              
8791 312417 100         UpdateHashValue(h, pos + ZOPFLI_MIN_MATCH <= end ?
8792 312147           array[pos + ZOPFLI_MIN_MATCH - 1] : 0);
8793 312417           h->hashval[hpos] = h->val;
8794 312417 100         if (h->head[h->val] != -1 && h->hashval[h->head[h->val]] == h->val) {
    50          
8795 310998           h->prev[hpos] = h->head[h->val];
8796             }
8797 1419           else h->prev[hpos] = hpos;
8798 312417           h->head[h->val] = hpos;
8799              
8800             #ifdef ZOPFLI_HASH_SAME
8801             /* Update "same". */
8802 312417 50         if (h->same[(pos - 1) & ZOPFLI_WINDOW_MASK] > 1) {
8803 0           amount = h->same[(pos - 1) & ZOPFLI_WINDOW_MASK] - 1;
8804             }
8805 312417 100         while (pos + amount + 1 < end &&
    50          
8806 0 0         array[pos] == array[pos + amount + 1] && amount < (unsigned short)(-1)) {
8807 0           amount++;
8808             }
8809 312417           h->same[hpos] = amount;
8810             #endif
8811              
8812             #ifdef ZOPFLI_HASH_SAME_HASH
8813 312417           h->val2 = ((h->same[hpos] - ZOPFLI_MIN_MATCH) & 255) ^ h->val;
8814 312417           h->hashval2[hpos] = h->val2;
8815 312417 100         if (h->head2[h->val2] != -1 && h->hashval2[h->head2[h->val2]] == h->val2) {
    50          
8816 310998           h->prev2[hpos] = h->head2[h->val2];
8817             }
8818 1419           else h->prev2[hpos] = hpos;
8819 312417           h->head2[h->val2] = hpos;
8820             #endif
8821 312417           }
8822              
8823 135           void ZopfliWarmupHash(const unsigned char* array, size_t pos, size_t end,
8824             ZopfliHash* h) {
8825 135           UpdateHashValue(h, array[pos + 0]);
8826 135 50         if (pos + 1 < end) UpdateHashValue(h, array[pos + 1]);
8827 135           }
8828             /*
8829             Copyright 2011 Google Inc. All Rights Reserved.
8830              
8831             Licensed under the Apache License, Version 2.0 (the "License");
8832             you may not use this file except in compliance with the License.
8833             You may obtain a copy of the License at
8834              
8835             http://www.apache.org/licenses/LICENSE-2.0
8836              
8837             Unless required by applicable law or agreed to in writing, software
8838             distributed under the License is distributed on an "AS IS" BASIS,
8839             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8840             See the License for the specific language governing permissions and
8841             limitations under the License.
8842              
8843             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
8844             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
8845             */
8846              
8847             /*
8848             Bounded package merge algorithm, based on the paper
8849             "A Fast and Space-Economical Algorithm for Length-Limited Coding
8850             Jyrki Katajainen, Alistair Moffat, Andrew Turpin".
8851             */
8852              
8853             /* katajainen.h */
8854             /*
8855             Copyright 2011 Google Inc. All Rights Reserved.
8856              
8857             Licensed under the Apache License, Version 2.0 (the "License");
8858             you may not use this file except in compliance with the License.
8859             You may obtain a copy of the License at
8860              
8861             http://www.apache.org/licenses/LICENSE-2.0
8862              
8863             Unless required by applicable law or agreed to in writing, software
8864             distributed under the License is distributed on an "AS IS" BASIS,
8865             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8866             See the License for the specific language governing permissions and
8867             limitations under the License.
8868              
8869             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
8870             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
8871             */
8872              
8873             #ifndef ZOPFLI_KATAJAINEN_H_
8874             #define ZOPFLI_KATAJAINEN_H_
8875              
8876             #include
8877              
8878             /*
8879             Outputs minimum-redundancy length-limited code bitlengths for symbols with the
8880             given counts. The bitlengths are limited by maxbits.
8881              
8882             The output is tailored for DEFLATE: symbols that never occur, get a bit length
8883             of 0, and if only a single symbol occurs at least once, its bitlength will be 1,
8884             and not 0 as would theoretically be needed for a single symbol.
8885              
8886             frequencies: The amount of occurrences of each symbol.
8887             n: The amount of symbols.
8888             maxbits: Maximum bit length, inclusive.
8889             bitlengths: Output, the bitlengths for the symbol prefix codes.
8890             return: 0 for OK, non-0 for error.
8891             */
8892             int ZopfliLengthLimitedCodeLengths(
8893             const size_t* frequencies, int n, int maxbits, unsigned* bitlengths);
8894              
8895             #endif /* ZOPFLI_KATAJAINEN_H_ */
8896              
8897             #include
8898             #include
8899             #include
8900              
8901             typedef struct Node Node;
8902              
8903             /*
8904             Nodes forming chains. Also used to represent leaves.
8905             */
8906             struct Node {
8907             size_t weight; /* Total weight (symbol count) of this chain. */
8908             Node* tail; /* Previous node(s) of this chain, or 0 if none. */
8909             int count; /* Leaf symbol index, or number of leaves before this chain. */
8910             };
8911              
8912             /*
8913             Memory pool for nodes.
8914             */
8915             typedef struct NodePool {
8916             Node* next; /* Pointer to a free node in the pool. */
8917             } NodePool;
8918              
8919             /*
8920             Initializes a chain node with the given values and marks it as in use.
8921             */
8922 95672           static void InitNode(size_t weight, int count, Node* tail, Node* node) {
8923 95672           node->weight = weight;
8924 95672           node->count = count;
8925 95672           node->tail = tail;
8926 95672           }
8927              
8928             /*
8929             Performs a Boundary Package-Merge step. Puts a new chain in the given list. The
8930             new chain is, depending on the weights, a leaf or a combination of two chains
8931             from the previous list.
8932             lists: The lists of chains.
8933             maxbits: Number of lists.
8934             leaves: The leaves, one per symbol.
8935             numsymbols: Number of leaves.
8936             pool: the node memory pool.
8937             index: The index of the list in which a new chain or leaf is required.
8938             */
8939 92965           static void BoundaryPM(Node* (*lists)[2], Node* leaves, int numsymbols,
8940             NodePool* pool, int index) {
8941             Node* newchain;
8942             Node* oldchain;
8943 92965           int lastcount = lists[index][1]->count; /* Count of last chain of list. */
8944              
8945 92965 100         if (index == 0 && lastcount >= numsymbols) return;
    100          
8946              
8947 87426           newchain = pool->next++;
8948 87426           oldchain = lists[index][1];
8949              
8950             /* These are set up before the recursive calls below, so that there is a list
8951             pointing to the new node, to let the garbage collection know it's in use. */
8952 87426           lists[index][0] = oldchain;
8953 87426           lists[index][1] = newchain;
8954              
8955 87426 100         if (index == 0) {
8956             /* New leaf node in list 0. */
8957 8609           InitNode(leaves[lastcount].weight, lastcount + 1, 0, newchain);
8958             } else {
8959 78817           size_t sum = lists[index - 1][0]->weight + lists[index - 1][1]->weight;
8960 78817 100         if (lastcount < numsymbols && sum > leaves[lastcount].weight) {
    100          
8961             /* New leaf inserted in list, so count is incremented. */
8962 43037           InitNode(leaves[lastcount].weight, lastcount + 1, oldchain->tail,
8963             newchain);
8964             } else {
8965 35780           InitNode(sum, lastcount, lists[index - 1][1], newchain);
8966             /* Two lookahead chains of previous list used up, create new ones. */
8967 35780           BoundaryPM(lists, leaves, numsymbols, pool, index - 1);
8968 35780           BoundaryPM(lists, leaves, numsymbols, pool, index - 1);
8969             }
8970             }
8971             }
8972              
8973 4123           static void BoundaryPMFinal(Node* (*lists)[2],
8974             Node* leaves, int numsymbols, NodePool* pool, int index) {
8975 4123           int lastcount = lists[index][1]->count; /* Count of last chain of list. */
8976              
8977 4123           size_t sum = lists[index - 1][0]->weight + lists[index - 1][1]->weight;
8978              
8979 4123 100         if (lastcount < numsymbols && sum > leaves[lastcount].weight) {
    50          
8980 2274           Node* newchain = pool->next;
8981 2274           Node* oldchain = lists[index][1]->tail;
8982              
8983 2274           lists[index][1] = newchain;
8984 2274           newchain->count = lastcount + 1;
8985 2274           newchain->tail = oldchain;
8986             } else {
8987 1849           lists[index][1]->tail = lists[index - 1][1];
8988             }
8989 4123           }
8990              
8991             /*
8992             Initializes each list with as lookahead chains the two leaves with lowest
8993             weights.
8994             */
8995 4123           static void InitLists(
8996             NodePool* pool, const Node* leaves, int maxbits, Node* (*lists)[2]) {
8997             int i;
8998 4123           Node* node0 = pool->next++;
8999 4123           Node* node1 = pool->next++;
9000 4123           InitNode(leaves[0].weight, 1, 0, node0);
9001 4123           InitNode(leaves[1].weight, 2, 0, node1);
9002 20728 100         for (i = 0; i < maxbits; i++) {
9003 16605           lists[i][0] = node0;
9004 16605           lists[i][1] = node1;
9005             }
9006 4123           }
9007              
9008             /*
9009             Converts result of boundary package-merge to the bitlengths. The result in the
9010             last chain of the last list contains the amount of active leaves in each list.
9011             chain: Chain to extract the bit length from (last chain from last list).
9012             */
9013 4123           static void ExtractBitLengths(Node* chain, Node* leaves, unsigned* bitlengths) {
9014 4123           int counts[16] = {0};
9015 4123           unsigned end = 16;
9016 4123           unsigned ptr = 15;
9017 4123           unsigned value = 1;
9018             Node* node;
9019             int val;
9020              
9021 17551 100         for (node = chain; node; node = node->tail) {
9022 13428           counts[--end] = node->count;
9023             }
9024              
9025 4123           val = counts[15];
9026 17551 100         while (ptr >= end) {
9027 34438 100         for (; val > counts[ptr - 1]; val--) {
9028 21010           bitlengths[leaves[val - 1].count] = value;
9029             }
9030 13428           ptr--;
9031 13428           value++;
9032             }
9033 4123           }
9034              
9035             /*
9036             Comparator for sorting the leaves. Has the function signature for qsort.
9037             */
9038 29750           static int LeafComparator(const void* a, const void* b) {
9039 29750           return ((const Node*)a)->weight - ((const Node*)b)->weight;
9040             }
9041              
9042 5229           int ZopfliLengthLimitedCodeLengths(
9043             const size_t* frequencies, int n, int maxbits, unsigned* bitlengths) {
9044             NodePool pool;
9045             int i;
9046 5229           int numsymbols = 0; /* Amount of symbols with frequency > 0. */
9047             int numBoundaryPMRuns;
9048             Node* nodes;
9049              
9050             /* Array of lists of chains. Each list requires only two lookahead chains at
9051             a time, so each list is a array of two Node*'s. */
9052             Node* (*lists)[2];
9053              
9054             /* One leaf per symbol. Only numsymbols leaves will be used. */
9055 5229           Node* leaves = (Node*)malloc(n * sizeof(*leaves));
9056              
9057             /* Initialize all bitlengths at 0. */
9058 251784 100         for (i = 0; i < n; i++) {
9059 246555           bitlengths[i] = 0;
9060             }
9061              
9062             /* Count used symbols and place them in the leaves. */
9063 251784 100         for (i = 0; i < n; i++) {
9064 246555 100         if (frequencies[i]) {
9065 22612           leaves[numsymbols].weight = frequencies[i];
9066 22612           leaves[numsymbols].count = i; /* Index of symbol this leaf represents. */
9067 22612           numsymbols++;
9068             }
9069             }
9070              
9071             /* Check special cases and error conditions. */
9072 5229 50         if ((1 << maxbits) < numsymbols) {
9073 0           free(leaves);
9074 0           return 1; /* Error, too few maxbits to represent symbols. */
9075             }
9076 5229 100         if (numsymbols == 0) {
9077 88           free(leaves);
9078 88           return 0; /* No symbols at all. OK. */
9079             }
9080 5141 100         if (numsymbols == 1) {
9081 434           bitlengths[leaves[0].count] = 1;
9082 434           free(leaves);
9083 434           return 0; /* Only one symbol, give it bitlength 1, not 0. OK. */
9084             }
9085 4707 100         if (numsymbols == 2) {
9086 584           bitlengths[leaves[0].count]++;
9087 584           bitlengths[leaves[1].count]++;
9088 584           free(leaves);
9089 584           return 0;
9090             }
9091              
9092             /* Sort the leaves from lightest to heaviest. Add count into the same
9093             variable for stable sorting. */
9094 25133 100         for (i = 0; i < numsymbols; i++) {
9095 21010 50         if (leaves[i].weight >=
9096             ((size_t)1 << (sizeof(leaves[0].weight) * CHAR_BIT - 9))) {
9097 0           free(leaves);
9098 0           return 1; /* Error, we need 9 bits for the count. */
9099             }
9100 21010           leaves[i].weight = (leaves[i].weight << 9) | leaves[i].count;
9101             }
9102 4123           qsort(leaves, numsymbols, sizeof(Node), LeafComparator);
9103 25133 100         for (i = 0; i < numsymbols; i++) {
9104 21010           leaves[i].weight >>= 9;
9105             }
9106              
9107 4123 100         if (numsymbols - 1 < maxbits) {
9108 4012           maxbits = numsymbols - 1;
9109             }
9110              
9111             /* Initialize node memory pool. */
9112 4123           nodes = (Node*)malloc(maxbits * 2 * numsymbols * sizeof(Node));
9113 4123           pool.next = nodes;
9114              
9115 4123           lists = (Node* (*)[2])malloc(maxbits * sizeof(*lists));
9116 4123           InitLists(&pool, leaves, maxbits, lists);
9117              
9118             /* In the last list, 2 * numsymbols - 2 active chains need to be created. Two
9119             are already created in the initialization. Each BoundaryPM run creates one. */
9120 4123           numBoundaryPMRuns = 2 * numsymbols - 4;
9121 25528 100         for (i = 0; i < numBoundaryPMRuns - 1; i++) {
9122 21405           BoundaryPM(lists, leaves, numsymbols, &pool, maxbits - 1);
9123             }
9124 4123           BoundaryPMFinal(lists, leaves, numsymbols, &pool, maxbits - 1);
9125              
9126 4123           ExtractBitLengths(lists[maxbits - 1][1], leaves, bitlengths);
9127              
9128 4123           free(lists);
9129 4123           free(leaves);
9130 4123           free(nodes);
9131 5229           return 0; /* OK. */
9132             }
9133             /*
9134             Copyright 2011 Google Inc. All Rights Reserved.
9135              
9136             Licensed under the Apache License, Version 2.0 (the "License");
9137             you may not use this file except in compliance with the License.
9138             You may obtain a copy of the License at
9139              
9140             http://www.apache.org/licenses/LICENSE-2.0
9141              
9142             Unless required by applicable law or agreed to in writing, software
9143             distributed under the License is distributed on an "AS IS" BASIS,
9144             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9145             See the License for the specific language governing permissions and
9146             limitations under the License.
9147              
9148             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
9149             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
9150             */
9151              
9152             /* lz77.h */
9153             /*
9154             Copyright 2011 Google Inc. All Rights Reserved.
9155              
9156             Licensed under the Apache License, Version 2.0 (the "License");
9157             you may not use this file except in compliance with the License.
9158             You may obtain a copy of the License at
9159              
9160             http://www.apache.org/licenses/LICENSE-2.0
9161              
9162             Unless required by applicable law or agreed to in writing, software
9163             distributed under the License is distributed on an "AS IS" BASIS,
9164             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9165             See the License for the specific language governing permissions and
9166             limitations under the License.
9167              
9168             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
9169             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
9170             */
9171              
9172             /*
9173             Functions for basic LZ77 compression and utilities for the "squeeze" LZ77
9174             compression.
9175             */
9176              
9177             #ifndef ZOPFLI_LZ77_H_
9178             #define ZOPFLI_LZ77_H_
9179              
9180             #include
9181              
9182             /* cache.h */
9183             /*
9184             Copyright 2011 Google Inc. All Rights Reserved.
9185              
9186             Licensed under the Apache License, Version 2.0 (the "License");
9187             you may not use this file except in compliance with the License.
9188             You may obtain a copy of the License at
9189              
9190             http://www.apache.org/licenses/LICENSE-2.0
9191              
9192             Unless required by applicable law or agreed to in writing, software
9193             distributed under the License is distributed on an "AS IS" BASIS,
9194             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9195             See the License for the specific language governing permissions and
9196             limitations under the License.
9197              
9198             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
9199             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
9200             */
9201              
9202             /*
9203             The cache that speeds up ZopfliFindLongestMatch of lz77.c.
9204             */
9205              
9206             #ifndef ZOPFLI_CACHE_H_
9207             #define ZOPFLI_CACHE_H_
9208              
9209             /* util.h */
9210             /*
9211             Copyright 2011 Google Inc. All Rights Reserved.
9212              
9213             Licensed under the Apache License, Version 2.0 (the "License");
9214             you may not use this file except in compliance with the License.
9215             You may obtain a copy of the License at
9216              
9217             http://www.apache.org/licenses/LICENSE-2.0
9218              
9219             Unless required by applicable law or agreed to in writing, software
9220             distributed under the License is distributed on an "AS IS" BASIS,
9221             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9222             See the License for the specific language governing permissions and
9223             limitations under the License.
9224              
9225             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
9226             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
9227             */
9228              
9229             /*
9230             Several utilities, including: #defines to try different compression results,
9231             basic deflate specification values and generic program options.
9232             */
9233              
9234             #ifndef ZOPFLI_UTIL_H_
9235             #define ZOPFLI_UTIL_H_
9236              
9237             #include
9238             #include
9239              
9240             /* Minimum and maximum length that can be encoded in deflate. */
9241             #define ZOPFLI_MAX_MATCH 258
9242             #define ZOPFLI_MIN_MATCH 3
9243              
9244             /* Number of distinct literal/length and distance symbols in DEFLATE */
9245             #define ZOPFLI_NUM_LL 288
9246             #define ZOPFLI_NUM_D 32
9247              
9248             /*
9249             The window size for deflate. Must be a power of two. This should be 32768, the
9250             maximum possible by the deflate spec. Anything less hurts compression more than
9251             speed.
9252             */
9253             #define ZOPFLI_WINDOW_SIZE 32768
9254              
9255             /*
9256             The window mask used to wrap indices into the window. This is why the
9257             window size must be a power of two.
9258             */
9259             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
9260              
9261             /*
9262             A block structure of huge, non-smart, blocks to divide the input into, to allow
9263             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
9264             The whole compression algorithm, including the smarter block splitting, will
9265             be executed independently on each huge block.
9266             Dividing into huge blocks hurts compression, but not much relative to the size.
9267             Set it to 0 to disable master blocks.
9268             */
9269             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
9270              
9271             /*
9272             Used to initialize costs for example
9273             */
9274             #define ZOPFLI_LARGE_FLOAT 1e30
9275              
9276             /*
9277             For longest match cache. max 256. Uses huge amounts of memory but makes it
9278             faster. Uses this many times three bytes per single byte of the input data.
9279             This is so because longest match finding has to find the exact distance
9280             that belongs to each length for the best lz77 strategy.
9281             Good values: e.g. 5, 8.
9282             */
9283             #define ZOPFLI_CACHE_LENGTH 8
9284              
9285             /*
9286             limit the max hash chain hits for this hash value. This has an effect only
9287             on files where the hash value is the same very often. On these files, this
9288             gives worse compression (the value should ideally be 32768, which is the
9289             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
9290             faster on some specific files.
9291             Good value: e.g. 8192.
9292             */
9293             #define ZOPFLI_MAX_CHAIN_HITS 8192
9294              
9295             /*
9296             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
9297             consumes a lot of memory but speeds it up. No effect on compression size.
9298             */
9299             #define ZOPFLI_LONGEST_MATCH_CACHE
9300              
9301             /*
9302             Enable to remember amount of successive identical bytes in the hash chain for
9303             finding longest match
9304             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
9305             This has no effect on the compression result, and enabling it increases speed.
9306             */
9307             #define ZOPFLI_HASH_SAME
9308              
9309             /*
9310             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
9311             best length so far is long enough. This is way faster for files with lots of
9312             identical bytes, on which the compressor is otherwise too slow. Regular files
9313             are unaffected or maybe a tiny bit slower.
9314             This has no effect on the compression result, only on speed.
9315             */
9316             #define ZOPFLI_HASH_SAME_HASH
9317              
9318             /*
9319             Enable this, to avoid slowness for files which are a repetition of the same
9320             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
9321             the compression result.
9322             */
9323             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
9324              
9325             /*
9326             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
9327             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
9328             varies from file to file.
9329             */
9330             #define ZOPFLI_LAZY_MATCHING
9331              
9332             /*
9333             Appends value to dynamically allocated memory, doubling its allocation size
9334             whenever needed.
9335              
9336             value: the value to append, type T
9337             data: pointer to the dynamic array to append to, type T**
9338             size: pointer to the size of the array to append to, type size_t*. This is the
9339             size that you consider the array to be, not the internal allocation size.
9340             Precondition: allocated size of data is at least a power of two greater than or
9341             equal than *size.
9342             */
9343             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
9344             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
9345             if (!((*size) & ((*size) - 1))) {\
9346             /*double alloc size if it's a power of two*/\
9347             void** data_void = reinterpret_cast(data);\
9348             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
9349             : realloc((*data), (*size) * 2 * sizeof(**data));\
9350             }\
9351             (*data)[(*size)] = (value);\
9352             (*size)++;\
9353             }
9354             #else /* C gives problems with strict-aliasing rules for (void**) cast */
9355             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
9356             if (!((*size) & ((*size) - 1))) {\
9357             /*double alloc size if it's a power of two*/\
9358             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
9359             : realloc((*data), (*size) * 2 * sizeof(**data));\
9360             }\
9361             (*data)[(*size)] = (value);\
9362             (*size)++;\
9363             }
9364             #endif
9365              
9366              
9367             #endif /* ZOPFLI_UTIL_H_ */
9368              
9369              
9370             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
9371              
9372             /*
9373             Cache used by ZopfliFindLongestMatch to remember previously found length/dist
9374             values.
9375             This is needed because the squeeze runs will ask these values multiple times for
9376             the same position.
9377             Uses large amounts of memory, since it has to remember the distance belonging
9378             to every possible shorter-than-the-best length (the so called "sublen" array).
9379             */
9380             typedef struct ZopfliLongestMatchCache {
9381             unsigned short* length;
9382             unsigned short* dist;
9383             unsigned char* sublen;
9384             } ZopfliLongestMatchCache;
9385              
9386             /* Initializes the ZopfliLongestMatchCache. */
9387             void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc);
9388              
9389             /* Frees up the memory of the ZopfliLongestMatchCache. */
9390             void ZopfliCleanCache(ZopfliLongestMatchCache* lmc);
9391              
9392             /* Stores sublen array in the cache. */
9393             void ZopfliSublenToCache(const unsigned short* sublen,
9394             size_t pos, size_t length,
9395             ZopfliLongestMatchCache* lmc);
9396              
9397             /* Extracts sublen array from the cache. */
9398             void ZopfliCacheToSublen(const ZopfliLongestMatchCache* lmc,
9399             size_t pos, size_t length,
9400             unsigned short* sublen);
9401             /* Returns the length up to which could be stored in the cache. */
9402             unsigned ZopfliMaxCachedSublen(const ZopfliLongestMatchCache* lmc,
9403             size_t pos, size_t length);
9404              
9405             #endif /* ZOPFLI_LONGEST_MATCH_CACHE */
9406              
9407             #endif /* ZOPFLI_CACHE_H_ */
9408              
9409             /* hash.h */
9410             /*
9411             Copyright 2011 Google Inc. All Rights Reserved.
9412              
9413             Licensed under the Apache License, Version 2.0 (the "License");
9414             you may not use this file except in compliance with the License.
9415             You may obtain a copy of the License at
9416              
9417             http://www.apache.org/licenses/LICENSE-2.0
9418              
9419             Unless required by applicable law or agreed to in writing, software
9420             distributed under the License is distributed on an "AS IS" BASIS,
9421             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9422             See the License for the specific language governing permissions and
9423             limitations under the License.
9424              
9425             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
9426             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
9427             */
9428              
9429             /*
9430             The hash for ZopfliFindLongestMatch of lz77.c.
9431             */
9432              
9433             #ifndef ZOPFLI_HASH_H_
9434             #define ZOPFLI_HASH_H_
9435              
9436             /* util.h */
9437             /*
9438             Copyright 2011 Google Inc. All Rights Reserved.
9439              
9440             Licensed under the Apache License, Version 2.0 (the "License");
9441             you may not use this file except in compliance with the License.
9442             You may obtain a copy of the License at
9443              
9444             http://www.apache.org/licenses/LICENSE-2.0
9445              
9446             Unless required by applicable law or agreed to in writing, software
9447             distributed under the License is distributed on an "AS IS" BASIS,
9448             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9449             See the License for the specific language governing permissions and
9450             limitations under the License.
9451              
9452             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
9453             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
9454             */
9455              
9456             /*
9457             Several utilities, including: #defines to try different compression results,
9458             basic deflate specification values and generic program options.
9459             */
9460              
9461             #ifndef ZOPFLI_UTIL_H_
9462             #define ZOPFLI_UTIL_H_
9463              
9464             #include
9465             #include
9466              
9467             /* Minimum and maximum length that can be encoded in deflate. */
9468             #define ZOPFLI_MAX_MATCH 258
9469             #define ZOPFLI_MIN_MATCH 3
9470              
9471             /* Number of distinct literal/length and distance symbols in DEFLATE */
9472             #define ZOPFLI_NUM_LL 288
9473             #define ZOPFLI_NUM_D 32
9474              
9475             /*
9476             The window size for deflate. Must be a power of two. This should be 32768, the
9477             maximum possible by the deflate spec. Anything less hurts compression more than
9478             speed.
9479             */
9480             #define ZOPFLI_WINDOW_SIZE 32768
9481              
9482             /*
9483             The window mask used to wrap indices into the window. This is why the
9484             window size must be a power of two.
9485             */
9486             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
9487              
9488             /*
9489             A block structure of huge, non-smart, blocks to divide the input into, to allow
9490             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
9491             The whole compression algorithm, including the smarter block splitting, will
9492             be executed independently on each huge block.
9493             Dividing into huge blocks hurts compression, but not much relative to the size.
9494             Set it to 0 to disable master blocks.
9495             */
9496             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
9497              
9498             /*
9499             Used to initialize costs for example
9500             */
9501             #define ZOPFLI_LARGE_FLOAT 1e30
9502              
9503             /*
9504             For longest match cache. max 256. Uses huge amounts of memory but makes it
9505             faster. Uses this many times three bytes per single byte of the input data.
9506             This is so because longest match finding has to find the exact distance
9507             that belongs to each length for the best lz77 strategy.
9508             Good values: e.g. 5, 8.
9509             */
9510             #define ZOPFLI_CACHE_LENGTH 8
9511              
9512             /*
9513             limit the max hash chain hits for this hash value. This has an effect only
9514             on files where the hash value is the same very often. On these files, this
9515             gives worse compression (the value should ideally be 32768, which is the
9516             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
9517             faster on some specific files.
9518             Good value: e.g. 8192.
9519             */
9520             #define ZOPFLI_MAX_CHAIN_HITS 8192
9521              
9522             /*
9523             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
9524             consumes a lot of memory but speeds it up. No effect on compression size.
9525             */
9526             #define ZOPFLI_LONGEST_MATCH_CACHE
9527              
9528             /*
9529             Enable to remember amount of successive identical bytes in the hash chain for
9530             finding longest match
9531             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
9532             This has no effect on the compression result, and enabling it increases speed.
9533             */
9534             #define ZOPFLI_HASH_SAME
9535              
9536             /*
9537             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
9538             best length so far is long enough. This is way faster for files with lots of
9539             identical bytes, on which the compressor is otherwise too slow. Regular files
9540             are unaffected or maybe a tiny bit slower.
9541             This has no effect on the compression result, only on speed.
9542             */
9543             #define ZOPFLI_HASH_SAME_HASH
9544              
9545             /*
9546             Enable this, to avoid slowness for files which are a repetition of the same
9547             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
9548             the compression result.
9549             */
9550             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
9551              
9552             /*
9553             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
9554             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
9555             varies from file to file.
9556             */
9557             #define ZOPFLI_LAZY_MATCHING
9558              
9559             /*
9560             Appends value to dynamically allocated memory, doubling its allocation size
9561             whenever needed.
9562              
9563             value: the value to append, type T
9564             data: pointer to the dynamic array to append to, type T**
9565             size: pointer to the size of the array to append to, type size_t*. This is the
9566             size that you consider the array to be, not the internal allocation size.
9567             Precondition: allocated size of data is at least a power of two greater than or
9568             equal than *size.
9569             */
9570             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
9571             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
9572             if (!((*size) & ((*size) - 1))) {\
9573             /*double alloc size if it's a power of two*/\
9574             void** data_void = reinterpret_cast(data);\
9575             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
9576             : realloc((*data), (*size) * 2 * sizeof(**data));\
9577             }\
9578             (*data)[(*size)] = (value);\
9579             (*size)++;\
9580             }
9581             #else /* C gives problems with strict-aliasing rules for (void**) cast */
9582             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
9583             if (!((*size) & ((*size) - 1))) {\
9584             /*double alloc size if it's a power of two*/\
9585             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
9586             : realloc((*data), (*size) * 2 * sizeof(**data));\
9587             }\
9588             (*data)[(*size)] = (value);\
9589             (*size)++;\
9590             }
9591             #endif
9592              
9593              
9594             #endif /* ZOPFLI_UTIL_H_ */
9595              
9596              
9597             typedef struct ZopfliHash {
9598             int* head; /* Hash value to index of its most recent occurrence. */
9599             unsigned short* prev; /* Index to index of prev. occurrence of same hash. */
9600             int* hashval; /* Index to hash value at this index. */
9601             int val; /* Current hash value. */
9602              
9603             #ifdef ZOPFLI_HASH_SAME_HASH
9604             /* Fields with similar purpose as the above hash, but for the second hash with
9605             a value that is calculated differently. */
9606             int* head2; /* Hash value to index of its most recent occurrence. */
9607             unsigned short* prev2; /* Index to index of prev. occurrence of same hash. */
9608             int* hashval2; /* Index to hash value at this index. */
9609             int val2; /* Current hash value. */
9610             #endif
9611              
9612             #ifdef ZOPFLI_HASH_SAME
9613             unsigned short* same; /* Amount of repetitions of same byte after this .*/
9614             #endif
9615             } ZopfliHash;
9616              
9617             /* Allocates ZopfliHash memory. */
9618             void ZopfliAllocHash(size_t window_size, ZopfliHash* h);
9619              
9620             /* Resets all fields of ZopfliHash. */
9621             void ZopfliResetHash(size_t window_size, ZopfliHash* h);
9622              
9623             /* Frees ZopfliHash memory. */
9624             void ZopfliCleanHash(ZopfliHash* h);
9625              
9626             /*
9627             Updates the hash values based on the current position in the array. All calls
9628             to this must be made for consecutive bytes.
9629             */
9630             void ZopfliUpdateHash(const unsigned char* array, size_t pos, size_t end,
9631             ZopfliHash* h);
9632              
9633             /*
9634             Prepopulates hash:
9635             Fills in the initial values in the hash, before ZopfliUpdateHash can be used
9636             correctly.
9637             */
9638             void ZopfliWarmupHash(const unsigned char* array, size_t pos, size_t end,
9639             ZopfliHash* h);
9640              
9641             #endif /* ZOPFLI_HASH_H_ */
9642              
9643             /* zopfli.h */
9644             /*
9645             Copyright 2011 Google Inc. All Rights Reserved.
9646              
9647             Licensed under the Apache License, Version 2.0 (the "License");
9648             you may not use this file except in compliance with the License.
9649             You may obtain a copy of the License at
9650              
9651             http://www.apache.org/licenses/LICENSE-2.0
9652              
9653             Unless required by applicable law or agreed to in writing, software
9654             distributed under the License is distributed on an "AS IS" BASIS,
9655             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9656             See the License for the specific language governing permissions and
9657             limitations under the License.
9658              
9659             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
9660             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
9661             */
9662              
9663             #ifndef ZOPFLI_ZOPFLI_H_
9664             #define ZOPFLI_ZOPFLI_H_
9665              
9666             #include
9667             #include /* for size_t */
9668              
9669             #ifdef __cplusplus
9670             extern "C" {
9671             #endif
9672              
9673             /*
9674             Options used throughout the program.
9675             */
9676             typedef struct ZopfliOptions {
9677             /* Whether to print output */
9678             int verbose;
9679              
9680             /* Whether to print more detailed output */
9681             int verbose_more;
9682              
9683             /*
9684             Maximum amount of times to rerun forward and backward pass to optimize LZ77
9685             compression cost. Good values: 10, 15 for small files, 5 for files over
9686             several MB in size or it will be too slow.
9687             */
9688             int numiterations;
9689              
9690             /*
9691             If true, splits the data in multiple deflate blocks with optimal choice
9692             for the block boundaries. Block splitting gives better compression. Default:
9693             true (1).
9694             */
9695             int blocksplitting;
9696              
9697             /*
9698             No longer used, left for compatibility.
9699             */
9700             int blocksplittinglast;
9701              
9702             /*
9703             Maximum amount of blocks to split into (0 for unlimited, but this can give
9704             extreme results that hurt compression on some files). Default value: 15.
9705             */
9706             int blocksplittingmax;
9707             } ZopfliOptions;
9708              
9709             /* Initializes options with default values. */
9710             void ZopfliInitOptions(ZopfliOptions* options);
9711              
9712             /* Output format */
9713             typedef enum {
9714             ZOPFLI_FORMAT_GZIP,
9715             ZOPFLI_FORMAT_ZLIB,
9716             ZOPFLI_FORMAT_DEFLATE
9717             } ZopfliFormat;
9718              
9719             /*
9720             Compresses according to the given output format and appends the result to the
9721             output.
9722              
9723             options: global program options
9724             output_type: the output format to use
9725             out: pointer to the dynamic output array to which the result is appended. Must
9726             be freed after use
9727             outsize: pointer to the dynamic output array size
9728             */
9729             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
9730             const unsigned char* in, size_t insize,
9731             unsigned char** out, size_t* outsize);
9732              
9733             #ifdef __cplusplus
9734             } // extern "C"
9735             #endif
9736              
9737             #endif /* ZOPFLI_ZOPFLI_H_ */
9738              
9739              
9740             /*
9741             Stores lit/length and dist pairs for LZ77.
9742             Parameter litlens: Contains the literal symbols or length values.
9743             Parameter dists: Contains the distances. A value is 0 to indicate that there is
9744             no dist and the corresponding litlens value is a literal instead of a length.
9745             Parameter size: The size of both the litlens and dists arrays.
9746             The memory can best be managed by using ZopfliInitLZ77Store to initialize it,
9747             ZopfliCleanLZ77Store to destroy it, and ZopfliStoreLitLenDist to append values.
9748              
9749             */
9750             typedef struct ZopfliLZ77Store {
9751             unsigned short* litlens; /* Lit or len. */
9752             unsigned short* dists; /* If 0: indicates literal in corresponding litlens,
9753             if > 0: length in corresponding litlens, this is the distance. */
9754             size_t size;
9755              
9756             const unsigned char* data; /* original data */
9757             size_t* pos; /* position in data where this LZ77 command begins */
9758              
9759             unsigned short* ll_symbol;
9760             unsigned short* d_symbol;
9761              
9762             /* Cumulative histograms wrapping around per chunk. Each chunk has the amount
9763             of distinct symbols as length, so using 1 value per LZ77 symbol, we have a
9764             precise histogram at every N symbols, and the rest can be calculated by
9765             looping through the actual symbols of this chunk. */
9766             size_t* ll_counts;
9767             size_t* d_counts;
9768             } ZopfliLZ77Store;
9769              
9770             void ZopfliInitLZ77Store(const unsigned char* data, ZopfliLZ77Store* store);
9771             void ZopfliCleanLZ77Store(ZopfliLZ77Store* store);
9772             void ZopfliCopyLZ77Store(const ZopfliLZ77Store* source, ZopfliLZ77Store* dest);
9773             void ZopfliStoreLitLenDist(unsigned short length, unsigned short dist,
9774             size_t pos, ZopfliLZ77Store* store);
9775             void ZopfliAppendLZ77Store(const ZopfliLZ77Store* store,
9776             ZopfliLZ77Store* target);
9777             /* Gets the amount of raw bytes that this range of LZ77 symbols spans. */
9778             size_t ZopfliLZ77GetByteRange(const ZopfliLZ77Store* lz77,
9779             size_t lstart, size_t lend);
9780             /* Gets the histogram of lit/len and dist symbols in the given range, using the
9781             cumulative histograms, so faster than adding one by one for large range. Does
9782             not add the one end symbol of value 256. */
9783             void ZopfliLZ77GetHistogram(const ZopfliLZ77Store* lz77,
9784             size_t lstart, size_t lend,
9785             size_t* ll_counts, size_t* d_counts);
9786              
9787             /*
9788             Some state information for compressing a block.
9789             This is currently a bit under-used (with mainly only the longest match cache),
9790             but is kept for easy future expansion.
9791             */
9792             typedef struct ZopfliBlockState {
9793             const ZopfliOptions* options;
9794              
9795             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
9796             /* Cache for length/distance pairs found so far. */
9797             ZopfliLongestMatchCache* lmc;
9798             #endif
9799              
9800             /* The start (inclusive) and end (not inclusive) of the current block. */
9801             size_t blockstart;
9802             size_t blockend;
9803             } ZopfliBlockState;
9804              
9805             void ZopfliInitBlockState(const ZopfliOptions* options,
9806             size_t blockstart, size_t blockend, int add_lmc,
9807             ZopfliBlockState* s);
9808             void ZopfliCleanBlockState(ZopfliBlockState* s);
9809              
9810             /*
9811             Finds the longest match (length and corresponding distance) for LZ77
9812             compression.
9813             Even when not using "sublen", it can be more efficient to provide an array,
9814             because only then the caching is used.
9815             array: the data
9816             pos: position in the data to find the match for
9817             size: size of the data
9818             limit: limit length to maximum this value (default should be 258). This allows
9819             finding a shorter dist for that length (= less extra bits). Must be
9820             in the range [ZOPFLI_MIN_MATCH, ZOPFLI_MAX_MATCH].
9821             sublen: output array of 259 elements, or null. Has, for each length, the
9822             smallest distance required to reach this length. Only 256 of its 259 values
9823             are used, the first 3 are ignored (the shortest length is 3. It is purely
9824             for convenience that the array is made 3 longer).
9825             */
9826             void ZopfliFindLongestMatch(
9827             ZopfliBlockState *s, const ZopfliHash* h, const unsigned char* array,
9828             size_t pos, size_t size, size_t limit,
9829             unsigned short* sublen, unsigned short* distance, unsigned short* length);
9830              
9831             /*
9832             Verifies if length and dist are indeed valid, only used for assertion.
9833             */
9834             void ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
9835             unsigned short dist, unsigned short length);
9836              
9837             /*
9838             Does LZ77 using an algorithm similar to gzip, with lazy matching, rather than
9839             with the slow but better "squeeze" implementation.
9840             The result is placed in the ZopfliLZ77Store.
9841             If instart is larger than 0, it uses values before instart as starting
9842             dictionary.
9843             */
9844             void ZopfliLZ77Greedy(ZopfliBlockState* s, const unsigned char* in,
9845             size_t instart, size_t inend,
9846             ZopfliLZ77Store* store, ZopfliHash* h);
9847              
9848             #endif /* ZOPFLI_LZ77_H_ */
9849              
9850             /* symbols.h */
9851             /*
9852             Copyright 2016 Google Inc. All Rights Reserved.
9853              
9854             Licensed under the Apache License, Version 2.0 (the "License");
9855             you may not use this file except in compliance with the License.
9856             You may obtain a copy of the License at
9857              
9858             http://www.apache.org/licenses/LICENSE-2.0
9859              
9860             Unless required by applicable law or agreed to in writing, software
9861             distributed under the License is distributed on an "AS IS" BASIS,
9862             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9863             See the License for the specific language governing permissions and
9864             limitations under the License.
9865              
9866             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
9867             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
9868             */
9869              
9870             /*
9871             Utilities for using the lz77 symbols of the deflate spec.
9872             */
9873              
9874             #ifndef ZOPFLI_SYMBOLS_H_
9875             #define ZOPFLI_SYMBOLS_H_
9876              
9877             /* __has_builtin available in clang */
9878             #ifdef __has_builtin
9879             # if __has_builtin(__builtin_clz)
9880             # define ZOPFLI_HAS_BUILTIN_CLZ
9881             # endif
9882             /* __builtin_clz available beginning with GCC 3.4 */
9883             #elif __GNUC__ * 100 + __GNUC_MINOR__ >= 304
9884             # define ZOPFLI_HAS_BUILTIN_CLZ
9885             #endif
9886              
9887             /* Gets the amount of extra bits for the given dist, cfr. the DEFLATE spec. */
9888             static int ZopfliGetDistExtraBits(int dist) {
9889             #ifdef ZOPFLI_HAS_BUILTIN_CLZ
9890             if (dist < 5) return 0;
9891             return (31 ^ __builtin_clz(dist - 1)) - 1; /* log2(dist - 1) - 1 */
9892             #else
9893             if (dist < 5) return 0;
9894             else if (dist < 9) return 1;
9895             else if (dist < 17) return 2;
9896             else if (dist < 33) return 3;
9897             else if (dist < 65) return 4;
9898             else if (dist < 129) return 5;
9899             else if (dist < 257) return 6;
9900             else if (dist < 513) return 7;
9901             else if (dist < 1025) return 8;
9902             else if (dist < 2049) return 9;
9903             else if (dist < 4097) return 10;
9904             else if (dist < 8193) return 11;
9905             else if (dist < 16385) return 12;
9906             else return 13;
9907             #endif
9908             }
9909              
9910             /* Gets value of the extra bits for the given dist, cfr. the DEFLATE spec. */
9911             static int ZopfliGetDistExtraBitsValue(int dist) {
9912             #ifdef ZOPFLI_HAS_BUILTIN_CLZ
9913             if (dist < 5) {
9914             return 0;
9915             } else {
9916             int l = 31 ^ __builtin_clz(dist - 1); /* log2(dist - 1) */
9917             return (dist - (1 + (1 << l))) & ((1 << (l - 1)) - 1);
9918             }
9919             #else
9920             if (dist < 5) return 0;
9921             else if (dist < 9) return (dist - 5) & 1;
9922             else if (dist < 17) return (dist - 9) & 3;
9923             else if (dist < 33) return (dist - 17) & 7;
9924             else if (dist < 65) return (dist - 33) & 15;
9925             else if (dist < 129) return (dist - 65) & 31;
9926             else if (dist < 257) return (dist - 129) & 63;
9927             else if (dist < 513) return (dist - 257) & 127;
9928             else if (dist < 1025) return (dist - 513) & 255;
9929             else if (dist < 2049) return (dist - 1025) & 511;
9930             else if (dist < 4097) return (dist - 2049) & 1023;
9931             else if (dist < 8193) return (dist - 4097) & 2047;
9932             else if (dist < 16385) return (dist - 8193) & 4095;
9933             else return (dist - 16385) & 8191;
9934             #endif
9935             }
9936              
9937             /* Gets the symbol for the given dist, cfr. the DEFLATE spec. */
9938             static int ZopfliGetDistSymbol(int dist) {
9939             #ifdef ZOPFLI_HAS_BUILTIN_CLZ
9940             if (dist < 5) {
9941             return dist - 1;
9942             } else {
9943             int l = (31 ^ __builtin_clz(dist - 1)); /* log2(dist - 1) */
9944             int r = ((dist - 1) >> (l - 1)) & 1;
9945             return l * 2 + r;
9946             }
9947             #else
9948             if (dist < 193) {
9949             if (dist < 13) { /* dist 0..13. */
9950             if (dist < 5) return dist - 1;
9951             else if (dist < 7) return 4;
9952             else if (dist < 9) return 5;
9953             else return 6;
9954             } else { /* dist 13..193. */
9955             if (dist < 17) return 7;
9956             else if (dist < 25) return 8;
9957             else if (dist < 33) return 9;
9958             else if (dist < 49) return 10;
9959             else if (dist < 65) return 11;
9960             else if (dist < 97) return 12;
9961             else if (dist < 129) return 13;
9962             else return 14;
9963             }
9964             } else {
9965             if (dist < 2049) { /* dist 193..2049. */
9966             if (dist < 257) return 15;
9967             else if (dist < 385) return 16;
9968             else if (dist < 513) return 17;
9969             else if (dist < 769) return 18;
9970             else if (dist < 1025) return 19;
9971             else if (dist < 1537) return 20;
9972             else return 21;
9973             } else { /* dist 2049..32768. */
9974             if (dist < 3073) return 22;
9975             else if (dist < 4097) return 23;
9976             else if (dist < 6145) return 24;
9977             else if (dist < 8193) return 25;
9978             else if (dist < 12289) return 26;
9979             else if (dist < 16385) return 27;
9980             else if (dist < 24577) return 28;
9981             else return 29;
9982             }
9983             }
9984             #endif
9985             }
9986              
9987             /* Gets the amount of extra bits for the given length, cfr. the DEFLATE spec. */
9988             static int ZopfliGetLengthExtraBits(int l) {
9989             static const int table[259] = {
9990             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
9991             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
9992             3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
9993             3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
9994             4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
9995             4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
9996             4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
9997             4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
9998             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
9999             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
10000             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
10001             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
10002             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
10003             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
10004             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
10005             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0
10006             };
10007             return table[l];
10008             }
10009              
10010             /* Gets value of the extra bits for the given length, cfr. the DEFLATE spec. */
10011             static int ZopfliGetLengthExtraBitsValue(int l) {
10012             static const int table[259] = {
10013             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 0,
10014             1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5,
10015             6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6,
10016             7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
10017             13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2,
10018             3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10019             10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
10020             29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
10021             18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6,
10022             7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
10023             27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
10024             16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 0
10025             };
10026             return table[l];
10027             }
10028              
10029             /*
10030             Gets the symbol for the given length, cfr. the DEFLATE spec.
10031             Returns the symbol in the range [257-285] (inclusive)
10032             */
10033             static int ZopfliGetLengthSymbol(int l) {
10034             static const int table[259] = {
10035             0, 0, 0, 257, 258, 259, 260, 261, 262, 263, 264,
10036             265, 265, 266, 266, 267, 267, 268, 268,
10037             269, 269, 269, 269, 270, 270, 270, 270,
10038             271, 271, 271, 271, 272, 272, 272, 272,
10039             273, 273, 273, 273, 273, 273, 273, 273,
10040             274, 274, 274, 274, 274, 274, 274, 274,
10041             275, 275, 275, 275, 275, 275, 275, 275,
10042             276, 276, 276, 276, 276, 276, 276, 276,
10043             277, 277, 277, 277, 277, 277, 277, 277,
10044             277, 277, 277, 277, 277, 277, 277, 277,
10045             278, 278, 278, 278, 278, 278, 278, 278,
10046             278, 278, 278, 278, 278, 278, 278, 278,
10047             279, 279, 279, 279, 279, 279, 279, 279,
10048             279, 279, 279, 279, 279, 279, 279, 279,
10049             280, 280, 280, 280, 280, 280, 280, 280,
10050             280, 280, 280, 280, 280, 280, 280, 280,
10051             281, 281, 281, 281, 281, 281, 281, 281,
10052             281, 281, 281, 281, 281, 281, 281, 281,
10053             281, 281, 281, 281, 281, 281, 281, 281,
10054             281, 281, 281, 281, 281, 281, 281, 281,
10055             282, 282, 282, 282, 282, 282, 282, 282,
10056             282, 282, 282, 282, 282, 282, 282, 282,
10057             282, 282, 282, 282, 282, 282, 282, 282,
10058             282, 282, 282, 282, 282, 282, 282, 282,
10059             283, 283, 283, 283, 283, 283, 283, 283,
10060             283, 283, 283, 283, 283, 283, 283, 283,
10061             283, 283, 283, 283, 283, 283, 283, 283,
10062             283, 283, 283, 283, 283, 283, 283, 283,
10063             284, 284, 284, 284, 284, 284, 284, 284,
10064             284, 284, 284, 284, 284, 284, 284, 284,
10065             284, 284, 284, 284, 284, 284, 284, 284,
10066             284, 284, 284, 284, 284, 284, 284, 285
10067             };
10068             return table[l];
10069             }
10070              
10071             /* Gets the amount of extra bits for the given length symbol. */
10072             static int ZopfliGetLengthSymbolExtraBits(int s) {
10073             static const int table[29] = {
10074             0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
10075             3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0
10076             };
10077             return table[s - 257];
10078             }
10079              
10080             /* Gets the amount of extra bits for the given distance symbol. */
10081             static int ZopfliGetDistSymbolExtraBits(int s) {
10082             static const int table[30] = {
10083             0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
10084             9, 9, 10, 10, 11, 11, 12, 12, 13, 13
10085             };
10086             return table[s];
10087             }
10088              
10089             #endif /* ZOPFLI_SYMBOLS_H_ */
10090              
10091             /* util.h */
10092             /*
10093             Copyright 2011 Google Inc. All Rights Reserved.
10094              
10095             Licensed under the Apache License, Version 2.0 (the "License");
10096             you may not use this file except in compliance with the License.
10097             You may obtain a copy of the License at
10098              
10099             http://www.apache.org/licenses/LICENSE-2.0
10100              
10101             Unless required by applicable law or agreed to in writing, software
10102             distributed under the License is distributed on an "AS IS" BASIS,
10103             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10104             See the License for the specific language governing permissions and
10105             limitations under the License.
10106              
10107             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
10108             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
10109             */
10110              
10111             /*
10112             Several utilities, including: #defines to try different compression results,
10113             basic deflate specification values and generic program options.
10114             */
10115              
10116             #ifndef ZOPFLI_UTIL_H_
10117             #define ZOPFLI_UTIL_H_
10118              
10119             #include
10120             #include
10121              
10122             /* Minimum and maximum length that can be encoded in deflate. */
10123             #define ZOPFLI_MAX_MATCH 258
10124             #define ZOPFLI_MIN_MATCH 3
10125              
10126             /* Number of distinct literal/length and distance symbols in DEFLATE */
10127             #define ZOPFLI_NUM_LL 288
10128             #define ZOPFLI_NUM_D 32
10129              
10130             /*
10131             The window size for deflate. Must be a power of two. This should be 32768, the
10132             maximum possible by the deflate spec. Anything less hurts compression more than
10133             speed.
10134             */
10135             #define ZOPFLI_WINDOW_SIZE 32768
10136              
10137             /*
10138             The window mask used to wrap indices into the window. This is why the
10139             window size must be a power of two.
10140             */
10141             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
10142              
10143             /*
10144             A block structure of huge, non-smart, blocks to divide the input into, to allow
10145             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
10146             The whole compression algorithm, including the smarter block splitting, will
10147             be executed independently on each huge block.
10148             Dividing into huge blocks hurts compression, but not much relative to the size.
10149             Set it to 0 to disable master blocks.
10150             */
10151             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
10152              
10153             /*
10154             Used to initialize costs for example
10155             */
10156             #define ZOPFLI_LARGE_FLOAT 1e30
10157              
10158             /*
10159             For longest match cache. max 256. Uses huge amounts of memory but makes it
10160             faster. Uses this many times three bytes per single byte of the input data.
10161             This is so because longest match finding has to find the exact distance
10162             that belongs to each length for the best lz77 strategy.
10163             Good values: e.g. 5, 8.
10164             */
10165             #define ZOPFLI_CACHE_LENGTH 8
10166              
10167             /*
10168             limit the max hash chain hits for this hash value. This has an effect only
10169             on files where the hash value is the same very often. On these files, this
10170             gives worse compression (the value should ideally be 32768, which is the
10171             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
10172             faster on some specific files.
10173             Good value: e.g. 8192.
10174             */
10175             #define ZOPFLI_MAX_CHAIN_HITS 8192
10176              
10177             /*
10178             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
10179             consumes a lot of memory but speeds it up. No effect on compression size.
10180             */
10181             #define ZOPFLI_LONGEST_MATCH_CACHE
10182              
10183             /*
10184             Enable to remember amount of successive identical bytes in the hash chain for
10185             finding longest match
10186             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
10187             This has no effect on the compression result, and enabling it increases speed.
10188             */
10189             #define ZOPFLI_HASH_SAME
10190              
10191             /*
10192             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
10193             best length so far is long enough. This is way faster for files with lots of
10194             identical bytes, on which the compressor is otherwise too slow. Regular files
10195             are unaffected or maybe a tiny bit slower.
10196             This has no effect on the compression result, only on speed.
10197             */
10198             #define ZOPFLI_HASH_SAME_HASH
10199              
10200             /*
10201             Enable this, to avoid slowness for files which are a repetition of the same
10202             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
10203             the compression result.
10204             */
10205             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
10206              
10207             /*
10208             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
10209             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
10210             varies from file to file.
10211             */
10212             #define ZOPFLI_LAZY_MATCHING
10213              
10214             /*
10215             Appends value to dynamically allocated memory, doubling its allocation size
10216             whenever needed.
10217              
10218             value: the value to append, type T
10219             data: pointer to the dynamic array to append to, type T**
10220             size: pointer to the size of the array to append to, type size_t*. This is the
10221             size that you consider the array to be, not the internal allocation size.
10222             Precondition: allocated size of data is at least a power of two greater than or
10223             equal than *size.
10224             */
10225             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
10226             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
10227             if (!((*size) & ((*size) - 1))) {\
10228             /*double alloc size if it's a power of two*/\
10229             void** data_void = reinterpret_cast(data);\
10230             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
10231             : realloc((*data), (*size) * 2 * sizeof(**data));\
10232             }\
10233             (*data)[(*size)] = (value);\
10234             (*size)++;\
10235             }
10236             #else /* C gives problems with strict-aliasing rules for (void**) cast */
10237             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
10238             if (!((*size) & ((*size) - 1))) {\
10239             /*double alloc size if it's a power of two*/\
10240             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
10241             : realloc((*data), (*size) * 2 * sizeof(**data));\
10242             }\
10243             (*data)[(*size)] = (value);\
10244             (*size)++;\
10245             }
10246             #endif
10247              
10248              
10249             #endif /* ZOPFLI_UTIL_H_ */
10250              
10251              
10252             #include
10253             #include
10254             #include
10255              
10256 82           void ZopfliInitLZ77Store(const unsigned char* data, ZopfliLZ77Store* store) {
10257 82           store->size = 0;
10258 82           store->litlens = 0;
10259 82           store->dists = 0;
10260 82           store->pos = 0;
10261 82           store->data = data;
10262 82           store->ll_symbol = 0;
10263 82           store->d_symbol = 0;
10264 82           store->ll_counts = 0;
10265 82           store->d_counts = 0;
10266 82           }
10267              
10268 82           void ZopfliCleanLZ77Store(ZopfliLZ77Store* store) {
10269 82           free(store->litlens);
10270 82           free(store->dists);
10271 82           free(store->pos);
10272 82           free(store->ll_symbol);
10273 82           free(store->d_symbol);
10274 82           free(store->ll_counts);
10275 82           free(store->d_counts);
10276 82           }
10277              
10278 8           static size_t CeilDiv(size_t a, size_t b) {
10279 8           return (a + b - 1) / b;
10280             }
10281              
10282 4           void ZopfliCopyLZ77Store(
10283             const ZopfliLZ77Store* source, ZopfliLZ77Store* dest) {
10284             size_t i;
10285 4           size_t llsize = ZOPFLI_NUM_LL * CeilDiv(source->size, ZOPFLI_NUM_LL);
10286 4           size_t dsize = ZOPFLI_NUM_D * CeilDiv(source->size, ZOPFLI_NUM_D);
10287 4           ZopfliCleanLZ77Store(dest);
10288 4           ZopfliInitLZ77Store(source->data, dest);
10289 4           dest->litlens =
10290 4           (unsigned short*)malloc(sizeof(*dest->litlens) * source->size);
10291 4           dest->dists = (unsigned short*)malloc(sizeof(*dest->dists) * source->size);
10292 4           dest->pos = (size_t*)malloc(sizeof(*dest->pos) * source->size);
10293 4           dest->ll_symbol =
10294 4           (unsigned short*)malloc(sizeof(*dest->ll_symbol) * source->size);
10295 4           dest->d_symbol =
10296 4           (unsigned short*)malloc(sizeof(*dest->d_symbol) * source->size);
10297 4           dest->ll_counts = (size_t*)malloc(sizeof(*dest->ll_counts) * llsize);
10298 4           dest->d_counts = (size_t*)malloc(sizeof(*dest->d_counts) * dsize);
10299              
10300             /* Allocation failed. */
10301 4 50         if (!dest->litlens || !dest->dists) exit(-1);
    50          
10302 4 50         if (!dest->pos) exit(-1);
10303 4 50         if (!dest->ll_symbol || !dest->d_symbol) exit(-1);
    50          
10304 4 50         if (!dest->ll_counts || !dest->d_counts) exit(-1);
    50          
10305              
10306 4           dest->size = source->size;
10307 68 100         for (i = 0; i < source->size; i++) {
10308 64           dest->litlens[i] = source->litlens[i];
10309 64           dest->dists[i] = source->dists[i];
10310 64           dest->pos[i] = source->pos[i];
10311 64           dest->ll_symbol[i] = source->ll_symbol[i];
10312 64           dest->d_symbol[i] = source->d_symbol[i];
10313             }
10314 1156 100         for (i = 0; i < llsize; i++) {
10315 1152           dest->ll_counts[i] = source->ll_counts[i];
10316             }
10317 164 100         for (i = 0; i < dsize; i++) {
10318 160           dest->d_counts[i] = source->d_counts[i];
10319             }
10320 4           }
10321              
10322             /*
10323             Appends the length and distance to the LZ77 arrays of the ZopfliLZ77Store.
10324             context must be a ZopfliLZ77Store*.
10325             */
10326 1216           void ZopfliStoreLitLenDist(unsigned short length, unsigned short dist,
10327             size_t pos, ZopfliLZ77Store* store) {
10328             size_t i;
10329             /* Needed for using ZOPFLI_APPEND_DATA multiple times. */
10330 1216           size_t origsize = store->size;
10331 1216           size_t llstart = ZOPFLI_NUM_LL * (origsize / ZOPFLI_NUM_LL);
10332 1216           size_t dstart = ZOPFLI_NUM_D * (origsize / ZOPFLI_NUM_D);
10333              
10334             /* Everytime the index wraps around, a new cumulative histogram is made: we're
10335             keeping one histogram value per LZ77 symbol rather than a full histogram for
10336             each to save memory. */
10337 1216 100         if (origsize % ZOPFLI_NUM_LL == 0) {
10338 74           size_t llsize = origsize;
10339 21386 100         for (i = 0; i < ZOPFLI_NUM_LL; i++) {
10340 21312 100         ZOPFLI_APPEND_DATA(
    100          
    50          
10341             origsize == 0 ? 0 : store->ll_counts[origsize - ZOPFLI_NUM_LL + i],
10342             &store->ll_counts, &llsize);
10343             }
10344             }
10345 1216 100         if (origsize % ZOPFLI_NUM_D == 0) {
10346 93           size_t dsize = origsize;
10347 3069 100         for (i = 0; i < ZOPFLI_NUM_D; i++) {
10348 2976 100         ZOPFLI_APPEND_DATA(
    100          
    100          
10349             origsize == 0 ? 0 : store->d_counts[origsize - ZOPFLI_NUM_D + i],
10350             &store->d_counts, &dsize);
10351             }
10352             }
10353              
10354 1216 100         ZOPFLI_APPEND_DATA(length, &store->litlens, &store->size);
    100          
10355 1216           store->size = origsize;
10356 1216 100         ZOPFLI_APPEND_DATA(dist, &store->dists, &store->size);
    100          
10357 1216           store->size = origsize;
10358 1216 100         ZOPFLI_APPEND_DATA(pos, &store->pos, &store->size);
    100          
10359             assert(length < 259);
10360              
10361 1216 100         if (dist == 0) {
10362 513           store->size = origsize;
10363 513 100         ZOPFLI_APPEND_DATA(length, &store->ll_symbol, &store->size);
    100          
10364 513           store->size = origsize;
10365 513 100         ZOPFLI_APPEND_DATA(0, &store->d_symbol, &store->size);
    100          
10366 513           store->ll_counts[llstart + length]++;
10367             } else {
10368 703           store->size = origsize;
10369 703 100         ZOPFLI_APPEND_DATA(ZopfliGetLengthSymbol(length),
    100          
10370             &store->ll_symbol, &store->size);
10371 703           store->size = origsize;
10372 703 100         ZOPFLI_APPEND_DATA(ZopfliGetDistSymbol(dist),
    100          
10373             &store->d_symbol, &store->size);
10374 703           store->ll_counts[llstart + ZopfliGetLengthSymbol(length)]++;
10375 703           store->d_counts[dstart + ZopfliGetDistSymbol(dist)]++;
10376             }
10377 1216           }
10378              
10379 4           void ZopfliAppendLZ77Store(const ZopfliLZ77Store* store,
10380             ZopfliLZ77Store* target) {
10381             size_t i;
10382 68 100         for (i = 0; i < store->size; i++) {
10383 64           ZopfliStoreLitLenDist(store->litlens[i], store->dists[i],
10384 64           store->pos[i], target);
10385             }
10386 4           }
10387              
10388 204           size_t ZopfliLZ77GetByteRange(const ZopfliLZ77Store* lz77,
10389             size_t lstart, size_t lend) {
10390 204           size_t l = lend - 1;
10391 204 50         if (lstart == lend) return 0;
10392 204 100         return lz77->pos[l] + ((lz77->dists[l] == 0) ?
10393 378           1 : lz77->litlens[l]) - lz77->pos[lstart];
10394             }
10395              
10396 0           static void ZopfliLZ77GetHistogramAt(const ZopfliLZ77Store* lz77, size_t lpos,
10397             size_t* ll_counts, size_t* d_counts) {
10398             /* The real histogram is created by using the histogram for this chunk, but
10399             all superfluous values of this chunk subtracted. */
10400 0           size_t llpos = ZOPFLI_NUM_LL * (lpos / ZOPFLI_NUM_LL);
10401 0           size_t dpos = ZOPFLI_NUM_D * (lpos / ZOPFLI_NUM_D);
10402             size_t i;
10403 0 0         for (i = 0; i < ZOPFLI_NUM_LL; i++) {
10404 0           ll_counts[i] = lz77->ll_counts[llpos + i];
10405             }
10406 0 0         for (i = lpos + 1; i < llpos + ZOPFLI_NUM_LL && i < lz77->size; i++) {
    0          
10407 0           ll_counts[lz77->ll_symbol[i]]--;
10408             }
10409 0 0         for (i = 0; i < ZOPFLI_NUM_D; i++) {
10410 0           d_counts[i] = lz77->d_counts[dpos + i];
10411             }
10412 0 0         for (i = lpos + 1; i < dpos + ZOPFLI_NUM_D && i < lz77->size; i++) {
    0          
10413 0 0         if (lz77->dists[i] != 0) d_counts[lz77->d_symbol[i]]--;
10414             }
10415 0           }
10416              
10417 261           void ZopfliLZ77GetHistogram(const ZopfliLZ77Store* lz77,
10418             size_t lstart, size_t lend,
10419             size_t* ll_counts, size_t* d_counts) {
10420             size_t i;
10421 261 50         if (lstart + ZOPFLI_NUM_LL * 3 > lend) {
10422 261           memset(ll_counts, 0, sizeof(*ll_counts) * ZOPFLI_NUM_LL);
10423 261           memset(d_counts, 0, sizeof(*d_counts) * ZOPFLI_NUM_D);
10424 4676 100         for (i = lstart; i < lend; i++) {
10425 4415           ll_counts[lz77->ll_symbol[i]]++;
10426 4415 100         if (lz77->dists[i] != 0) d_counts[lz77->d_symbol[i]]++;
10427             }
10428             } else {
10429             /* Subtract the cumulative histograms at the end and the start to get the
10430             histogram for this range. */
10431 0           ZopfliLZ77GetHistogramAt(lz77, lend - 1, ll_counts, d_counts);
10432 0 0         if (lstart > 0) {
10433             size_t ll_counts2[ZOPFLI_NUM_LL];
10434             size_t d_counts2[ZOPFLI_NUM_D];
10435 0           ZopfliLZ77GetHistogramAt(lz77, lstart - 1, ll_counts2, d_counts2);
10436              
10437 0 0         for (i = 0; i < ZOPFLI_NUM_LL; i++) {
10438 0           ll_counts[i] -= ll_counts2[i];
10439             }
10440 0 0         for (i = 0; i < ZOPFLI_NUM_D; i++) {
10441 0           d_counts[i] -= d_counts2[i];
10442             }
10443             }
10444             }
10445 261           }
10446              
10447 11           void ZopfliInitBlockState(const ZopfliOptions* options,
10448             size_t blockstart, size_t blockend, int add_lmc,
10449             ZopfliBlockState* s) {
10450 11           s->options = options;
10451 11           s->blockstart = blockstart;
10452 11           s->blockend = blockend;
10453             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
10454 11 100         if (add_lmc) {
10455 8           s->lmc = (ZopfliLongestMatchCache*)malloc(sizeof(ZopfliLongestMatchCache));
10456 8           ZopfliInitCache(blockend - blockstart, s->lmc);
10457             } else {
10458 3           s->lmc = 0;
10459             }
10460             #endif
10461 11           }
10462              
10463 11           void ZopfliCleanBlockState(ZopfliBlockState* s) {
10464             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
10465 11 100         if (s->lmc) {
10466 8           ZopfliCleanCache(s->lmc);
10467 8           free(s->lmc);
10468             }
10469             #endif
10470 11           }
10471              
10472             /*
10473             Gets a score of the length given the distance. Typically, the score of the
10474             length is the length itself, but if the distance is very long, decrease the
10475             score of the length a bit to make up for the fact that long distances use large
10476             amounts of extra bits.
10477              
10478             This is not an accurate score, it is a heuristic only for the greedy LZ77
10479             implementation. More accurate cost models are employed later. Making this
10480             heuristic more accurate may hurt rather than improve compression.
10481              
10482             The two direct uses of this heuristic are:
10483             -avoid using a length of 3 in combination with a long distance. This only has
10484             an effect if length == 3.
10485             -make a slightly better choice between the two options of the lazy matching.
10486              
10487             Indirectly, this affects:
10488             -the block split points if the default of block splitting first is used, in a
10489             rather unpredictable way
10490             -the first zopfli run, so it affects the chance of the first run being closer
10491             to the optimal output
10492             */
10493 268           static int GetLengthScore(int length, int distance) {
10494             /*
10495             At 1024, the distance uses 9+ extra bits and this seems to be the sweet spot
10496             on tested files.
10497             */
10498 268 50         return distance > 1024 ? length - 1 : length;
10499             }
10500              
10501 666           void ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
10502             unsigned short dist, unsigned short length) {
10503              
10504             /* TODO(lode): make this only run in a debug compile, it's for assert only. */
10505             size_t i;
10506              
10507             assert(pos + length <= datasize);
10508 165420 100         for (i = 0; i < length; i++) {
10509 164754 50         if (data[pos - dist + i] != data[pos + i]) {
10510             assert(data[pos - dist + i] == data[pos + i]);
10511 0           break;
10512             }
10513             }
10514 666           }
10515              
10516             /*
10517             Finds how long the match of scan and match is. Can be used to find how many
10518             bytes starting from scan, and from match, are equal. Returns the last byte
10519             after scan, which is still equal to the correspondinb byte after match.
10520             scan is the position to compare
10521             match is the earlier position to compare.
10522             end is the last possible byte, beyond which to stop looking.
10523             safe_end is a few (8) bytes before end, for comparing multiple bytes at once.
10524             */
10525 48340           static const unsigned char* GetMatch(const unsigned char* scan,
10526             const unsigned char* match,
10527             const unsigned char* end,
10528             const unsigned char* safe_end) {
10529              
10530             if (sizeof(size_t) == 8) {
10531             /* 8 checks at once per array bounds check (size_t is 64-bit). */
10532 661010 100         while (scan < safe_end && *((size_t*)scan) == *((size_t*)match)) {
    50          
10533 636840           scan += 8;
10534 636840           match += 8;
10535             }
10536             } else if (sizeof(unsigned int) == 4) {
10537             /* 4 checks at once per array bounds check (unsigned int is 32-bit). */
10538             while (scan < safe_end
10539             && *((unsigned int*)scan) == *((unsigned int*)match)) {
10540             scan += 4;
10541             match += 4;
10542             }
10543             } else {
10544             /* do 8 checks at once per array bounds check. */
10545             while (scan < safe_end && *scan == *match && *++scan == *++match
10546             && *++scan == *++match && *++scan == *++match
10547             && *++scan == *++match && *++scan == *++match
10548             && *++scan == *++match && *++scan == *++match) {
10549             scan++; match++;
10550             }
10551             }
10552              
10553             /* The remaining few bytes. */
10554 89156 100         while (scan != end && *scan == *match) {
    50          
10555 64986           scan++; match++;
10556             }
10557              
10558 24170           return scan;
10559             }
10560              
10561             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
10562             /*
10563             Gets distance, length and sublen values from the cache if possible.
10564             Returns 1 if it got the values from the cache, 0 if not.
10565             Updates the limit value to a smaller one if possible with more limited
10566             information from the cache.
10567             */
10568 147606           static int TryGetFromLongestMatchCache(ZopfliBlockState* s,
10569             size_t pos, size_t* limit,
10570             unsigned short* sublen, unsigned short* distance, unsigned short* length) {
10571             /* The LMC cache starts at the beginning of the block rather than the
10572             beginning of the whole array. */
10573 147606           size_t lmcpos = pos - s->blockstart;
10574              
10575             /* Length > 0 and dist 0 is invalid combination, which indicates on purpose
10576             that this cache value is not filled in yet. */
10577 147606 100         unsigned char cache_available = s->lmc && (s->lmc->length[lmcpos] == 0 ||
    50          
    100          
10578 147539           s->lmc->dist[lmcpos] != 0);
10579 147620 100         unsigned char limit_ok_for_cache = cache_available &&
    100          
10580 14 50         (*limit == ZOPFLI_MAX_MATCH || s->lmc->length[lmcpos] <= *limit ||
    50          
10581 0 0         (sublen && ZopfliMaxCachedSublen(s->lmc,
10582 0           lmcpos, s->lmc->length[lmcpos]) >= *limit));
10583              
10584 147606 100         if (s->lmc && limit_ok_for_cache && cache_available) {
    100          
    50          
10585 245164           if (!sublen || s->lmc->length[lmcpos]
10586 122310           <= ZopfliMaxCachedSublen(s->lmc, lmcpos, s->lmc->length[lmcpos])) {
10587 122854           *length = s->lmc->length[lmcpos];
10588 122854 50         if (*length > *limit) *length = *limit;
10589 122854 100         if (sublen) {
10590 122310           ZopfliCacheToSublen(s->lmc, lmcpos, *length, sublen);
10591 122310           *distance = sublen[*length];
10592 122310 50         if (*limit == ZOPFLI_MAX_MATCH && *length >= ZOPFLI_MIN_MATCH) {
10593             assert(sublen[*length] == s->lmc->dist[lmcpos]);
10594             }
10595             } else {
10596 544           *distance = s->lmc->dist[lmcpos];
10597             }
10598 122854           return 1;
10599             }
10600             /* Can't use much of the cache, since the "sublens" need to be calculated,
10601             but at least we already know when to stop. */
10602 0           *limit = s->lmc->length[lmcpos];
10603             }
10604              
10605 24752           return 0;
10606             }
10607              
10608             /*
10609             Stores the found sublen, distance and length in the longest match cache, if
10610             possible.
10611             */
10612 24622           static void StoreInLongestMatchCache(ZopfliBlockState* s,
10613             size_t pos, size_t limit,
10614             const unsigned short* sublen,
10615             unsigned short distance, unsigned short length) {
10616             /* The LMC cache starts at the beginning of the block rather than the
10617             beginning of the whole array. */
10618 24622           size_t lmcpos = pos - s->blockstart;
10619              
10620             /* Length > 0 and dist 0 is invalid combination, which indicates on purpose
10621             that this cache value is not filled in yet. */
10622 24622 100         unsigned char cache_available = s->lmc && (s->lmc->length[lmcpos] == 0 ||
    50          
    100          
10623 24555           s->lmc->dist[lmcpos] != 0);
10624              
10625 24622 100         if (s->lmc && limit == ZOPFLI_MAX_MATCH && sublen && !cache_available) {
    100          
    50          
    50          
10626             assert(s->lmc->length[lmcpos] == 1 && s->lmc->dist[lmcpos] == 0);
10627 17468 50         s->lmc->dist[lmcpos] = length < ZOPFLI_MIN_MATCH ? 0 : distance;
10628 17468 50         s->lmc->length[lmcpos] = length < ZOPFLI_MIN_MATCH ? 0 : length;
10629             assert(!(s->lmc->length[lmcpos] == 1 && s->lmc->dist[lmcpos] == 0));
10630 17468           ZopfliSublenToCache(sublen, lmcpos, length, s->lmc);
10631             }
10632 24622           }
10633             #endif
10634              
10635 147606           void ZopfliFindLongestMatch(ZopfliBlockState* s, const ZopfliHash* h,
10636             const unsigned char* array,
10637             size_t pos, size_t size, size_t limit,
10638             unsigned short* sublen, unsigned short* distance, unsigned short* length) {
10639 147606           unsigned short hpos = pos & ZOPFLI_WINDOW_MASK, p, pp;
10640 147606           unsigned short bestdist = 0;
10641 147606           unsigned short bestlength = 1;
10642             const unsigned char* scan;
10643             const unsigned char* match;
10644             const unsigned char* arrayend;
10645             const unsigned char* arrayend_safe;
10646             #if ZOPFLI_MAX_CHAIN_HITS < ZOPFLI_WINDOW_SIZE
10647 147606           int chain_counter = ZOPFLI_MAX_CHAIN_HITS; /* For quitting early. */
10648             #endif
10649              
10650 147606           unsigned dist = 0; /* Not unsigned short on purpose. */
10651              
10652 147606           int* hhead = h->head;
10653 147606           unsigned short* hprev = h->prev;
10654 147606           int* hhashval = h->hashval;
10655 147606           int hval = h->val;
10656              
10657             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
10658 147606 100         if (TryGetFromLongestMatchCache(s, pos, &limit, sublen, distance, length)) {
10659             assert(pos + *length <= size);
10660 122854           return;
10661             }
10662             #endif
10663              
10664             assert(limit <= ZOPFLI_MAX_MATCH);
10665             assert(limit >= ZOPFLI_MIN_MATCH);
10666             assert(pos < size);
10667              
10668 24752 100         if (size - pos < ZOPFLI_MIN_MATCH) {
10669             /* The rest of the code assumes there are at least ZOPFLI_MIN_MATCH bytes to
10670             try. */
10671 130           *length = 0;
10672 130           *distance = 0;
10673 130           return;
10674             }
10675              
10676 24622 100         if (pos + limit > size) {
10677 7063           limit = size - pos;
10678             }
10679 24622           arrayend = &array[pos] + limit;
10680 24622           arrayend_safe = arrayend - 8;
10681              
10682             assert(hval < 65536);
10683              
10684 24622           pp = hhead[hval]; /* During the whole loop, p == hprev[pp]. */
10685 24622           p = hprev[pp];
10686              
10687             assert(pp == hpos);
10688              
10689 24622 100         dist = p < pp ? pp - p : ((ZOPFLI_WINDOW_SIZE - p) + pp);
10690              
10691             /* Go through all distances. */
10692 24622 100         while (dist < ZOPFLI_WINDOW_SIZE) {
10693 24170           unsigned short currentlength = 0;
10694              
10695             assert(p < ZOPFLI_WINDOW_SIZE);
10696             assert(p == hprev[pp]);
10697             assert(hhashval[p] == hval);
10698              
10699 24170 50         if (dist > 0) {
10700             assert(pos < size);
10701             assert(dist <= pos);
10702 24170           scan = &array[pos];
10703 24170           match = &array[pos - dist];
10704              
10705             /* Testing the byte at position bestlength first, goes slightly faster. */
10706 24170 50         if (pos + bestlength >= size
10707 24170 50         || *(scan + bestlength) == *(match + bestlength)) {
10708              
10709             #ifdef ZOPFLI_HASH_SAME
10710 24170           unsigned short same0 = h->same[pos & ZOPFLI_WINDOW_MASK];
10711 24170 50         if (same0 > 2 && *scan == *match) {
    0          
10712 0           unsigned short same1 = h->same[(pos - dist) & ZOPFLI_WINDOW_MASK];
10713 0           unsigned short same = same0 < same1 ? same0 : same1;
10714 0 0         if (same > limit) same = limit;
10715 0           scan += same;
10716 0           match += same;
10717             }
10718             #endif
10719 24170           scan = GetMatch(scan, match, arrayend, arrayend_safe);
10720 24170           currentlength = scan - &array[pos]; /* The found length. */
10721             }
10722              
10723 24170 50         if (currentlength > bestlength) {
10724 24170 100         if (sublen) {
10725             unsigned short j;
10726 5153610 100         for (j = bestlength + 1; j <= currentlength; j++) {
10727 5129488           sublen[j] = dist;
10728             }
10729             }
10730 24170           bestdist = dist;
10731 24170           bestlength = currentlength;
10732 24170 50         if (currentlength >= limit) break;
10733             }
10734             }
10735              
10736              
10737             #ifdef ZOPFLI_HASH_SAME_HASH
10738             /* Switch to the other hash once this will be more efficient. */
10739 0 0         if (hhead != h->head2 && bestlength >= h->same[hpos] &&
    0          
    0          
10740 0           h->val2 == h->hashval2[p]) {
10741             /* Now use the hash that encodes the length and first byte. */
10742 0           hhead = h->head2;
10743 0           hprev = h->prev2;
10744 0           hhashval = h->hashval2;
10745 0           hval = h->val2;
10746             }
10747             #endif
10748              
10749 0           pp = p;
10750 0           p = hprev[p];
10751 0 0         if (p == pp) break; /* Uninited prev value. */
10752              
10753 0 0         dist += p < pp ? pp - p : ((ZOPFLI_WINDOW_SIZE - p) + pp);
10754              
10755             #if ZOPFLI_MAX_CHAIN_HITS < ZOPFLI_WINDOW_SIZE
10756 0           chain_counter--;
10757 0 0         if (chain_counter <= 0) break;
10758             #endif
10759             }
10760              
10761             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
10762 24622           StoreInLongestMatchCache(s, pos, limit, sublen, bestdist, bestlength);
10763             #endif
10764              
10765             assert(bestlength <= limit);
10766              
10767 24622           *distance = bestdist;
10768 24622           *length = bestlength;
10769             assert(pos + *length <= size);
10770             }
10771              
10772 7           void ZopfliLZ77Greedy(ZopfliBlockState* s, const unsigned char* in,
10773             size_t instart, size_t inend,
10774             ZopfliLZ77Store* store, ZopfliHash* h) {
10775 7           size_t i = 0, j;
10776             unsigned short leng;
10777             unsigned short dist;
10778             int lengthscore;
10779 7           size_t windowstart = instart > ZOPFLI_WINDOW_SIZE
10780 7 50         ? instart - ZOPFLI_WINDOW_SIZE : 0;
10781             unsigned short dummysublen[259];
10782              
10783             #ifdef ZOPFLI_LAZY_MATCHING
10784             /* Lazy matching. */
10785 7           unsigned prev_length = 0;
10786 7           unsigned prev_match = 0;
10787             int prevlengthscore;
10788 7           int match_available = 0;
10789             #endif
10790              
10791 7 50         if (instart == inend) return;
10792              
10793 7           ZopfliResetHash(ZOPFLI_WINDOW_SIZE, h);
10794 7           ZopfliWarmupHash(in, windowstart, inend, h);
10795 16 100         for (i = windowstart; i < instart; i++) {
10796 9           ZopfliUpdateHash(in, i, inend, h);
10797             }
10798              
10799 141 100         for (i = instart; i < inend; i++) {
10800 134           ZopfliUpdateHash(in, i, inend, h);
10801              
10802 134           ZopfliFindLongestMatch(s, h, in, i, inend, ZOPFLI_MAX_MATCH, dummysublen,
10803             &dist, &leng);
10804 134           lengthscore = GetLengthScore(leng, dist);
10805              
10806             #ifdef ZOPFLI_LAZY_MATCHING
10807             /* Lazy matching. */
10808 134           prevlengthscore = GetLengthScore(prev_length, prev_match);
10809 134 100         if (match_available) {
10810 6           match_available = 0;
10811 6 50         if (lengthscore > prevlengthscore + 1) {
10812 0           ZopfliStoreLitLenDist(in[i - 1], 0, i - 1, store);
10813 0 0         if (lengthscore >= ZOPFLI_MIN_MATCH && leng < ZOPFLI_MAX_MATCH) {
    0          
10814 0           match_available = 1;
10815 0           prev_length = leng;
10816 0           prev_match = dist;
10817 0           continue;
10818             }
10819             } else {
10820             /* Add previous to output. */
10821 6           leng = prev_length;
10822 6           dist = prev_match;
10823 6           lengthscore = prevlengthscore;
10824             /* Add to output. */
10825 6           ZopfliVerifyLenDist(in, inend, i - 1, dist, leng);
10826 6           ZopfliStoreLitLenDist(leng, dist, i - 1, store);
10827 756 100         for (j = 2; j < leng; j++) {
10828             assert(i < inend);
10829 750           i++;
10830 750           ZopfliUpdateHash(in, i, inend, h);
10831             }
10832 6           continue;
10833             }
10834             }
10835 128 100         else if (lengthscore >= ZOPFLI_MIN_MATCH && leng < ZOPFLI_MAX_MATCH) {
    100          
10836 6           match_available = 1;
10837 6           prev_length = leng;
10838 6           prev_match = dist;
10839 6           continue;
10840             }
10841             /* End of lazy matching. */
10842             #endif
10843              
10844             /* Add to output. */
10845 122 100         if (lengthscore >= ZOPFLI_MIN_MATCH) {
10846 68           ZopfliVerifyLenDist(in, inend, i, dist, leng);
10847 68           ZopfliStoreLitLenDist(leng, dist, i, store);
10848             } else {
10849 54           leng = 1;
10850 54           ZopfliStoreLitLenDist(in[i], 0, i, store);
10851             }
10852 17598 100         for (j = 1; j < leng; j++) {
10853             assert(i < inend);
10854 17476           i++;
10855 17476           ZopfliUpdateHash(in, i, inend, h);
10856             }
10857             }
10858             }
10859             /*
10860             Copyright 2011 Google Inc. All Rights Reserved.
10861              
10862             Licensed under the Apache License, Version 2.0 (the "License");
10863             you may not use this file except in compliance with the License.
10864             You may obtain a copy of the License at
10865              
10866             http://www.apache.org/licenses/LICENSE-2.0
10867              
10868             Unless required by applicable law or agreed to in writing, software
10869             distributed under the License is distributed on an "AS IS" BASIS,
10870             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10871             See the License for the specific language governing permissions and
10872             limitations under the License.
10873              
10874             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
10875             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
10876             */
10877              
10878             /* squeeze.h */
10879             /*
10880             Copyright 2011 Google Inc. All Rights Reserved.
10881              
10882             Licensed under the Apache License, Version 2.0 (the "License");
10883             you may not use this file except in compliance with the License.
10884             You may obtain a copy of the License at
10885              
10886             http://www.apache.org/licenses/LICENSE-2.0
10887              
10888             Unless required by applicable law or agreed to in writing, software
10889             distributed under the License is distributed on an "AS IS" BASIS,
10890             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10891             See the License for the specific language governing permissions and
10892             limitations under the License.
10893              
10894             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
10895             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
10896             */
10897              
10898             /*
10899             The squeeze functions do enhanced LZ77 compression by optimal parsing with a
10900             cost model, rather than greedily choosing the longest length or using a single
10901             step of lazy matching like regular implementations.
10902              
10903             Since the cost model is based on the Huffman tree that can only be calculated
10904             after the LZ77 data is generated, there is a chicken and egg problem, and
10905             multiple runs are done with updated cost models to converge to a better
10906             solution.
10907             */
10908              
10909             #ifndef ZOPFLI_SQUEEZE_H_
10910             #define ZOPFLI_SQUEEZE_H_
10911              
10912             /* lz77.h */
10913             /*
10914             Copyright 2011 Google Inc. All Rights Reserved.
10915              
10916             Licensed under the Apache License, Version 2.0 (the "License");
10917             you may not use this file except in compliance with the License.
10918             You may obtain a copy of the License at
10919              
10920             http://www.apache.org/licenses/LICENSE-2.0
10921              
10922             Unless required by applicable law or agreed to in writing, software
10923             distributed under the License is distributed on an "AS IS" BASIS,
10924             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10925             See the License for the specific language governing permissions and
10926             limitations under the License.
10927              
10928             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
10929             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
10930             */
10931              
10932             /*
10933             Functions for basic LZ77 compression and utilities for the "squeeze" LZ77
10934             compression.
10935             */
10936              
10937             #ifndef ZOPFLI_LZ77_H_
10938             #define ZOPFLI_LZ77_H_
10939              
10940             #include
10941              
10942             /* cache.h */
10943             /*
10944             Copyright 2011 Google Inc. All Rights Reserved.
10945              
10946             Licensed under the Apache License, Version 2.0 (the "License");
10947             you may not use this file except in compliance with the License.
10948             You may obtain a copy of the License at
10949              
10950             http://www.apache.org/licenses/LICENSE-2.0
10951              
10952             Unless required by applicable law or agreed to in writing, software
10953             distributed under the License is distributed on an "AS IS" BASIS,
10954             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10955             See the License for the specific language governing permissions and
10956             limitations under the License.
10957              
10958             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
10959             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
10960             */
10961              
10962             /*
10963             The cache that speeds up ZopfliFindLongestMatch of lz77.c.
10964             */
10965              
10966             #ifndef ZOPFLI_CACHE_H_
10967             #define ZOPFLI_CACHE_H_
10968              
10969             /* util.h */
10970             /*
10971             Copyright 2011 Google Inc. All Rights Reserved.
10972              
10973             Licensed under the Apache License, Version 2.0 (the "License");
10974             you may not use this file except in compliance with the License.
10975             You may obtain a copy of the License at
10976              
10977             http://www.apache.org/licenses/LICENSE-2.0
10978              
10979             Unless required by applicable law or agreed to in writing, software
10980             distributed under the License is distributed on an "AS IS" BASIS,
10981             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10982             See the License for the specific language governing permissions and
10983             limitations under the License.
10984              
10985             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
10986             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
10987             */
10988              
10989             /*
10990             Several utilities, including: #defines to try different compression results,
10991             basic deflate specification values and generic program options.
10992             */
10993              
10994             #ifndef ZOPFLI_UTIL_H_
10995             #define ZOPFLI_UTIL_H_
10996              
10997             #include
10998             #include
10999              
11000             /* Minimum and maximum length that can be encoded in deflate. */
11001             #define ZOPFLI_MAX_MATCH 258
11002             #define ZOPFLI_MIN_MATCH 3
11003              
11004             /* Number of distinct literal/length and distance symbols in DEFLATE */
11005             #define ZOPFLI_NUM_LL 288
11006             #define ZOPFLI_NUM_D 32
11007              
11008             /*
11009             The window size for deflate. Must be a power of two. This should be 32768, the
11010             maximum possible by the deflate spec. Anything less hurts compression more than
11011             speed.
11012             */
11013             #define ZOPFLI_WINDOW_SIZE 32768
11014              
11015             /*
11016             The window mask used to wrap indices into the window. This is why the
11017             window size must be a power of two.
11018             */
11019             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
11020              
11021             /*
11022             A block structure of huge, non-smart, blocks to divide the input into, to allow
11023             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
11024             The whole compression algorithm, including the smarter block splitting, will
11025             be executed independently on each huge block.
11026             Dividing into huge blocks hurts compression, but not much relative to the size.
11027             Set it to 0 to disable master blocks.
11028             */
11029             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
11030              
11031             /*
11032             Used to initialize costs for example
11033             */
11034             #define ZOPFLI_LARGE_FLOAT 1e30
11035              
11036             /*
11037             For longest match cache. max 256. Uses huge amounts of memory but makes it
11038             faster. Uses this many times three bytes per single byte of the input data.
11039             This is so because longest match finding has to find the exact distance
11040             that belongs to each length for the best lz77 strategy.
11041             Good values: e.g. 5, 8.
11042             */
11043             #define ZOPFLI_CACHE_LENGTH 8
11044              
11045             /*
11046             limit the max hash chain hits for this hash value. This has an effect only
11047             on files where the hash value is the same very often. On these files, this
11048             gives worse compression (the value should ideally be 32768, which is the
11049             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
11050             faster on some specific files.
11051             Good value: e.g. 8192.
11052             */
11053             #define ZOPFLI_MAX_CHAIN_HITS 8192
11054              
11055             /*
11056             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
11057             consumes a lot of memory but speeds it up. No effect on compression size.
11058             */
11059             #define ZOPFLI_LONGEST_MATCH_CACHE
11060              
11061             /*
11062             Enable to remember amount of successive identical bytes in the hash chain for
11063             finding longest match
11064             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
11065             This has no effect on the compression result, and enabling it increases speed.
11066             */
11067             #define ZOPFLI_HASH_SAME
11068              
11069             /*
11070             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
11071             best length so far is long enough. This is way faster for files with lots of
11072             identical bytes, on which the compressor is otherwise too slow. Regular files
11073             are unaffected or maybe a tiny bit slower.
11074             This has no effect on the compression result, only on speed.
11075             */
11076             #define ZOPFLI_HASH_SAME_HASH
11077              
11078             /*
11079             Enable this, to avoid slowness for files which are a repetition of the same
11080             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
11081             the compression result.
11082             */
11083             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
11084              
11085             /*
11086             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
11087             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
11088             varies from file to file.
11089             */
11090             #define ZOPFLI_LAZY_MATCHING
11091              
11092             /*
11093             Appends value to dynamically allocated memory, doubling its allocation size
11094             whenever needed.
11095              
11096             value: the value to append, type T
11097             data: pointer to the dynamic array to append to, type T**
11098             size: pointer to the size of the array to append to, type size_t*. This is the
11099             size that you consider the array to be, not the internal allocation size.
11100             Precondition: allocated size of data is at least a power of two greater than or
11101             equal than *size.
11102             */
11103             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
11104             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
11105             if (!((*size) & ((*size) - 1))) {\
11106             /*double alloc size if it's a power of two*/\
11107             void** data_void = reinterpret_cast(data);\
11108             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
11109             : realloc((*data), (*size) * 2 * sizeof(**data));\
11110             }\
11111             (*data)[(*size)] = (value);\
11112             (*size)++;\
11113             }
11114             #else /* C gives problems with strict-aliasing rules for (void**) cast */
11115             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
11116             if (!((*size) & ((*size) - 1))) {\
11117             /*double alloc size if it's a power of two*/\
11118             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
11119             : realloc((*data), (*size) * 2 * sizeof(**data));\
11120             }\
11121             (*data)[(*size)] = (value);\
11122             (*size)++;\
11123             }
11124             #endif
11125              
11126              
11127             #endif /* ZOPFLI_UTIL_H_ */
11128              
11129              
11130             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
11131              
11132             /*
11133             Cache used by ZopfliFindLongestMatch to remember previously found length/dist
11134             values.
11135             This is needed because the squeeze runs will ask these values multiple times for
11136             the same position.
11137             Uses large amounts of memory, since it has to remember the distance belonging
11138             to every possible shorter-than-the-best length (the so called "sublen" array).
11139             */
11140             typedef struct ZopfliLongestMatchCache {
11141             unsigned short* length;
11142             unsigned short* dist;
11143             unsigned char* sublen;
11144             } ZopfliLongestMatchCache;
11145              
11146             /* Initializes the ZopfliLongestMatchCache. */
11147             void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc);
11148              
11149             /* Frees up the memory of the ZopfliLongestMatchCache. */
11150             void ZopfliCleanCache(ZopfliLongestMatchCache* lmc);
11151              
11152             /* Stores sublen array in the cache. */
11153             void ZopfliSublenToCache(const unsigned short* sublen,
11154             size_t pos, size_t length,
11155             ZopfliLongestMatchCache* lmc);
11156              
11157             /* Extracts sublen array from the cache. */
11158             void ZopfliCacheToSublen(const ZopfliLongestMatchCache* lmc,
11159             size_t pos, size_t length,
11160             unsigned short* sublen);
11161             /* Returns the length up to which could be stored in the cache. */
11162             unsigned ZopfliMaxCachedSublen(const ZopfliLongestMatchCache* lmc,
11163             size_t pos, size_t length);
11164              
11165             #endif /* ZOPFLI_LONGEST_MATCH_CACHE */
11166              
11167             #endif /* ZOPFLI_CACHE_H_ */
11168              
11169             /* hash.h */
11170             /*
11171             Copyright 2011 Google Inc. All Rights Reserved.
11172              
11173             Licensed under the Apache License, Version 2.0 (the "License");
11174             you may not use this file except in compliance with the License.
11175             You may obtain a copy of the License at
11176              
11177             http://www.apache.org/licenses/LICENSE-2.0
11178              
11179             Unless required by applicable law or agreed to in writing, software
11180             distributed under the License is distributed on an "AS IS" BASIS,
11181             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11182             See the License for the specific language governing permissions and
11183             limitations under the License.
11184              
11185             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
11186             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
11187             */
11188              
11189             /*
11190             The hash for ZopfliFindLongestMatch of lz77.c.
11191             */
11192              
11193             #ifndef ZOPFLI_HASH_H_
11194             #define ZOPFLI_HASH_H_
11195              
11196             /* util.h */
11197             /*
11198             Copyright 2011 Google Inc. All Rights Reserved.
11199              
11200             Licensed under the Apache License, Version 2.0 (the "License");
11201             you may not use this file except in compliance with the License.
11202             You may obtain a copy of the License at
11203              
11204             http://www.apache.org/licenses/LICENSE-2.0
11205              
11206             Unless required by applicable law or agreed to in writing, software
11207             distributed under the License is distributed on an "AS IS" BASIS,
11208             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11209             See the License for the specific language governing permissions and
11210             limitations under the License.
11211              
11212             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
11213             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
11214             */
11215              
11216             /*
11217             Several utilities, including: #defines to try different compression results,
11218             basic deflate specification values and generic program options.
11219             */
11220              
11221             #ifndef ZOPFLI_UTIL_H_
11222             #define ZOPFLI_UTIL_H_
11223              
11224             #include
11225             #include
11226              
11227             /* Minimum and maximum length that can be encoded in deflate. */
11228             #define ZOPFLI_MAX_MATCH 258
11229             #define ZOPFLI_MIN_MATCH 3
11230              
11231             /* Number of distinct literal/length and distance symbols in DEFLATE */
11232             #define ZOPFLI_NUM_LL 288
11233             #define ZOPFLI_NUM_D 32
11234              
11235             /*
11236             The window size for deflate. Must be a power of two. This should be 32768, the
11237             maximum possible by the deflate spec. Anything less hurts compression more than
11238             speed.
11239             */
11240             #define ZOPFLI_WINDOW_SIZE 32768
11241              
11242             /*
11243             The window mask used to wrap indices into the window. This is why the
11244             window size must be a power of two.
11245             */
11246             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
11247              
11248             /*
11249             A block structure of huge, non-smart, blocks to divide the input into, to allow
11250             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
11251             The whole compression algorithm, including the smarter block splitting, will
11252             be executed independently on each huge block.
11253             Dividing into huge blocks hurts compression, but not much relative to the size.
11254             Set it to 0 to disable master blocks.
11255             */
11256             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
11257              
11258             /*
11259             Used to initialize costs for example
11260             */
11261             #define ZOPFLI_LARGE_FLOAT 1e30
11262              
11263             /*
11264             For longest match cache. max 256. Uses huge amounts of memory but makes it
11265             faster. Uses this many times three bytes per single byte of the input data.
11266             This is so because longest match finding has to find the exact distance
11267             that belongs to each length for the best lz77 strategy.
11268             Good values: e.g. 5, 8.
11269             */
11270             #define ZOPFLI_CACHE_LENGTH 8
11271              
11272             /*
11273             limit the max hash chain hits for this hash value. This has an effect only
11274             on files where the hash value is the same very often. On these files, this
11275             gives worse compression (the value should ideally be 32768, which is the
11276             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
11277             faster on some specific files.
11278             Good value: e.g. 8192.
11279             */
11280             #define ZOPFLI_MAX_CHAIN_HITS 8192
11281              
11282             /*
11283             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
11284             consumes a lot of memory but speeds it up. No effect on compression size.
11285             */
11286             #define ZOPFLI_LONGEST_MATCH_CACHE
11287              
11288             /*
11289             Enable to remember amount of successive identical bytes in the hash chain for
11290             finding longest match
11291             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
11292             This has no effect on the compression result, and enabling it increases speed.
11293             */
11294             #define ZOPFLI_HASH_SAME
11295              
11296             /*
11297             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
11298             best length so far is long enough. This is way faster for files with lots of
11299             identical bytes, on which the compressor is otherwise too slow. Regular files
11300             are unaffected or maybe a tiny bit slower.
11301             This has no effect on the compression result, only on speed.
11302             */
11303             #define ZOPFLI_HASH_SAME_HASH
11304              
11305             /*
11306             Enable this, to avoid slowness for files which are a repetition of the same
11307             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
11308             the compression result.
11309             */
11310             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
11311              
11312             /*
11313             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
11314             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
11315             varies from file to file.
11316             */
11317             #define ZOPFLI_LAZY_MATCHING
11318              
11319             /*
11320             Appends value to dynamically allocated memory, doubling its allocation size
11321             whenever needed.
11322              
11323             value: the value to append, type T
11324             data: pointer to the dynamic array to append to, type T**
11325             size: pointer to the size of the array to append to, type size_t*. This is the
11326             size that you consider the array to be, not the internal allocation size.
11327             Precondition: allocated size of data is at least a power of two greater than or
11328             equal than *size.
11329             */
11330             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
11331             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
11332             if (!((*size) & ((*size) - 1))) {\
11333             /*double alloc size if it's a power of two*/\
11334             void** data_void = reinterpret_cast(data);\
11335             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
11336             : realloc((*data), (*size) * 2 * sizeof(**data));\
11337             }\
11338             (*data)[(*size)] = (value);\
11339             (*size)++;\
11340             }
11341             #else /* C gives problems with strict-aliasing rules for (void**) cast */
11342             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
11343             if (!((*size) & ((*size) - 1))) {\
11344             /*double alloc size if it's a power of two*/\
11345             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
11346             : realloc((*data), (*size) * 2 * sizeof(**data));\
11347             }\
11348             (*data)[(*size)] = (value);\
11349             (*size)++;\
11350             }
11351             #endif
11352              
11353              
11354             #endif /* ZOPFLI_UTIL_H_ */
11355              
11356              
11357             typedef struct ZopfliHash {
11358             int* head; /* Hash value to index of its most recent occurrence. */
11359             unsigned short* prev; /* Index to index of prev. occurrence of same hash. */
11360             int* hashval; /* Index to hash value at this index. */
11361             int val; /* Current hash value. */
11362              
11363             #ifdef ZOPFLI_HASH_SAME_HASH
11364             /* Fields with similar purpose as the above hash, but for the second hash with
11365             a value that is calculated differently. */
11366             int* head2; /* Hash value to index of its most recent occurrence. */
11367             unsigned short* prev2; /* Index to index of prev. occurrence of same hash. */
11368             int* hashval2; /* Index to hash value at this index. */
11369             int val2; /* Current hash value. */
11370             #endif
11371              
11372             #ifdef ZOPFLI_HASH_SAME
11373             unsigned short* same; /* Amount of repetitions of same byte after this .*/
11374             #endif
11375             } ZopfliHash;
11376              
11377             /* Allocates ZopfliHash memory. */
11378             void ZopfliAllocHash(size_t window_size, ZopfliHash* h);
11379              
11380             /* Resets all fields of ZopfliHash. */
11381             void ZopfliResetHash(size_t window_size, ZopfliHash* h);
11382              
11383             /* Frees ZopfliHash memory. */
11384             void ZopfliCleanHash(ZopfliHash* h);
11385              
11386             /*
11387             Updates the hash values based on the current position in the array. All calls
11388             to this must be made for consecutive bytes.
11389             */
11390             void ZopfliUpdateHash(const unsigned char* array, size_t pos, size_t end,
11391             ZopfliHash* h);
11392              
11393             /*
11394             Prepopulates hash:
11395             Fills in the initial values in the hash, before ZopfliUpdateHash can be used
11396             correctly.
11397             */
11398             void ZopfliWarmupHash(const unsigned char* array, size_t pos, size_t end,
11399             ZopfliHash* h);
11400              
11401             #endif /* ZOPFLI_HASH_H_ */
11402              
11403             /* zopfli.h */
11404             /*
11405             Copyright 2011 Google Inc. All Rights Reserved.
11406              
11407             Licensed under the Apache License, Version 2.0 (the "License");
11408             you may not use this file except in compliance with the License.
11409             You may obtain a copy of the License at
11410              
11411             http://www.apache.org/licenses/LICENSE-2.0
11412              
11413             Unless required by applicable law or agreed to in writing, software
11414             distributed under the License is distributed on an "AS IS" BASIS,
11415             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11416             See the License for the specific language governing permissions and
11417             limitations under the License.
11418              
11419             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
11420             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
11421             */
11422              
11423             #ifndef ZOPFLI_ZOPFLI_H_
11424             #define ZOPFLI_ZOPFLI_H_
11425              
11426             #include
11427             #include /* for size_t */
11428              
11429             #ifdef __cplusplus
11430             extern "C" {
11431             #endif
11432              
11433             /*
11434             Options used throughout the program.
11435             */
11436             typedef struct ZopfliOptions {
11437             /* Whether to print output */
11438             int verbose;
11439              
11440             /* Whether to print more detailed output */
11441             int verbose_more;
11442              
11443             /*
11444             Maximum amount of times to rerun forward and backward pass to optimize LZ77
11445             compression cost. Good values: 10, 15 for small files, 5 for files over
11446             several MB in size or it will be too slow.
11447             */
11448             int numiterations;
11449              
11450             /*
11451             If true, splits the data in multiple deflate blocks with optimal choice
11452             for the block boundaries. Block splitting gives better compression. Default:
11453             true (1).
11454             */
11455             int blocksplitting;
11456              
11457             /*
11458             No longer used, left for compatibility.
11459             */
11460             int blocksplittinglast;
11461              
11462             /*
11463             Maximum amount of blocks to split into (0 for unlimited, but this can give
11464             extreme results that hurt compression on some files). Default value: 15.
11465             */
11466             int blocksplittingmax;
11467             } ZopfliOptions;
11468              
11469             /* Initializes options with default values. */
11470             void ZopfliInitOptions(ZopfliOptions* options);
11471              
11472             /* Output format */
11473             typedef enum {
11474             ZOPFLI_FORMAT_GZIP,
11475             ZOPFLI_FORMAT_ZLIB,
11476             ZOPFLI_FORMAT_DEFLATE
11477             } ZopfliFormat;
11478              
11479             /*
11480             Compresses according to the given output format and appends the result to the
11481             output.
11482              
11483             options: global program options
11484             output_type: the output format to use
11485             out: pointer to the dynamic output array to which the result is appended. Must
11486             be freed after use
11487             outsize: pointer to the dynamic output array size
11488             */
11489             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
11490             const unsigned char* in, size_t insize,
11491             unsigned char** out, size_t* outsize);
11492              
11493             #ifdef __cplusplus
11494             } // extern "C"
11495             #endif
11496              
11497             #endif /* ZOPFLI_ZOPFLI_H_ */
11498              
11499              
11500             /*
11501             Stores lit/length and dist pairs for LZ77.
11502             Parameter litlens: Contains the literal symbols or length values.
11503             Parameter dists: Contains the distances. A value is 0 to indicate that there is
11504             no dist and the corresponding litlens value is a literal instead of a length.
11505             Parameter size: The size of both the litlens and dists arrays.
11506             The memory can best be managed by using ZopfliInitLZ77Store to initialize it,
11507             ZopfliCleanLZ77Store to destroy it, and ZopfliStoreLitLenDist to append values.
11508              
11509             */
11510             typedef struct ZopfliLZ77Store {
11511             unsigned short* litlens; /* Lit or len. */
11512             unsigned short* dists; /* If 0: indicates literal in corresponding litlens,
11513             if > 0: length in corresponding litlens, this is the distance. */
11514             size_t size;
11515              
11516             const unsigned char* data; /* original data */
11517             size_t* pos; /* position in data where this LZ77 command begins */
11518              
11519             unsigned short* ll_symbol;
11520             unsigned short* d_symbol;
11521              
11522             /* Cumulative histograms wrapping around per chunk. Each chunk has the amount
11523             of distinct symbols as length, so using 1 value per LZ77 symbol, we have a
11524             precise histogram at every N symbols, and the rest can be calculated by
11525             looping through the actual symbols of this chunk. */
11526             size_t* ll_counts;
11527             size_t* d_counts;
11528             } ZopfliLZ77Store;
11529              
11530             void ZopfliInitLZ77Store(const unsigned char* data, ZopfliLZ77Store* store);
11531             void ZopfliCleanLZ77Store(ZopfliLZ77Store* store);
11532             void ZopfliCopyLZ77Store(const ZopfliLZ77Store* source, ZopfliLZ77Store* dest);
11533             void ZopfliStoreLitLenDist(unsigned short length, unsigned short dist,
11534             size_t pos, ZopfliLZ77Store* store);
11535             void ZopfliAppendLZ77Store(const ZopfliLZ77Store* store,
11536             ZopfliLZ77Store* target);
11537             /* Gets the amount of raw bytes that this range of LZ77 symbols spans. */
11538             size_t ZopfliLZ77GetByteRange(const ZopfliLZ77Store* lz77,
11539             size_t lstart, size_t lend);
11540             /* Gets the histogram of lit/len and dist symbols in the given range, using the
11541             cumulative histograms, so faster than adding one by one for large range. Does
11542             not add the one end symbol of value 256. */
11543             void ZopfliLZ77GetHistogram(const ZopfliLZ77Store* lz77,
11544             size_t lstart, size_t lend,
11545             size_t* ll_counts, size_t* d_counts);
11546              
11547             /*
11548             Some state information for compressing a block.
11549             This is currently a bit under-used (with mainly only the longest match cache),
11550             but is kept for easy future expansion.
11551             */
11552             typedef struct ZopfliBlockState {
11553             const ZopfliOptions* options;
11554              
11555             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
11556             /* Cache for length/distance pairs found so far. */
11557             ZopfliLongestMatchCache* lmc;
11558             #endif
11559              
11560             /* The start (inclusive) and end (not inclusive) of the current block. */
11561             size_t blockstart;
11562             size_t blockend;
11563             } ZopfliBlockState;
11564              
11565             void ZopfliInitBlockState(const ZopfliOptions* options,
11566             size_t blockstart, size_t blockend, int add_lmc,
11567             ZopfliBlockState* s);
11568             void ZopfliCleanBlockState(ZopfliBlockState* s);
11569              
11570             /*
11571             Finds the longest match (length and corresponding distance) for LZ77
11572             compression.
11573             Even when not using "sublen", it can be more efficient to provide an array,
11574             because only then the caching is used.
11575             array: the data
11576             pos: position in the data to find the match for
11577             size: size of the data
11578             limit: limit length to maximum this value (default should be 258). This allows
11579             finding a shorter dist for that length (= less extra bits). Must be
11580             in the range [ZOPFLI_MIN_MATCH, ZOPFLI_MAX_MATCH].
11581             sublen: output array of 259 elements, or null. Has, for each length, the
11582             smallest distance required to reach this length. Only 256 of its 259 values
11583             are used, the first 3 are ignored (the shortest length is 3. It is purely
11584             for convenience that the array is made 3 longer).
11585             */
11586             void ZopfliFindLongestMatch(
11587             ZopfliBlockState *s, const ZopfliHash* h, const unsigned char* array,
11588             size_t pos, size_t size, size_t limit,
11589             unsigned short* sublen, unsigned short* distance, unsigned short* length);
11590              
11591             /*
11592             Verifies if length and dist are indeed valid, only used for assertion.
11593             */
11594             void ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
11595             unsigned short dist, unsigned short length);
11596              
11597             /*
11598             Does LZ77 using an algorithm similar to gzip, with lazy matching, rather than
11599             with the slow but better "squeeze" implementation.
11600             The result is placed in the ZopfliLZ77Store.
11601             If instart is larger than 0, it uses values before instart as starting
11602             dictionary.
11603             */
11604             void ZopfliLZ77Greedy(ZopfliBlockState* s, const unsigned char* in,
11605             size_t instart, size_t inend,
11606             ZopfliLZ77Store* store, ZopfliHash* h);
11607              
11608             #endif /* ZOPFLI_LZ77_H_ */
11609              
11610              
11611             /*
11612             Calculates lit/len and dist pairs for given data.
11613             If instart is larger than 0, it uses values before instart as starting
11614             dictionary.
11615             */
11616             void ZopfliLZ77Optimal(ZopfliBlockState *s,
11617             const unsigned char* in, size_t instart, size_t inend,
11618             int numiterations,
11619             ZopfliLZ77Store* store);
11620              
11621             /*
11622             Does the same as ZopfliLZ77Optimal, but optimized for the fixed tree of the
11623             deflate standard.
11624             The fixed tree never gives the best compression. But this gives the best
11625             possible LZ77 encoding possible with the fixed tree.
11626             This does not create or output any fixed tree, only LZ77 data optimized for
11627             using with a fixed tree.
11628             If instart is larger than 0, it uses values before instart as starting
11629             dictionary.
11630             */
11631             void ZopfliLZ77OptimalFixed(ZopfliBlockState *s,
11632             const unsigned char* in,
11633             size_t instart, size_t inend,
11634             ZopfliLZ77Store* store);
11635              
11636             #endif /* ZOPFLI_SQUEEZE_H_ */
11637              
11638              
11639             #include
11640             #include
11641             #include
11642              
11643             /* blocksplitter.h */
11644             /*
11645             Copyright 2011 Google Inc. All Rights Reserved.
11646              
11647             Licensed under the Apache License, Version 2.0 (the "License");
11648             you may not use this file except in compliance with the License.
11649             You may obtain a copy of the License at
11650              
11651             http://www.apache.org/licenses/LICENSE-2.0
11652              
11653             Unless required by applicable law or agreed to in writing, software
11654             distributed under the License is distributed on an "AS IS" BASIS,
11655             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11656             See the License for the specific language governing permissions and
11657             limitations under the License.
11658              
11659             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
11660             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
11661             */
11662              
11663             /*
11664             Functions to choose good boundaries for block splitting. Deflate allows encoding
11665             the data in multiple blocks, with a separate Huffman tree for each block. The
11666             Huffman tree itself requires some bytes to encode, so by choosing certain
11667             blocks, you can either hurt, or enhance compression. These functions choose good
11668             ones that enhance it.
11669             */
11670              
11671             #ifndef ZOPFLI_BLOCKSPLITTER_H_
11672             #define ZOPFLI_BLOCKSPLITTER_H_
11673              
11674             #include
11675              
11676             /* lz77.h */
11677             /*
11678             Copyright 2011 Google Inc. All Rights Reserved.
11679              
11680             Licensed under the Apache License, Version 2.0 (the "License");
11681             you may not use this file except in compliance with the License.
11682             You may obtain a copy of the License at
11683              
11684             http://www.apache.org/licenses/LICENSE-2.0
11685              
11686             Unless required by applicable law or agreed to in writing, software
11687             distributed under the License is distributed on an "AS IS" BASIS,
11688             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11689             See the License for the specific language governing permissions and
11690             limitations under the License.
11691              
11692             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
11693             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
11694             */
11695              
11696             /*
11697             Functions for basic LZ77 compression and utilities for the "squeeze" LZ77
11698             compression.
11699             */
11700              
11701             #ifndef ZOPFLI_LZ77_H_
11702             #define ZOPFLI_LZ77_H_
11703              
11704             #include
11705              
11706             /* cache.h */
11707             /*
11708             Copyright 2011 Google Inc. All Rights Reserved.
11709              
11710             Licensed under the Apache License, Version 2.0 (the "License");
11711             you may not use this file except in compliance with the License.
11712             You may obtain a copy of the License at
11713              
11714             http://www.apache.org/licenses/LICENSE-2.0
11715              
11716             Unless required by applicable law or agreed to in writing, software
11717             distributed under the License is distributed on an "AS IS" BASIS,
11718             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11719             See the License for the specific language governing permissions and
11720             limitations under the License.
11721              
11722             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
11723             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
11724             */
11725              
11726             /*
11727             The cache that speeds up ZopfliFindLongestMatch of lz77.c.
11728             */
11729              
11730             #ifndef ZOPFLI_CACHE_H_
11731             #define ZOPFLI_CACHE_H_
11732              
11733             /* util.h */
11734             /*
11735             Copyright 2011 Google Inc. All Rights Reserved.
11736              
11737             Licensed under the Apache License, Version 2.0 (the "License");
11738             you may not use this file except in compliance with the License.
11739             You may obtain a copy of the License at
11740              
11741             http://www.apache.org/licenses/LICENSE-2.0
11742              
11743             Unless required by applicable law or agreed to in writing, software
11744             distributed under the License is distributed on an "AS IS" BASIS,
11745             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11746             See the License for the specific language governing permissions and
11747             limitations under the License.
11748              
11749             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
11750             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
11751             */
11752              
11753             /*
11754             Several utilities, including: #defines to try different compression results,
11755             basic deflate specification values and generic program options.
11756             */
11757              
11758             #ifndef ZOPFLI_UTIL_H_
11759             #define ZOPFLI_UTIL_H_
11760              
11761             #include
11762             #include
11763              
11764             /* Minimum and maximum length that can be encoded in deflate. */
11765             #define ZOPFLI_MAX_MATCH 258
11766             #define ZOPFLI_MIN_MATCH 3
11767              
11768             /* Number of distinct literal/length and distance symbols in DEFLATE */
11769             #define ZOPFLI_NUM_LL 288
11770             #define ZOPFLI_NUM_D 32
11771              
11772             /*
11773             The window size for deflate. Must be a power of two. This should be 32768, the
11774             maximum possible by the deflate spec. Anything less hurts compression more than
11775             speed.
11776             */
11777             #define ZOPFLI_WINDOW_SIZE 32768
11778              
11779             /*
11780             The window mask used to wrap indices into the window. This is why the
11781             window size must be a power of two.
11782             */
11783             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
11784              
11785             /*
11786             A block structure of huge, non-smart, blocks to divide the input into, to allow
11787             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
11788             The whole compression algorithm, including the smarter block splitting, will
11789             be executed independently on each huge block.
11790             Dividing into huge blocks hurts compression, but not much relative to the size.
11791             Set it to 0 to disable master blocks.
11792             */
11793             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
11794              
11795             /*
11796             Used to initialize costs for example
11797             */
11798             #define ZOPFLI_LARGE_FLOAT 1e30
11799              
11800             /*
11801             For longest match cache. max 256. Uses huge amounts of memory but makes it
11802             faster. Uses this many times three bytes per single byte of the input data.
11803             This is so because longest match finding has to find the exact distance
11804             that belongs to each length for the best lz77 strategy.
11805             Good values: e.g. 5, 8.
11806             */
11807             #define ZOPFLI_CACHE_LENGTH 8
11808              
11809             /*
11810             limit the max hash chain hits for this hash value. This has an effect only
11811             on files where the hash value is the same very often. On these files, this
11812             gives worse compression (the value should ideally be 32768, which is the
11813             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
11814             faster on some specific files.
11815             Good value: e.g. 8192.
11816             */
11817             #define ZOPFLI_MAX_CHAIN_HITS 8192
11818              
11819             /*
11820             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
11821             consumes a lot of memory but speeds it up. No effect on compression size.
11822             */
11823             #define ZOPFLI_LONGEST_MATCH_CACHE
11824              
11825             /*
11826             Enable to remember amount of successive identical bytes in the hash chain for
11827             finding longest match
11828             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
11829             This has no effect on the compression result, and enabling it increases speed.
11830             */
11831             #define ZOPFLI_HASH_SAME
11832              
11833             /*
11834             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
11835             best length so far is long enough. This is way faster for files with lots of
11836             identical bytes, on which the compressor is otherwise too slow. Regular files
11837             are unaffected or maybe a tiny bit slower.
11838             This has no effect on the compression result, only on speed.
11839             */
11840             #define ZOPFLI_HASH_SAME_HASH
11841              
11842             /*
11843             Enable this, to avoid slowness for files which are a repetition of the same
11844             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
11845             the compression result.
11846             */
11847             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
11848              
11849             /*
11850             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
11851             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
11852             varies from file to file.
11853             */
11854             #define ZOPFLI_LAZY_MATCHING
11855              
11856             /*
11857             Appends value to dynamically allocated memory, doubling its allocation size
11858             whenever needed.
11859              
11860             value: the value to append, type T
11861             data: pointer to the dynamic array to append to, type T**
11862             size: pointer to the size of the array to append to, type size_t*. This is the
11863             size that you consider the array to be, not the internal allocation size.
11864             Precondition: allocated size of data is at least a power of two greater than or
11865             equal than *size.
11866             */
11867             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
11868             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
11869             if (!((*size) & ((*size) - 1))) {\
11870             /*double alloc size if it's a power of two*/\
11871             void** data_void = reinterpret_cast(data);\
11872             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
11873             : realloc((*data), (*size) * 2 * sizeof(**data));\
11874             }\
11875             (*data)[(*size)] = (value);\
11876             (*size)++;\
11877             }
11878             #else /* C gives problems with strict-aliasing rules for (void**) cast */
11879             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
11880             if (!((*size) & ((*size) - 1))) {\
11881             /*double alloc size if it's a power of two*/\
11882             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
11883             : realloc((*data), (*size) * 2 * sizeof(**data));\
11884             }\
11885             (*data)[(*size)] = (value);\
11886             (*size)++;\
11887             }
11888             #endif
11889              
11890              
11891             #endif /* ZOPFLI_UTIL_H_ */
11892              
11893              
11894             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
11895              
11896             /*
11897             Cache used by ZopfliFindLongestMatch to remember previously found length/dist
11898             values.
11899             This is needed because the squeeze runs will ask these values multiple times for
11900             the same position.
11901             Uses large amounts of memory, since it has to remember the distance belonging
11902             to every possible shorter-than-the-best length (the so called "sublen" array).
11903             */
11904             typedef struct ZopfliLongestMatchCache {
11905             unsigned short* length;
11906             unsigned short* dist;
11907             unsigned char* sublen;
11908             } ZopfliLongestMatchCache;
11909              
11910             /* Initializes the ZopfliLongestMatchCache. */
11911             void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc);
11912              
11913             /* Frees up the memory of the ZopfliLongestMatchCache. */
11914             void ZopfliCleanCache(ZopfliLongestMatchCache* lmc);
11915              
11916             /* Stores sublen array in the cache. */
11917             void ZopfliSublenToCache(const unsigned short* sublen,
11918             size_t pos, size_t length,
11919             ZopfliLongestMatchCache* lmc);
11920              
11921             /* Extracts sublen array from the cache. */
11922             void ZopfliCacheToSublen(const ZopfliLongestMatchCache* lmc,
11923             size_t pos, size_t length,
11924             unsigned short* sublen);
11925             /* Returns the length up to which could be stored in the cache. */
11926             unsigned ZopfliMaxCachedSublen(const ZopfliLongestMatchCache* lmc,
11927             size_t pos, size_t length);
11928              
11929             #endif /* ZOPFLI_LONGEST_MATCH_CACHE */
11930              
11931             #endif /* ZOPFLI_CACHE_H_ */
11932              
11933             /* hash.h */
11934             /*
11935             Copyright 2011 Google Inc. All Rights Reserved.
11936              
11937             Licensed under the Apache License, Version 2.0 (the "License");
11938             you may not use this file except in compliance with the License.
11939             You may obtain a copy of the License at
11940              
11941             http://www.apache.org/licenses/LICENSE-2.0
11942              
11943             Unless required by applicable law or agreed to in writing, software
11944             distributed under the License is distributed on an "AS IS" BASIS,
11945             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11946             See the License for the specific language governing permissions and
11947             limitations under the License.
11948              
11949             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
11950             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
11951             */
11952              
11953             /*
11954             The hash for ZopfliFindLongestMatch of lz77.c.
11955             */
11956              
11957             #ifndef ZOPFLI_HASH_H_
11958             #define ZOPFLI_HASH_H_
11959              
11960             /* util.h */
11961             /*
11962             Copyright 2011 Google Inc. All Rights Reserved.
11963              
11964             Licensed under the Apache License, Version 2.0 (the "License");
11965             you may not use this file except in compliance with the License.
11966             You may obtain a copy of the License at
11967              
11968             http://www.apache.org/licenses/LICENSE-2.0
11969              
11970             Unless required by applicable law or agreed to in writing, software
11971             distributed under the License is distributed on an "AS IS" BASIS,
11972             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11973             See the License for the specific language governing permissions and
11974             limitations under the License.
11975              
11976             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
11977             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
11978             */
11979              
11980             /*
11981             Several utilities, including: #defines to try different compression results,
11982             basic deflate specification values and generic program options.
11983             */
11984              
11985             #ifndef ZOPFLI_UTIL_H_
11986             #define ZOPFLI_UTIL_H_
11987              
11988             #include
11989             #include
11990              
11991             /* Minimum and maximum length that can be encoded in deflate. */
11992             #define ZOPFLI_MAX_MATCH 258
11993             #define ZOPFLI_MIN_MATCH 3
11994              
11995             /* Number of distinct literal/length and distance symbols in DEFLATE */
11996             #define ZOPFLI_NUM_LL 288
11997             #define ZOPFLI_NUM_D 32
11998              
11999             /*
12000             The window size for deflate. Must be a power of two. This should be 32768, the
12001             maximum possible by the deflate spec. Anything less hurts compression more than
12002             speed.
12003             */
12004             #define ZOPFLI_WINDOW_SIZE 32768
12005              
12006             /*
12007             The window mask used to wrap indices into the window. This is why the
12008             window size must be a power of two.
12009             */
12010             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
12011              
12012             /*
12013             A block structure of huge, non-smart, blocks to divide the input into, to allow
12014             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
12015             The whole compression algorithm, including the smarter block splitting, will
12016             be executed independently on each huge block.
12017             Dividing into huge blocks hurts compression, but not much relative to the size.
12018             Set it to 0 to disable master blocks.
12019             */
12020             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
12021              
12022             /*
12023             Used to initialize costs for example
12024             */
12025             #define ZOPFLI_LARGE_FLOAT 1e30
12026              
12027             /*
12028             For longest match cache. max 256. Uses huge amounts of memory but makes it
12029             faster. Uses this many times three bytes per single byte of the input data.
12030             This is so because longest match finding has to find the exact distance
12031             that belongs to each length for the best lz77 strategy.
12032             Good values: e.g. 5, 8.
12033             */
12034             #define ZOPFLI_CACHE_LENGTH 8
12035              
12036             /*
12037             limit the max hash chain hits for this hash value. This has an effect only
12038             on files where the hash value is the same very often. On these files, this
12039             gives worse compression (the value should ideally be 32768, which is the
12040             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
12041             faster on some specific files.
12042             Good value: e.g. 8192.
12043             */
12044             #define ZOPFLI_MAX_CHAIN_HITS 8192
12045              
12046             /*
12047             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
12048             consumes a lot of memory but speeds it up. No effect on compression size.
12049             */
12050             #define ZOPFLI_LONGEST_MATCH_CACHE
12051              
12052             /*
12053             Enable to remember amount of successive identical bytes in the hash chain for
12054             finding longest match
12055             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
12056             This has no effect on the compression result, and enabling it increases speed.
12057             */
12058             #define ZOPFLI_HASH_SAME
12059              
12060             /*
12061             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
12062             best length so far is long enough. This is way faster for files with lots of
12063             identical bytes, on which the compressor is otherwise too slow. Regular files
12064             are unaffected or maybe a tiny bit slower.
12065             This has no effect on the compression result, only on speed.
12066             */
12067             #define ZOPFLI_HASH_SAME_HASH
12068              
12069             /*
12070             Enable this, to avoid slowness for files which are a repetition of the same
12071             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
12072             the compression result.
12073             */
12074             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
12075              
12076             /*
12077             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
12078             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
12079             varies from file to file.
12080             */
12081             #define ZOPFLI_LAZY_MATCHING
12082              
12083             /*
12084             Appends value to dynamically allocated memory, doubling its allocation size
12085             whenever needed.
12086              
12087             value: the value to append, type T
12088             data: pointer to the dynamic array to append to, type T**
12089             size: pointer to the size of the array to append to, type size_t*. This is the
12090             size that you consider the array to be, not the internal allocation size.
12091             Precondition: allocated size of data is at least a power of two greater than or
12092             equal than *size.
12093             */
12094             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
12095             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
12096             if (!((*size) & ((*size) - 1))) {\
12097             /*double alloc size if it's a power of two*/\
12098             void** data_void = reinterpret_cast(data);\
12099             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
12100             : realloc((*data), (*size) * 2 * sizeof(**data));\
12101             }\
12102             (*data)[(*size)] = (value);\
12103             (*size)++;\
12104             }
12105             #else /* C gives problems with strict-aliasing rules for (void**) cast */
12106             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
12107             if (!((*size) & ((*size) - 1))) {\
12108             /*double alloc size if it's a power of two*/\
12109             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
12110             : realloc((*data), (*size) * 2 * sizeof(**data));\
12111             }\
12112             (*data)[(*size)] = (value);\
12113             (*size)++;\
12114             }
12115             #endif
12116              
12117              
12118             #endif /* ZOPFLI_UTIL_H_ */
12119              
12120              
12121             typedef struct ZopfliHash {
12122             int* head; /* Hash value to index of its most recent occurrence. */
12123             unsigned short* prev; /* Index to index of prev. occurrence of same hash. */
12124             int* hashval; /* Index to hash value at this index. */
12125             int val; /* Current hash value. */
12126              
12127             #ifdef ZOPFLI_HASH_SAME_HASH
12128             /* Fields with similar purpose as the above hash, but for the second hash with
12129             a value that is calculated differently. */
12130             int* head2; /* Hash value to index of its most recent occurrence. */
12131             unsigned short* prev2; /* Index to index of prev. occurrence of same hash. */
12132             int* hashval2; /* Index to hash value at this index. */
12133             int val2; /* Current hash value. */
12134             #endif
12135              
12136             #ifdef ZOPFLI_HASH_SAME
12137             unsigned short* same; /* Amount of repetitions of same byte after this .*/
12138             #endif
12139             } ZopfliHash;
12140              
12141             /* Allocates ZopfliHash memory. */
12142             void ZopfliAllocHash(size_t window_size, ZopfliHash* h);
12143              
12144             /* Resets all fields of ZopfliHash. */
12145             void ZopfliResetHash(size_t window_size, ZopfliHash* h);
12146              
12147             /* Frees ZopfliHash memory. */
12148             void ZopfliCleanHash(ZopfliHash* h);
12149              
12150             /*
12151             Updates the hash values based on the current position in the array. All calls
12152             to this must be made for consecutive bytes.
12153             */
12154             void ZopfliUpdateHash(const unsigned char* array, size_t pos, size_t end,
12155             ZopfliHash* h);
12156              
12157             /*
12158             Prepopulates hash:
12159             Fills in the initial values in the hash, before ZopfliUpdateHash can be used
12160             correctly.
12161             */
12162             void ZopfliWarmupHash(const unsigned char* array, size_t pos, size_t end,
12163             ZopfliHash* h);
12164              
12165             #endif /* ZOPFLI_HASH_H_ */
12166              
12167             /* zopfli.h */
12168             /*
12169             Copyright 2011 Google Inc. All Rights Reserved.
12170              
12171             Licensed under the Apache License, Version 2.0 (the "License");
12172             you may not use this file except in compliance with the License.
12173             You may obtain a copy of the License at
12174              
12175             http://www.apache.org/licenses/LICENSE-2.0
12176              
12177             Unless required by applicable law or agreed to in writing, software
12178             distributed under the License is distributed on an "AS IS" BASIS,
12179             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12180             See the License for the specific language governing permissions and
12181             limitations under the License.
12182              
12183             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
12184             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
12185             */
12186              
12187             #ifndef ZOPFLI_ZOPFLI_H_
12188             #define ZOPFLI_ZOPFLI_H_
12189              
12190             #include
12191             #include /* for size_t */
12192              
12193             #ifdef __cplusplus
12194             extern "C" {
12195             #endif
12196              
12197             /*
12198             Options used throughout the program.
12199             */
12200             typedef struct ZopfliOptions {
12201             /* Whether to print output */
12202             int verbose;
12203              
12204             /* Whether to print more detailed output */
12205             int verbose_more;
12206              
12207             /*
12208             Maximum amount of times to rerun forward and backward pass to optimize LZ77
12209             compression cost. Good values: 10, 15 for small files, 5 for files over
12210             several MB in size or it will be too slow.
12211             */
12212             int numiterations;
12213              
12214             /*
12215             If true, splits the data in multiple deflate blocks with optimal choice
12216             for the block boundaries. Block splitting gives better compression. Default:
12217             true (1).
12218             */
12219             int blocksplitting;
12220              
12221             /*
12222             No longer used, left for compatibility.
12223             */
12224             int blocksplittinglast;
12225              
12226             /*
12227             Maximum amount of blocks to split into (0 for unlimited, but this can give
12228             extreme results that hurt compression on some files). Default value: 15.
12229             */
12230             int blocksplittingmax;
12231             } ZopfliOptions;
12232              
12233             /* Initializes options with default values. */
12234             void ZopfliInitOptions(ZopfliOptions* options);
12235              
12236             /* Output format */
12237             typedef enum {
12238             ZOPFLI_FORMAT_GZIP,
12239             ZOPFLI_FORMAT_ZLIB,
12240             ZOPFLI_FORMAT_DEFLATE
12241             } ZopfliFormat;
12242              
12243             /*
12244             Compresses according to the given output format and appends the result to the
12245             output.
12246              
12247             options: global program options
12248             output_type: the output format to use
12249             out: pointer to the dynamic output array to which the result is appended. Must
12250             be freed after use
12251             outsize: pointer to the dynamic output array size
12252             */
12253             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
12254             const unsigned char* in, size_t insize,
12255             unsigned char** out, size_t* outsize);
12256              
12257             #ifdef __cplusplus
12258             } // extern "C"
12259             #endif
12260              
12261             #endif /* ZOPFLI_ZOPFLI_H_ */
12262              
12263              
12264             /*
12265             Stores lit/length and dist pairs for LZ77.
12266             Parameter litlens: Contains the literal symbols or length values.
12267             Parameter dists: Contains the distances. A value is 0 to indicate that there is
12268             no dist and the corresponding litlens value is a literal instead of a length.
12269             Parameter size: The size of both the litlens and dists arrays.
12270             The memory can best be managed by using ZopfliInitLZ77Store to initialize it,
12271             ZopfliCleanLZ77Store to destroy it, and ZopfliStoreLitLenDist to append values.
12272              
12273             */
12274             typedef struct ZopfliLZ77Store {
12275             unsigned short* litlens; /* Lit or len. */
12276             unsigned short* dists; /* If 0: indicates literal in corresponding litlens,
12277             if > 0: length in corresponding litlens, this is the distance. */
12278             size_t size;
12279              
12280             const unsigned char* data; /* original data */
12281             size_t* pos; /* position in data where this LZ77 command begins */
12282              
12283             unsigned short* ll_symbol;
12284             unsigned short* d_symbol;
12285              
12286             /* Cumulative histograms wrapping around per chunk. Each chunk has the amount
12287             of distinct symbols as length, so using 1 value per LZ77 symbol, we have a
12288             precise histogram at every N symbols, and the rest can be calculated by
12289             looping through the actual symbols of this chunk. */
12290             size_t* ll_counts;
12291             size_t* d_counts;
12292             } ZopfliLZ77Store;
12293              
12294             void ZopfliInitLZ77Store(const unsigned char* data, ZopfliLZ77Store* store);
12295             void ZopfliCleanLZ77Store(ZopfliLZ77Store* store);
12296             void ZopfliCopyLZ77Store(const ZopfliLZ77Store* source, ZopfliLZ77Store* dest);
12297             void ZopfliStoreLitLenDist(unsigned short length, unsigned short dist,
12298             size_t pos, ZopfliLZ77Store* store);
12299             void ZopfliAppendLZ77Store(const ZopfliLZ77Store* store,
12300             ZopfliLZ77Store* target);
12301             /* Gets the amount of raw bytes that this range of LZ77 symbols spans. */
12302             size_t ZopfliLZ77GetByteRange(const ZopfliLZ77Store* lz77,
12303             size_t lstart, size_t lend);
12304             /* Gets the histogram of lit/len and dist symbols in the given range, using the
12305             cumulative histograms, so faster than adding one by one for large range. Does
12306             not add the one end symbol of value 256. */
12307             void ZopfliLZ77GetHistogram(const ZopfliLZ77Store* lz77,
12308             size_t lstart, size_t lend,
12309             size_t* ll_counts, size_t* d_counts);
12310              
12311             /*
12312             Some state information for compressing a block.
12313             This is currently a bit under-used (with mainly only the longest match cache),
12314             but is kept for easy future expansion.
12315             */
12316             typedef struct ZopfliBlockState {
12317             const ZopfliOptions* options;
12318              
12319             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
12320             /* Cache for length/distance pairs found so far. */
12321             ZopfliLongestMatchCache* lmc;
12322             #endif
12323              
12324             /* The start (inclusive) and end (not inclusive) of the current block. */
12325             size_t blockstart;
12326             size_t blockend;
12327             } ZopfliBlockState;
12328              
12329             void ZopfliInitBlockState(const ZopfliOptions* options,
12330             size_t blockstart, size_t blockend, int add_lmc,
12331             ZopfliBlockState* s);
12332             void ZopfliCleanBlockState(ZopfliBlockState* s);
12333              
12334             /*
12335             Finds the longest match (length and corresponding distance) for LZ77
12336             compression.
12337             Even when not using "sublen", it can be more efficient to provide an array,
12338             because only then the caching is used.
12339             array: the data
12340             pos: position in the data to find the match for
12341             size: size of the data
12342             limit: limit length to maximum this value (default should be 258). This allows
12343             finding a shorter dist for that length (= less extra bits). Must be
12344             in the range [ZOPFLI_MIN_MATCH, ZOPFLI_MAX_MATCH].
12345             sublen: output array of 259 elements, or null. Has, for each length, the
12346             smallest distance required to reach this length. Only 256 of its 259 values
12347             are used, the first 3 are ignored (the shortest length is 3. It is purely
12348             for convenience that the array is made 3 longer).
12349             */
12350             void ZopfliFindLongestMatch(
12351             ZopfliBlockState *s, const ZopfliHash* h, const unsigned char* array,
12352             size_t pos, size_t size, size_t limit,
12353             unsigned short* sublen, unsigned short* distance, unsigned short* length);
12354              
12355             /*
12356             Verifies if length and dist are indeed valid, only used for assertion.
12357             */
12358             void ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
12359             unsigned short dist, unsigned short length);
12360              
12361             /*
12362             Does LZ77 using an algorithm similar to gzip, with lazy matching, rather than
12363             with the slow but better "squeeze" implementation.
12364             The result is placed in the ZopfliLZ77Store.
12365             If instart is larger than 0, it uses values before instart as starting
12366             dictionary.
12367             */
12368             void ZopfliLZ77Greedy(ZopfliBlockState* s, const unsigned char* in,
12369             size_t instart, size_t inend,
12370             ZopfliLZ77Store* store, ZopfliHash* h);
12371              
12372             #endif /* ZOPFLI_LZ77_H_ */
12373              
12374             /* zopfli.h */
12375             /*
12376             Copyright 2011 Google Inc. All Rights Reserved.
12377              
12378             Licensed under the Apache License, Version 2.0 (the "License");
12379             you may not use this file except in compliance with the License.
12380             You may obtain a copy of the License at
12381              
12382             http://www.apache.org/licenses/LICENSE-2.0
12383              
12384             Unless required by applicable law or agreed to in writing, software
12385             distributed under the License is distributed on an "AS IS" BASIS,
12386             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12387             See the License for the specific language governing permissions and
12388             limitations under the License.
12389              
12390             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
12391             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
12392             */
12393              
12394             #ifndef ZOPFLI_ZOPFLI_H_
12395             #define ZOPFLI_ZOPFLI_H_
12396              
12397             #include
12398             #include /* for size_t */
12399              
12400             #ifdef __cplusplus
12401             extern "C" {
12402             #endif
12403              
12404             /*
12405             Options used throughout the program.
12406             */
12407             typedef struct ZopfliOptions {
12408             /* Whether to print output */
12409             int verbose;
12410              
12411             /* Whether to print more detailed output */
12412             int verbose_more;
12413              
12414             /*
12415             Maximum amount of times to rerun forward and backward pass to optimize LZ77
12416             compression cost. Good values: 10, 15 for small files, 5 for files over
12417             several MB in size or it will be too slow.
12418             */
12419             int numiterations;
12420              
12421             /*
12422             If true, splits the data in multiple deflate blocks with optimal choice
12423             for the block boundaries. Block splitting gives better compression. Default:
12424             true (1).
12425             */
12426             int blocksplitting;
12427              
12428             /*
12429             No longer used, left for compatibility.
12430             */
12431             int blocksplittinglast;
12432              
12433             /*
12434             Maximum amount of blocks to split into (0 for unlimited, but this can give
12435             extreme results that hurt compression on some files). Default value: 15.
12436             */
12437             int blocksplittingmax;
12438             } ZopfliOptions;
12439              
12440             /* Initializes options with default values. */
12441             void ZopfliInitOptions(ZopfliOptions* options);
12442              
12443             /* Output format */
12444             typedef enum {
12445             ZOPFLI_FORMAT_GZIP,
12446             ZOPFLI_FORMAT_ZLIB,
12447             ZOPFLI_FORMAT_DEFLATE
12448             } ZopfliFormat;
12449              
12450             /*
12451             Compresses according to the given output format and appends the result to the
12452             output.
12453              
12454             options: global program options
12455             output_type: the output format to use
12456             out: pointer to the dynamic output array to which the result is appended. Must
12457             be freed after use
12458             outsize: pointer to the dynamic output array size
12459             */
12460             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
12461             const unsigned char* in, size_t insize,
12462             unsigned char** out, size_t* outsize);
12463              
12464             #ifdef __cplusplus
12465             } // extern "C"
12466             #endif
12467              
12468             #endif /* ZOPFLI_ZOPFLI_H_ */
12469              
12470              
12471              
12472             /*
12473             Does blocksplitting on LZ77 data.
12474             The output splitpoints are indices in the LZ77 data.
12475             maxblocks: set a limit to the amount of blocks. Set to 0 to mean no limit.
12476             */
12477             void ZopfliBlockSplitLZ77(const ZopfliOptions* options,
12478             const ZopfliLZ77Store* lz77, size_t maxblocks,
12479             size_t** splitpoints, size_t* npoints);
12480              
12481             /*
12482             Does blocksplitting on uncompressed data.
12483             The output splitpoints are indices in the uncompressed bytes.
12484              
12485             options: general program options.
12486             in: uncompressed input data
12487             instart: where to start splitting
12488             inend: where to end splitting (not inclusive)
12489             maxblocks: maximum amount of blocks to split into, or 0 for no limit
12490             splitpoints: dynamic array to put the resulting split point coordinates into.
12491             The coordinates are indices in the input array.
12492             npoints: pointer to amount of splitpoints, for the dynamic array. The amount of
12493             blocks is the amount of splitpoitns + 1.
12494             */
12495             void ZopfliBlockSplit(const ZopfliOptions* options,
12496             const unsigned char* in, size_t instart, size_t inend,
12497             size_t maxblocks, size_t** splitpoints, size_t* npoints);
12498              
12499             /*
12500             Divides the input into equal blocks, does not even take LZ77 lengths into
12501             account.
12502             */
12503             void ZopfliBlockSplitSimple(const unsigned char* in,
12504             size_t instart, size_t inend,
12505             size_t blocksize,
12506             size_t** splitpoints, size_t* npoints);
12507              
12508             #endif /* ZOPFLI_BLOCKSPLITTER_H_ */
12509              
12510             /* deflate.h */
12511             /*
12512             Copyright 2011 Google Inc. All Rights Reserved.
12513              
12514             Licensed under the Apache License, Version 2.0 (the "License");
12515             you may not use this file except in compliance with the License.
12516             You may obtain a copy of the License at
12517              
12518             http://www.apache.org/licenses/LICENSE-2.0
12519              
12520             Unless required by applicable law or agreed to in writing, software
12521             distributed under the License is distributed on an "AS IS" BASIS,
12522             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12523             See the License for the specific language governing permissions and
12524             limitations under the License.
12525              
12526             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
12527             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
12528             */
12529              
12530             #ifndef ZOPFLI_DEFLATE_H_
12531             #define ZOPFLI_DEFLATE_H_
12532              
12533             /*
12534             Functions to compress according to the DEFLATE specification, using the
12535             "squeeze" LZ77 compression backend.
12536             */
12537              
12538             /* lz77.h */
12539             /*
12540             Copyright 2011 Google Inc. All Rights Reserved.
12541              
12542             Licensed under the Apache License, Version 2.0 (the "License");
12543             you may not use this file except in compliance with the License.
12544             You may obtain a copy of the License at
12545              
12546             http://www.apache.org/licenses/LICENSE-2.0
12547              
12548             Unless required by applicable law or agreed to in writing, software
12549             distributed under the License is distributed on an "AS IS" BASIS,
12550             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12551             See the License for the specific language governing permissions and
12552             limitations under the License.
12553              
12554             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
12555             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
12556             */
12557              
12558             /*
12559             Functions for basic LZ77 compression and utilities for the "squeeze" LZ77
12560             compression.
12561             */
12562              
12563             #ifndef ZOPFLI_LZ77_H_
12564             #define ZOPFLI_LZ77_H_
12565              
12566             #include
12567              
12568             /* cache.h */
12569             /*
12570             Copyright 2011 Google Inc. All Rights Reserved.
12571              
12572             Licensed under the Apache License, Version 2.0 (the "License");
12573             you may not use this file except in compliance with the License.
12574             You may obtain a copy of the License at
12575              
12576             http://www.apache.org/licenses/LICENSE-2.0
12577              
12578             Unless required by applicable law or agreed to in writing, software
12579             distributed under the License is distributed on an "AS IS" BASIS,
12580             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12581             See the License for the specific language governing permissions and
12582             limitations under the License.
12583              
12584             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
12585             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
12586             */
12587              
12588             /*
12589             The cache that speeds up ZopfliFindLongestMatch of lz77.c.
12590             */
12591              
12592             #ifndef ZOPFLI_CACHE_H_
12593             #define ZOPFLI_CACHE_H_
12594              
12595             /* util.h */
12596             /*
12597             Copyright 2011 Google Inc. All Rights Reserved.
12598              
12599             Licensed under the Apache License, Version 2.0 (the "License");
12600             you may not use this file except in compliance with the License.
12601             You may obtain a copy of the License at
12602              
12603             http://www.apache.org/licenses/LICENSE-2.0
12604              
12605             Unless required by applicable law or agreed to in writing, software
12606             distributed under the License is distributed on an "AS IS" BASIS,
12607             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12608             See the License for the specific language governing permissions and
12609             limitations under the License.
12610              
12611             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
12612             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
12613             */
12614              
12615             /*
12616             Several utilities, including: #defines to try different compression results,
12617             basic deflate specification values and generic program options.
12618             */
12619              
12620             #ifndef ZOPFLI_UTIL_H_
12621             #define ZOPFLI_UTIL_H_
12622              
12623             #include
12624             #include
12625              
12626             /* Minimum and maximum length that can be encoded in deflate. */
12627             #define ZOPFLI_MAX_MATCH 258
12628             #define ZOPFLI_MIN_MATCH 3
12629              
12630             /* Number of distinct literal/length and distance symbols in DEFLATE */
12631             #define ZOPFLI_NUM_LL 288
12632             #define ZOPFLI_NUM_D 32
12633              
12634             /*
12635             The window size for deflate. Must be a power of two. This should be 32768, the
12636             maximum possible by the deflate spec. Anything less hurts compression more than
12637             speed.
12638             */
12639             #define ZOPFLI_WINDOW_SIZE 32768
12640              
12641             /*
12642             The window mask used to wrap indices into the window. This is why the
12643             window size must be a power of two.
12644             */
12645             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
12646              
12647             /*
12648             A block structure of huge, non-smart, blocks to divide the input into, to allow
12649             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
12650             The whole compression algorithm, including the smarter block splitting, will
12651             be executed independently on each huge block.
12652             Dividing into huge blocks hurts compression, but not much relative to the size.
12653             Set it to 0 to disable master blocks.
12654             */
12655             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
12656              
12657             /*
12658             Used to initialize costs for example
12659             */
12660             #define ZOPFLI_LARGE_FLOAT 1e30
12661              
12662             /*
12663             For longest match cache. max 256. Uses huge amounts of memory but makes it
12664             faster. Uses this many times three bytes per single byte of the input data.
12665             This is so because longest match finding has to find the exact distance
12666             that belongs to each length for the best lz77 strategy.
12667             Good values: e.g. 5, 8.
12668             */
12669             #define ZOPFLI_CACHE_LENGTH 8
12670              
12671             /*
12672             limit the max hash chain hits for this hash value. This has an effect only
12673             on files where the hash value is the same very often. On these files, this
12674             gives worse compression (the value should ideally be 32768, which is the
12675             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
12676             faster on some specific files.
12677             Good value: e.g. 8192.
12678             */
12679             #define ZOPFLI_MAX_CHAIN_HITS 8192
12680              
12681             /*
12682             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
12683             consumes a lot of memory but speeds it up. No effect on compression size.
12684             */
12685             #define ZOPFLI_LONGEST_MATCH_CACHE
12686              
12687             /*
12688             Enable to remember amount of successive identical bytes in the hash chain for
12689             finding longest match
12690             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
12691             This has no effect on the compression result, and enabling it increases speed.
12692             */
12693             #define ZOPFLI_HASH_SAME
12694              
12695             /*
12696             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
12697             best length so far is long enough. This is way faster for files with lots of
12698             identical bytes, on which the compressor is otherwise too slow. Regular files
12699             are unaffected or maybe a tiny bit slower.
12700             This has no effect on the compression result, only on speed.
12701             */
12702             #define ZOPFLI_HASH_SAME_HASH
12703              
12704             /*
12705             Enable this, to avoid slowness for files which are a repetition of the same
12706             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
12707             the compression result.
12708             */
12709             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
12710              
12711             /*
12712             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
12713             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
12714             varies from file to file.
12715             */
12716             #define ZOPFLI_LAZY_MATCHING
12717              
12718             /*
12719             Appends value to dynamically allocated memory, doubling its allocation size
12720             whenever needed.
12721              
12722             value: the value to append, type T
12723             data: pointer to the dynamic array to append to, type T**
12724             size: pointer to the size of the array to append to, type size_t*. This is the
12725             size that you consider the array to be, not the internal allocation size.
12726             Precondition: allocated size of data is at least a power of two greater than or
12727             equal than *size.
12728             */
12729             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
12730             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
12731             if (!((*size) & ((*size) - 1))) {\
12732             /*double alloc size if it's a power of two*/\
12733             void** data_void = reinterpret_cast(data);\
12734             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
12735             : realloc((*data), (*size) * 2 * sizeof(**data));\
12736             }\
12737             (*data)[(*size)] = (value);\
12738             (*size)++;\
12739             }
12740             #else /* C gives problems with strict-aliasing rules for (void**) cast */
12741             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
12742             if (!((*size) & ((*size) - 1))) {\
12743             /*double alloc size if it's a power of two*/\
12744             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
12745             : realloc((*data), (*size) * 2 * sizeof(**data));\
12746             }\
12747             (*data)[(*size)] = (value);\
12748             (*size)++;\
12749             }
12750             #endif
12751              
12752              
12753             #endif /* ZOPFLI_UTIL_H_ */
12754              
12755              
12756             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
12757              
12758             /*
12759             Cache used by ZopfliFindLongestMatch to remember previously found length/dist
12760             values.
12761             This is needed because the squeeze runs will ask these values multiple times for
12762             the same position.
12763             Uses large amounts of memory, since it has to remember the distance belonging
12764             to every possible shorter-than-the-best length (the so called "sublen" array).
12765             */
12766             typedef struct ZopfliLongestMatchCache {
12767             unsigned short* length;
12768             unsigned short* dist;
12769             unsigned char* sublen;
12770             } ZopfliLongestMatchCache;
12771              
12772             /* Initializes the ZopfliLongestMatchCache. */
12773             void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc);
12774              
12775             /* Frees up the memory of the ZopfliLongestMatchCache. */
12776             void ZopfliCleanCache(ZopfliLongestMatchCache* lmc);
12777              
12778             /* Stores sublen array in the cache. */
12779             void ZopfliSublenToCache(const unsigned short* sublen,
12780             size_t pos, size_t length,
12781             ZopfliLongestMatchCache* lmc);
12782              
12783             /* Extracts sublen array from the cache. */
12784             void ZopfliCacheToSublen(const ZopfliLongestMatchCache* lmc,
12785             size_t pos, size_t length,
12786             unsigned short* sublen);
12787             /* Returns the length up to which could be stored in the cache. */
12788             unsigned ZopfliMaxCachedSublen(const ZopfliLongestMatchCache* lmc,
12789             size_t pos, size_t length);
12790              
12791             #endif /* ZOPFLI_LONGEST_MATCH_CACHE */
12792              
12793             #endif /* ZOPFLI_CACHE_H_ */
12794              
12795             /* hash.h */
12796             /*
12797             Copyright 2011 Google Inc. All Rights Reserved.
12798              
12799             Licensed under the Apache License, Version 2.0 (the "License");
12800             you may not use this file except in compliance with the License.
12801             You may obtain a copy of the License at
12802              
12803             http://www.apache.org/licenses/LICENSE-2.0
12804              
12805             Unless required by applicable law or agreed to in writing, software
12806             distributed under the License is distributed on an "AS IS" BASIS,
12807             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12808             See the License for the specific language governing permissions and
12809             limitations under the License.
12810              
12811             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
12812             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
12813             */
12814              
12815             /*
12816             The hash for ZopfliFindLongestMatch of lz77.c.
12817             */
12818              
12819             #ifndef ZOPFLI_HASH_H_
12820             #define ZOPFLI_HASH_H_
12821              
12822             /* util.h */
12823             /*
12824             Copyright 2011 Google Inc. All Rights Reserved.
12825              
12826             Licensed under the Apache License, Version 2.0 (the "License");
12827             you may not use this file except in compliance with the License.
12828             You may obtain a copy of the License at
12829              
12830             http://www.apache.org/licenses/LICENSE-2.0
12831              
12832             Unless required by applicable law or agreed to in writing, software
12833             distributed under the License is distributed on an "AS IS" BASIS,
12834             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12835             See the License for the specific language governing permissions and
12836             limitations under the License.
12837              
12838             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
12839             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
12840             */
12841              
12842             /*
12843             Several utilities, including: #defines to try different compression results,
12844             basic deflate specification values and generic program options.
12845             */
12846              
12847             #ifndef ZOPFLI_UTIL_H_
12848             #define ZOPFLI_UTIL_H_
12849              
12850             #include
12851             #include
12852              
12853             /* Minimum and maximum length that can be encoded in deflate. */
12854             #define ZOPFLI_MAX_MATCH 258
12855             #define ZOPFLI_MIN_MATCH 3
12856              
12857             /* Number of distinct literal/length and distance symbols in DEFLATE */
12858             #define ZOPFLI_NUM_LL 288
12859             #define ZOPFLI_NUM_D 32
12860              
12861             /*
12862             The window size for deflate. Must be a power of two. This should be 32768, the
12863             maximum possible by the deflate spec. Anything less hurts compression more than
12864             speed.
12865             */
12866             #define ZOPFLI_WINDOW_SIZE 32768
12867              
12868             /*
12869             The window mask used to wrap indices into the window. This is why the
12870             window size must be a power of two.
12871             */
12872             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
12873              
12874             /*
12875             A block structure of huge, non-smart, blocks to divide the input into, to allow
12876             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
12877             The whole compression algorithm, including the smarter block splitting, will
12878             be executed independently on each huge block.
12879             Dividing into huge blocks hurts compression, but not much relative to the size.
12880             Set it to 0 to disable master blocks.
12881             */
12882             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
12883              
12884             /*
12885             Used to initialize costs for example
12886             */
12887             #define ZOPFLI_LARGE_FLOAT 1e30
12888              
12889             /*
12890             For longest match cache. max 256. Uses huge amounts of memory but makes it
12891             faster. Uses this many times three bytes per single byte of the input data.
12892             This is so because longest match finding has to find the exact distance
12893             that belongs to each length for the best lz77 strategy.
12894             Good values: e.g. 5, 8.
12895             */
12896             #define ZOPFLI_CACHE_LENGTH 8
12897              
12898             /*
12899             limit the max hash chain hits for this hash value. This has an effect only
12900             on files where the hash value is the same very often. On these files, this
12901             gives worse compression (the value should ideally be 32768, which is the
12902             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
12903             faster on some specific files.
12904             Good value: e.g. 8192.
12905             */
12906             #define ZOPFLI_MAX_CHAIN_HITS 8192
12907              
12908             /*
12909             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
12910             consumes a lot of memory but speeds it up. No effect on compression size.
12911             */
12912             #define ZOPFLI_LONGEST_MATCH_CACHE
12913              
12914             /*
12915             Enable to remember amount of successive identical bytes in the hash chain for
12916             finding longest match
12917             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
12918             This has no effect on the compression result, and enabling it increases speed.
12919             */
12920             #define ZOPFLI_HASH_SAME
12921              
12922             /*
12923             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
12924             best length so far is long enough. This is way faster for files with lots of
12925             identical bytes, on which the compressor is otherwise too slow. Regular files
12926             are unaffected or maybe a tiny bit slower.
12927             This has no effect on the compression result, only on speed.
12928             */
12929             #define ZOPFLI_HASH_SAME_HASH
12930              
12931             /*
12932             Enable this, to avoid slowness for files which are a repetition of the same
12933             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
12934             the compression result.
12935             */
12936             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
12937              
12938             /*
12939             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
12940             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
12941             varies from file to file.
12942             */
12943             #define ZOPFLI_LAZY_MATCHING
12944              
12945             /*
12946             Appends value to dynamically allocated memory, doubling its allocation size
12947             whenever needed.
12948              
12949             value: the value to append, type T
12950             data: pointer to the dynamic array to append to, type T**
12951             size: pointer to the size of the array to append to, type size_t*. This is the
12952             size that you consider the array to be, not the internal allocation size.
12953             Precondition: allocated size of data is at least a power of two greater than or
12954             equal than *size.
12955             */
12956             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
12957             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
12958             if (!((*size) & ((*size) - 1))) {\
12959             /*double alloc size if it's a power of two*/\
12960             void** data_void = reinterpret_cast(data);\
12961             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
12962             : realloc((*data), (*size) * 2 * sizeof(**data));\
12963             }\
12964             (*data)[(*size)] = (value);\
12965             (*size)++;\
12966             }
12967             #else /* C gives problems with strict-aliasing rules for (void**) cast */
12968             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
12969             if (!((*size) & ((*size) - 1))) {\
12970             /*double alloc size if it's a power of two*/\
12971             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
12972             : realloc((*data), (*size) * 2 * sizeof(**data));\
12973             }\
12974             (*data)[(*size)] = (value);\
12975             (*size)++;\
12976             }
12977             #endif
12978              
12979              
12980             #endif /* ZOPFLI_UTIL_H_ */
12981              
12982              
12983             typedef struct ZopfliHash {
12984             int* head; /* Hash value to index of its most recent occurrence. */
12985             unsigned short* prev; /* Index to index of prev. occurrence of same hash. */
12986             int* hashval; /* Index to hash value at this index. */
12987             int val; /* Current hash value. */
12988              
12989             #ifdef ZOPFLI_HASH_SAME_HASH
12990             /* Fields with similar purpose as the above hash, but for the second hash with
12991             a value that is calculated differently. */
12992             int* head2; /* Hash value to index of its most recent occurrence. */
12993             unsigned short* prev2; /* Index to index of prev. occurrence of same hash. */
12994             int* hashval2; /* Index to hash value at this index. */
12995             int val2; /* Current hash value. */
12996             #endif
12997              
12998             #ifdef ZOPFLI_HASH_SAME
12999             unsigned short* same; /* Amount of repetitions of same byte after this .*/
13000             #endif
13001             } ZopfliHash;
13002              
13003             /* Allocates ZopfliHash memory. */
13004             void ZopfliAllocHash(size_t window_size, ZopfliHash* h);
13005              
13006             /* Resets all fields of ZopfliHash. */
13007             void ZopfliResetHash(size_t window_size, ZopfliHash* h);
13008              
13009             /* Frees ZopfliHash memory. */
13010             void ZopfliCleanHash(ZopfliHash* h);
13011              
13012             /*
13013             Updates the hash values based on the current position in the array. All calls
13014             to this must be made for consecutive bytes.
13015             */
13016             void ZopfliUpdateHash(const unsigned char* array, size_t pos, size_t end,
13017             ZopfliHash* h);
13018              
13019             /*
13020             Prepopulates hash:
13021             Fills in the initial values in the hash, before ZopfliUpdateHash can be used
13022             correctly.
13023             */
13024             void ZopfliWarmupHash(const unsigned char* array, size_t pos, size_t end,
13025             ZopfliHash* h);
13026              
13027             #endif /* ZOPFLI_HASH_H_ */
13028              
13029             /* zopfli.h */
13030             /*
13031             Copyright 2011 Google Inc. All Rights Reserved.
13032              
13033             Licensed under the Apache License, Version 2.0 (the "License");
13034             you may not use this file except in compliance with the License.
13035             You may obtain a copy of the License at
13036              
13037             http://www.apache.org/licenses/LICENSE-2.0
13038              
13039             Unless required by applicable law or agreed to in writing, software
13040             distributed under the License is distributed on an "AS IS" BASIS,
13041             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13042             See the License for the specific language governing permissions and
13043             limitations under the License.
13044              
13045             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
13046             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
13047             */
13048              
13049             #ifndef ZOPFLI_ZOPFLI_H_
13050             #define ZOPFLI_ZOPFLI_H_
13051              
13052             #include
13053             #include /* for size_t */
13054              
13055             #ifdef __cplusplus
13056             extern "C" {
13057             #endif
13058              
13059             /*
13060             Options used throughout the program.
13061             */
13062             typedef struct ZopfliOptions {
13063             /* Whether to print output */
13064             int verbose;
13065              
13066             /* Whether to print more detailed output */
13067             int verbose_more;
13068              
13069             /*
13070             Maximum amount of times to rerun forward and backward pass to optimize LZ77
13071             compression cost. Good values: 10, 15 for small files, 5 for files over
13072             several MB in size or it will be too slow.
13073             */
13074             int numiterations;
13075              
13076             /*
13077             If true, splits the data in multiple deflate blocks with optimal choice
13078             for the block boundaries. Block splitting gives better compression. Default:
13079             true (1).
13080             */
13081             int blocksplitting;
13082              
13083             /*
13084             No longer used, left for compatibility.
13085             */
13086             int blocksplittinglast;
13087              
13088             /*
13089             Maximum amount of blocks to split into (0 for unlimited, but this can give
13090             extreme results that hurt compression on some files). Default value: 15.
13091             */
13092             int blocksplittingmax;
13093             } ZopfliOptions;
13094              
13095             /* Initializes options with default values. */
13096             void ZopfliInitOptions(ZopfliOptions* options);
13097              
13098             /* Output format */
13099             typedef enum {
13100             ZOPFLI_FORMAT_GZIP,
13101             ZOPFLI_FORMAT_ZLIB,
13102             ZOPFLI_FORMAT_DEFLATE
13103             } ZopfliFormat;
13104              
13105             /*
13106             Compresses according to the given output format and appends the result to the
13107             output.
13108              
13109             options: global program options
13110             output_type: the output format to use
13111             out: pointer to the dynamic output array to which the result is appended. Must
13112             be freed after use
13113             outsize: pointer to the dynamic output array size
13114             */
13115             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
13116             const unsigned char* in, size_t insize,
13117             unsigned char** out, size_t* outsize);
13118              
13119             #ifdef __cplusplus
13120             } // extern "C"
13121             #endif
13122              
13123             #endif /* ZOPFLI_ZOPFLI_H_ */
13124              
13125              
13126             /*
13127             Stores lit/length and dist pairs for LZ77.
13128             Parameter litlens: Contains the literal symbols or length values.
13129             Parameter dists: Contains the distances. A value is 0 to indicate that there is
13130             no dist and the corresponding litlens value is a literal instead of a length.
13131             Parameter size: The size of both the litlens and dists arrays.
13132             The memory can best be managed by using ZopfliInitLZ77Store to initialize it,
13133             ZopfliCleanLZ77Store to destroy it, and ZopfliStoreLitLenDist to append values.
13134              
13135             */
13136             typedef struct ZopfliLZ77Store {
13137             unsigned short* litlens; /* Lit or len. */
13138             unsigned short* dists; /* If 0: indicates literal in corresponding litlens,
13139             if > 0: length in corresponding litlens, this is the distance. */
13140             size_t size;
13141              
13142             const unsigned char* data; /* original data */
13143             size_t* pos; /* position in data where this LZ77 command begins */
13144              
13145             unsigned short* ll_symbol;
13146             unsigned short* d_symbol;
13147              
13148             /* Cumulative histograms wrapping around per chunk. Each chunk has the amount
13149             of distinct symbols as length, so using 1 value per LZ77 symbol, we have a
13150             precise histogram at every N symbols, and the rest can be calculated by
13151             looping through the actual symbols of this chunk. */
13152             size_t* ll_counts;
13153             size_t* d_counts;
13154             } ZopfliLZ77Store;
13155              
13156             void ZopfliInitLZ77Store(const unsigned char* data, ZopfliLZ77Store* store);
13157             void ZopfliCleanLZ77Store(ZopfliLZ77Store* store);
13158             void ZopfliCopyLZ77Store(const ZopfliLZ77Store* source, ZopfliLZ77Store* dest);
13159             void ZopfliStoreLitLenDist(unsigned short length, unsigned short dist,
13160             size_t pos, ZopfliLZ77Store* store);
13161             void ZopfliAppendLZ77Store(const ZopfliLZ77Store* store,
13162             ZopfliLZ77Store* target);
13163             /* Gets the amount of raw bytes that this range of LZ77 symbols spans. */
13164             size_t ZopfliLZ77GetByteRange(const ZopfliLZ77Store* lz77,
13165             size_t lstart, size_t lend);
13166             /* Gets the histogram of lit/len and dist symbols in the given range, using the
13167             cumulative histograms, so faster than adding one by one for large range. Does
13168             not add the one end symbol of value 256. */
13169             void ZopfliLZ77GetHistogram(const ZopfliLZ77Store* lz77,
13170             size_t lstart, size_t lend,
13171             size_t* ll_counts, size_t* d_counts);
13172              
13173             /*
13174             Some state information for compressing a block.
13175             This is currently a bit under-used (with mainly only the longest match cache),
13176             but is kept for easy future expansion.
13177             */
13178             typedef struct ZopfliBlockState {
13179             const ZopfliOptions* options;
13180              
13181             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
13182             /* Cache for length/distance pairs found so far. */
13183             ZopfliLongestMatchCache* lmc;
13184             #endif
13185              
13186             /* The start (inclusive) and end (not inclusive) of the current block. */
13187             size_t blockstart;
13188             size_t blockend;
13189             } ZopfliBlockState;
13190              
13191             void ZopfliInitBlockState(const ZopfliOptions* options,
13192             size_t blockstart, size_t blockend, int add_lmc,
13193             ZopfliBlockState* s);
13194             void ZopfliCleanBlockState(ZopfliBlockState* s);
13195              
13196             /*
13197             Finds the longest match (length and corresponding distance) for LZ77
13198             compression.
13199             Even when not using "sublen", it can be more efficient to provide an array,
13200             because only then the caching is used.
13201             array: the data
13202             pos: position in the data to find the match for
13203             size: size of the data
13204             limit: limit length to maximum this value (default should be 258). This allows
13205             finding a shorter dist for that length (= less extra bits). Must be
13206             in the range [ZOPFLI_MIN_MATCH, ZOPFLI_MAX_MATCH].
13207             sublen: output array of 259 elements, or null. Has, for each length, the
13208             smallest distance required to reach this length. Only 256 of its 259 values
13209             are used, the first 3 are ignored (the shortest length is 3. It is purely
13210             for convenience that the array is made 3 longer).
13211             */
13212             void ZopfliFindLongestMatch(
13213             ZopfliBlockState *s, const ZopfliHash* h, const unsigned char* array,
13214             size_t pos, size_t size, size_t limit,
13215             unsigned short* sublen, unsigned short* distance, unsigned short* length);
13216              
13217             /*
13218             Verifies if length and dist are indeed valid, only used for assertion.
13219             */
13220             void ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
13221             unsigned short dist, unsigned short length);
13222              
13223             /*
13224             Does LZ77 using an algorithm similar to gzip, with lazy matching, rather than
13225             with the slow but better "squeeze" implementation.
13226             The result is placed in the ZopfliLZ77Store.
13227             If instart is larger than 0, it uses values before instart as starting
13228             dictionary.
13229             */
13230             void ZopfliLZ77Greedy(ZopfliBlockState* s, const unsigned char* in,
13231             size_t instart, size_t inend,
13232             ZopfliLZ77Store* store, ZopfliHash* h);
13233              
13234             #endif /* ZOPFLI_LZ77_H_ */
13235              
13236             /* zopfli.h */
13237             /*
13238             Copyright 2011 Google Inc. All Rights Reserved.
13239              
13240             Licensed under the Apache License, Version 2.0 (the "License");
13241             you may not use this file except in compliance with the License.
13242             You may obtain a copy of the License at
13243              
13244             http://www.apache.org/licenses/LICENSE-2.0
13245              
13246             Unless required by applicable law or agreed to in writing, software
13247             distributed under the License is distributed on an "AS IS" BASIS,
13248             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13249             See the License for the specific language governing permissions and
13250             limitations under the License.
13251              
13252             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
13253             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
13254             */
13255              
13256             #ifndef ZOPFLI_ZOPFLI_H_
13257             #define ZOPFLI_ZOPFLI_H_
13258              
13259             #include
13260             #include /* for size_t */
13261              
13262             #ifdef __cplusplus
13263             extern "C" {
13264             #endif
13265              
13266             /*
13267             Options used throughout the program.
13268             */
13269             typedef struct ZopfliOptions {
13270             /* Whether to print output */
13271             int verbose;
13272              
13273             /* Whether to print more detailed output */
13274             int verbose_more;
13275              
13276             /*
13277             Maximum amount of times to rerun forward and backward pass to optimize LZ77
13278             compression cost. Good values: 10, 15 for small files, 5 for files over
13279             several MB in size or it will be too slow.
13280             */
13281             int numiterations;
13282              
13283             /*
13284             If true, splits the data in multiple deflate blocks with optimal choice
13285             for the block boundaries. Block splitting gives better compression. Default:
13286             true (1).
13287             */
13288             int blocksplitting;
13289              
13290             /*
13291             No longer used, left for compatibility.
13292             */
13293             int blocksplittinglast;
13294              
13295             /*
13296             Maximum amount of blocks to split into (0 for unlimited, but this can give
13297             extreme results that hurt compression on some files). Default value: 15.
13298             */
13299             int blocksplittingmax;
13300             } ZopfliOptions;
13301              
13302             /* Initializes options with default values. */
13303             void ZopfliInitOptions(ZopfliOptions* options);
13304              
13305             /* Output format */
13306             typedef enum {
13307             ZOPFLI_FORMAT_GZIP,
13308             ZOPFLI_FORMAT_ZLIB,
13309             ZOPFLI_FORMAT_DEFLATE
13310             } ZopfliFormat;
13311              
13312             /*
13313             Compresses according to the given output format and appends the result to the
13314             output.
13315              
13316             options: global program options
13317             output_type: the output format to use
13318             out: pointer to the dynamic output array to which the result is appended. Must
13319             be freed after use
13320             outsize: pointer to the dynamic output array size
13321             */
13322             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
13323             const unsigned char* in, size_t insize,
13324             unsigned char** out, size_t* outsize);
13325              
13326             #ifdef __cplusplus
13327             } // extern "C"
13328             #endif
13329              
13330             #endif /* ZOPFLI_ZOPFLI_H_ */
13331              
13332              
13333             #ifdef __cplusplus
13334             extern "C" {
13335             #endif
13336              
13337             /*
13338             Compresses according to the deflate specification and append the compressed
13339             result to the output.
13340             This function will usually output multiple deflate blocks. If final is 1, then
13341             the final bit will be set on the last block.
13342              
13343             options: global program options
13344             btype: the deflate block type. Use 2 for best compression.
13345             -0: non compressed blocks (00)
13346             -1: blocks with fixed tree (01)
13347             -2: blocks with dynamic tree (10)
13348             final: whether this is the last section of the input, sets the final bit to the
13349             last deflate block.
13350             in: the input bytes
13351             insize: number of input bytes
13352             bp: bit pointer for the output array. This must initially be 0, and for
13353             consecutive calls must be reused (it can have values from 0-7). This is
13354             because deflate appends blocks as bit-based data, rather than on byte
13355             boundaries.
13356             out: pointer to the dynamic output array to which the result is appended. Must
13357             be freed after use.
13358             outsize: pointer to the dynamic output array size.
13359             */
13360             void ZopfliDeflate(const ZopfliOptions* options, int btype, int final,
13361             const unsigned char* in, size_t insize,
13362             unsigned char* bp, unsigned char** out, size_t* outsize);
13363              
13364             /*
13365             Like ZopfliDeflate, but allows to specify start and end byte with instart and
13366             inend. Only that part is compressed, but earlier bytes are still used for the
13367             back window.
13368             */
13369             void ZopfliDeflatePart(const ZopfliOptions* options, int btype, int final,
13370             const unsigned char* in, size_t instart, size_t inend,
13371             unsigned char* bp, unsigned char** out,
13372             size_t* outsize);
13373              
13374             /*
13375             Calculates block size in bits.
13376             litlens: lz77 lit/lengths
13377             dists: ll77 distances
13378             lstart: start of block
13379             lend: end of block (not inclusive)
13380             */
13381             double ZopfliCalculateBlockSize(const ZopfliLZ77Store* lz77,
13382             size_t lstart, size_t lend, int btype);
13383              
13384             /*
13385             Calculates block size in bits, automatically using the best btype.
13386             */
13387             double ZopfliCalculateBlockSizeAutoType(const ZopfliLZ77Store* lz77,
13388             size_t lstart, size_t lend);
13389              
13390             #ifdef __cplusplus
13391             } // extern "C"
13392             #endif
13393              
13394             #endif /* ZOPFLI_DEFLATE_H_ */
13395              
13396             /* symbols.h */
13397             /*
13398             Copyright 2016 Google Inc. All Rights Reserved.
13399              
13400             Licensed under the Apache License, Version 2.0 (the "License");
13401             you may not use this file except in compliance with the License.
13402             You may obtain a copy of the License at
13403              
13404             http://www.apache.org/licenses/LICENSE-2.0
13405              
13406             Unless required by applicable law or agreed to in writing, software
13407             distributed under the License is distributed on an "AS IS" BASIS,
13408             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13409             See the License for the specific language governing permissions and
13410             limitations under the License.
13411              
13412             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
13413             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
13414             */
13415              
13416             /*
13417             Utilities for using the lz77 symbols of the deflate spec.
13418             */
13419              
13420             #ifndef ZOPFLI_SYMBOLS_H_
13421             #define ZOPFLI_SYMBOLS_H_
13422              
13423             /* __has_builtin available in clang */
13424             #ifdef __has_builtin
13425             # if __has_builtin(__builtin_clz)
13426             # define ZOPFLI_HAS_BUILTIN_CLZ
13427             # endif
13428             /* __builtin_clz available beginning with GCC 3.4 */
13429             #elif __GNUC__ * 100 + __GNUC_MINOR__ >= 304
13430             # define ZOPFLI_HAS_BUILTIN_CLZ
13431             #endif
13432              
13433             /* Gets the amount of extra bits for the given dist, cfr. the DEFLATE spec. */
13434             static int ZopfliGetDistExtraBits(int dist) {
13435             #ifdef ZOPFLI_HAS_BUILTIN_CLZ
13436             if (dist < 5) return 0;
13437             return (31 ^ __builtin_clz(dist - 1)) - 1; /* log2(dist - 1) - 1 */
13438             #else
13439             if (dist < 5) return 0;
13440             else if (dist < 9) return 1;
13441             else if (dist < 17) return 2;
13442             else if (dist < 33) return 3;
13443             else if (dist < 65) return 4;
13444             else if (dist < 129) return 5;
13445             else if (dist < 257) return 6;
13446             else if (dist < 513) return 7;
13447             else if (dist < 1025) return 8;
13448             else if (dist < 2049) return 9;
13449             else if (dist < 4097) return 10;
13450             else if (dist < 8193) return 11;
13451             else if (dist < 16385) return 12;
13452             else return 13;
13453             #endif
13454             }
13455              
13456             /* Gets value of the extra bits for the given dist, cfr. the DEFLATE spec. */
13457             static int ZopfliGetDistExtraBitsValue(int dist) {
13458             #ifdef ZOPFLI_HAS_BUILTIN_CLZ
13459             if (dist < 5) {
13460             return 0;
13461             } else {
13462             int l = 31 ^ __builtin_clz(dist - 1); /* log2(dist - 1) */
13463             return (dist - (1 + (1 << l))) & ((1 << (l - 1)) - 1);
13464             }
13465             #else
13466             if (dist < 5) return 0;
13467             else if (dist < 9) return (dist - 5) & 1;
13468             else if (dist < 17) return (dist - 9) & 3;
13469             else if (dist < 33) return (dist - 17) & 7;
13470             else if (dist < 65) return (dist - 33) & 15;
13471             else if (dist < 129) return (dist - 65) & 31;
13472             else if (dist < 257) return (dist - 129) & 63;
13473             else if (dist < 513) return (dist - 257) & 127;
13474             else if (dist < 1025) return (dist - 513) & 255;
13475             else if (dist < 2049) return (dist - 1025) & 511;
13476             else if (dist < 4097) return (dist - 2049) & 1023;
13477             else if (dist < 8193) return (dist - 4097) & 2047;
13478             else if (dist < 16385) return (dist - 8193) & 4095;
13479             else return (dist - 16385) & 8191;
13480             #endif
13481             }
13482              
13483             /* Gets the symbol for the given dist, cfr. the DEFLATE spec. */
13484             static int ZopfliGetDistSymbol(int dist) {
13485             #ifdef ZOPFLI_HAS_BUILTIN_CLZ
13486             if (dist < 5) {
13487             return dist - 1;
13488             } else {
13489             int l = (31 ^ __builtin_clz(dist - 1)); /* log2(dist - 1) */
13490             int r = ((dist - 1) >> (l - 1)) & 1;
13491             return l * 2 + r;
13492             }
13493             #else
13494             if (dist < 193) {
13495             if (dist < 13) { /* dist 0..13. */
13496             if (dist < 5) return dist - 1;
13497             else if (dist < 7) return 4;
13498             else if (dist < 9) return 5;
13499             else return 6;
13500             } else { /* dist 13..193. */
13501             if (dist < 17) return 7;
13502             else if (dist < 25) return 8;
13503             else if (dist < 33) return 9;
13504             else if (dist < 49) return 10;
13505             else if (dist < 65) return 11;
13506             else if (dist < 97) return 12;
13507             else if (dist < 129) return 13;
13508             else return 14;
13509             }
13510             } else {
13511             if (dist < 2049) { /* dist 193..2049. */
13512             if (dist < 257) return 15;
13513             else if (dist < 385) return 16;
13514             else if (dist < 513) return 17;
13515             else if (dist < 769) return 18;
13516             else if (dist < 1025) return 19;
13517             else if (dist < 1537) return 20;
13518             else return 21;
13519             } else { /* dist 2049..32768. */
13520             if (dist < 3073) return 22;
13521             else if (dist < 4097) return 23;
13522             else if (dist < 6145) return 24;
13523             else if (dist < 8193) return 25;
13524             else if (dist < 12289) return 26;
13525             else if (dist < 16385) return 27;
13526             else if (dist < 24577) return 28;
13527             else return 29;
13528             }
13529             }
13530             #endif
13531             }
13532              
13533             /* Gets the amount of extra bits for the given length, cfr. the DEFLATE spec. */
13534             static int ZopfliGetLengthExtraBits(int l) {
13535             static const int table[259] = {
13536             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
13537             2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
13538             3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
13539             3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
13540             4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
13541             4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
13542             4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
13543             4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
13544             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
13545             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
13546             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
13547             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
13548             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
13549             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
13550             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
13551             5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0
13552             };
13553             return table[l];
13554             }
13555              
13556             /* Gets value of the extra bits for the given length, cfr. the DEFLATE spec. */
13557             static int ZopfliGetLengthExtraBitsValue(int l) {
13558             static const int table[259] = {
13559             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 0,
13560             1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5,
13561             6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6,
13562             7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13563             13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2,
13564             3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
13565             10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
13566             29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
13567             18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6,
13568             7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
13569             27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
13570             16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 0
13571             };
13572             return table[l];
13573             }
13574              
13575             /*
13576             Gets the symbol for the given length, cfr. the DEFLATE spec.
13577             Returns the symbol in the range [257-285] (inclusive)
13578             */
13579             static int ZopfliGetLengthSymbol(int l) {
13580             static const int table[259] = {
13581             0, 0, 0, 257, 258, 259, 260, 261, 262, 263, 264,
13582             265, 265, 266, 266, 267, 267, 268, 268,
13583             269, 269, 269, 269, 270, 270, 270, 270,
13584             271, 271, 271, 271, 272, 272, 272, 272,
13585             273, 273, 273, 273, 273, 273, 273, 273,
13586             274, 274, 274, 274, 274, 274, 274, 274,
13587             275, 275, 275, 275, 275, 275, 275, 275,
13588             276, 276, 276, 276, 276, 276, 276, 276,
13589             277, 277, 277, 277, 277, 277, 277, 277,
13590             277, 277, 277, 277, 277, 277, 277, 277,
13591             278, 278, 278, 278, 278, 278, 278, 278,
13592             278, 278, 278, 278, 278, 278, 278, 278,
13593             279, 279, 279, 279, 279, 279, 279, 279,
13594             279, 279, 279, 279, 279, 279, 279, 279,
13595             280, 280, 280, 280, 280, 280, 280, 280,
13596             280, 280, 280, 280, 280, 280, 280, 280,
13597             281, 281, 281, 281, 281, 281, 281, 281,
13598             281, 281, 281, 281, 281, 281, 281, 281,
13599             281, 281, 281, 281, 281, 281, 281, 281,
13600             281, 281, 281, 281, 281, 281, 281, 281,
13601             282, 282, 282, 282, 282, 282, 282, 282,
13602             282, 282, 282, 282, 282, 282, 282, 282,
13603             282, 282, 282, 282, 282, 282, 282, 282,
13604             282, 282, 282, 282, 282, 282, 282, 282,
13605             283, 283, 283, 283, 283, 283, 283, 283,
13606             283, 283, 283, 283, 283, 283, 283, 283,
13607             283, 283, 283, 283, 283, 283, 283, 283,
13608             283, 283, 283, 283, 283, 283, 283, 283,
13609             284, 284, 284, 284, 284, 284, 284, 284,
13610             284, 284, 284, 284, 284, 284, 284, 284,
13611             284, 284, 284, 284, 284, 284, 284, 284,
13612             284, 284, 284, 284, 284, 284, 284, 285
13613             };
13614             return table[l];
13615             }
13616              
13617             /* Gets the amount of extra bits for the given length symbol. */
13618             static int ZopfliGetLengthSymbolExtraBits(int s) {
13619             static const int table[29] = {
13620             0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
13621             3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0
13622             };
13623             return table[s - 257];
13624             }
13625              
13626             /* Gets the amount of extra bits for the given distance symbol. */
13627             static int ZopfliGetDistSymbolExtraBits(int s) {
13628             static const int table[30] = {
13629             0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
13630             9, 9, 10, 10, 11, 11, 12, 12, 13, 13
13631             };
13632             return table[s];
13633             }
13634              
13635             #endif /* ZOPFLI_SYMBOLS_H_ */
13636              
13637             /* tree.h */
13638             /*
13639             Copyright 2011 Google Inc. All Rights Reserved.
13640              
13641             Licensed under the Apache License, Version 2.0 (the "License");
13642             you may not use this file except in compliance with the License.
13643             You may obtain a copy of the License at
13644              
13645             http://www.apache.org/licenses/LICENSE-2.0
13646              
13647             Unless required by applicable law or agreed to in writing, software
13648             distributed under the License is distributed on an "AS IS" BASIS,
13649             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13650             See the License for the specific language governing permissions and
13651             limitations under the License.
13652              
13653             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
13654             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
13655             */
13656              
13657             /*
13658             Utilities for creating and using Huffman trees.
13659             */
13660              
13661             #ifndef ZOPFLI_TREE_H_
13662             #define ZOPFLI_TREE_H_
13663              
13664             #include
13665              
13666             /*
13667             Calculates the bitlengths for the Huffman tree, based on the counts of each
13668             symbol.
13669             */
13670             void ZopfliCalculateBitLengths(const size_t* count, size_t n, int maxbits,
13671             unsigned *bitlengths);
13672              
13673             /*
13674             Converts a series of Huffman tree bitlengths, to the bit values of the symbols.
13675             */
13676             void ZopfliLengthsToSymbols(const unsigned* lengths, size_t n, unsigned maxbits,
13677             unsigned* symbols);
13678              
13679             /*
13680             Calculates the entropy of each symbol, based on the counts of each symbol. The
13681             result is similar to the result of ZopfliCalculateBitLengths, but with the
13682             actual theoritical bit lengths according to the entropy. Since the resulting
13683             values are fractional, they cannot be used to encode the tree specified by
13684             DEFLATE.
13685             */
13686             void ZopfliCalculateEntropy(const size_t* count, size_t n, double* bitlengths);
13687              
13688             #endif /* ZOPFLI_TREE_H_ */
13689              
13690             /* util.h */
13691             /*
13692             Copyright 2011 Google Inc. All Rights Reserved.
13693              
13694             Licensed under the Apache License, Version 2.0 (the "License");
13695             you may not use this file except in compliance with the License.
13696             You may obtain a copy of the License at
13697              
13698             http://www.apache.org/licenses/LICENSE-2.0
13699              
13700             Unless required by applicable law or agreed to in writing, software
13701             distributed under the License is distributed on an "AS IS" BASIS,
13702             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13703             See the License for the specific language governing permissions and
13704             limitations under the License.
13705              
13706             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
13707             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
13708             */
13709              
13710             /*
13711             Several utilities, including: #defines to try different compression results,
13712             basic deflate specification values and generic program options.
13713             */
13714              
13715             #ifndef ZOPFLI_UTIL_H_
13716             #define ZOPFLI_UTIL_H_
13717              
13718             #include
13719             #include
13720              
13721             /* Minimum and maximum length that can be encoded in deflate. */
13722             #define ZOPFLI_MAX_MATCH 258
13723             #define ZOPFLI_MIN_MATCH 3
13724              
13725             /* Number of distinct literal/length and distance symbols in DEFLATE */
13726             #define ZOPFLI_NUM_LL 288
13727             #define ZOPFLI_NUM_D 32
13728              
13729             /*
13730             The window size for deflate. Must be a power of two. This should be 32768, the
13731             maximum possible by the deflate spec. Anything less hurts compression more than
13732             speed.
13733             */
13734             #define ZOPFLI_WINDOW_SIZE 32768
13735              
13736             /*
13737             The window mask used to wrap indices into the window. This is why the
13738             window size must be a power of two.
13739             */
13740             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
13741              
13742             /*
13743             A block structure of huge, non-smart, blocks to divide the input into, to allow
13744             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
13745             The whole compression algorithm, including the smarter block splitting, will
13746             be executed independently on each huge block.
13747             Dividing into huge blocks hurts compression, but not much relative to the size.
13748             Set it to 0 to disable master blocks.
13749             */
13750             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
13751              
13752             /*
13753             Used to initialize costs for example
13754             */
13755             #define ZOPFLI_LARGE_FLOAT 1e30
13756              
13757             /*
13758             For longest match cache. max 256. Uses huge amounts of memory but makes it
13759             faster. Uses this many times three bytes per single byte of the input data.
13760             This is so because longest match finding has to find the exact distance
13761             that belongs to each length for the best lz77 strategy.
13762             Good values: e.g. 5, 8.
13763             */
13764             #define ZOPFLI_CACHE_LENGTH 8
13765              
13766             /*
13767             limit the max hash chain hits for this hash value. This has an effect only
13768             on files where the hash value is the same very often. On these files, this
13769             gives worse compression (the value should ideally be 32768, which is the
13770             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
13771             faster on some specific files.
13772             Good value: e.g. 8192.
13773             */
13774             #define ZOPFLI_MAX_CHAIN_HITS 8192
13775              
13776             /*
13777             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
13778             consumes a lot of memory but speeds it up. No effect on compression size.
13779             */
13780             #define ZOPFLI_LONGEST_MATCH_CACHE
13781              
13782             /*
13783             Enable to remember amount of successive identical bytes in the hash chain for
13784             finding longest match
13785             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
13786             This has no effect on the compression result, and enabling it increases speed.
13787             */
13788             #define ZOPFLI_HASH_SAME
13789              
13790             /*
13791             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
13792             best length so far is long enough. This is way faster for files with lots of
13793             identical bytes, on which the compressor is otherwise too slow. Regular files
13794             are unaffected or maybe a tiny bit slower.
13795             This has no effect on the compression result, only on speed.
13796             */
13797             #define ZOPFLI_HASH_SAME_HASH
13798              
13799             /*
13800             Enable this, to avoid slowness for files which are a repetition of the same
13801             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
13802             the compression result.
13803             */
13804             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
13805              
13806             /*
13807             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
13808             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
13809             varies from file to file.
13810             */
13811             #define ZOPFLI_LAZY_MATCHING
13812              
13813             /*
13814             Appends value to dynamically allocated memory, doubling its allocation size
13815             whenever needed.
13816              
13817             value: the value to append, type T
13818             data: pointer to the dynamic array to append to, type T**
13819             size: pointer to the size of the array to append to, type size_t*. This is the
13820             size that you consider the array to be, not the internal allocation size.
13821             Precondition: allocated size of data is at least a power of two greater than or
13822             equal than *size.
13823             */
13824             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
13825             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
13826             if (!((*size) & ((*size) - 1))) {\
13827             /*double alloc size if it's a power of two*/\
13828             void** data_void = reinterpret_cast(data);\
13829             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
13830             : realloc((*data), (*size) * 2 * sizeof(**data));\
13831             }\
13832             (*data)[(*size)] = (value);\
13833             (*size)++;\
13834             }
13835             #else /* C gives problems with strict-aliasing rules for (void**) cast */
13836             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
13837             if (!((*size) & ((*size) - 1))) {\
13838             /*double alloc size if it's a power of two*/\
13839             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
13840             : realloc((*data), (*size) * 2 * sizeof(**data));\
13841             }\
13842             (*data)[(*size)] = (value);\
13843             (*size)++;\
13844             }
13845             #endif
13846              
13847              
13848             #endif /* ZOPFLI_UTIL_H_ */
13849              
13850              
13851             typedef struct SymbolStats {
13852             /* The literal and length symbols. */
13853             size_t litlens[ZOPFLI_NUM_LL];
13854             /* The 32 unique dist symbols, not the 32768 possible dists. */
13855             size_t dists[ZOPFLI_NUM_D];
13856              
13857             /* Length of each lit/len symbol in bits. */
13858             double ll_symbols[ZOPFLI_NUM_LL];
13859             /* Length of each dist symbol in bits. */
13860             double d_symbols[ZOPFLI_NUM_D];
13861             } SymbolStats;
13862              
13863             /* Sets everything to 0. */
13864 4           static void InitStats(SymbolStats* stats) {
13865 4           memset(stats->litlens, 0, ZOPFLI_NUM_LL * sizeof(stats->litlens[0]));
13866 4           memset(stats->dists, 0, ZOPFLI_NUM_D * sizeof(stats->dists[0]));
13867              
13868 4           memset(stats->ll_symbols, 0, ZOPFLI_NUM_LL * sizeof(stats->ll_symbols[0]));
13869 4           memset(stats->d_symbols, 0, ZOPFLI_NUM_D * sizeof(stats->d_symbols[0]));
13870 4           }
13871              
13872 100           static void CopyStats(SymbolStats* source, SymbolStats* dest) {
13873 100           memcpy(dest->litlens, source->litlens,
13874             ZOPFLI_NUM_LL * sizeof(dest->litlens[0]));
13875 100           memcpy(dest->dists, source->dists, ZOPFLI_NUM_D * sizeof(dest->dists[0]));
13876              
13877 100           memcpy(dest->ll_symbols, source->ll_symbols,
13878             ZOPFLI_NUM_LL * sizeof(dest->ll_symbols[0]));
13879 100           memcpy(dest->d_symbols, source->d_symbols,
13880             ZOPFLI_NUM_D * sizeof(dest->d_symbols[0]));
13881 100           }
13882              
13883             /* Adds the bit lengths. */
13884 32           static void AddWeighedStatFreqs(const SymbolStats* stats1, double w1,
13885             const SymbolStats* stats2, double w2,
13886             SymbolStats* result) {
13887             size_t i;
13888 9248 100         for (i = 0; i < ZOPFLI_NUM_LL; i++) {
13889 9216           result->litlens[i] =
13890 9216           (size_t) (stats1->litlens[i] * w1 + stats2->litlens[i] * w2);
13891             }
13892 1056 100         for (i = 0; i < ZOPFLI_NUM_D; i++) {
13893 1024           result->dists[i] =
13894 1024           (size_t) (stats1->dists[i] * w1 + stats2->dists[i] * w2);
13895             }
13896 32           result->litlens[256] = 1; /* End symbol. */
13897 32           }
13898              
13899             typedef struct RanState {
13900             unsigned int m_w, m_z;
13901             } RanState;
13902              
13903 4           static void InitRanState(RanState* state) {
13904 4           state->m_w = 1;
13905 4           state->m_z = 2;
13906 4           }
13907              
13908             /* Get random number: "Multiply-With-Carry" generator of G. Marsaglia */
13909 15380           static unsigned int Ran(RanState* state) {
13910 15380           state->m_z = 36969 * (state->m_z & 65535) + (state->m_z >> 16);
13911 15380           state->m_w = 18000 * (state->m_w & 65535) + (state->m_w >> 16);
13912 15380           return (state->m_z << 16) + state->m_w; /* 32-bit result. */
13913             }
13914              
13915 72           static void RandomizeFreqs(RanState* state, size_t* freqs, int n) {
13916             int i;
13917 11592 100         for (i = 0; i < n; i++) {
13918 11520 100         if ((Ran(state) >> 4) % 3 == 0) freqs[i] = freqs[Ran(state) % n];
13919             }
13920 72           }
13921              
13922 36           static void RandomizeStatFreqs(RanState* state, SymbolStats* stats) {
13923 36           RandomizeFreqs(state, stats->litlens, ZOPFLI_NUM_LL);
13924 36           RandomizeFreqs(state, stats->dists, ZOPFLI_NUM_D);
13925 36           stats->litlens[256] = 1; /* End symbol. */
13926 36           }
13927              
13928 60           static void ClearStatFreqs(SymbolStats* stats) {
13929             size_t i;
13930 17340 100         for (i = 0; i < ZOPFLI_NUM_LL; i++) stats->litlens[i] = 0;
13931 1980 100         for (i = 0; i < ZOPFLI_NUM_D; i++) stats->dists[i] = 0;
13932 60           }
13933              
13934             /*
13935             Function that calculates a cost based on a model for the given LZ77 symbol.
13936             litlen: means literal symbol if dist is 0, length otherwise.
13937             */
13938             typedef double CostModelFun(unsigned litlen, unsigned dist, void* context);
13939              
13940             /*
13941             Cost model which should exactly match fixed tree.
13942             type: CostModelFun
13943             */
13944 803726           static double GetCostFixed(unsigned litlen, unsigned dist, void* unused) {
13945             (void)unused;
13946 803726 100         if (dist == 0) {
13947 9180 50         if (litlen <= 143) return 8;
13948 0           else return 9;
13949             } else {
13950 794546           int dbits = ZopfliGetDistExtraBits(dist);
13951 794546           int lbits = ZopfliGetLengthExtraBits(litlen);
13952 794546           int lsym = ZopfliGetLengthSymbol(litlen);
13953 794546           int cost = 0;
13954 794546 100         if (lsym <= 279) cost += 7;
13955 751544           else cost += 8;
13956 794546           cost += 5; /* Every dist symbol has length 5. */
13957 794546           return cost + dbits + lbits;
13958             }
13959             }
13960              
13961             /*
13962             Cost model based on symbol statistics.
13963             type: CostModelFun
13964             */
13965 7847149           static double GetCostStat(unsigned litlen, unsigned dist, void* context) {
13966 7847149           SymbolStats* stats = (SymbolStats*)context;
13967 7847149 100         if (dist == 0) {
13968 137700           return stats->ll_symbols[litlen];
13969             } else {
13970 7709449           int lsym = ZopfliGetLengthSymbol(litlen);
13971 7709449           int lbits = ZopfliGetLengthExtraBits(litlen);
13972 7709449           int dsym = ZopfliGetDistSymbol(dist);
13973 7709449           int dbits = ZopfliGetDistExtraBits(dist);
13974 7709449           return lbits + dbits + stats->ll_symbols[lsym] + stats->d_symbols[dsym];
13975             }
13976             }
13977              
13978             /*
13979             Finds the minimum possible cost this cost model can return for valid length and
13980             distance symbols.
13981             */
13982 64           static double GetCostModelMinCost(CostModelFun* costmodel, void* costcontext) {
13983             double mincost;
13984 64           int bestlength = 0; /* length that has lowest cost in the cost model */
13985 64           int bestdist = 0; /* distance that has lowest cost in the cost model */
13986             int i;
13987             /*
13988             Table of distances that have a different distance symbol in the deflate
13989             specification. Each value is the first distance that has a new symbol. Only
13990             different symbols affect the cost model so only these need to be checked.
13991             See RFC 1951 section 3.2.5. Compressed blocks (length and distance codes).
13992             */
13993             static const int dsymbols[30] = {
13994             1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513,
13995             769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577
13996             };
13997              
13998 64           mincost = ZOPFLI_LARGE_FLOAT;
13999 16448 100         for (i = 3; i < 259; i++) {
14000 16384           double c = costmodel(i, 1, costcontext);
14001 16384 100         if (c < mincost) {
14002 76           bestlength = i;
14003 76           mincost = c;
14004             }
14005             }
14006              
14007 64           mincost = ZOPFLI_LARGE_FLOAT;
14008 1984 100         for (i = 0; i < 30; i++) {
14009 1920           double c = costmodel(3, dsymbols[i], costcontext);
14010 1920 100         if (c < mincost) {
14011 78           bestdist = dsymbols[i];
14012 78           mincost = c;
14013             }
14014             }
14015              
14016 64           return costmodel(bestlength, bestdist, costcontext);
14017             }
14018              
14019 146880           static size_t zopfli_min(size_t a, size_t b) {
14020 146880           return a < b ? a : b;
14021             }
14022              
14023             /*
14024             Performs the forward pass for "squeeze". Gets the most optimal length to reach
14025             every byte from a previous byte, using cost calculations.
14026             s: the ZopfliBlockState
14027             in: the input data array
14028             instart: where to start
14029             inend: where to stop (not inclusive)
14030             costmodel: function to calculate the cost of some lit/len/dist pair.
14031             costcontext: abstract context for the costmodel function
14032             length_array: output array of size (inend - instart) which will receive the best
14033             length to reach this byte from a previous byte.
14034             returns the cost that was, according to the costmodel, needed to get to the end.
14035             */
14036 64           static double GetBestLengths(ZopfliBlockState *s,
14037             const unsigned char* in,
14038             size_t instart, size_t inend,
14039             CostModelFun* costmodel, void* costcontext,
14040             unsigned short* length_array,
14041             ZopfliHash* h, float* costs) {
14042             /* Best cost to get here so far. */
14043 64           size_t blocksize = inend - instart;
14044 64           size_t i = 0, k, kend;
14045             unsigned short leng;
14046             unsigned short dist;
14047             unsigned short sublen[259];
14048 64           size_t windowstart = instart > ZOPFLI_WINDOW_SIZE
14049 64 50         ? instart - ZOPFLI_WINDOW_SIZE : 0;
14050             double result;
14051 64           double mincost = GetCostModelMinCost(costmodel, costcontext);
14052             double mincostaddcostj;
14053              
14054 64 50         if (instart == inend) return 0;
14055              
14056 64           ZopfliResetHash(ZOPFLI_WINDOW_SIZE, h);
14057 64           ZopfliWarmupHash(in, windowstart, inend, h);
14058 208 100         for (i = windowstart; i < instart; i++) {
14059 144           ZopfliUpdateHash(in, i, inend, h);
14060             }
14061              
14062 146944 100         for (i = 1; i < blocksize + 1; i++) costs[i] = ZOPFLI_LARGE_FLOAT;
14063 64           costs[0] = 0; /* Because it's the start. */
14064 64           length_array[0] = 0;
14065              
14066 146944 100         for (i = instart; i < inend; i++) {
14067 146880           size_t j = i - instart; /* Index in the costs array and length_array. */
14068 146880           ZopfliUpdateHash(in, i, inend, h);
14069              
14070             #ifdef ZOPFLI_SHORTCUT_LONG_REPETITIONS
14071             /* If we're in a long repetition of the same character and have more than
14072             ZOPFLI_MAX_MATCH characters before and after our position. */
14073 146880 50         if (h->same[i & ZOPFLI_WINDOW_MASK] > ZOPFLI_MAX_MATCH * 2
14074 0 0         && i > instart + ZOPFLI_MAX_MATCH + 1
14075 0 0         && i + ZOPFLI_MAX_MATCH * 2 + 1 < inend
14076 0 0         && h->same[(i - ZOPFLI_MAX_MATCH) & ZOPFLI_WINDOW_MASK]
14077             > ZOPFLI_MAX_MATCH) {
14078 0           double symbolcost = costmodel(ZOPFLI_MAX_MATCH, 1, costcontext);
14079             /* Set the length to reach each one to ZOPFLI_MAX_MATCH, and the cost to
14080             the cost corresponding to that length. Doing this, we skip
14081             ZOPFLI_MAX_MATCH values to avoid calling ZopfliFindLongestMatch. */
14082 0 0         for (k = 0; k < ZOPFLI_MAX_MATCH; k++) {
14083 0           costs[j + ZOPFLI_MAX_MATCH] = costs[j] + symbolcost;
14084 0           length_array[j + ZOPFLI_MAX_MATCH] = ZOPFLI_MAX_MATCH;
14085 0           i++;
14086 0           j++;
14087 0           ZopfliUpdateHash(in, i, inend, h);
14088             }
14089             }
14090             #endif
14091              
14092 146880           ZopfliFindLongestMatch(s, h, in, i, inend, ZOPFLI_MAX_MATCH, sublen,
14093             &dist, &leng);
14094              
14095             /* Literal. */
14096 146880 50         if (i + 1 <= inend) {
14097 146880           double newCost = costmodel(in[i], 0, costcontext) + costs[j];
14098             assert(newCost >= 0);
14099 146880 100         if (newCost < costs[j + 1]) {
14100 1046           costs[j + 1] = newCost;
14101 1046           length_array[j + 1] = 1;
14102             }
14103             }
14104             /* Lengths. */
14105 146880           kend = zopfli_min(leng, inend-i);
14106 146880           mincostaddcostj = mincost + costs[j];
14107 36544704 100         for (k = 3; k <= kend; k++) {
14108             double newCost;
14109              
14110             /* Calling the cost model is expensive, avoid this if we are already at
14111             the minimum possible cost that it can return. */
14112 36397824 100         if (costs[j + k] <= mincostaddcostj) continue;
14113              
14114 8485627           newCost = costmodel(k, sublen[k], costcontext) + costs[j];
14115             assert(newCost >= 0);
14116 8485627 100         if (newCost < costs[j + k]) {
14117             assert(k <= ZOPFLI_MAX_MATCH);
14118 190816           costs[j + k] = newCost;
14119 190816           length_array[j + k] = k;
14120             }
14121             }
14122             }
14123              
14124             assert(costs[blocksize] >= 0);
14125 64           result = costs[blocksize];
14126              
14127 64           return result;
14128             }
14129              
14130             /*
14131             Calculates the optimal path of lz77 lengths to use, from the calculated
14132             length_array. The length_array must contain the optimal length to reach that
14133             byte. The path will be filled with the lengths to use, so its data size will be
14134             the amount of lz77 symbols.
14135             */
14136 64           static void TraceBackwards(size_t size, const unsigned short* length_array,
14137             unsigned short** path, size_t* pathsize) {
14138 64           size_t index = size;
14139 64 50         if (size == 0) return;
14140             for (;;) {
14141 1024 100         ZOPFLI_APPEND_DATA(length_array[index], path, pathsize);
    100          
14142             assert(length_array[index] <= index);
14143             assert(length_array[index] <= ZOPFLI_MAX_MATCH);
14144             assert(length_array[index] != 0);
14145 1024           index -= length_array[index];
14146 1024 100         if (index == 0) break;
14147 960           }
14148              
14149             /* Mirror result. */
14150 560 100         for (index = 0; index < *pathsize / 2; index++) {
14151 496           unsigned short temp = (*path)[index];
14152 496           (*path)[index] = (*path)[*pathsize - index - 1];
14153 496           (*path)[*pathsize - index - 1] = temp;
14154             }
14155             }
14156              
14157 64           static void FollowPath(ZopfliBlockState* s,
14158             const unsigned char* in, size_t instart, size_t inend,
14159             unsigned short* path, size_t pathsize,
14160             ZopfliLZ77Store* store, ZopfliHash *h) {
14161 64           size_t i, j, pos = 0;
14162 64           size_t windowstart = instart > ZOPFLI_WINDOW_SIZE
14163 64 50         ? instart - ZOPFLI_WINDOW_SIZE : 0;
14164              
14165 64           size_t total_length_test = 0;
14166              
14167 64 50         if (instart == inend) return;
14168              
14169 64           ZopfliResetHash(ZOPFLI_WINDOW_SIZE, h);
14170 64           ZopfliWarmupHash(in, windowstart, inend, h);
14171 208 100         for (i = windowstart; i < instart; i++) {
14172 144           ZopfliUpdateHash(in, i, inend, h);
14173             }
14174              
14175 64           pos = instart;
14176 1088 100         for (i = 0; i < pathsize; i++) {
14177 1024           unsigned short length = path[i];
14178             unsigned short dummy_length;
14179             unsigned short dist;
14180             assert(pos < inend);
14181              
14182 1024           ZopfliUpdateHash(in, pos, inend, h);
14183              
14184             /* Add to output. */
14185 1024 100         if (length >= ZOPFLI_MIN_MATCH) {
14186             /* Get the distance by recalculating longest match. The found length
14187             should match the length from the path. */
14188 592           ZopfliFindLongestMatch(s, h, in, pos, inend, length, 0,
14189             &dist, &dummy_length);
14190             assert(!(dummy_length != length && length > 2 && dummy_length > 2));
14191 592           ZopfliVerifyLenDist(in, inend, pos, dist, length);
14192 592           ZopfliStoreLitLenDist(length, dist, pos, store);
14193 592           total_length_test += length;
14194             } else {
14195 432           length = 1;
14196 432           ZopfliStoreLitLenDist(in[pos], 0, pos, store);
14197 432           total_length_test++;
14198             }
14199              
14200              
14201             assert(pos + length <= inend);
14202 146880 100         for (j = 1; j < length; j++) {
14203 145856           ZopfliUpdateHash(in, pos + j, inend, h);
14204             }
14205              
14206 1024           pos += length;
14207             }
14208             }
14209              
14210             /* Calculates the entropy of the statistics */
14211 132           static void CalculateStatistics(SymbolStats* stats) {
14212 132           ZopfliCalculateEntropy(stats->litlens, ZOPFLI_NUM_LL, stats->ll_symbols);
14213 132           ZopfliCalculateEntropy(stats->dists, ZOPFLI_NUM_D, stats->d_symbols);
14214 132           }
14215              
14216             /* Appends the symbol statistics from the store. */
14217 64           static void GetStatistics(const ZopfliLZ77Store* store, SymbolStats* stats) {
14218             size_t i;
14219 1088 100         for (i = 0; i < store->size; i++) {
14220 1024 100         if (store->dists[i] == 0) {
14221 432           stats->litlens[store->litlens[i]]++;
14222             } else {
14223 592           stats->litlens[ZopfliGetLengthSymbol(store->litlens[i])]++;
14224 592           stats->dists[ZopfliGetDistSymbol(store->dists[i])]++;
14225             }
14226             }
14227 64           stats->litlens[256] = 1; /* End symbol. */
14228              
14229 64           CalculateStatistics(stats);
14230 64           }
14231              
14232             /*
14233             Does a single run for ZopfliLZ77Optimal. For good compression, repeated runs
14234             with updated statistics should be performed.
14235             s: the block state
14236             in: the input data array
14237             instart: where to start
14238             inend: where to stop (not inclusive)
14239             path: pointer to dynamically allocated memory to store the path
14240             pathsize: pointer to the size of the dynamic path array
14241             length_array: array of size (inend - instart) used to store lengths
14242             costmodel: function to use as the cost model for this squeeze run
14243             costcontext: abstract context for the costmodel function
14244             store: place to output the LZ77 data
14245             returns the cost that was, according to the costmodel, needed to get to the end.
14246             This is not the actual cost.
14247             */
14248 64           static double LZ77OptimalRun(ZopfliBlockState* s,
14249             const unsigned char* in, size_t instart, size_t inend,
14250             unsigned short** path, size_t* pathsize,
14251             unsigned short* length_array, CostModelFun* costmodel,
14252             void* costcontext, ZopfliLZ77Store* store,
14253             ZopfliHash* h, float* costs) {
14254 64           double cost = GetBestLengths(s, in, instart, inend, costmodel,
14255             costcontext, length_array, h, costs);
14256 64           free(*path);
14257 64           *path = 0;
14258 64           *pathsize = 0;
14259 64           TraceBackwards(inend - instart, length_array, path, pathsize);
14260 64           FollowPath(s, in, instart, inend, *path, *pathsize, store, h);
14261             assert(cost < ZOPFLI_LARGE_FLOAT);
14262 64           return cost;
14263             }
14264              
14265 4           void ZopfliLZ77Optimal(ZopfliBlockState *s,
14266             const unsigned char* in, size_t instart, size_t inend,
14267             int numiterations,
14268             ZopfliLZ77Store* store) {
14269             /* Dist to get to here with smallest cost. */
14270 4           size_t blocksize = inend - instart;
14271 4           unsigned short* length_array =
14272 4           (unsigned short*)malloc(sizeof(unsigned short) * (blocksize + 1));
14273 4           unsigned short* path = 0;
14274 4           size_t pathsize = 0;
14275             ZopfliLZ77Store currentstore;
14276             ZopfliHash hash;
14277 4           ZopfliHash* h = &hash;
14278             SymbolStats stats, beststats, laststats;
14279             int i;
14280 4           float* costs = (float*)malloc(sizeof(float) * (blocksize + 1));
14281             double cost;
14282 4           double bestcost = ZOPFLI_LARGE_FLOAT;
14283 4           double lastcost = 0;
14284             /* Try randomizing the costs a bit once the size stabilizes. */
14285             RanState ran_state;
14286 4           int lastrandomstep = -1;
14287              
14288 4 50         if (!costs) exit(-1); /* Allocation failed. */
14289 4 50         if (!length_array) exit(-1); /* Allocation failed. */
14290              
14291 4           InitRanState(&ran_state);
14292 4           InitStats(&stats);
14293 4           ZopfliInitLZ77Store(in, ¤tstore);
14294 4           ZopfliAllocHash(ZOPFLI_WINDOW_SIZE, h);
14295              
14296             /* Do regular deflate, then loop multiple shortest path runs, each time using
14297             the statistics of the previous run. */
14298              
14299             /* Initial run. */
14300 4           ZopfliLZ77Greedy(s, in, instart, inend, ¤tstore, h);
14301 4           GetStatistics(¤tstore, &stats);
14302              
14303             /* Repeat statistics with each time the cost model from the previous stat
14304             run. */
14305 64 100         for (i = 0; i < numiterations; i++) {
14306 60           ZopfliCleanLZ77Store(¤tstore);
14307 60           ZopfliInitLZ77Store(in, ¤tstore);
14308 60           LZ77OptimalRun(s, in, instart, inend, &path, &pathsize,
14309             length_array, GetCostStat, (void*)&stats,
14310             ¤tstore, h, costs);
14311 60           cost = ZopfliCalculateBlockSize(¤tstore, 0, currentstore.size, 2);
14312 60 50         if (s->options->verbose_more || (s->options->verbose && cost < bestcost)) {
    50          
    0          
14313 0           fprintf(stderr, "Iteration %d: %d bit\n", i, (int) cost);
14314             }
14315 60 100         if (cost < bestcost) {
14316             /* Copy to the output store. */
14317 4           ZopfliCopyLZ77Store(¤tstore, store);
14318 4           CopyStats(&stats, &beststats);
14319 4           bestcost = cost;
14320             }
14321 60           CopyStats(&stats, &laststats);
14322 60           ClearStatFreqs(&stats);
14323 60           GetStatistics(¤tstore, &stats);
14324 60 100         if (lastrandomstep != -1) {
14325             /* This makes it converge slower but better. Do it only once the
14326             randomness kicks in so that if the user does few iterations, it gives a
14327             better result sooner. */
14328 32           AddWeighedStatFreqs(&stats, 1.0, &laststats, 0.5, &stats);
14329 32           CalculateStatistics(&stats);
14330             }
14331 60 100         if (i > 5 && cost == lastcost) {
    50          
14332 36           CopyStats(&beststats, &stats);
14333 36           RandomizeStatFreqs(&ran_state, &stats);
14334 36           CalculateStatistics(&stats);
14335 36           lastrandomstep = i;
14336             }
14337 60           lastcost = cost;
14338             }
14339              
14340 4           free(length_array);
14341 4           free(path);
14342 4           free(costs);
14343 4           ZopfliCleanLZ77Store(¤tstore);
14344 4           ZopfliCleanHash(h);
14345 4           }
14346              
14347 4           void ZopfliLZ77OptimalFixed(ZopfliBlockState *s,
14348             const unsigned char* in,
14349             size_t instart, size_t inend,
14350             ZopfliLZ77Store* store)
14351             {
14352             /* Dist to get to here with smallest cost. */
14353 4           size_t blocksize = inend - instart;
14354 4           unsigned short* length_array =
14355 4           (unsigned short*)malloc(sizeof(unsigned short) * (blocksize + 1));
14356 4           unsigned short* path = 0;
14357 4           size_t pathsize = 0;
14358             ZopfliHash hash;
14359 4           ZopfliHash* h = &hash;
14360 4           float* costs = (float*)malloc(sizeof(float) * (blocksize + 1));
14361              
14362 4 50         if (!costs) exit(-1); /* Allocation failed. */
14363 4 50         if (!length_array) exit(-1); /* Allocation failed. */
14364              
14365 4           ZopfliAllocHash(ZOPFLI_WINDOW_SIZE, h);
14366              
14367 4           s->blockstart = instart;
14368 4           s->blockend = inend;
14369              
14370             /* Shortest path for fixed tree This one should give the shortest possible
14371             result for fixed tree, no repeated runs are needed since the tree is known. */
14372 4           LZ77OptimalRun(s, in, instart, inend, &path, &pathsize,
14373             length_array, GetCostFixed, 0, store, h, costs);
14374              
14375 4           free(length_array);
14376 4           free(path);
14377 4           free(costs);
14378 4           ZopfliCleanHash(h);
14379 4           }
14380             /*
14381             Copyright 2011 Google Inc. All Rights Reserved.
14382              
14383             Licensed under the Apache License, Version 2.0 (the "License");
14384             you may not use this file except in compliance with the License.
14385             You may obtain a copy of the License at
14386              
14387             http://www.apache.org/licenses/LICENSE-2.0
14388              
14389             Unless required by applicable law or agreed to in writing, software
14390             distributed under the License is distributed on an "AS IS" BASIS,
14391             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14392             See the License for the specific language governing permissions and
14393             limitations under the License.
14394              
14395             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
14396             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
14397             */
14398              
14399             /* tree.h */
14400             /*
14401             Copyright 2011 Google Inc. All Rights Reserved.
14402              
14403             Licensed under the Apache License, Version 2.0 (the "License");
14404             you may not use this file except in compliance with the License.
14405             You may obtain a copy of the License at
14406              
14407             http://www.apache.org/licenses/LICENSE-2.0
14408              
14409             Unless required by applicable law or agreed to in writing, software
14410             distributed under the License is distributed on an "AS IS" BASIS,
14411             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14412             See the License for the specific language governing permissions and
14413             limitations under the License.
14414              
14415             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
14416             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
14417             */
14418              
14419             /*
14420             Utilities for creating and using Huffman trees.
14421             */
14422              
14423             #ifndef ZOPFLI_TREE_H_
14424             #define ZOPFLI_TREE_H_
14425              
14426             #include
14427              
14428             /*
14429             Calculates the bitlengths for the Huffman tree, based on the counts of each
14430             symbol.
14431             */
14432             void ZopfliCalculateBitLengths(const size_t* count, size_t n, int maxbits,
14433             unsigned *bitlengths);
14434              
14435             /*
14436             Converts a series of Huffman tree bitlengths, to the bit values of the symbols.
14437             */
14438             void ZopfliLengthsToSymbols(const unsigned* lengths, size_t n, unsigned maxbits,
14439             unsigned* symbols);
14440              
14441             /*
14442             Calculates the entropy of each symbol, based on the counts of each symbol. The
14443             result is similar to the result of ZopfliCalculateBitLengths, but with the
14444             actual theoritical bit lengths according to the entropy. Since the resulting
14445             values are fractional, they cannot be used to encode the tree specified by
14446             DEFLATE.
14447             */
14448             void ZopfliCalculateEntropy(const size_t* count, size_t n, double* bitlengths);
14449              
14450             #endif /* ZOPFLI_TREE_H_ */
14451              
14452              
14453             #include
14454             #include
14455             #include
14456             #include
14457              
14458             /* katajainen.h */
14459             /*
14460             Copyright 2011 Google Inc. All Rights Reserved.
14461              
14462             Licensed under the Apache License, Version 2.0 (the "License");
14463             you may not use this file except in compliance with the License.
14464             You may obtain a copy of the License at
14465              
14466             http://www.apache.org/licenses/LICENSE-2.0
14467              
14468             Unless required by applicable law or agreed to in writing, software
14469             distributed under the License is distributed on an "AS IS" BASIS,
14470             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14471             See the License for the specific language governing permissions and
14472             limitations under the License.
14473              
14474             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
14475             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
14476             */
14477              
14478             #ifndef ZOPFLI_KATAJAINEN_H_
14479             #define ZOPFLI_KATAJAINEN_H_
14480              
14481             #include
14482              
14483             /*
14484             Outputs minimum-redundancy length-limited code bitlengths for symbols with the
14485             given counts. The bitlengths are limited by maxbits.
14486              
14487             The output is tailored for DEFLATE: symbols that never occur, get a bit length
14488             of 0, and if only a single symbol occurs at least once, its bitlength will be 1,
14489             and not 0 as would theoretically be needed for a single symbol.
14490              
14491             frequencies: The amount of occurrences of each symbol.
14492             n: The amount of symbols.
14493             maxbits: Maximum bit length, inclusive.
14494             bitlengths: Output, the bitlengths for the symbol prefix codes.
14495             return: 0 for OK, non-0 for error.
14496             */
14497             int ZopfliLengthLimitedCodeLengths(
14498             const size_t* frequencies, int n, int maxbits, unsigned* bitlengths);
14499              
14500             #endif /* ZOPFLI_KATAJAINEN_H_ */
14501              
14502             /* util.h */
14503             /*
14504             Copyright 2011 Google Inc. All Rights Reserved.
14505              
14506             Licensed under the Apache License, Version 2.0 (the "License");
14507             you may not use this file except in compliance with the License.
14508             You may obtain a copy of the License at
14509              
14510             http://www.apache.org/licenses/LICENSE-2.0
14511              
14512             Unless required by applicable law or agreed to in writing, software
14513             distributed under the License is distributed on an "AS IS" BASIS,
14514             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14515             See the License for the specific language governing permissions and
14516             limitations under the License.
14517              
14518             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
14519             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
14520             */
14521              
14522             /*
14523             Several utilities, including: #defines to try different compression results,
14524             basic deflate specification values and generic program options.
14525             */
14526              
14527             #ifndef ZOPFLI_UTIL_H_
14528             #define ZOPFLI_UTIL_H_
14529              
14530             #include
14531             #include
14532              
14533             /* Minimum and maximum length that can be encoded in deflate. */
14534             #define ZOPFLI_MAX_MATCH 258
14535             #define ZOPFLI_MIN_MATCH 3
14536              
14537             /* Number of distinct literal/length and distance symbols in DEFLATE */
14538             #define ZOPFLI_NUM_LL 288
14539             #define ZOPFLI_NUM_D 32
14540              
14541             /*
14542             The window size for deflate. Must be a power of two. This should be 32768, the
14543             maximum possible by the deflate spec. Anything less hurts compression more than
14544             speed.
14545             */
14546             #define ZOPFLI_WINDOW_SIZE 32768
14547              
14548             /*
14549             The window mask used to wrap indices into the window. This is why the
14550             window size must be a power of two.
14551             */
14552             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
14553              
14554             /*
14555             A block structure of huge, non-smart, blocks to divide the input into, to allow
14556             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
14557             The whole compression algorithm, including the smarter block splitting, will
14558             be executed independently on each huge block.
14559             Dividing into huge blocks hurts compression, but not much relative to the size.
14560             Set it to 0 to disable master blocks.
14561             */
14562             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
14563              
14564             /*
14565             Used to initialize costs for example
14566             */
14567             #define ZOPFLI_LARGE_FLOAT 1e30
14568              
14569             /*
14570             For longest match cache. max 256. Uses huge amounts of memory but makes it
14571             faster. Uses this many times three bytes per single byte of the input data.
14572             This is so because longest match finding has to find the exact distance
14573             that belongs to each length for the best lz77 strategy.
14574             Good values: e.g. 5, 8.
14575             */
14576             #define ZOPFLI_CACHE_LENGTH 8
14577              
14578             /*
14579             limit the max hash chain hits for this hash value. This has an effect only
14580             on files where the hash value is the same very often. On these files, this
14581             gives worse compression (the value should ideally be 32768, which is the
14582             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
14583             faster on some specific files.
14584             Good value: e.g. 8192.
14585             */
14586             #define ZOPFLI_MAX_CHAIN_HITS 8192
14587              
14588             /*
14589             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
14590             consumes a lot of memory but speeds it up. No effect on compression size.
14591             */
14592             #define ZOPFLI_LONGEST_MATCH_CACHE
14593              
14594             /*
14595             Enable to remember amount of successive identical bytes in the hash chain for
14596             finding longest match
14597             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
14598             This has no effect on the compression result, and enabling it increases speed.
14599             */
14600             #define ZOPFLI_HASH_SAME
14601              
14602             /*
14603             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
14604             best length so far is long enough. This is way faster for files with lots of
14605             identical bytes, on which the compressor is otherwise too slow. Regular files
14606             are unaffected or maybe a tiny bit slower.
14607             This has no effect on the compression result, only on speed.
14608             */
14609             #define ZOPFLI_HASH_SAME_HASH
14610              
14611             /*
14612             Enable this, to avoid slowness for files which are a repetition of the same
14613             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
14614             the compression result.
14615             */
14616             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
14617              
14618             /*
14619             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
14620             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
14621             varies from file to file.
14622             */
14623             #define ZOPFLI_LAZY_MATCHING
14624              
14625             /*
14626             Appends value to dynamically allocated memory, doubling its allocation size
14627             whenever needed.
14628              
14629             value: the value to append, type T
14630             data: pointer to the dynamic array to append to, type T**
14631             size: pointer to the size of the array to append to, type size_t*. This is the
14632             size that you consider the array to be, not the internal allocation size.
14633             Precondition: allocated size of data is at least a power of two greater than or
14634             equal than *size.
14635             */
14636             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
14637             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
14638             if (!((*size) & ((*size) - 1))) {\
14639             /*double alloc size if it's a power of two*/\
14640             void** data_void = reinterpret_cast(data);\
14641             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
14642             : realloc((*data), (*size) * 2 * sizeof(**data));\
14643             }\
14644             (*data)[(*size)] = (value);\
14645             (*size)++;\
14646             }
14647             #else /* C gives problems with strict-aliasing rules for (void**) cast */
14648             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
14649             if (!((*size) & ((*size) - 1))) {\
14650             /*double alloc size if it's a power of two*/\
14651             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
14652             : realloc((*data), (*size) * 2 * sizeof(**data));\
14653             }\
14654             (*data)[(*size)] = (value);\
14655             (*size)++;\
14656             }
14657             #endif
14658              
14659              
14660             #endif /* ZOPFLI_UTIL_H_ */
14661              
14662              
14663 9           void ZopfliLengthsToSymbols(const unsigned* lengths, size_t n, unsigned maxbits,
14664             unsigned* symbols) {
14665 9           size_t* bl_count = (size_t*)malloc(sizeof(size_t) * (maxbits + 1));
14666 9           size_t* next_code = (size_t*)malloc(sizeof(size_t) * (maxbits + 1));
14667             unsigned bits, i;
14668             unsigned code;
14669              
14670 1308 100         for (i = 0; i < n; i++) {
14671 1299           symbols[i] = 0;
14672             }
14673              
14674             /* 1) Count the number of codes for each code length. Let bl_count[N] be the
14675             number of codes of length N, N >= 1. */
14676 145 100         for (bits = 0; bits <= maxbits; bits++) {
14677 136           bl_count[bits] = 0;
14678             }
14679 1308 100         for (i = 0; i < n; i++) {
14680             assert(lengths[i] <= maxbits);
14681 1299           bl_count[lengths[i]]++;
14682             }
14683             /* 2) Find the numerical value of the smallest code for each code length. */
14684 9           code = 0;
14685 9           bl_count[0] = 0;
14686 136 100         for (bits = 1; bits <= maxbits; bits++) {
14687 127           code = (code + bl_count[bits-1]) << 1;
14688 127           next_code[bits] = code;
14689             }
14690             /* 3) Assign numerical values to all codes, using consecutive values for all
14691             codes of the same length with the base values determined at step 2. */
14692 1308 100         for (i = 0; i < n; i++) {
14693 1299           unsigned len = lengths[i];
14694 1299 100         if (len != 0) {
14695 970           symbols[i] = next_code[len];
14696 970           next_code[len]++;
14697             }
14698             }
14699              
14700 9           free(bl_count);
14701 9           free(next_code);
14702 9           }
14703              
14704 264           void ZopfliCalculateEntropy(const size_t* count, size_t n, double* bitlengths) {
14705             static const double kInvLog2 = 1.4426950408889; /* 1.0 / log(2.0) */
14706 264           unsigned sum = 0;
14707             unsigned i;
14708             double log2sum;
14709 42504 100         for (i = 0; i < n; ++i) {
14710 42240           sum += count[i];
14711             }
14712 264 100         log2sum = (sum == 0 ? log(n) : log(sum)) * kInvLog2;
14713 42504 100         for (i = 0; i < n; ++i) {
14714             /* When the count of the symbol is 0, but its cost is requested anyway, it
14715             means the symbol will appear at least once anyway, so give it the cost as if
14716             its count is 1.*/
14717 42240 100         if (count[i] == 0) bitlengths[i] = log2sum;
14718 1347           else bitlengths[i] = log2sum - log(count[i]) * kInvLog2;
14719             /* Depending on compiler and architecture, the above subtraction of two
14720             floating point numbers may give a negative result very close to zero
14721             instead of zero (e.g. -5.973954e-17 with gcc 4.1.2 on Ubuntu 11.4). Clamp
14722             it to zero. These floating point imprecisions do not affect the cost model
14723             significantly so this is ok. */
14724 42240 50         if (bitlengths[i] < 0 && bitlengths[i] > -1e-5) bitlengths[i] = 0;
    0          
14725             assert(bitlengths[i] >= 0);
14726             }
14727 264           }
14728              
14729 5229           void ZopfliCalculateBitLengths(const size_t* count, size_t n, int maxbits,
14730             unsigned* bitlengths) {
14731 5229           int error = ZopfliLengthLimitedCodeLengths(count, n, maxbits, bitlengths);
14732             (void) error;
14733             assert(!error);
14734 5229           }
14735             /*
14736             Copyright 2011 Google Inc. All Rights Reserved.
14737              
14738             Licensed under the Apache License, Version 2.0 (the "License");
14739             you may not use this file except in compliance with the License.
14740             You may obtain a copy of the License at
14741              
14742             http://www.apache.org/licenses/LICENSE-2.0
14743              
14744             Unless required by applicable law or agreed to in writing, software
14745             distributed under the License is distributed on an "AS IS" BASIS,
14746             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14747             See the License for the specific language governing permissions and
14748             limitations under the License.
14749              
14750             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
14751             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
14752             */
14753              
14754             /* util.h */
14755             /*
14756             Copyright 2011 Google Inc. All Rights Reserved.
14757              
14758             Licensed under the Apache License, Version 2.0 (the "License");
14759             you may not use this file except in compliance with the License.
14760             You may obtain a copy of the License at
14761              
14762             http://www.apache.org/licenses/LICENSE-2.0
14763              
14764             Unless required by applicable law or agreed to in writing, software
14765             distributed under the License is distributed on an "AS IS" BASIS,
14766             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14767             See the License for the specific language governing permissions and
14768             limitations under the License.
14769              
14770             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
14771             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
14772             */
14773              
14774             /*
14775             Several utilities, including: #defines to try different compression results,
14776             basic deflate specification values and generic program options.
14777             */
14778              
14779             #ifndef ZOPFLI_UTIL_H_
14780             #define ZOPFLI_UTIL_H_
14781              
14782             #include
14783             #include
14784              
14785             /* Minimum and maximum length that can be encoded in deflate. */
14786             #define ZOPFLI_MAX_MATCH 258
14787             #define ZOPFLI_MIN_MATCH 3
14788              
14789             /* Number of distinct literal/length and distance symbols in DEFLATE */
14790             #define ZOPFLI_NUM_LL 288
14791             #define ZOPFLI_NUM_D 32
14792              
14793             /*
14794             The window size for deflate. Must be a power of two. This should be 32768, the
14795             maximum possible by the deflate spec. Anything less hurts compression more than
14796             speed.
14797             */
14798             #define ZOPFLI_WINDOW_SIZE 32768
14799              
14800             /*
14801             The window mask used to wrap indices into the window. This is why the
14802             window size must be a power of two.
14803             */
14804             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
14805              
14806             /*
14807             A block structure of huge, non-smart, blocks to divide the input into, to allow
14808             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
14809             The whole compression algorithm, including the smarter block splitting, will
14810             be executed independently on each huge block.
14811             Dividing into huge blocks hurts compression, but not much relative to the size.
14812             Set it to 0 to disable master blocks.
14813             */
14814             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
14815              
14816             /*
14817             Used to initialize costs for example
14818             */
14819             #define ZOPFLI_LARGE_FLOAT 1e30
14820              
14821             /*
14822             For longest match cache. max 256. Uses huge amounts of memory but makes it
14823             faster. Uses this many times three bytes per single byte of the input data.
14824             This is so because longest match finding has to find the exact distance
14825             that belongs to each length for the best lz77 strategy.
14826             Good values: e.g. 5, 8.
14827             */
14828             #define ZOPFLI_CACHE_LENGTH 8
14829              
14830             /*
14831             limit the max hash chain hits for this hash value. This has an effect only
14832             on files where the hash value is the same very often. On these files, this
14833             gives worse compression (the value should ideally be 32768, which is the
14834             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
14835             faster on some specific files.
14836             Good value: e.g. 8192.
14837             */
14838             #define ZOPFLI_MAX_CHAIN_HITS 8192
14839              
14840             /*
14841             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
14842             consumes a lot of memory but speeds it up. No effect on compression size.
14843             */
14844             #define ZOPFLI_LONGEST_MATCH_CACHE
14845              
14846             /*
14847             Enable to remember amount of successive identical bytes in the hash chain for
14848             finding longest match
14849             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
14850             This has no effect on the compression result, and enabling it increases speed.
14851             */
14852             #define ZOPFLI_HASH_SAME
14853              
14854             /*
14855             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
14856             best length so far is long enough. This is way faster for files with lots of
14857             identical bytes, on which the compressor is otherwise too slow. Regular files
14858             are unaffected or maybe a tiny bit slower.
14859             This has no effect on the compression result, only on speed.
14860             */
14861             #define ZOPFLI_HASH_SAME_HASH
14862              
14863             /*
14864             Enable this, to avoid slowness for files which are a repetition of the same
14865             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
14866             the compression result.
14867             */
14868             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
14869              
14870             /*
14871             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
14872             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
14873             varies from file to file.
14874             */
14875             #define ZOPFLI_LAZY_MATCHING
14876              
14877             /*
14878             Appends value to dynamically allocated memory, doubling its allocation size
14879             whenever needed.
14880              
14881             value: the value to append, type T
14882             data: pointer to the dynamic array to append to, type T**
14883             size: pointer to the size of the array to append to, type size_t*. This is the
14884             size that you consider the array to be, not the internal allocation size.
14885             Precondition: allocated size of data is at least a power of two greater than or
14886             equal than *size.
14887             */
14888             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
14889             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
14890             if (!((*size) & ((*size) - 1))) {\
14891             /*double alloc size if it's a power of two*/\
14892             void** data_void = reinterpret_cast(data);\
14893             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
14894             : realloc((*data), (*size) * 2 * sizeof(**data));\
14895             }\
14896             (*data)[(*size)] = (value);\
14897             (*size)++;\
14898             }
14899             #else /* C gives problems with strict-aliasing rules for (void**) cast */
14900             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
14901             if (!((*size) & ((*size) - 1))) {\
14902             /*double alloc size if it's a power of two*/\
14903             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
14904             : realloc((*data), (*size) * 2 * sizeof(**data));\
14905             }\
14906             (*data)[(*size)] = (value);\
14907             (*size)++;\
14908             }
14909             #endif
14910              
14911              
14912             #endif /* ZOPFLI_UTIL_H_ */
14913              
14914              
14915             /* zopfli.h */
14916             /*
14917             Copyright 2011 Google Inc. All Rights Reserved.
14918              
14919             Licensed under the Apache License, Version 2.0 (the "License");
14920             you may not use this file except in compliance with the License.
14921             You may obtain a copy of the License at
14922              
14923             http://www.apache.org/licenses/LICENSE-2.0
14924              
14925             Unless required by applicable law or agreed to in writing, software
14926             distributed under the License is distributed on an "AS IS" BASIS,
14927             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14928             See the License for the specific language governing permissions and
14929             limitations under the License.
14930              
14931             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
14932             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
14933             */
14934              
14935             #ifndef ZOPFLI_ZOPFLI_H_
14936             #define ZOPFLI_ZOPFLI_H_
14937              
14938             #include
14939             #include /* for size_t */
14940              
14941             #ifdef __cplusplus
14942             extern "C" {
14943             #endif
14944              
14945             /*
14946             Options used throughout the program.
14947             */
14948             typedef struct ZopfliOptions {
14949             /* Whether to print output */
14950             int verbose;
14951              
14952             /* Whether to print more detailed output */
14953             int verbose_more;
14954              
14955             /*
14956             Maximum amount of times to rerun forward and backward pass to optimize LZ77
14957             compression cost. Good values: 10, 15 for small files, 5 for files over
14958             several MB in size or it will be too slow.
14959             */
14960             int numiterations;
14961              
14962             /*
14963             If true, splits the data in multiple deflate blocks with optimal choice
14964             for the block boundaries. Block splitting gives better compression. Default:
14965             true (1).
14966             */
14967             int blocksplitting;
14968              
14969             /*
14970             No longer used, left for compatibility.
14971             */
14972             int blocksplittinglast;
14973              
14974             /*
14975             Maximum amount of blocks to split into (0 for unlimited, but this can give
14976             extreme results that hurt compression on some files). Default value: 15.
14977             */
14978             int blocksplittingmax;
14979             } ZopfliOptions;
14980              
14981             /* Initializes options with default values. */
14982             void ZopfliInitOptions(ZopfliOptions* options);
14983              
14984             /* Output format */
14985             typedef enum {
14986             ZOPFLI_FORMAT_GZIP,
14987             ZOPFLI_FORMAT_ZLIB,
14988             ZOPFLI_FORMAT_DEFLATE
14989             } ZopfliFormat;
14990              
14991             /*
14992             Compresses according to the given output format and appends the result to the
14993             output.
14994              
14995             options: global program options
14996             output_type: the output format to use
14997             out: pointer to the dynamic output array to which the result is appended. Must
14998             be freed after use
14999             outsize: pointer to the dynamic output array size
15000             */
15001             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
15002             const unsigned char* in, size_t insize,
15003             unsigned char** out, size_t* outsize);
15004              
15005             #ifdef __cplusplus
15006             } // extern "C"
15007             #endif
15008              
15009             #endif /* ZOPFLI_ZOPFLI_H_ */
15010              
15011              
15012             #include
15013             #include
15014             #include
15015              
15016 3           void ZopfliInitOptions(ZopfliOptions* options) {
15017 3           options->verbose = 0;
15018 3           options->verbose_more = 0;
15019 3           options->numiterations = 15;
15020 3           options->blocksplitting = 1;
15021 3           options->blocksplittinglast = 0;
15022 3           options->blocksplittingmax = 15;
15023 3           }
15024             /*
15025             Copyright 2013 Google Inc. All Rights Reserved.
15026              
15027             Licensed under the Apache License, Version 2.0 (the "License");
15028             you may not use this file except in compliance with the License.
15029             You may obtain a copy of the License at
15030              
15031             http://www.apache.org/licenses/LICENSE-2.0
15032              
15033             Unless required by applicable law or agreed to in writing, software
15034             distributed under the License is distributed on an "AS IS" BASIS,
15035             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15036             See the License for the specific language governing permissions and
15037             limitations under the License.
15038              
15039             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
15040             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
15041             */
15042              
15043             /* zlib_container.h */
15044             /*
15045             Copyright 2013 Google Inc. All Rights Reserved.
15046              
15047             Licensed under the Apache License, Version 2.0 (the "License");
15048             you may not use this file except in compliance with the License.
15049             You may obtain a copy of the License at
15050              
15051             http://www.apache.org/licenses/LICENSE-2.0
15052              
15053             Unless required by applicable law or agreed to in writing, software
15054             distributed under the License is distributed on an "AS IS" BASIS,
15055             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15056             See the License for the specific language governing permissions and
15057             limitations under the License.
15058              
15059             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
15060             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
15061             */
15062              
15063             #ifndef ZOPFLI_ZLIB_H_
15064             #define ZOPFLI_ZLIB_H_
15065              
15066             /*
15067             Functions to compress according to the Zlib specification.
15068             */
15069              
15070             /* zopfli.h */
15071             /*
15072             Copyright 2011 Google Inc. All Rights Reserved.
15073              
15074             Licensed under the Apache License, Version 2.0 (the "License");
15075             you may not use this file except in compliance with the License.
15076             You may obtain a copy of the License at
15077              
15078             http://www.apache.org/licenses/LICENSE-2.0
15079              
15080             Unless required by applicable law or agreed to in writing, software
15081             distributed under the License is distributed on an "AS IS" BASIS,
15082             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15083             See the License for the specific language governing permissions and
15084             limitations under the License.
15085              
15086             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
15087             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
15088             */
15089              
15090             #ifndef ZOPFLI_ZOPFLI_H_
15091             #define ZOPFLI_ZOPFLI_H_
15092              
15093             #include
15094             #include /* for size_t */
15095              
15096             #ifdef __cplusplus
15097             extern "C" {
15098             #endif
15099              
15100             /*
15101             Options used throughout the program.
15102             */
15103             typedef struct ZopfliOptions {
15104             /* Whether to print output */
15105             int verbose;
15106              
15107             /* Whether to print more detailed output */
15108             int verbose_more;
15109              
15110             /*
15111             Maximum amount of times to rerun forward and backward pass to optimize LZ77
15112             compression cost. Good values: 10, 15 for small files, 5 for files over
15113             several MB in size or it will be too slow.
15114             */
15115             int numiterations;
15116              
15117             /*
15118             If true, splits the data in multiple deflate blocks with optimal choice
15119             for the block boundaries. Block splitting gives better compression. Default:
15120             true (1).
15121             */
15122             int blocksplitting;
15123              
15124             /*
15125             No longer used, left for compatibility.
15126             */
15127             int blocksplittinglast;
15128              
15129             /*
15130             Maximum amount of blocks to split into (0 for unlimited, but this can give
15131             extreme results that hurt compression on some files). Default value: 15.
15132             */
15133             int blocksplittingmax;
15134             } ZopfliOptions;
15135              
15136             /* Initializes options with default values. */
15137             void ZopfliInitOptions(ZopfliOptions* options);
15138              
15139             /* Output format */
15140             typedef enum {
15141             ZOPFLI_FORMAT_GZIP,
15142             ZOPFLI_FORMAT_ZLIB,
15143             ZOPFLI_FORMAT_DEFLATE
15144             } ZopfliFormat;
15145              
15146             /*
15147             Compresses according to the given output format and appends the result to the
15148             output.
15149              
15150             options: global program options
15151             output_type: the output format to use
15152             out: pointer to the dynamic output array to which the result is appended. Must
15153             be freed after use
15154             outsize: pointer to the dynamic output array size
15155             */
15156             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
15157             const unsigned char* in, size_t insize,
15158             unsigned char** out, size_t* outsize);
15159              
15160             #ifdef __cplusplus
15161             } // extern "C"
15162             #endif
15163              
15164             #endif /* ZOPFLI_ZOPFLI_H_ */
15165              
15166              
15167             #ifdef __cplusplus
15168             extern "C" {
15169             #endif
15170              
15171             /*
15172             Compresses according to the zlib specification and append the compressed
15173             result to the output.
15174              
15175             options: global program options
15176             out: pointer to the dynamic output array to which the result is appended. Must
15177             be freed after use.
15178             outsize: pointer to the dynamic output array size.
15179             */
15180             void ZopfliZlibCompress(const ZopfliOptions* options,
15181             const unsigned char* in, size_t insize,
15182             unsigned char** out, size_t* outsize);
15183              
15184             #ifdef __cplusplus
15185             } // extern "C"
15186             #endif
15187              
15188             #endif /* ZOPFLI_ZLIB_H_ */
15189              
15190             /* util.h */
15191             /*
15192             Copyright 2011 Google Inc. All Rights Reserved.
15193              
15194             Licensed under the Apache License, Version 2.0 (the "License");
15195             you may not use this file except in compliance with the License.
15196             You may obtain a copy of the License at
15197              
15198             http://www.apache.org/licenses/LICENSE-2.0
15199              
15200             Unless required by applicable law or agreed to in writing, software
15201             distributed under the License is distributed on an "AS IS" BASIS,
15202             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15203             See the License for the specific language governing permissions and
15204             limitations under the License.
15205              
15206             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
15207             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
15208             */
15209              
15210             /*
15211             Several utilities, including: #defines to try different compression results,
15212             basic deflate specification values and generic program options.
15213             */
15214              
15215             #ifndef ZOPFLI_UTIL_H_
15216             #define ZOPFLI_UTIL_H_
15217              
15218             #include
15219             #include
15220              
15221             /* Minimum and maximum length that can be encoded in deflate. */
15222             #define ZOPFLI_MAX_MATCH 258
15223             #define ZOPFLI_MIN_MATCH 3
15224              
15225             /* Number of distinct literal/length and distance symbols in DEFLATE */
15226             #define ZOPFLI_NUM_LL 288
15227             #define ZOPFLI_NUM_D 32
15228              
15229             /*
15230             The window size for deflate. Must be a power of two. This should be 32768, the
15231             maximum possible by the deflate spec. Anything less hurts compression more than
15232             speed.
15233             */
15234             #define ZOPFLI_WINDOW_SIZE 32768
15235              
15236             /*
15237             The window mask used to wrap indices into the window. This is why the
15238             window size must be a power of two.
15239             */
15240             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
15241              
15242             /*
15243             A block structure of huge, non-smart, blocks to divide the input into, to allow
15244             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
15245             The whole compression algorithm, including the smarter block splitting, will
15246             be executed independently on each huge block.
15247             Dividing into huge blocks hurts compression, but not much relative to the size.
15248             Set it to 0 to disable master blocks.
15249             */
15250             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
15251              
15252             /*
15253             Used to initialize costs for example
15254             */
15255             #define ZOPFLI_LARGE_FLOAT 1e30
15256              
15257             /*
15258             For longest match cache. max 256. Uses huge amounts of memory but makes it
15259             faster. Uses this many times three bytes per single byte of the input data.
15260             This is so because longest match finding has to find the exact distance
15261             that belongs to each length for the best lz77 strategy.
15262             Good values: e.g. 5, 8.
15263             */
15264             #define ZOPFLI_CACHE_LENGTH 8
15265              
15266             /*
15267             limit the max hash chain hits for this hash value. This has an effect only
15268             on files where the hash value is the same very often. On these files, this
15269             gives worse compression (the value should ideally be 32768, which is the
15270             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
15271             faster on some specific files.
15272             Good value: e.g. 8192.
15273             */
15274             #define ZOPFLI_MAX_CHAIN_HITS 8192
15275              
15276             /*
15277             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
15278             consumes a lot of memory but speeds it up. No effect on compression size.
15279             */
15280             #define ZOPFLI_LONGEST_MATCH_CACHE
15281              
15282             /*
15283             Enable to remember amount of successive identical bytes in the hash chain for
15284             finding longest match
15285             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
15286             This has no effect on the compression result, and enabling it increases speed.
15287             */
15288             #define ZOPFLI_HASH_SAME
15289              
15290             /*
15291             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
15292             best length so far is long enough. This is way faster for files with lots of
15293             identical bytes, on which the compressor is otherwise too slow. Regular files
15294             are unaffected or maybe a tiny bit slower.
15295             This has no effect on the compression result, only on speed.
15296             */
15297             #define ZOPFLI_HASH_SAME_HASH
15298              
15299             /*
15300             Enable this, to avoid slowness for files which are a repetition of the same
15301             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
15302             the compression result.
15303             */
15304             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
15305              
15306             /*
15307             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
15308             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
15309             varies from file to file.
15310             */
15311             #define ZOPFLI_LAZY_MATCHING
15312              
15313             /*
15314             Appends value to dynamically allocated memory, doubling its allocation size
15315             whenever needed.
15316              
15317             value: the value to append, type T
15318             data: pointer to the dynamic array to append to, type T**
15319             size: pointer to the size of the array to append to, type size_t*. This is the
15320             size that you consider the array to be, not the internal allocation size.
15321             Precondition: allocated size of data is at least a power of two greater than or
15322             equal than *size.
15323             */
15324             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
15325             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
15326             if (!((*size) & ((*size) - 1))) {\
15327             /*double alloc size if it's a power of two*/\
15328             void** data_void = reinterpret_cast(data);\
15329             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
15330             : realloc((*data), (*size) * 2 * sizeof(**data));\
15331             }\
15332             (*data)[(*size)] = (value);\
15333             (*size)++;\
15334             }
15335             #else /* C gives problems with strict-aliasing rules for (void**) cast */
15336             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
15337             if (!((*size) & ((*size) - 1))) {\
15338             /*double alloc size if it's a power of two*/\
15339             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
15340             : realloc((*data), (*size) * 2 * sizeof(**data));\
15341             }\
15342             (*data)[(*size)] = (value);\
15343             (*size)++;\
15344             }
15345             #endif
15346              
15347              
15348             #endif /* ZOPFLI_UTIL_H_ */
15349              
15350              
15351             #include
15352              
15353             /* deflate.h */
15354             /*
15355             Copyright 2011 Google Inc. All Rights Reserved.
15356              
15357             Licensed under the Apache License, Version 2.0 (the "License");
15358             you may not use this file except in compliance with the License.
15359             You may obtain a copy of the License at
15360              
15361             http://www.apache.org/licenses/LICENSE-2.0
15362              
15363             Unless required by applicable law or agreed to in writing, software
15364             distributed under the License is distributed on an "AS IS" BASIS,
15365             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15366             See the License for the specific language governing permissions and
15367             limitations under the License.
15368              
15369             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
15370             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
15371             */
15372              
15373             #ifndef ZOPFLI_DEFLATE_H_
15374             #define ZOPFLI_DEFLATE_H_
15375              
15376             /*
15377             Functions to compress according to the DEFLATE specification, using the
15378             "squeeze" LZ77 compression backend.
15379             */
15380              
15381             /* lz77.h */
15382             /*
15383             Copyright 2011 Google Inc. All Rights Reserved.
15384              
15385             Licensed under the Apache License, Version 2.0 (the "License");
15386             you may not use this file except in compliance with the License.
15387             You may obtain a copy of the License at
15388              
15389             http://www.apache.org/licenses/LICENSE-2.0
15390              
15391             Unless required by applicable law or agreed to in writing, software
15392             distributed under the License is distributed on an "AS IS" BASIS,
15393             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15394             See the License for the specific language governing permissions and
15395             limitations under the License.
15396              
15397             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
15398             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
15399             */
15400              
15401             /*
15402             Functions for basic LZ77 compression and utilities for the "squeeze" LZ77
15403             compression.
15404             */
15405              
15406             #ifndef ZOPFLI_LZ77_H_
15407             #define ZOPFLI_LZ77_H_
15408              
15409             #include
15410              
15411             /* cache.h */
15412             /*
15413             Copyright 2011 Google Inc. All Rights Reserved.
15414              
15415             Licensed under the Apache License, Version 2.0 (the "License");
15416             you may not use this file except in compliance with the License.
15417             You may obtain a copy of the License at
15418              
15419             http://www.apache.org/licenses/LICENSE-2.0
15420              
15421             Unless required by applicable law or agreed to in writing, software
15422             distributed under the License is distributed on an "AS IS" BASIS,
15423             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15424             See the License for the specific language governing permissions and
15425             limitations under the License.
15426              
15427             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
15428             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
15429             */
15430              
15431             /*
15432             The cache that speeds up ZopfliFindLongestMatch of lz77.c.
15433             */
15434              
15435             #ifndef ZOPFLI_CACHE_H_
15436             #define ZOPFLI_CACHE_H_
15437              
15438             /* util.h */
15439             /*
15440             Copyright 2011 Google Inc. All Rights Reserved.
15441              
15442             Licensed under the Apache License, Version 2.0 (the "License");
15443             you may not use this file except in compliance with the License.
15444             You may obtain a copy of the License at
15445              
15446             http://www.apache.org/licenses/LICENSE-2.0
15447              
15448             Unless required by applicable law or agreed to in writing, software
15449             distributed under the License is distributed on an "AS IS" BASIS,
15450             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15451             See the License for the specific language governing permissions and
15452             limitations under the License.
15453              
15454             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
15455             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
15456             */
15457              
15458             /*
15459             Several utilities, including: #defines to try different compression results,
15460             basic deflate specification values and generic program options.
15461             */
15462              
15463             #ifndef ZOPFLI_UTIL_H_
15464             #define ZOPFLI_UTIL_H_
15465              
15466             #include
15467             #include
15468              
15469             /* Minimum and maximum length that can be encoded in deflate. */
15470             #define ZOPFLI_MAX_MATCH 258
15471             #define ZOPFLI_MIN_MATCH 3
15472              
15473             /* Number of distinct literal/length and distance symbols in DEFLATE */
15474             #define ZOPFLI_NUM_LL 288
15475             #define ZOPFLI_NUM_D 32
15476              
15477             /*
15478             The window size for deflate. Must be a power of two. This should be 32768, the
15479             maximum possible by the deflate spec. Anything less hurts compression more than
15480             speed.
15481             */
15482             #define ZOPFLI_WINDOW_SIZE 32768
15483              
15484             /*
15485             The window mask used to wrap indices into the window. This is why the
15486             window size must be a power of two.
15487             */
15488             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
15489              
15490             /*
15491             A block structure of huge, non-smart, blocks to divide the input into, to allow
15492             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
15493             The whole compression algorithm, including the smarter block splitting, will
15494             be executed independently on each huge block.
15495             Dividing into huge blocks hurts compression, but not much relative to the size.
15496             Set it to 0 to disable master blocks.
15497             */
15498             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
15499              
15500             /*
15501             Used to initialize costs for example
15502             */
15503             #define ZOPFLI_LARGE_FLOAT 1e30
15504              
15505             /*
15506             For longest match cache. max 256. Uses huge amounts of memory but makes it
15507             faster. Uses this many times three bytes per single byte of the input data.
15508             This is so because longest match finding has to find the exact distance
15509             that belongs to each length for the best lz77 strategy.
15510             Good values: e.g. 5, 8.
15511             */
15512             #define ZOPFLI_CACHE_LENGTH 8
15513              
15514             /*
15515             limit the max hash chain hits for this hash value. This has an effect only
15516             on files where the hash value is the same very often. On these files, this
15517             gives worse compression (the value should ideally be 32768, which is the
15518             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
15519             faster on some specific files.
15520             Good value: e.g. 8192.
15521             */
15522             #define ZOPFLI_MAX_CHAIN_HITS 8192
15523              
15524             /*
15525             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
15526             consumes a lot of memory but speeds it up. No effect on compression size.
15527             */
15528             #define ZOPFLI_LONGEST_MATCH_CACHE
15529              
15530             /*
15531             Enable to remember amount of successive identical bytes in the hash chain for
15532             finding longest match
15533             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
15534             This has no effect on the compression result, and enabling it increases speed.
15535             */
15536             #define ZOPFLI_HASH_SAME
15537              
15538             /*
15539             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
15540             best length so far is long enough. This is way faster for files with lots of
15541             identical bytes, on which the compressor is otherwise too slow. Regular files
15542             are unaffected or maybe a tiny bit slower.
15543             This has no effect on the compression result, only on speed.
15544             */
15545             #define ZOPFLI_HASH_SAME_HASH
15546              
15547             /*
15548             Enable this, to avoid slowness for files which are a repetition of the same
15549             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
15550             the compression result.
15551             */
15552             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
15553              
15554             /*
15555             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
15556             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
15557             varies from file to file.
15558             */
15559             #define ZOPFLI_LAZY_MATCHING
15560              
15561             /*
15562             Appends value to dynamically allocated memory, doubling its allocation size
15563             whenever needed.
15564              
15565             value: the value to append, type T
15566             data: pointer to the dynamic array to append to, type T**
15567             size: pointer to the size of the array to append to, type size_t*. This is the
15568             size that you consider the array to be, not the internal allocation size.
15569             Precondition: allocated size of data is at least a power of two greater than or
15570             equal than *size.
15571             */
15572             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
15573             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
15574             if (!((*size) & ((*size) - 1))) {\
15575             /*double alloc size if it's a power of two*/\
15576             void** data_void = reinterpret_cast(data);\
15577             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
15578             : realloc((*data), (*size) * 2 * sizeof(**data));\
15579             }\
15580             (*data)[(*size)] = (value);\
15581             (*size)++;\
15582             }
15583             #else /* C gives problems with strict-aliasing rules for (void**) cast */
15584             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
15585             if (!((*size) & ((*size) - 1))) {\
15586             /*double alloc size if it's a power of two*/\
15587             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
15588             : realloc((*data), (*size) * 2 * sizeof(**data));\
15589             }\
15590             (*data)[(*size)] = (value);\
15591             (*size)++;\
15592             }
15593             #endif
15594              
15595              
15596             #endif /* ZOPFLI_UTIL_H_ */
15597              
15598              
15599             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
15600              
15601             /*
15602             Cache used by ZopfliFindLongestMatch to remember previously found length/dist
15603             values.
15604             This is needed because the squeeze runs will ask these values multiple times for
15605             the same position.
15606             Uses large amounts of memory, since it has to remember the distance belonging
15607             to every possible shorter-than-the-best length (the so called "sublen" array).
15608             */
15609             typedef struct ZopfliLongestMatchCache {
15610             unsigned short* length;
15611             unsigned short* dist;
15612             unsigned char* sublen;
15613             } ZopfliLongestMatchCache;
15614              
15615             /* Initializes the ZopfliLongestMatchCache. */
15616             void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc);
15617              
15618             /* Frees up the memory of the ZopfliLongestMatchCache. */
15619             void ZopfliCleanCache(ZopfliLongestMatchCache* lmc);
15620              
15621             /* Stores sublen array in the cache. */
15622             void ZopfliSublenToCache(const unsigned short* sublen,
15623             size_t pos, size_t length,
15624             ZopfliLongestMatchCache* lmc);
15625              
15626             /* Extracts sublen array from the cache. */
15627             void ZopfliCacheToSublen(const ZopfliLongestMatchCache* lmc,
15628             size_t pos, size_t length,
15629             unsigned short* sublen);
15630             /* Returns the length up to which could be stored in the cache. */
15631             unsigned ZopfliMaxCachedSublen(const ZopfliLongestMatchCache* lmc,
15632             size_t pos, size_t length);
15633              
15634             #endif /* ZOPFLI_LONGEST_MATCH_CACHE */
15635              
15636             #endif /* ZOPFLI_CACHE_H_ */
15637              
15638             /* hash.h */
15639             /*
15640             Copyright 2011 Google Inc. All Rights Reserved.
15641              
15642             Licensed under the Apache License, Version 2.0 (the "License");
15643             you may not use this file except in compliance with the License.
15644             You may obtain a copy of the License at
15645              
15646             http://www.apache.org/licenses/LICENSE-2.0
15647              
15648             Unless required by applicable law or agreed to in writing, software
15649             distributed under the License is distributed on an "AS IS" BASIS,
15650             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15651             See the License for the specific language governing permissions and
15652             limitations under the License.
15653              
15654             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
15655             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
15656             */
15657              
15658             /*
15659             The hash for ZopfliFindLongestMatch of lz77.c.
15660             */
15661              
15662             #ifndef ZOPFLI_HASH_H_
15663             #define ZOPFLI_HASH_H_
15664              
15665             /* util.h */
15666             /*
15667             Copyright 2011 Google Inc. All Rights Reserved.
15668              
15669             Licensed under the Apache License, Version 2.0 (the "License");
15670             you may not use this file except in compliance with the License.
15671             You may obtain a copy of the License at
15672              
15673             http://www.apache.org/licenses/LICENSE-2.0
15674              
15675             Unless required by applicable law or agreed to in writing, software
15676             distributed under the License is distributed on an "AS IS" BASIS,
15677             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15678             See the License for the specific language governing permissions and
15679             limitations under the License.
15680              
15681             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
15682             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
15683             */
15684              
15685             /*
15686             Several utilities, including: #defines to try different compression results,
15687             basic deflate specification values and generic program options.
15688             */
15689              
15690             #ifndef ZOPFLI_UTIL_H_
15691             #define ZOPFLI_UTIL_H_
15692              
15693             #include
15694             #include
15695              
15696             /* Minimum and maximum length that can be encoded in deflate. */
15697             #define ZOPFLI_MAX_MATCH 258
15698             #define ZOPFLI_MIN_MATCH 3
15699              
15700             /* Number of distinct literal/length and distance symbols in DEFLATE */
15701             #define ZOPFLI_NUM_LL 288
15702             #define ZOPFLI_NUM_D 32
15703              
15704             /*
15705             The window size for deflate. Must be a power of two. This should be 32768, the
15706             maximum possible by the deflate spec. Anything less hurts compression more than
15707             speed.
15708             */
15709             #define ZOPFLI_WINDOW_SIZE 32768
15710              
15711             /*
15712             The window mask used to wrap indices into the window. This is why the
15713             window size must be a power of two.
15714             */
15715             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
15716              
15717             /*
15718             A block structure of huge, non-smart, blocks to divide the input into, to allow
15719             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
15720             The whole compression algorithm, including the smarter block splitting, will
15721             be executed independently on each huge block.
15722             Dividing into huge blocks hurts compression, but not much relative to the size.
15723             Set it to 0 to disable master blocks.
15724             */
15725             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
15726              
15727             /*
15728             Used to initialize costs for example
15729             */
15730             #define ZOPFLI_LARGE_FLOAT 1e30
15731              
15732             /*
15733             For longest match cache. max 256. Uses huge amounts of memory but makes it
15734             faster. Uses this many times three bytes per single byte of the input data.
15735             This is so because longest match finding has to find the exact distance
15736             that belongs to each length for the best lz77 strategy.
15737             Good values: e.g. 5, 8.
15738             */
15739             #define ZOPFLI_CACHE_LENGTH 8
15740              
15741             /*
15742             limit the max hash chain hits for this hash value. This has an effect only
15743             on files where the hash value is the same very often. On these files, this
15744             gives worse compression (the value should ideally be 32768, which is the
15745             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
15746             faster on some specific files.
15747             Good value: e.g. 8192.
15748             */
15749             #define ZOPFLI_MAX_CHAIN_HITS 8192
15750              
15751             /*
15752             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
15753             consumes a lot of memory but speeds it up. No effect on compression size.
15754             */
15755             #define ZOPFLI_LONGEST_MATCH_CACHE
15756              
15757             /*
15758             Enable to remember amount of successive identical bytes in the hash chain for
15759             finding longest match
15760             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
15761             This has no effect on the compression result, and enabling it increases speed.
15762             */
15763             #define ZOPFLI_HASH_SAME
15764              
15765             /*
15766             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
15767             best length so far is long enough. This is way faster for files with lots of
15768             identical bytes, on which the compressor is otherwise too slow. Regular files
15769             are unaffected or maybe a tiny bit slower.
15770             This has no effect on the compression result, only on speed.
15771             */
15772             #define ZOPFLI_HASH_SAME_HASH
15773              
15774             /*
15775             Enable this, to avoid slowness for files which are a repetition of the same
15776             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
15777             the compression result.
15778             */
15779             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
15780              
15781             /*
15782             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
15783             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
15784             varies from file to file.
15785             */
15786             #define ZOPFLI_LAZY_MATCHING
15787              
15788             /*
15789             Appends value to dynamically allocated memory, doubling its allocation size
15790             whenever needed.
15791              
15792             value: the value to append, type T
15793             data: pointer to the dynamic array to append to, type T**
15794             size: pointer to the size of the array to append to, type size_t*. This is the
15795             size that you consider the array to be, not the internal allocation size.
15796             Precondition: allocated size of data is at least a power of two greater than or
15797             equal than *size.
15798             */
15799             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
15800             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
15801             if (!((*size) & ((*size) - 1))) {\
15802             /*double alloc size if it's a power of two*/\
15803             void** data_void = reinterpret_cast(data);\
15804             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
15805             : realloc((*data), (*size) * 2 * sizeof(**data));\
15806             }\
15807             (*data)[(*size)] = (value);\
15808             (*size)++;\
15809             }
15810             #else /* C gives problems with strict-aliasing rules for (void**) cast */
15811             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
15812             if (!((*size) & ((*size) - 1))) {\
15813             /*double alloc size if it's a power of two*/\
15814             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
15815             : realloc((*data), (*size) * 2 * sizeof(**data));\
15816             }\
15817             (*data)[(*size)] = (value);\
15818             (*size)++;\
15819             }
15820             #endif
15821              
15822              
15823             #endif /* ZOPFLI_UTIL_H_ */
15824              
15825              
15826             typedef struct ZopfliHash {
15827             int* head; /* Hash value to index of its most recent occurrence. */
15828             unsigned short* prev; /* Index to index of prev. occurrence of same hash. */
15829             int* hashval; /* Index to hash value at this index. */
15830             int val; /* Current hash value. */
15831              
15832             #ifdef ZOPFLI_HASH_SAME_HASH
15833             /* Fields with similar purpose as the above hash, but for the second hash with
15834             a value that is calculated differently. */
15835             int* head2; /* Hash value to index of its most recent occurrence. */
15836             unsigned short* prev2; /* Index to index of prev. occurrence of same hash. */
15837             int* hashval2; /* Index to hash value at this index. */
15838             int val2; /* Current hash value. */
15839             #endif
15840              
15841             #ifdef ZOPFLI_HASH_SAME
15842             unsigned short* same; /* Amount of repetitions of same byte after this .*/
15843             #endif
15844             } ZopfliHash;
15845              
15846             /* Allocates ZopfliHash memory. */
15847             void ZopfliAllocHash(size_t window_size, ZopfliHash* h);
15848              
15849             /* Resets all fields of ZopfliHash. */
15850             void ZopfliResetHash(size_t window_size, ZopfliHash* h);
15851              
15852             /* Frees ZopfliHash memory. */
15853             void ZopfliCleanHash(ZopfliHash* h);
15854              
15855             /*
15856             Updates the hash values based on the current position in the array. All calls
15857             to this must be made for consecutive bytes.
15858             */
15859             void ZopfliUpdateHash(const unsigned char* array, size_t pos, size_t end,
15860             ZopfliHash* h);
15861              
15862             /*
15863             Prepopulates hash:
15864             Fills in the initial values in the hash, before ZopfliUpdateHash can be used
15865             correctly.
15866             */
15867             void ZopfliWarmupHash(const unsigned char* array, size_t pos, size_t end,
15868             ZopfliHash* h);
15869              
15870             #endif /* ZOPFLI_HASH_H_ */
15871              
15872             /* zopfli.h */
15873             /*
15874             Copyright 2011 Google Inc. All Rights Reserved.
15875              
15876             Licensed under the Apache License, Version 2.0 (the "License");
15877             you may not use this file except in compliance with the License.
15878             You may obtain a copy of the License at
15879              
15880             http://www.apache.org/licenses/LICENSE-2.0
15881              
15882             Unless required by applicable law or agreed to in writing, software
15883             distributed under the License is distributed on an "AS IS" BASIS,
15884             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15885             See the License for the specific language governing permissions and
15886             limitations under the License.
15887              
15888             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
15889             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
15890             */
15891              
15892             #ifndef ZOPFLI_ZOPFLI_H_
15893             #define ZOPFLI_ZOPFLI_H_
15894              
15895             #include
15896             #include /* for size_t */
15897              
15898             #ifdef __cplusplus
15899             extern "C" {
15900             #endif
15901              
15902             /*
15903             Options used throughout the program.
15904             */
15905             typedef struct ZopfliOptions {
15906             /* Whether to print output */
15907             int verbose;
15908              
15909             /* Whether to print more detailed output */
15910             int verbose_more;
15911              
15912             /*
15913             Maximum amount of times to rerun forward and backward pass to optimize LZ77
15914             compression cost. Good values: 10, 15 for small files, 5 for files over
15915             several MB in size or it will be too slow.
15916             */
15917             int numiterations;
15918              
15919             /*
15920             If true, splits the data in multiple deflate blocks with optimal choice
15921             for the block boundaries. Block splitting gives better compression. Default:
15922             true (1).
15923             */
15924             int blocksplitting;
15925              
15926             /*
15927             No longer used, left for compatibility.
15928             */
15929             int blocksplittinglast;
15930              
15931             /*
15932             Maximum amount of blocks to split into (0 for unlimited, but this can give
15933             extreme results that hurt compression on some files). Default value: 15.
15934             */
15935             int blocksplittingmax;
15936             } ZopfliOptions;
15937              
15938             /* Initializes options with default values. */
15939             void ZopfliInitOptions(ZopfliOptions* options);
15940              
15941             /* Output format */
15942             typedef enum {
15943             ZOPFLI_FORMAT_GZIP,
15944             ZOPFLI_FORMAT_ZLIB,
15945             ZOPFLI_FORMAT_DEFLATE
15946             } ZopfliFormat;
15947              
15948             /*
15949             Compresses according to the given output format and appends the result to the
15950             output.
15951              
15952             options: global program options
15953             output_type: the output format to use
15954             out: pointer to the dynamic output array to which the result is appended. Must
15955             be freed after use
15956             outsize: pointer to the dynamic output array size
15957             */
15958             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
15959             const unsigned char* in, size_t insize,
15960             unsigned char** out, size_t* outsize);
15961              
15962             #ifdef __cplusplus
15963             } // extern "C"
15964             #endif
15965              
15966             #endif /* ZOPFLI_ZOPFLI_H_ */
15967              
15968              
15969             /*
15970             Stores lit/length and dist pairs for LZ77.
15971             Parameter litlens: Contains the literal symbols or length values.
15972             Parameter dists: Contains the distances. A value is 0 to indicate that there is
15973             no dist and the corresponding litlens value is a literal instead of a length.
15974             Parameter size: The size of both the litlens and dists arrays.
15975             The memory can best be managed by using ZopfliInitLZ77Store to initialize it,
15976             ZopfliCleanLZ77Store to destroy it, and ZopfliStoreLitLenDist to append values.
15977              
15978             */
15979             typedef struct ZopfliLZ77Store {
15980             unsigned short* litlens; /* Lit or len. */
15981             unsigned short* dists; /* If 0: indicates literal in corresponding litlens,
15982             if > 0: length in corresponding litlens, this is the distance. */
15983             size_t size;
15984              
15985             const unsigned char* data; /* original data */
15986             size_t* pos; /* position in data where this LZ77 command begins */
15987              
15988             unsigned short* ll_symbol;
15989             unsigned short* d_symbol;
15990              
15991             /* Cumulative histograms wrapping around per chunk. Each chunk has the amount
15992             of distinct symbols as length, so using 1 value per LZ77 symbol, we have a
15993             precise histogram at every N symbols, and the rest can be calculated by
15994             looping through the actual symbols of this chunk. */
15995             size_t* ll_counts;
15996             size_t* d_counts;
15997             } ZopfliLZ77Store;
15998              
15999             void ZopfliInitLZ77Store(const unsigned char* data, ZopfliLZ77Store* store);
16000             void ZopfliCleanLZ77Store(ZopfliLZ77Store* store);
16001             void ZopfliCopyLZ77Store(const ZopfliLZ77Store* source, ZopfliLZ77Store* dest);
16002             void ZopfliStoreLitLenDist(unsigned short length, unsigned short dist,
16003             size_t pos, ZopfliLZ77Store* store);
16004             void ZopfliAppendLZ77Store(const ZopfliLZ77Store* store,
16005             ZopfliLZ77Store* target);
16006             /* Gets the amount of raw bytes that this range of LZ77 symbols spans. */
16007             size_t ZopfliLZ77GetByteRange(const ZopfliLZ77Store* lz77,
16008             size_t lstart, size_t lend);
16009             /* Gets the histogram of lit/len and dist symbols in the given range, using the
16010             cumulative histograms, so faster than adding one by one for large range. Does
16011             not add the one end symbol of value 256. */
16012             void ZopfliLZ77GetHistogram(const ZopfliLZ77Store* lz77,
16013             size_t lstart, size_t lend,
16014             size_t* ll_counts, size_t* d_counts);
16015              
16016             /*
16017             Some state information for compressing a block.
16018             This is currently a bit under-used (with mainly only the longest match cache),
16019             but is kept for easy future expansion.
16020             */
16021             typedef struct ZopfliBlockState {
16022             const ZopfliOptions* options;
16023              
16024             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
16025             /* Cache for length/distance pairs found so far. */
16026             ZopfliLongestMatchCache* lmc;
16027             #endif
16028              
16029             /* The start (inclusive) and end (not inclusive) of the current block. */
16030             size_t blockstart;
16031             size_t blockend;
16032             } ZopfliBlockState;
16033              
16034             void ZopfliInitBlockState(const ZopfliOptions* options,
16035             size_t blockstart, size_t blockend, int add_lmc,
16036             ZopfliBlockState* s);
16037             void ZopfliCleanBlockState(ZopfliBlockState* s);
16038              
16039             /*
16040             Finds the longest match (length and corresponding distance) for LZ77
16041             compression.
16042             Even when not using "sublen", it can be more efficient to provide an array,
16043             because only then the caching is used.
16044             array: the data
16045             pos: position in the data to find the match for
16046             size: size of the data
16047             limit: limit length to maximum this value (default should be 258). This allows
16048             finding a shorter dist for that length (= less extra bits). Must be
16049             in the range [ZOPFLI_MIN_MATCH, ZOPFLI_MAX_MATCH].
16050             sublen: output array of 259 elements, or null. Has, for each length, the
16051             smallest distance required to reach this length. Only 256 of its 259 values
16052             are used, the first 3 are ignored (the shortest length is 3. It is purely
16053             for convenience that the array is made 3 longer).
16054             */
16055             void ZopfliFindLongestMatch(
16056             ZopfliBlockState *s, const ZopfliHash* h, const unsigned char* array,
16057             size_t pos, size_t size, size_t limit,
16058             unsigned short* sublen, unsigned short* distance, unsigned short* length);
16059              
16060             /*
16061             Verifies if length and dist are indeed valid, only used for assertion.
16062             */
16063             void ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
16064             unsigned short dist, unsigned short length);
16065              
16066             /*
16067             Does LZ77 using an algorithm similar to gzip, with lazy matching, rather than
16068             with the slow but better "squeeze" implementation.
16069             The result is placed in the ZopfliLZ77Store.
16070             If instart is larger than 0, it uses values before instart as starting
16071             dictionary.
16072             */
16073             void ZopfliLZ77Greedy(ZopfliBlockState* s, const unsigned char* in,
16074             size_t instart, size_t inend,
16075             ZopfliLZ77Store* store, ZopfliHash* h);
16076              
16077             #endif /* ZOPFLI_LZ77_H_ */
16078              
16079             /* zopfli.h */
16080             /*
16081             Copyright 2011 Google Inc. All Rights Reserved.
16082              
16083             Licensed under the Apache License, Version 2.0 (the "License");
16084             you may not use this file except in compliance with the License.
16085             You may obtain a copy of the License at
16086              
16087             http://www.apache.org/licenses/LICENSE-2.0
16088              
16089             Unless required by applicable law or agreed to in writing, software
16090             distributed under the License is distributed on an "AS IS" BASIS,
16091             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16092             See the License for the specific language governing permissions and
16093             limitations under the License.
16094              
16095             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
16096             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
16097             */
16098              
16099             #ifndef ZOPFLI_ZOPFLI_H_
16100             #define ZOPFLI_ZOPFLI_H_
16101              
16102             #include
16103             #include /* for size_t */
16104              
16105             #ifdef __cplusplus
16106             extern "C" {
16107             #endif
16108              
16109             /*
16110             Options used throughout the program.
16111             */
16112             typedef struct ZopfliOptions {
16113             /* Whether to print output */
16114             int verbose;
16115              
16116             /* Whether to print more detailed output */
16117             int verbose_more;
16118              
16119             /*
16120             Maximum amount of times to rerun forward and backward pass to optimize LZ77
16121             compression cost. Good values: 10, 15 for small files, 5 for files over
16122             several MB in size or it will be too slow.
16123             */
16124             int numiterations;
16125              
16126             /*
16127             If true, splits the data in multiple deflate blocks with optimal choice
16128             for the block boundaries. Block splitting gives better compression. Default:
16129             true (1).
16130             */
16131             int blocksplitting;
16132              
16133             /*
16134             No longer used, left for compatibility.
16135             */
16136             int blocksplittinglast;
16137              
16138             /*
16139             Maximum amount of blocks to split into (0 for unlimited, but this can give
16140             extreme results that hurt compression on some files). Default value: 15.
16141             */
16142             int blocksplittingmax;
16143             } ZopfliOptions;
16144              
16145             /* Initializes options with default values. */
16146             void ZopfliInitOptions(ZopfliOptions* options);
16147              
16148             /* Output format */
16149             typedef enum {
16150             ZOPFLI_FORMAT_GZIP,
16151             ZOPFLI_FORMAT_ZLIB,
16152             ZOPFLI_FORMAT_DEFLATE
16153             } ZopfliFormat;
16154              
16155             /*
16156             Compresses according to the given output format and appends the result to the
16157             output.
16158              
16159             options: global program options
16160             output_type: the output format to use
16161             out: pointer to the dynamic output array to which the result is appended. Must
16162             be freed after use
16163             outsize: pointer to the dynamic output array size
16164             */
16165             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
16166             const unsigned char* in, size_t insize,
16167             unsigned char** out, size_t* outsize);
16168              
16169             #ifdef __cplusplus
16170             } // extern "C"
16171             #endif
16172              
16173             #endif /* ZOPFLI_ZOPFLI_H_ */
16174              
16175              
16176             #ifdef __cplusplus
16177             extern "C" {
16178             #endif
16179              
16180             /*
16181             Compresses according to the deflate specification and append the compressed
16182             result to the output.
16183             This function will usually output multiple deflate blocks. If final is 1, then
16184             the final bit will be set on the last block.
16185              
16186             options: global program options
16187             btype: the deflate block type. Use 2 for best compression.
16188             -0: non compressed blocks (00)
16189             -1: blocks with fixed tree (01)
16190             -2: blocks with dynamic tree (10)
16191             final: whether this is the last section of the input, sets the final bit to the
16192             last deflate block.
16193             in: the input bytes
16194             insize: number of input bytes
16195             bp: bit pointer for the output array. This must initially be 0, and for
16196             consecutive calls must be reused (it can have values from 0-7). This is
16197             because deflate appends blocks as bit-based data, rather than on byte
16198             boundaries.
16199             out: pointer to the dynamic output array to which the result is appended. Must
16200             be freed after use.
16201             outsize: pointer to the dynamic output array size.
16202             */
16203             void ZopfliDeflate(const ZopfliOptions* options, int btype, int final,
16204             const unsigned char* in, size_t insize,
16205             unsigned char* bp, unsigned char** out, size_t* outsize);
16206              
16207             /*
16208             Like ZopfliDeflate, but allows to specify start and end byte with instart and
16209             inend. Only that part is compressed, but earlier bytes are still used for the
16210             back window.
16211             */
16212             void ZopfliDeflatePart(const ZopfliOptions* options, int btype, int final,
16213             const unsigned char* in, size_t instart, size_t inend,
16214             unsigned char* bp, unsigned char** out,
16215             size_t* outsize);
16216              
16217             /*
16218             Calculates block size in bits.
16219             litlens: lz77 lit/lengths
16220             dists: ll77 distances
16221             lstart: start of block
16222             lend: end of block (not inclusive)
16223             */
16224             double ZopfliCalculateBlockSize(const ZopfliLZ77Store* lz77,
16225             size_t lstart, size_t lend, int btype);
16226              
16227             /*
16228             Calculates block size in bits, automatically using the best btype.
16229             */
16230             double ZopfliCalculateBlockSizeAutoType(const ZopfliLZ77Store* lz77,
16231             size_t lstart, size_t lend);
16232              
16233             #ifdef __cplusplus
16234             } // extern "C"
16235             #endif
16236              
16237             #endif /* ZOPFLI_DEFLATE_H_ */
16238              
16239              
16240              
16241             /* Calculates the adler32 checksum of the data */
16242 0           static unsigned adler32(const unsigned char* data, size_t size)
16243             {
16244             static const unsigned sums_overflow = 5550;
16245 0           unsigned s1 = 1;
16246 0           unsigned s2 = 1 >> 16;
16247              
16248 0 0         while (size > 0) {
16249 0           size_t amount = size > sums_overflow ? sums_overflow : size;
16250 0           size -= amount;
16251 0 0         while (amount > 0) {
16252 0           s1 += (*data++);
16253 0           s2 += s1;
16254 0           amount--;
16255             }
16256 0           s1 %= 65521;
16257 0           s2 %= 65521;
16258             }
16259              
16260 0           return (s2 << 16) | s1;
16261             }
16262              
16263 0           void ZopfliZlibCompress(const ZopfliOptions* options,
16264             const unsigned char* in, size_t insize,
16265             unsigned char** out, size_t* outsize) {
16266 0           unsigned char bitpointer = 0;
16267 0           unsigned checksum = adler32(in, (unsigned)insize);
16268 0           unsigned cmf = 120; /* CM 8, CINFO 7. See zlib spec.*/
16269 0           unsigned flevel = 3;
16270 0           unsigned fdict = 0;
16271 0           unsigned cmfflg = 256 * cmf + fdict * 32 + flevel * 64;
16272 0           unsigned fcheck = 31 - cmfflg % 31;
16273 0           cmfflg += fcheck;
16274              
16275 0 0         ZOPFLI_APPEND_DATA(cmfflg / 256, out, outsize);
    0          
16276 0 0         ZOPFLI_APPEND_DATA(cmfflg % 256, out, outsize);
    0          
16277              
16278 0           ZopfliDeflate(options, 2 /* dynamic block */, 1 /* final */,
16279             in, insize, &bitpointer, out, outsize);
16280              
16281 0 0         ZOPFLI_APPEND_DATA((checksum >> 24) % 256, out, outsize);
    0          
16282 0 0         ZOPFLI_APPEND_DATA((checksum >> 16) % 256, out, outsize);
    0          
16283 0 0         ZOPFLI_APPEND_DATA((checksum >> 8) % 256, out, outsize);
    0          
16284 0 0         ZOPFLI_APPEND_DATA(checksum % 256, out, outsize);
    0          
16285              
16286 0 0         if (options->verbose) {
16287 0           fprintf(stderr,
16288             "Original Size: %d, Zlib: %d, Compression: %f%% Removed\n",
16289 0           (int)insize, (int)*outsize,
16290 0           100.0 * (double)(insize - *outsize) / (double)insize);
16291             }
16292 0           }
16293             /*
16294             Copyright 2011 Google Inc. All Rights Reserved.
16295              
16296             Licensed under the Apache License, Version 2.0 (the "License");
16297             you may not use this file except in compliance with the License.
16298             You may obtain a copy of the License at
16299              
16300             http://www.apache.org/licenses/LICENSE-2.0
16301              
16302             Unless required by applicable law or agreed to in writing, software
16303             distributed under the License is distributed on an "AS IS" BASIS,
16304             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16305             See the License for the specific language governing permissions and
16306             limitations under the License.
16307              
16308             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
16309             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
16310             */
16311              
16312             /*
16313             Zopfli compressor program. It can output gzip-, zlib- or deflate-compatible
16314             data. By default it creates a .gz file. This tool can only compress, not
16315             decompress. Decompression can be done by any standard gzip, zlib or deflate
16316             decompressor.
16317             */
16318              
16319             #include
16320             #include
16321             #include
16322             #include
16323              
16324             /* deflate.h */
16325             /*
16326             Copyright 2011 Google Inc. All Rights Reserved.
16327              
16328             Licensed under the Apache License, Version 2.0 (the "License");
16329             you may not use this file except in compliance with the License.
16330             You may obtain a copy of the License at
16331              
16332             http://www.apache.org/licenses/LICENSE-2.0
16333              
16334             Unless required by applicable law or agreed to in writing, software
16335             distributed under the License is distributed on an "AS IS" BASIS,
16336             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16337             See the License for the specific language governing permissions and
16338             limitations under the License.
16339              
16340             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
16341             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
16342             */
16343              
16344             #ifndef ZOPFLI_DEFLATE_H_
16345             #define ZOPFLI_DEFLATE_H_
16346              
16347             /*
16348             Functions to compress according to the DEFLATE specification, using the
16349             "squeeze" LZ77 compression backend.
16350             */
16351              
16352             /* lz77.h */
16353             /*
16354             Copyright 2011 Google Inc. All Rights Reserved.
16355              
16356             Licensed under the Apache License, Version 2.0 (the "License");
16357             you may not use this file except in compliance with the License.
16358             You may obtain a copy of the License at
16359              
16360             http://www.apache.org/licenses/LICENSE-2.0
16361              
16362             Unless required by applicable law or agreed to in writing, software
16363             distributed under the License is distributed on an "AS IS" BASIS,
16364             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16365             See the License for the specific language governing permissions and
16366             limitations under the License.
16367              
16368             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
16369             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
16370             */
16371              
16372             /*
16373             Functions for basic LZ77 compression and utilities for the "squeeze" LZ77
16374             compression.
16375             */
16376              
16377             #ifndef ZOPFLI_LZ77_H_
16378             #define ZOPFLI_LZ77_H_
16379              
16380             #include
16381              
16382             /* cache.h */
16383             /*
16384             Copyright 2011 Google Inc. All Rights Reserved.
16385              
16386             Licensed under the Apache License, Version 2.0 (the "License");
16387             you may not use this file except in compliance with the License.
16388             You may obtain a copy of the License at
16389              
16390             http://www.apache.org/licenses/LICENSE-2.0
16391              
16392             Unless required by applicable law or agreed to in writing, software
16393             distributed under the License is distributed on an "AS IS" BASIS,
16394             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16395             See the License for the specific language governing permissions and
16396             limitations under the License.
16397              
16398             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
16399             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
16400             */
16401              
16402             /*
16403             The cache that speeds up ZopfliFindLongestMatch of lz77.c.
16404             */
16405              
16406             #ifndef ZOPFLI_CACHE_H_
16407             #define ZOPFLI_CACHE_H_
16408              
16409             /* util.h */
16410             /*
16411             Copyright 2011 Google Inc. All Rights Reserved.
16412              
16413             Licensed under the Apache License, Version 2.0 (the "License");
16414             you may not use this file except in compliance with the License.
16415             You may obtain a copy of the License at
16416              
16417             http://www.apache.org/licenses/LICENSE-2.0
16418              
16419             Unless required by applicable law or agreed to in writing, software
16420             distributed under the License is distributed on an "AS IS" BASIS,
16421             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16422             See the License for the specific language governing permissions and
16423             limitations under the License.
16424              
16425             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
16426             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
16427             */
16428              
16429             /*
16430             Several utilities, including: #defines to try different compression results,
16431             basic deflate specification values and generic program options.
16432             */
16433              
16434             #ifndef ZOPFLI_UTIL_H_
16435             #define ZOPFLI_UTIL_H_
16436              
16437             #include
16438             #include
16439              
16440             /* Minimum and maximum length that can be encoded in deflate. */
16441             #define ZOPFLI_MAX_MATCH 258
16442             #define ZOPFLI_MIN_MATCH 3
16443              
16444             /* Number of distinct literal/length and distance symbols in DEFLATE */
16445             #define ZOPFLI_NUM_LL 288
16446             #define ZOPFLI_NUM_D 32
16447              
16448             /*
16449             The window size for deflate. Must be a power of two. This should be 32768, the
16450             maximum possible by the deflate spec. Anything less hurts compression more than
16451             speed.
16452             */
16453             #define ZOPFLI_WINDOW_SIZE 32768
16454              
16455             /*
16456             The window mask used to wrap indices into the window. This is why the
16457             window size must be a power of two.
16458             */
16459             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
16460              
16461             /*
16462             A block structure of huge, non-smart, blocks to divide the input into, to allow
16463             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
16464             The whole compression algorithm, including the smarter block splitting, will
16465             be executed independently on each huge block.
16466             Dividing into huge blocks hurts compression, but not much relative to the size.
16467             Set it to 0 to disable master blocks.
16468             */
16469             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
16470              
16471             /*
16472             Used to initialize costs for example
16473             */
16474             #define ZOPFLI_LARGE_FLOAT 1e30
16475              
16476             /*
16477             For longest match cache. max 256. Uses huge amounts of memory but makes it
16478             faster. Uses this many times three bytes per single byte of the input data.
16479             This is so because longest match finding has to find the exact distance
16480             that belongs to each length for the best lz77 strategy.
16481             Good values: e.g. 5, 8.
16482             */
16483             #define ZOPFLI_CACHE_LENGTH 8
16484              
16485             /*
16486             limit the max hash chain hits for this hash value. This has an effect only
16487             on files where the hash value is the same very often. On these files, this
16488             gives worse compression (the value should ideally be 32768, which is the
16489             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
16490             faster on some specific files.
16491             Good value: e.g. 8192.
16492             */
16493             #define ZOPFLI_MAX_CHAIN_HITS 8192
16494              
16495             /*
16496             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
16497             consumes a lot of memory but speeds it up. No effect on compression size.
16498             */
16499             #define ZOPFLI_LONGEST_MATCH_CACHE
16500              
16501             /*
16502             Enable to remember amount of successive identical bytes in the hash chain for
16503             finding longest match
16504             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
16505             This has no effect on the compression result, and enabling it increases speed.
16506             */
16507             #define ZOPFLI_HASH_SAME
16508              
16509             /*
16510             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
16511             best length so far is long enough. This is way faster for files with lots of
16512             identical bytes, on which the compressor is otherwise too slow. Regular files
16513             are unaffected or maybe a tiny bit slower.
16514             This has no effect on the compression result, only on speed.
16515             */
16516             #define ZOPFLI_HASH_SAME_HASH
16517              
16518             /*
16519             Enable this, to avoid slowness for files which are a repetition of the same
16520             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
16521             the compression result.
16522             */
16523             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
16524              
16525             /*
16526             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
16527             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
16528             varies from file to file.
16529             */
16530             #define ZOPFLI_LAZY_MATCHING
16531              
16532             /*
16533             Appends value to dynamically allocated memory, doubling its allocation size
16534             whenever needed.
16535              
16536             value: the value to append, type T
16537             data: pointer to the dynamic array to append to, type T**
16538             size: pointer to the size of the array to append to, type size_t*. This is the
16539             size that you consider the array to be, not the internal allocation size.
16540             Precondition: allocated size of data is at least a power of two greater than or
16541             equal than *size.
16542             */
16543             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
16544             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
16545             if (!((*size) & ((*size) - 1))) {\
16546             /*double alloc size if it's a power of two*/\
16547             void** data_void = reinterpret_cast(data);\
16548             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
16549             : realloc((*data), (*size) * 2 * sizeof(**data));\
16550             }\
16551             (*data)[(*size)] = (value);\
16552             (*size)++;\
16553             }
16554             #else /* C gives problems with strict-aliasing rules for (void**) cast */
16555             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
16556             if (!((*size) & ((*size) - 1))) {\
16557             /*double alloc size if it's a power of two*/\
16558             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
16559             : realloc((*data), (*size) * 2 * sizeof(**data));\
16560             }\
16561             (*data)[(*size)] = (value);\
16562             (*size)++;\
16563             }
16564             #endif
16565              
16566              
16567             #endif /* ZOPFLI_UTIL_H_ */
16568              
16569              
16570             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
16571              
16572             /*
16573             Cache used by ZopfliFindLongestMatch to remember previously found length/dist
16574             values.
16575             This is needed because the squeeze runs will ask these values multiple times for
16576             the same position.
16577             Uses large amounts of memory, since it has to remember the distance belonging
16578             to every possible shorter-than-the-best length (the so called "sublen" array).
16579             */
16580             typedef struct ZopfliLongestMatchCache {
16581             unsigned short* length;
16582             unsigned short* dist;
16583             unsigned char* sublen;
16584             } ZopfliLongestMatchCache;
16585              
16586             /* Initializes the ZopfliLongestMatchCache. */
16587             void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc);
16588              
16589             /* Frees up the memory of the ZopfliLongestMatchCache. */
16590             void ZopfliCleanCache(ZopfliLongestMatchCache* lmc);
16591              
16592             /* Stores sublen array in the cache. */
16593             void ZopfliSublenToCache(const unsigned short* sublen,
16594             size_t pos, size_t length,
16595             ZopfliLongestMatchCache* lmc);
16596              
16597             /* Extracts sublen array from the cache. */
16598             void ZopfliCacheToSublen(const ZopfliLongestMatchCache* lmc,
16599             size_t pos, size_t length,
16600             unsigned short* sublen);
16601             /* Returns the length up to which could be stored in the cache. */
16602             unsigned ZopfliMaxCachedSublen(const ZopfliLongestMatchCache* lmc,
16603             size_t pos, size_t length);
16604              
16605             #endif /* ZOPFLI_LONGEST_MATCH_CACHE */
16606              
16607             #endif /* ZOPFLI_CACHE_H_ */
16608              
16609             /* hash.h */
16610             /*
16611             Copyright 2011 Google Inc. All Rights Reserved.
16612              
16613             Licensed under the Apache License, Version 2.0 (the "License");
16614             you may not use this file except in compliance with the License.
16615             You may obtain a copy of the License at
16616              
16617             http://www.apache.org/licenses/LICENSE-2.0
16618              
16619             Unless required by applicable law or agreed to in writing, software
16620             distributed under the License is distributed on an "AS IS" BASIS,
16621             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16622             See the License for the specific language governing permissions and
16623             limitations under the License.
16624              
16625             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
16626             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
16627             */
16628              
16629             /*
16630             The hash for ZopfliFindLongestMatch of lz77.c.
16631             */
16632              
16633             #ifndef ZOPFLI_HASH_H_
16634             #define ZOPFLI_HASH_H_
16635              
16636             /* util.h */
16637             /*
16638             Copyright 2011 Google Inc. All Rights Reserved.
16639              
16640             Licensed under the Apache License, Version 2.0 (the "License");
16641             you may not use this file except in compliance with the License.
16642             You may obtain a copy of the License at
16643              
16644             http://www.apache.org/licenses/LICENSE-2.0
16645              
16646             Unless required by applicable law or agreed to in writing, software
16647             distributed under the License is distributed on an "AS IS" BASIS,
16648             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16649             See the License for the specific language governing permissions and
16650             limitations under the License.
16651              
16652             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
16653             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
16654             */
16655              
16656             /*
16657             Several utilities, including: #defines to try different compression results,
16658             basic deflate specification values and generic program options.
16659             */
16660              
16661             #ifndef ZOPFLI_UTIL_H_
16662             #define ZOPFLI_UTIL_H_
16663              
16664             #include
16665             #include
16666              
16667             /* Minimum and maximum length that can be encoded in deflate. */
16668             #define ZOPFLI_MAX_MATCH 258
16669             #define ZOPFLI_MIN_MATCH 3
16670              
16671             /* Number of distinct literal/length and distance symbols in DEFLATE */
16672             #define ZOPFLI_NUM_LL 288
16673             #define ZOPFLI_NUM_D 32
16674              
16675             /*
16676             The window size for deflate. Must be a power of two. This should be 32768, the
16677             maximum possible by the deflate spec. Anything less hurts compression more than
16678             speed.
16679             */
16680             #define ZOPFLI_WINDOW_SIZE 32768
16681              
16682             /*
16683             The window mask used to wrap indices into the window. This is why the
16684             window size must be a power of two.
16685             */
16686             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
16687              
16688             /*
16689             A block structure of huge, non-smart, blocks to divide the input into, to allow
16690             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
16691             The whole compression algorithm, including the smarter block splitting, will
16692             be executed independently on each huge block.
16693             Dividing into huge blocks hurts compression, but not much relative to the size.
16694             Set it to 0 to disable master blocks.
16695             */
16696             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
16697              
16698             /*
16699             Used to initialize costs for example
16700             */
16701             #define ZOPFLI_LARGE_FLOAT 1e30
16702              
16703             /*
16704             For longest match cache. max 256. Uses huge amounts of memory but makes it
16705             faster. Uses this many times three bytes per single byte of the input data.
16706             This is so because longest match finding has to find the exact distance
16707             that belongs to each length for the best lz77 strategy.
16708             Good values: e.g. 5, 8.
16709             */
16710             #define ZOPFLI_CACHE_LENGTH 8
16711              
16712             /*
16713             limit the max hash chain hits for this hash value. This has an effect only
16714             on files where the hash value is the same very often. On these files, this
16715             gives worse compression (the value should ideally be 32768, which is the
16716             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
16717             faster on some specific files.
16718             Good value: e.g. 8192.
16719             */
16720             #define ZOPFLI_MAX_CHAIN_HITS 8192
16721              
16722             /*
16723             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
16724             consumes a lot of memory but speeds it up. No effect on compression size.
16725             */
16726             #define ZOPFLI_LONGEST_MATCH_CACHE
16727              
16728             /*
16729             Enable to remember amount of successive identical bytes in the hash chain for
16730             finding longest match
16731             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
16732             This has no effect on the compression result, and enabling it increases speed.
16733             */
16734             #define ZOPFLI_HASH_SAME
16735              
16736             /*
16737             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
16738             best length so far is long enough. This is way faster for files with lots of
16739             identical bytes, on which the compressor is otherwise too slow. Regular files
16740             are unaffected or maybe a tiny bit slower.
16741             This has no effect on the compression result, only on speed.
16742             */
16743             #define ZOPFLI_HASH_SAME_HASH
16744              
16745             /*
16746             Enable this, to avoid slowness for files which are a repetition of the same
16747             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
16748             the compression result.
16749             */
16750             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
16751              
16752             /*
16753             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
16754             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
16755             varies from file to file.
16756             */
16757             #define ZOPFLI_LAZY_MATCHING
16758              
16759             /*
16760             Appends value to dynamically allocated memory, doubling its allocation size
16761             whenever needed.
16762              
16763             value: the value to append, type T
16764             data: pointer to the dynamic array to append to, type T**
16765             size: pointer to the size of the array to append to, type size_t*. This is the
16766             size that you consider the array to be, not the internal allocation size.
16767             Precondition: allocated size of data is at least a power of two greater than or
16768             equal than *size.
16769             */
16770             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
16771             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
16772             if (!((*size) & ((*size) - 1))) {\
16773             /*double alloc size if it's a power of two*/\
16774             void** data_void = reinterpret_cast(data);\
16775             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
16776             : realloc((*data), (*size) * 2 * sizeof(**data));\
16777             }\
16778             (*data)[(*size)] = (value);\
16779             (*size)++;\
16780             }
16781             #else /* C gives problems with strict-aliasing rules for (void**) cast */
16782             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
16783             if (!((*size) & ((*size) - 1))) {\
16784             /*double alloc size if it's a power of two*/\
16785             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
16786             : realloc((*data), (*size) * 2 * sizeof(**data));\
16787             }\
16788             (*data)[(*size)] = (value);\
16789             (*size)++;\
16790             }
16791             #endif
16792              
16793              
16794             #endif /* ZOPFLI_UTIL_H_ */
16795              
16796              
16797             typedef struct ZopfliHash {
16798             int* head; /* Hash value to index of its most recent occurrence. */
16799             unsigned short* prev; /* Index to index of prev. occurrence of same hash. */
16800             int* hashval; /* Index to hash value at this index. */
16801             int val; /* Current hash value. */
16802              
16803             #ifdef ZOPFLI_HASH_SAME_HASH
16804             /* Fields with similar purpose as the above hash, but for the second hash with
16805             a value that is calculated differently. */
16806             int* head2; /* Hash value to index of its most recent occurrence. */
16807             unsigned short* prev2; /* Index to index of prev. occurrence of same hash. */
16808             int* hashval2; /* Index to hash value at this index. */
16809             int val2; /* Current hash value. */
16810             #endif
16811              
16812             #ifdef ZOPFLI_HASH_SAME
16813             unsigned short* same; /* Amount of repetitions of same byte after this .*/
16814             #endif
16815             } ZopfliHash;
16816              
16817             /* Allocates ZopfliHash memory. */
16818             void ZopfliAllocHash(size_t window_size, ZopfliHash* h);
16819              
16820             /* Resets all fields of ZopfliHash. */
16821             void ZopfliResetHash(size_t window_size, ZopfliHash* h);
16822              
16823             /* Frees ZopfliHash memory. */
16824             void ZopfliCleanHash(ZopfliHash* h);
16825              
16826             /*
16827             Updates the hash values based on the current position in the array. All calls
16828             to this must be made for consecutive bytes.
16829             */
16830             void ZopfliUpdateHash(const unsigned char* array, size_t pos, size_t end,
16831             ZopfliHash* h);
16832              
16833             /*
16834             Prepopulates hash:
16835             Fills in the initial values in the hash, before ZopfliUpdateHash can be used
16836             correctly.
16837             */
16838             void ZopfliWarmupHash(const unsigned char* array, size_t pos, size_t end,
16839             ZopfliHash* h);
16840              
16841             #endif /* ZOPFLI_HASH_H_ */
16842              
16843             /* zopfli.h */
16844             /*
16845             Copyright 2011 Google Inc. All Rights Reserved.
16846              
16847             Licensed under the Apache License, Version 2.0 (the "License");
16848             you may not use this file except in compliance with the License.
16849             You may obtain a copy of the License at
16850              
16851             http://www.apache.org/licenses/LICENSE-2.0
16852              
16853             Unless required by applicable law or agreed to in writing, software
16854             distributed under the License is distributed on an "AS IS" BASIS,
16855             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16856             See the License for the specific language governing permissions and
16857             limitations under the License.
16858              
16859             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
16860             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
16861             */
16862              
16863             #ifndef ZOPFLI_ZOPFLI_H_
16864             #define ZOPFLI_ZOPFLI_H_
16865              
16866             #include
16867             #include /* for size_t */
16868              
16869             #ifdef __cplusplus
16870             extern "C" {
16871             #endif
16872              
16873             /*
16874             Options used throughout the program.
16875             */
16876             typedef struct ZopfliOptions {
16877             /* Whether to print output */
16878             int verbose;
16879              
16880             /* Whether to print more detailed output */
16881             int verbose_more;
16882              
16883             /*
16884             Maximum amount of times to rerun forward and backward pass to optimize LZ77
16885             compression cost. Good values: 10, 15 for small files, 5 for files over
16886             several MB in size or it will be too slow.
16887             */
16888             int numiterations;
16889              
16890             /*
16891             If true, splits the data in multiple deflate blocks with optimal choice
16892             for the block boundaries. Block splitting gives better compression. Default:
16893             true (1).
16894             */
16895             int blocksplitting;
16896              
16897             /*
16898             No longer used, left for compatibility.
16899             */
16900             int blocksplittinglast;
16901              
16902             /*
16903             Maximum amount of blocks to split into (0 for unlimited, but this can give
16904             extreme results that hurt compression on some files). Default value: 15.
16905             */
16906             int blocksplittingmax;
16907             } ZopfliOptions;
16908              
16909             /* Initializes options with default values. */
16910             void ZopfliInitOptions(ZopfliOptions* options);
16911              
16912             /* Output format */
16913             typedef enum {
16914             ZOPFLI_FORMAT_GZIP,
16915             ZOPFLI_FORMAT_ZLIB,
16916             ZOPFLI_FORMAT_DEFLATE
16917             } ZopfliFormat;
16918              
16919             /*
16920             Compresses according to the given output format and appends the result to the
16921             output.
16922              
16923             options: global program options
16924             output_type: the output format to use
16925             out: pointer to the dynamic output array to which the result is appended. Must
16926             be freed after use
16927             outsize: pointer to the dynamic output array size
16928             */
16929             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
16930             const unsigned char* in, size_t insize,
16931             unsigned char** out, size_t* outsize);
16932              
16933             #ifdef __cplusplus
16934             } // extern "C"
16935             #endif
16936              
16937             #endif /* ZOPFLI_ZOPFLI_H_ */
16938              
16939              
16940             /*
16941             Stores lit/length and dist pairs for LZ77.
16942             Parameter litlens: Contains the literal symbols or length values.
16943             Parameter dists: Contains the distances. A value is 0 to indicate that there is
16944             no dist and the corresponding litlens value is a literal instead of a length.
16945             Parameter size: The size of both the litlens and dists arrays.
16946             The memory can best be managed by using ZopfliInitLZ77Store to initialize it,
16947             ZopfliCleanLZ77Store to destroy it, and ZopfliStoreLitLenDist to append values.
16948              
16949             */
16950             typedef struct ZopfliLZ77Store {
16951             unsigned short* litlens; /* Lit or len. */
16952             unsigned short* dists; /* If 0: indicates literal in corresponding litlens,
16953             if > 0: length in corresponding litlens, this is the distance. */
16954             size_t size;
16955              
16956             const unsigned char* data; /* original data */
16957             size_t* pos; /* position in data where this LZ77 command begins */
16958              
16959             unsigned short* ll_symbol;
16960             unsigned short* d_symbol;
16961              
16962             /* Cumulative histograms wrapping around per chunk. Each chunk has the amount
16963             of distinct symbols as length, so using 1 value per LZ77 symbol, we have a
16964             precise histogram at every N symbols, and the rest can be calculated by
16965             looping through the actual symbols of this chunk. */
16966             size_t* ll_counts;
16967             size_t* d_counts;
16968             } ZopfliLZ77Store;
16969              
16970             void ZopfliInitLZ77Store(const unsigned char* data, ZopfliLZ77Store* store);
16971             void ZopfliCleanLZ77Store(ZopfliLZ77Store* store);
16972             void ZopfliCopyLZ77Store(const ZopfliLZ77Store* source, ZopfliLZ77Store* dest);
16973             void ZopfliStoreLitLenDist(unsigned short length, unsigned short dist,
16974             size_t pos, ZopfliLZ77Store* store);
16975             void ZopfliAppendLZ77Store(const ZopfliLZ77Store* store,
16976             ZopfliLZ77Store* target);
16977             /* Gets the amount of raw bytes that this range of LZ77 symbols spans. */
16978             size_t ZopfliLZ77GetByteRange(const ZopfliLZ77Store* lz77,
16979             size_t lstart, size_t lend);
16980             /* Gets the histogram of lit/len and dist symbols in the given range, using the
16981             cumulative histograms, so faster than adding one by one for large range. Does
16982             not add the one end symbol of value 256. */
16983             void ZopfliLZ77GetHistogram(const ZopfliLZ77Store* lz77,
16984             size_t lstart, size_t lend,
16985             size_t* ll_counts, size_t* d_counts);
16986              
16987             /*
16988             Some state information for compressing a block.
16989             This is currently a bit under-used (with mainly only the longest match cache),
16990             but is kept for easy future expansion.
16991             */
16992             typedef struct ZopfliBlockState {
16993             const ZopfliOptions* options;
16994              
16995             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
16996             /* Cache for length/distance pairs found so far. */
16997             ZopfliLongestMatchCache* lmc;
16998             #endif
16999              
17000             /* The start (inclusive) and end (not inclusive) of the current block. */
17001             size_t blockstart;
17002             size_t blockend;
17003             } ZopfliBlockState;
17004              
17005             void ZopfliInitBlockState(const ZopfliOptions* options,
17006             size_t blockstart, size_t blockend, int add_lmc,
17007             ZopfliBlockState* s);
17008             void ZopfliCleanBlockState(ZopfliBlockState* s);
17009              
17010             /*
17011             Finds the longest match (length and corresponding distance) for LZ77
17012             compression.
17013             Even when not using "sublen", it can be more efficient to provide an array,
17014             because only then the caching is used.
17015             array: the data
17016             pos: position in the data to find the match for
17017             size: size of the data
17018             limit: limit length to maximum this value (default should be 258). This allows
17019             finding a shorter dist for that length (= less extra bits). Must be
17020             in the range [ZOPFLI_MIN_MATCH, ZOPFLI_MAX_MATCH].
17021             sublen: output array of 259 elements, or null. Has, for each length, the
17022             smallest distance required to reach this length. Only 256 of its 259 values
17023             are used, the first 3 are ignored (the shortest length is 3. It is purely
17024             for convenience that the array is made 3 longer).
17025             */
17026             void ZopfliFindLongestMatch(
17027             ZopfliBlockState *s, const ZopfliHash* h, const unsigned char* array,
17028             size_t pos, size_t size, size_t limit,
17029             unsigned short* sublen, unsigned short* distance, unsigned short* length);
17030              
17031             /*
17032             Verifies if length and dist are indeed valid, only used for assertion.
17033             */
17034             void ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
17035             unsigned short dist, unsigned short length);
17036              
17037             /*
17038             Does LZ77 using an algorithm similar to gzip, with lazy matching, rather than
17039             with the slow but better "squeeze" implementation.
17040             The result is placed in the ZopfliLZ77Store.
17041             If instart is larger than 0, it uses values before instart as starting
17042             dictionary.
17043             */
17044             void ZopfliLZ77Greedy(ZopfliBlockState* s, const unsigned char* in,
17045             size_t instart, size_t inend,
17046             ZopfliLZ77Store* store, ZopfliHash* h);
17047              
17048             #endif /* ZOPFLI_LZ77_H_ */
17049              
17050             /* zopfli.h */
17051             /*
17052             Copyright 2011 Google Inc. All Rights Reserved.
17053              
17054             Licensed under the Apache License, Version 2.0 (the "License");
17055             you may not use this file except in compliance with the License.
17056             You may obtain a copy of the License at
17057              
17058             http://www.apache.org/licenses/LICENSE-2.0
17059              
17060             Unless required by applicable law or agreed to in writing, software
17061             distributed under the License is distributed on an "AS IS" BASIS,
17062             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17063             See the License for the specific language governing permissions and
17064             limitations under the License.
17065              
17066             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
17067             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
17068             */
17069              
17070             #ifndef ZOPFLI_ZOPFLI_H_
17071             #define ZOPFLI_ZOPFLI_H_
17072              
17073             #include
17074             #include /* for size_t */
17075              
17076             #ifdef __cplusplus
17077             extern "C" {
17078             #endif
17079              
17080             /*
17081             Options used throughout the program.
17082             */
17083             typedef struct ZopfliOptions {
17084             /* Whether to print output */
17085             int verbose;
17086              
17087             /* Whether to print more detailed output */
17088             int verbose_more;
17089              
17090             /*
17091             Maximum amount of times to rerun forward and backward pass to optimize LZ77
17092             compression cost. Good values: 10, 15 for small files, 5 for files over
17093             several MB in size or it will be too slow.
17094             */
17095             int numiterations;
17096              
17097             /*
17098             If true, splits the data in multiple deflate blocks with optimal choice
17099             for the block boundaries. Block splitting gives better compression. Default:
17100             true (1).
17101             */
17102             int blocksplitting;
17103              
17104             /*
17105             No longer used, left for compatibility.
17106             */
17107             int blocksplittinglast;
17108              
17109             /*
17110             Maximum amount of blocks to split into (0 for unlimited, but this can give
17111             extreme results that hurt compression on some files). Default value: 15.
17112             */
17113             int blocksplittingmax;
17114             } ZopfliOptions;
17115              
17116             /* Initializes options with default values. */
17117             void ZopfliInitOptions(ZopfliOptions* options);
17118              
17119             /* Output format */
17120             typedef enum {
17121             ZOPFLI_FORMAT_GZIP,
17122             ZOPFLI_FORMAT_ZLIB,
17123             ZOPFLI_FORMAT_DEFLATE
17124             } ZopfliFormat;
17125              
17126             /*
17127             Compresses according to the given output format and appends the result to the
17128             output.
17129              
17130             options: global program options
17131             output_type: the output format to use
17132             out: pointer to the dynamic output array to which the result is appended. Must
17133             be freed after use
17134             outsize: pointer to the dynamic output array size
17135             */
17136             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
17137             const unsigned char* in, size_t insize,
17138             unsigned char** out, size_t* outsize);
17139              
17140             #ifdef __cplusplus
17141             } // extern "C"
17142             #endif
17143              
17144             #endif /* ZOPFLI_ZOPFLI_H_ */
17145              
17146              
17147             #ifdef __cplusplus
17148             extern "C" {
17149             #endif
17150              
17151             /*
17152             Compresses according to the deflate specification and append the compressed
17153             result to the output.
17154             This function will usually output multiple deflate blocks. If final is 1, then
17155             the final bit will be set on the last block.
17156              
17157             options: global program options
17158             btype: the deflate block type. Use 2 for best compression.
17159             -0: non compressed blocks (00)
17160             -1: blocks with fixed tree (01)
17161             -2: blocks with dynamic tree (10)
17162             final: whether this is the last section of the input, sets the final bit to the
17163             last deflate block.
17164             in: the input bytes
17165             insize: number of input bytes
17166             bp: bit pointer for the output array. This must initially be 0, and for
17167             consecutive calls must be reused (it can have values from 0-7). This is
17168             because deflate appends blocks as bit-based data, rather than on byte
17169             boundaries.
17170             out: pointer to the dynamic output array to which the result is appended. Must
17171             be freed after use.
17172             outsize: pointer to the dynamic output array size.
17173             */
17174             void ZopfliDeflate(const ZopfliOptions* options, int btype, int final,
17175             const unsigned char* in, size_t insize,
17176             unsigned char* bp, unsigned char** out, size_t* outsize);
17177              
17178             /*
17179             Like ZopfliDeflate, but allows to specify start and end byte with instart and
17180             inend. Only that part is compressed, but earlier bytes are still used for the
17181             back window.
17182             */
17183             void ZopfliDeflatePart(const ZopfliOptions* options, int btype, int final,
17184             const unsigned char* in, size_t instart, size_t inend,
17185             unsigned char* bp, unsigned char** out,
17186             size_t* outsize);
17187              
17188             /*
17189             Calculates block size in bits.
17190             litlens: lz77 lit/lengths
17191             dists: ll77 distances
17192             lstart: start of block
17193             lend: end of block (not inclusive)
17194             */
17195             double ZopfliCalculateBlockSize(const ZopfliLZ77Store* lz77,
17196             size_t lstart, size_t lend, int btype);
17197              
17198             /*
17199             Calculates block size in bits, automatically using the best btype.
17200             */
17201             double ZopfliCalculateBlockSizeAutoType(const ZopfliLZ77Store* lz77,
17202             size_t lstart, size_t lend);
17203              
17204             #ifdef __cplusplus
17205             } // extern "C"
17206             #endif
17207              
17208             #endif /* ZOPFLI_DEFLATE_H_ */
17209              
17210             /* gzip_container.h */
17211             /*
17212             Copyright 2013 Google Inc. All Rights Reserved.
17213              
17214             Licensed under the Apache License, Version 2.0 (the "License");
17215             you may not use this file except in compliance with the License.
17216             You may obtain a copy of the License at
17217              
17218             http://www.apache.org/licenses/LICENSE-2.0
17219              
17220             Unless required by applicable law or agreed to in writing, software
17221             distributed under the License is distributed on an "AS IS" BASIS,
17222             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17223             See the License for the specific language governing permissions and
17224             limitations under the License.
17225              
17226             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
17227             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
17228             */
17229              
17230             #ifndef ZOPFLI_GZIP_H_
17231             #define ZOPFLI_GZIP_H_
17232              
17233             /*
17234             Functions to compress according to the Gzip specification.
17235             */
17236              
17237             /* zopfli.h */
17238             /*
17239             Copyright 2011 Google Inc. All Rights Reserved.
17240              
17241             Licensed under the Apache License, Version 2.0 (the "License");
17242             you may not use this file except in compliance with the License.
17243             You may obtain a copy of the License at
17244              
17245             http://www.apache.org/licenses/LICENSE-2.0
17246              
17247             Unless required by applicable law or agreed to in writing, software
17248             distributed under the License is distributed on an "AS IS" BASIS,
17249             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17250             See the License for the specific language governing permissions and
17251             limitations under the License.
17252              
17253             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
17254             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
17255             */
17256              
17257             #ifndef ZOPFLI_ZOPFLI_H_
17258             #define ZOPFLI_ZOPFLI_H_
17259              
17260             #include
17261             #include /* for size_t */
17262              
17263             #ifdef __cplusplus
17264             extern "C" {
17265             #endif
17266              
17267             /*
17268             Options used throughout the program.
17269             */
17270             typedef struct ZopfliOptions {
17271             /* Whether to print output */
17272             int verbose;
17273              
17274             /* Whether to print more detailed output */
17275             int verbose_more;
17276              
17277             /*
17278             Maximum amount of times to rerun forward and backward pass to optimize LZ77
17279             compression cost. Good values: 10, 15 for small files, 5 for files over
17280             several MB in size or it will be too slow.
17281             */
17282             int numiterations;
17283              
17284             /*
17285             If true, splits the data in multiple deflate blocks with optimal choice
17286             for the block boundaries. Block splitting gives better compression. Default:
17287             true (1).
17288             */
17289             int blocksplitting;
17290              
17291             /*
17292             No longer used, left for compatibility.
17293             */
17294             int blocksplittinglast;
17295              
17296             /*
17297             Maximum amount of blocks to split into (0 for unlimited, but this can give
17298             extreme results that hurt compression on some files). Default value: 15.
17299             */
17300             int blocksplittingmax;
17301             } ZopfliOptions;
17302              
17303             /* Initializes options with default values. */
17304             void ZopfliInitOptions(ZopfliOptions* options);
17305              
17306             /* Output format */
17307             typedef enum {
17308             ZOPFLI_FORMAT_GZIP,
17309             ZOPFLI_FORMAT_ZLIB,
17310             ZOPFLI_FORMAT_DEFLATE
17311             } ZopfliFormat;
17312              
17313             /*
17314             Compresses according to the given output format and appends the result to the
17315             output.
17316              
17317             options: global program options
17318             output_type: the output format to use
17319             out: pointer to the dynamic output array to which the result is appended. Must
17320             be freed after use
17321             outsize: pointer to the dynamic output array size
17322             */
17323             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
17324             const unsigned char* in, size_t insize,
17325             unsigned char** out, size_t* outsize);
17326              
17327             #ifdef __cplusplus
17328             } // extern "C"
17329             #endif
17330              
17331             #endif /* ZOPFLI_ZOPFLI_H_ */
17332              
17333              
17334             #ifdef __cplusplus
17335             extern "C" {
17336             #endif
17337              
17338             /*
17339             Compresses according to the gzip specification and append the compressed
17340             result to the output.
17341              
17342             options: global program options
17343             out: pointer to the dynamic output array to which the result is appended. Must
17344             be freed after use.
17345             outsize: pointer to the dynamic output array size.
17346             */
17347             void ZopfliGzipCompress(const ZopfliOptions* options,
17348             const unsigned char* in, size_t insize,
17349             unsigned char** out, size_t* outsize);
17350              
17351             #ifdef __cplusplus
17352             } // extern "C"
17353             #endif
17354              
17355             #endif /* ZOPFLI_GZIP_H_ */
17356              
17357             /* zlib_container.h */
17358             /*
17359             Copyright 2013 Google Inc. All Rights Reserved.
17360              
17361             Licensed under the Apache License, Version 2.0 (the "License");
17362             you may not use this file except in compliance with the License.
17363             You may obtain a copy of the License at
17364              
17365             http://www.apache.org/licenses/LICENSE-2.0
17366              
17367             Unless required by applicable law or agreed to in writing, software
17368             distributed under the License is distributed on an "AS IS" BASIS,
17369             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17370             See the License for the specific language governing permissions and
17371             limitations under the License.
17372              
17373             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
17374             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
17375             */
17376              
17377             #ifndef ZOPFLI_ZLIB_H_
17378             #define ZOPFLI_ZLIB_H_
17379              
17380             /*
17381             Functions to compress according to the Zlib specification.
17382             */
17383              
17384             /* zopfli.h */
17385             /*
17386             Copyright 2011 Google Inc. All Rights Reserved.
17387              
17388             Licensed under the Apache License, Version 2.0 (the "License");
17389             you may not use this file except in compliance with the License.
17390             You may obtain a copy of the License at
17391              
17392             http://www.apache.org/licenses/LICENSE-2.0
17393              
17394             Unless required by applicable law or agreed to in writing, software
17395             distributed under the License is distributed on an "AS IS" BASIS,
17396             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17397             See the License for the specific language governing permissions and
17398             limitations under the License.
17399              
17400             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
17401             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
17402             */
17403              
17404             #ifndef ZOPFLI_ZOPFLI_H_
17405             #define ZOPFLI_ZOPFLI_H_
17406              
17407             #include
17408             #include /* for size_t */
17409              
17410             #ifdef __cplusplus
17411             extern "C" {
17412             #endif
17413              
17414             /*
17415             Options used throughout the program.
17416             */
17417             typedef struct ZopfliOptions {
17418             /* Whether to print output */
17419             int verbose;
17420              
17421             /* Whether to print more detailed output */
17422             int verbose_more;
17423              
17424             /*
17425             Maximum amount of times to rerun forward and backward pass to optimize LZ77
17426             compression cost. Good values: 10, 15 for small files, 5 for files over
17427             several MB in size or it will be too slow.
17428             */
17429             int numiterations;
17430              
17431             /*
17432             If true, splits the data in multiple deflate blocks with optimal choice
17433             for the block boundaries. Block splitting gives better compression. Default:
17434             true (1).
17435             */
17436             int blocksplitting;
17437              
17438             /*
17439             No longer used, left for compatibility.
17440             */
17441             int blocksplittinglast;
17442              
17443             /*
17444             Maximum amount of blocks to split into (0 for unlimited, but this can give
17445             extreme results that hurt compression on some files). Default value: 15.
17446             */
17447             int blocksplittingmax;
17448             } ZopfliOptions;
17449              
17450             /* Initializes options with default values. */
17451             void ZopfliInitOptions(ZopfliOptions* options);
17452              
17453             /* Output format */
17454             typedef enum {
17455             ZOPFLI_FORMAT_GZIP,
17456             ZOPFLI_FORMAT_ZLIB,
17457             ZOPFLI_FORMAT_DEFLATE
17458             } ZopfliFormat;
17459              
17460             /*
17461             Compresses according to the given output format and appends the result to the
17462             output.
17463              
17464             options: global program options
17465             output_type: the output format to use
17466             out: pointer to the dynamic output array to which the result is appended. Must
17467             be freed after use
17468             outsize: pointer to the dynamic output array size
17469             */
17470             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
17471             const unsigned char* in, size_t insize,
17472             unsigned char** out, size_t* outsize);
17473              
17474             #ifdef __cplusplus
17475             } // extern "C"
17476             #endif
17477              
17478             #endif /* ZOPFLI_ZOPFLI_H_ */
17479              
17480              
17481             #ifdef __cplusplus
17482             extern "C" {
17483             #endif
17484              
17485             /*
17486             Compresses according to the zlib specification and append the compressed
17487             result to the output.
17488              
17489             options: global program options
17490             out: pointer to the dynamic output array to which the result is appended. Must
17491             be freed after use.
17492             outsize: pointer to the dynamic output array size.
17493             */
17494             void ZopfliZlibCompress(const ZopfliOptions* options,
17495             const unsigned char* in, size_t insize,
17496             unsigned char** out, size_t* outsize);
17497              
17498             #ifdef __cplusplus
17499             } // extern "C"
17500             #endif
17501              
17502             #endif /* ZOPFLI_ZLIB_H_ */
17503              
17504              
17505             /* Windows workaround for stdout output. */
17506             #if _WIN32
17507             #include
17508             #endif
17509              
17510             /*
17511             Loads a file into a memory array. Returns 1 on success, 0 if file doesn't exist
17512             or couldn't be opened.
17513             */
17514 0           static int LoadFile(const char* filename,
17515             unsigned char** out, size_t* outsize) {
17516             FILE* file;
17517              
17518 0           *out = 0;
17519 0           *outsize = 0;
17520 0           file = fopen(filename, "rb");
17521 0 0         if (!file) return 0;
17522              
17523 0           fseek(file , 0 , SEEK_END);
17524 0           *outsize = ftell(file);
17525 0 0         if(*outsize > 2147483647) {
17526 0           fprintf(stderr,"Files larger than 2GB are not supported.\n");
17527 0           exit(EXIT_FAILURE);
17528             }
17529 0           rewind(file);
17530              
17531 0           *out = (unsigned char*)malloc(*outsize);
17532              
17533 0 0         if (*outsize && (*out)) {
    0          
17534 0           size_t testsize = fread(*out, 1, *outsize, file);
17535 0 0         if (testsize != *outsize) {
17536             /* It could be a directory */
17537 0           free(*out);
17538 0           *out = 0;
17539 0           *outsize = 0;
17540 0           fclose(file);
17541 0           return 0;
17542             }
17543             }
17544              
17545             assert(!(*outsize) || out); /* If size is not zero, out must be allocated. */
17546 0           fclose(file);
17547 0           return 1;
17548             }
17549              
17550             /*
17551             Saves a file from a memory array, overwriting the file if it existed.
17552             */
17553 0           static void SaveFile(const char* filename,
17554             const unsigned char* in, size_t insize) {
17555 0           FILE* file = fopen(filename, "wb" );
17556 0 0         if (file == NULL) {
17557 0           fprintf(stderr,"Error: Cannot write to output file, terminating.\n");
17558 0           exit (EXIT_FAILURE);
17559             }
17560             assert(file);
17561 0           fwrite((char*)in, 1, insize, file);
17562 0           fclose(file);
17563 0           }
17564              
17565             /*
17566             outfilename: filename to write output to, or 0 to write to stdout instead
17567             */
17568 0           static void CompressFile(const ZopfliOptions* options,
17569             ZopfliFormat output_type,
17570             const char* infilename,
17571             const char* outfilename) {
17572             unsigned char* in;
17573             size_t insize;
17574 0           unsigned char* out = 0;
17575 0           size_t outsize = 0;
17576 0 0         if (!LoadFile(infilename, &in, &insize)) {
17577 0           fprintf(stderr, "Invalid filename: %s\n", infilename);
17578 0           return;
17579             }
17580              
17581 0           ZopfliCompress(options, output_type, in, insize, &out, &outsize);
17582              
17583 0 0         if (outfilename) {
17584 0           SaveFile(outfilename, out, outsize);
17585             } else {
17586             #if _WIN32
17587             /* Windows workaround for stdout output. */
17588             _setmode(_fileno(stdout), _O_BINARY);
17589             #endif
17590 0           fwrite(out, 1, outsize, stdout);
17591             }
17592              
17593 0           free(out);
17594 0           free(in);
17595             }
17596              
17597             /*
17598             Add two strings together. Size does not matter. Result must be freed.
17599             */
17600 0           static char* AddStrings(const char* str1, const char* str2) {
17601 0           size_t len = strlen(str1) + strlen(str2);
17602 0           char* result = (char*)malloc(len + 1);
17603 0 0         if (!result) exit(-1); /* Allocation failed. */
17604 0           strcpy(result, str1);
17605 0           strcat(result, str2);
17606 0           return result;
17607             }
17608              
17609 0           static char StringsEqual(const char* str1, const char* str2) {
17610 0           return strcmp(str1, str2) == 0;
17611             }
17612              
17613 0           int main(int argc, char* argv[]) {
17614             ZopfliOptions options;
17615 0           ZopfliFormat output_type = ZOPFLI_FORMAT_GZIP;
17616 0           const char* filename = 0;
17617 0           int output_to_stdout = 0;
17618             int i;
17619              
17620 0           ZopfliInitOptions(&options);
17621              
17622 0 0         for (i = 1; i < argc; i++) {
17623 0           const char* arg = argv[i];
17624 0 0         if (StringsEqual(arg, "-v")) options.verbose = 1;
17625 0 0         else if (StringsEqual(arg, "-c")) output_to_stdout = 1;
17626 0 0         else if (StringsEqual(arg, "--deflate")) {
17627 0           output_type = ZOPFLI_FORMAT_DEFLATE;
17628             }
17629 0 0         else if (StringsEqual(arg, "--zlib")) output_type = ZOPFLI_FORMAT_ZLIB;
17630 0 0         else if (StringsEqual(arg, "--gzip")) output_type = ZOPFLI_FORMAT_GZIP;
17631 0 0         else if (StringsEqual(arg, "--splitlast")) /* Ignore */;
17632 0 0         else if (arg[0] == '-' && arg[1] == '-' && arg[2] == 'i'
    0          
    0          
17633 0 0         && arg[3] >= '0' && arg[3] <= '9') {
    0          
17634 0           options.numiterations = atoi(arg + 3);
17635             }
17636 0 0         else if (StringsEqual(arg, "-h")) {
17637 0           fprintf(stderr,
17638             "Usage: zopfli [OPTION]... FILE...\n"
17639             " -h gives this help\n"
17640             " -c write the result on standard output, instead of disk"
17641             " filename + '.gz'\n"
17642             " -v verbose mode\n"
17643             " --i# perform # iterations (default 15). More gives"
17644             " more compression but is slower."
17645             " Examples: --i10, --i50, --i1000\n");
17646 0           fprintf(stderr,
17647             " --gzip output to gzip format (default)\n"
17648             " --zlib output to zlib format instead of gzip\n"
17649             " --deflate output to deflate format instead of gzip\n"
17650             " --splitlast ignored, left for backwards compatibility\n");
17651 0           return 0;
17652             }
17653             }
17654              
17655 0 0         if (options.numiterations < 1) {
17656 0           fprintf(stderr, "Error: must have 1 or more iterations\n");
17657 0           return 0;
17658             }
17659              
17660 0 0         for (i = 1; i < argc; i++) {
17661 0 0         if (argv[i][0] != '-') {
17662             char* outfilename;
17663 0           filename = argv[i];
17664 0 0         if (output_to_stdout) {
17665 0           outfilename = 0;
17666 0 0         } else if (output_type == ZOPFLI_FORMAT_GZIP) {
17667 0           outfilename = AddStrings(filename, ".gz");
17668 0 0         } else if (output_type == ZOPFLI_FORMAT_ZLIB) {
17669 0           outfilename = AddStrings(filename, ".zlib");
17670             } else {
17671             assert(output_type == ZOPFLI_FORMAT_DEFLATE);
17672 0           outfilename = AddStrings(filename, ".deflate");
17673             }
17674 0 0         if (options.verbose && outfilename) {
    0          
17675 0           fprintf(stderr, "Saving to: %s\n", outfilename);
17676             }
17677 0           CompressFile(&options, output_type, filename, outfilename);
17678 0           free(outfilename);
17679             }
17680             }
17681              
17682 0 0         if (!filename) {
17683 0           fprintf(stderr,
17684             "Please provide filename\nFor help, type: %s -h\n", argv[0]);
17685             }
17686              
17687 0           return 0;
17688             }
17689             /*
17690             Copyright 2011 Google Inc. All Rights Reserved.
17691              
17692             Licensed under the Apache License, Version 2.0 (the "License");
17693             you may not use this file except in compliance with the License.
17694             You may obtain a copy of the License at
17695              
17696             http://www.apache.org/licenses/LICENSE-2.0
17697              
17698             Unless required by applicable law or agreed to in writing, software
17699             distributed under the License is distributed on an "AS IS" BASIS,
17700             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17701             See the License for the specific language governing permissions and
17702             limitations under the License.
17703              
17704             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
17705             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
17706             */
17707              
17708             /* zopfli.h */
17709             /*
17710             Copyright 2011 Google Inc. All Rights Reserved.
17711              
17712             Licensed under the Apache License, Version 2.0 (the "License");
17713             you may not use this file except in compliance with the License.
17714             You may obtain a copy of the License at
17715              
17716             http://www.apache.org/licenses/LICENSE-2.0
17717              
17718             Unless required by applicable law or agreed to in writing, software
17719             distributed under the License is distributed on an "AS IS" BASIS,
17720             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17721             See the License for the specific language governing permissions and
17722             limitations under the License.
17723              
17724             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
17725             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
17726             */
17727              
17728             #ifndef ZOPFLI_ZOPFLI_H_
17729             #define ZOPFLI_ZOPFLI_H_
17730              
17731             #include
17732             #include /* for size_t */
17733              
17734             #ifdef __cplusplus
17735             extern "C" {
17736             #endif
17737              
17738             /*
17739             Options used throughout the program.
17740             */
17741             typedef struct ZopfliOptions {
17742             /* Whether to print output */
17743             int verbose;
17744              
17745             /* Whether to print more detailed output */
17746             int verbose_more;
17747              
17748             /*
17749             Maximum amount of times to rerun forward and backward pass to optimize LZ77
17750             compression cost. Good values: 10, 15 for small files, 5 for files over
17751             several MB in size or it will be too slow.
17752             */
17753             int numiterations;
17754              
17755             /*
17756             If true, splits the data in multiple deflate blocks with optimal choice
17757             for the block boundaries. Block splitting gives better compression. Default:
17758             true (1).
17759             */
17760             int blocksplitting;
17761              
17762             /*
17763             No longer used, left for compatibility.
17764             */
17765             int blocksplittinglast;
17766              
17767             /*
17768             Maximum amount of blocks to split into (0 for unlimited, but this can give
17769             extreme results that hurt compression on some files). Default value: 15.
17770             */
17771             int blocksplittingmax;
17772             } ZopfliOptions;
17773              
17774             /* Initializes options with default values. */
17775             void ZopfliInitOptions(ZopfliOptions* options);
17776              
17777             /* Output format */
17778             typedef enum {
17779             ZOPFLI_FORMAT_GZIP,
17780             ZOPFLI_FORMAT_ZLIB,
17781             ZOPFLI_FORMAT_DEFLATE
17782             } ZopfliFormat;
17783              
17784             /*
17785             Compresses according to the given output format and appends the result to the
17786             output.
17787              
17788             options: global program options
17789             output_type: the output format to use
17790             out: pointer to the dynamic output array to which the result is appended. Must
17791             be freed after use
17792             outsize: pointer to the dynamic output array size
17793             */
17794             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
17795             const unsigned char* in, size_t insize,
17796             unsigned char** out, size_t* outsize);
17797              
17798             #ifdef __cplusplus
17799             } // extern "C"
17800             #endif
17801              
17802             #endif /* ZOPFLI_ZOPFLI_H_ */
17803              
17804              
17805             /* deflate.h */
17806             /*
17807             Copyright 2011 Google Inc. All Rights Reserved.
17808              
17809             Licensed under the Apache License, Version 2.0 (the "License");
17810             you may not use this file except in compliance with the License.
17811             You may obtain a copy of the License at
17812              
17813             http://www.apache.org/licenses/LICENSE-2.0
17814              
17815             Unless required by applicable law or agreed to in writing, software
17816             distributed under the License is distributed on an "AS IS" BASIS,
17817             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17818             See the License for the specific language governing permissions and
17819             limitations under the License.
17820              
17821             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
17822             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
17823             */
17824              
17825             #ifndef ZOPFLI_DEFLATE_H_
17826             #define ZOPFLI_DEFLATE_H_
17827              
17828             /*
17829             Functions to compress according to the DEFLATE specification, using the
17830             "squeeze" LZ77 compression backend.
17831             */
17832              
17833             /* lz77.h */
17834             /*
17835             Copyright 2011 Google Inc. All Rights Reserved.
17836              
17837             Licensed under the Apache License, Version 2.0 (the "License");
17838             you may not use this file except in compliance with the License.
17839             You may obtain a copy of the License at
17840              
17841             http://www.apache.org/licenses/LICENSE-2.0
17842              
17843             Unless required by applicable law or agreed to in writing, software
17844             distributed under the License is distributed on an "AS IS" BASIS,
17845             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17846             See the License for the specific language governing permissions and
17847             limitations under the License.
17848              
17849             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
17850             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
17851             */
17852              
17853             /*
17854             Functions for basic LZ77 compression and utilities for the "squeeze" LZ77
17855             compression.
17856             */
17857              
17858             #ifndef ZOPFLI_LZ77_H_
17859             #define ZOPFLI_LZ77_H_
17860              
17861             #include
17862              
17863             /* cache.h */
17864             /*
17865             Copyright 2011 Google Inc. All Rights Reserved.
17866              
17867             Licensed under the Apache License, Version 2.0 (the "License");
17868             you may not use this file except in compliance with the License.
17869             You may obtain a copy of the License at
17870              
17871             http://www.apache.org/licenses/LICENSE-2.0
17872              
17873             Unless required by applicable law or agreed to in writing, software
17874             distributed under the License is distributed on an "AS IS" BASIS,
17875             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17876             See the License for the specific language governing permissions and
17877             limitations under the License.
17878              
17879             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
17880             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
17881             */
17882              
17883             /*
17884             The cache that speeds up ZopfliFindLongestMatch of lz77.c.
17885             */
17886              
17887             #ifndef ZOPFLI_CACHE_H_
17888             #define ZOPFLI_CACHE_H_
17889              
17890             /* util.h */
17891             /*
17892             Copyright 2011 Google Inc. All Rights Reserved.
17893              
17894             Licensed under the Apache License, Version 2.0 (the "License");
17895             you may not use this file except in compliance with the License.
17896             You may obtain a copy of the License at
17897              
17898             http://www.apache.org/licenses/LICENSE-2.0
17899              
17900             Unless required by applicable law or agreed to in writing, software
17901             distributed under the License is distributed on an "AS IS" BASIS,
17902             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17903             See the License for the specific language governing permissions and
17904             limitations under the License.
17905              
17906             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
17907             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
17908             */
17909              
17910             /*
17911             Several utilities, including: #defines to try different compression results,
17912             basic deflate specification values and generic program options.
17913             */
17914              
17915             #ifndef ZOPFLI_UTIL_H_
17916             #define ZOPFLI_UTIL_H_
17917              
17918             #include
17919             #include
17920              
17921             /* Minimum and maximum length that can be encoded in deflate. */
17922             #define ZOPFLI_MAX_MATCH 258
17923             #define ZOPFLI_MIN_MATCH 3
17924              
17925             /* Number of distinct literal/length and distance symbols in DEFLATE */
17926             #define ZOPFLI_NUM_LL 288
17927             #define ZOPFLI_NUM_D 32
17928              
17929             /*
17930             The window size for deflate. Must be a power of two. This should be 32768, the
17931             maximum possible by the deflate spec. Anything less hurts compression more than
17932             speed.
17933             */
17934             #define ZOPFLI_WINDOW_SIZE 32768
17935              
17936             /*
17937             The window mask used to wrap indices into the window. This is why the
17938             window size must be a power of two.
17939             */
17940             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
17941              
17942             /*
17943             A block structure of huge, non-smart, blocks to divide the input into, to allow
17944             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
17945             The whole compression algorithm, including the smarter block splitting, will
17946             be executed independently on each huge block.
17947             Dividing into huge blocks hurts compression, but not much relative to the size.
17948             Set it to 0 to disable master blocks.
17949             */
17950             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
17951              
17952             /*
17953             Used to initialize costs for example
17954             */
17955             #define ZOPFLI_LARGE_FLOAT 1e30
17956              
17957             /*
17958             For longest match cache. max 256. Uses huge amounts of memory but makes it
17959             faster. Uses this many times three bytes per single byte of the input data.
17960             This is so because longest match finding has to find the exact distance
17961             that belongs to each length for the best lz77 strategy.
17962             Good values: e.g. 5, 8.
17963             */
17964             #define ZOPFLI_CACHE_LENGTH 8
17965              
17966             /*
17967             limit the max hash chain hits for this hash value. This has an effect only
17968             on files where the hash value is the same very often. On these files, this
17969             gives worse compression (the value should ideally be 32768, which is the
17970             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
17971             faster on some specific files.
17972             Good value: e.g. 8192.
17973             */
17974             #define ZOPFLI_MAX_CHAIN_HITS 8192
17975              
17976             /*
17977             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
17978             consumes a lot of memory but speeds it up. No effect on compression size.
17979             */
17980             #define ZOPFLI_LONGEST_MATCH_CACHE
17981              
17982             /*
17983             Enable to remember amount of successive identical bytes in the hash chain for
17984             finding longest match
17985             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
17986             This has no effect on the compression result, and enabling it increases speed.
17987             */
17988             #define ZOPFLI_HASH_SAME
17989              
17990             /*
17991             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
17992             best length so far is long enough. This is way faster for files with lots of
17993             identical bytes, on which the compressor is otherwise too slow. Regular files
17994             are unaffected or maybe a tiny bit slower.
17995             This has no effect on the compression result, only on speed.
17996             */
17997             #define ZOPFLI_HASH_SAME_HASH
17998              
17999             /*
18000             Enable this, to avoid slowness for files which are a repetition of the same
18001             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
18002             the compression result.
18003             */
18004             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
18005              
18006             /*
18007             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
18008             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
18009             varies from file to file.
18010             */
18011             #define ZOPFLI_LAZY_MATCHING
18012              
18013             /*
18014             Appends value to dynamically allocated memory, doubling its allocation size
18015             whenever needed.
18016              
18017             value: the value to append, type T
18018             data: pointer to the dynamic array to append to, type T**
18019             size: pointer to the size of the array to append to, type size_t*. This is the
18020             size that you consider the array to be, not the internal allocation size.
18021             Precondition: allocated size of data is at least a power of two greater than or
18022             equal than *size.
18023             */
18024             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
18025             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
18026             if (!((*size) & ((*size) - 1))) {\
18027             /*double alloc size if it's a power of two*/\
18028             void** data_void = reinterpret_cast(data);\
18029             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
18030             : realloc((*data), (*size) * 2 * sizeof(**data));\
18031             }\
18032             (*data)[(*size)] = (value);\
18033             (*size)++;\
18034             }
18035             #else /* C gives problems with strict-aliasing rules for (void**) cast */
18036             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
18037             if (!((*size) & ((*size) - 1))) {\
18038             /*double alloc size if it's a power of two*/\
18039             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
18040             : realloc((*data), (*size) * 2 * sizeof(**data));\
18041             }\
18042             (*data)[(*size)] = (value);\
18043             (*size)++;\
18044             }
18045             #endif
18046              
18047              
18048             #endif /* ZOPFLI_UTIL_H_ */
18049              
18050              
18051             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
18052              
18053             /*
18054             Cache used by ZopfliFindLongestMatch to remember previously found length/dist
18055             values.
18056             This is needed because the squeeze runs will ask these values multiple times for
18057             the same position.
18058             Uses large amounts of memory, since it has to remember the distance belonging
18059             to every possible shorter-than-the-best length (the so called "sublen" array).
18060             */
18061             typedef struct ZopfliLongestMatchCache {
18062             unsigned short* length;
18063             unsigned short* dist;
18064             unsigned char* sublen;
18065             } ZopfliLongestMatchCache;
18066              
18067             /* Initializes the ZopfliLongestMatchCache. */
18068             void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc);
18069              
18070             /* Frees up the memory of the ZopfliLongestMatchCache. */
18071             void ZopfliCleanCache(ZopfliLongestMatchCache* lmc);
18072              
18073             /* Stores sublen array in the cache. */
18074             void ZopfliSublenToCache(const unsigned short* sublen,
18075             size_t pos, size_t length,
18076             ZopfliLongestMatchCache* lmc);
18077              
18078             /* Extracts sublen array from the cache. */
18079             void ZopfliCacheToSublen(const ZopfliLongestMatchCache* lmc,
18080             size_t pos, size_t length,
18081             unsigned short* sublen);
18082             /* Returns the length up to which could be stored in the cache. */
18083             unsigned ZopfliMaxCachedSublen(const ZopfliLongestMatchCache* lmc,
18084             size_t pos, size_t length);
18085              
18086             #endif /* ZOPFLI_LONGEST_MATCH_CACHE */
18087              
18088             #endif /* ZOPFLI_CACHE_H_ */
18089              
18090             /* hash.h */
18091             /*
18092             Copyright 2011 Google Inc. All Rights Reserved.
18093              
18094             Licensed under the Apache License, Version 2.0 (the "License");
18095             you may not use this file except in compliance with the License.
18096             You may obtain a copy of the License at
18097              
18098             http://www.apache.org/licenses/LICENSE-2.0
18099              
18100             Unless required by applicable law or agreed to in writing, software
18101             distributed under the License is distributed on an "AS IS" BASIS,
18102             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18103             See the License for the specific language governing permissions and
18104             limitations under the License.
18105              
18106             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
18107             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
18108             */
18109              
18110             /*
18111             The hash for ZopfliFindLongestMatch of lz77.c.
18112             */
18113              
18114             #ifndef ZOPFLI_HASH_H_
18115             #define ZOPFLI_HASH_H_
18116              
18117             /* util.h */
18118             /*
18119             Copyright 2011 Google Inc. All Rights Reserved.
18120              
18121             Licensed under the Apache License, Version 2.0 (the "License");
18122             you may not use this file except in compliance with the License.
18123             You may obtain a copy of the License at
18124              
18125             http://www.apache.org/licenses/LICENSE-2.0
18126              
18127             Unless required by applicable law or agreed to in writing, software
18128             distributed under the License is distributed on an "AS IS" BASIS,
18129             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18130             See the License for the specific language governing permissions and
18131             limitations under the License.
18132              
18133             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
18134             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
18135             */
18136              
18137             /*
18138             Several utilities, including: #defines to try different compression results,
18139             basic deflate specification values and generic program options.
18140             */
18141              
18142             #ifndef ZOPFLI_UTIL_H_
18143             #define ZOPFLI_UTIL_H_
18144              
18145             #include
18146             #include
18147              
18148             /* Minimum and maximum length that can be encoded in deflate. */
18149             #define ZOPFLI_MAX_MATCH 258
18150             #define ZOPFLI_MIN_MATCH 3
18151              
18152             /* Number of distinct literal/length and distance symbols in DEFLATE */
18153             #define ZOPFLI_NUM_LL 288
18154             #define ZOPFLI_NUM_D 32
18155              
18156             /*
18157             The window size for deflate. Must be a power of two. This should be 32768, the
18158             maximum possible by the deflate spec. Anything less hurts compression more than
18159             speed.
18160             */
18161             #define ZOPFLI_WINDOW_SIZE 32768
18162              
18163             /*
18164             The window mask used to wrap indices into the window. This is why the
18165             window size must be a power of two.
18166             */
18167             #define ZOPFLI_WINDOW_MASK (ZOPFLI_WINDOW_SIZE - 1)
18168              
18169             /*
18170             A block structure of huge, non-smart, blocks to divide the input into, to allow
18171             operating on huge files without exceeding memory, such as the 1GB wiki9 corpus.
18172             The whole compression algorithm, including the smarter block splitting, will
18173             be executed independently on each huge block.
18174             Dividing into huge blocks hurts compression, but not much relative to the size.
18175             Set it to 0 to disable master blocks.
18176             */
18177             #define ZOPFLI_MASTER_BLOCK_SIZE 1000000
18178              
18179             /*
18180             Used to initialize costs for example
18181             */
18182             #define ZOPFLI_LARGE_FLOAT 1e30
18183              
18184             /*
18185             For longest match cache. max 256. Uses huge amounts of memory but makes it
18186             faster. Uses this many times three bytes per single byte of the input data.
18187             This is so because longest match finding has to find the exact distance
18188             that belongs to each length for the best lz77 strategy.
18189             Good values: e.g. 5, 8.
18190             */
18191             #define ZOPFLI_CACHE_LENGTH 8
18192              
18193             /*
18194             limit the max hash chain hits for this hash value. This has an effect only
18195             on files where the hash value is the same very often. On these files, this
18196             gives worse compression (the value should ideally be 32768, which is the
18197             ZOPFLI_WINDOW_SIZE, while zlib uses 4096 even for best level), but makes it
18198             faster on some specific files.
18199             Good value: e.g. 8192.
18200             */
18201             #define ZOPFLI_MAX_CHAIN_HITS 8192
18202              
18203             /*
18204             Whether to use the longest match cache for ZopfliFindLongestMatch. This cache
18205             consumes a lot of memory but speeds it up. No effect on compression size.
18206             */
18207             #define ZOPFLI_LONGEST_MATCH_CACHE
18208              
18209             /*
18210             Enable to remember amount of successive identical bytes in the hash chain for
18211             finding longest match
18212             required for ZOPFLI_HASH_SAME_HASH and ZOPFLI_SHORTCUT_LONG_REPETITIONS
18213             This has no effect on the compression result, and enabling it increases speed.
18214             */
18215             #define ZOPFLI_HASH_SAME
18216              
18217             /*
18218             Switch to a faster hash based on the info from ZOPFLI_HASH_SAME once the
18219             best length so far is long enough. This is way faster for files with lots of
18220             identical bytes, on which the compressor is otherwise too slow. Regular files
18221             are unaffected or maybe a tiny bit slower.
18222             This has no effect on the compression result, only on speed.
18223             */
18224             #define ZOPFLI_HASH_SAME_HASH
18225              
18226             /*
18227             Enable this, to avoid slowness for files which are a repetition of the same
18228             character more than a multiple of ZOPFLI_MAX_MATCH times. This should not affect
18229             the compression result.
18230             */
18231             #define ZOPFLI_SHORTCUT_LONG_REPETITIONS
18232              
18233             /*
18234             Whether to use lazy matching in the greedy LZ77 implementation. This gives a
18235             better result of ZopfliLZ77Greedy, but the effect this has on the optimal LZ77
18236             varies from file to file.
18237             */
18238             #define ZOPFLI_LAZY_MATCHING
18239              
18240             /*
18241             Appends value to dynamically allocated memory, doubling its allocation size
18242             whenever needed.
18243              
18244             value: the value to append, type T
18245             data: pointer to the dynamic array to append to, type T**
18246             size: pointer to the size of the array to append to, type size_t*. This is the
18247             size that you consider the array to be, not the internal allocation size.
18248             Precondition: allocated size of data is at least a power of two greater than or
18249             equal than *size.
18250             */
18251             #ifdef __cplusplus /* C++ cannot assign void* from malloc to *data */
18252             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
18253             if (!((*size) & ((*size) - 1))) {\
18254             /*double alloc size if it's a power of two*/\
18255             void** data_void = reinterpret_cast(data);\
18256             *data_void = (*size) == 0 ? malloc(sizeof(**data))\
18257             : realloc((*data), (*size) * 2 * sizeof(**data));\
18258             }\
18259             (*data)[(*size)] = (value);\
18260             (*size)++;\
18261             }
18262             #else /* C gives problems with strict-aliasing rules for (void**) cast */
18263             #define ZOPFLI_APPEND_DATA(/* T */ value, /* T** */ data, /* size_t* */ size) {\
18264             if (!((*size) & ((*size) - 1))) {\
18265             /*double alloc size if it's a power of two*/\
18266             (*data) = (*size) == 0 ? malloc(sizeof(**data))\
18267             : realloc((*data), (*size) * 2 * sizeof(**data));\
18268             }\
18269             (*data)[(*size)] = (value);\
18270             (*size)++;\
18271             }
18272             #endif
18273              
18274              
18275             #endif /* ZOPFLI_UTIL_H_ */
18276              
18277              
18278             typedef struct ZopfliHash {
18279             int* head; /* Hash value to index of its most recent occurrence. */
18280             unsigned short* prev; /* Index to index of prev. occurrence of same hash. */
18281             int* hashval; /* Index to hash value at this index. */
18282             int val; /* Current hash value. */
18283              
18284             #ifdef ZOPFLI_HASH_SAME_HASH
18285             /* Fields with similar purpose as the above hash, but for the second hash with
18286             a value that is calculated differently. */
18287             int* head2; /* Hash value to index of its most recent occurrence. */
18288             unsigned short* prev2; /* Index to index of prev. occurrence of same hash. */
18289             int* hashval2; /* Index to hash value at this index. */
18290             int val2; /* Current hash value. */
18291             #endif
18292              
18293             #ifdef ZOPFLI_HASH_SAME
18294             unsigned short* same; /* Amount of repetitions of same byte after this .*/
18295             #endif
18296             } ZopfliHash;
18297              
18298             /* Allocates ZopfliHash memory. */
18299             void ZopfliAllocHash(size_t window_size, ZopfliHash* h);
18300              
18301             /* Resets all fields of ZopfliHash. */
18302             void ZopfliResetHash(size_t window_size, ZopfliHash* h);
18303              
18304             /* Frees ZopfliHash memory. */
18305             void ZopfliCleanHash(ZopfliHash* h);
18306              
18307             /*
18308             Updates the hash values based on the current position in the array. All calls
18309             to this must be made for consecutive bytes.
18310             */
18311             void ZopfliUpdateHash(const unsigned char* array, size_t pos, size_t end,
18312             ZopfliHash* h);
18313              
18314             /*
18315             Prepopulates hash:
18316             Fills in the initial values in the hash, before ZopfliUpdateHash can be used
18317             correctly.
18318             */
18319             void ZopfliWarmupHash(const unsigned char* array, size_t pos, size_t end,
18320             ZopfliHash* h);
18321              
18322             #endif /* ZOPFLI_HASH_H_ */
18323              
18324             /* zopfli.h */
18325             /*
18326             Copyright 2011 Google Inc. All Rights Reserved.
18327              
18328             Licensed under the Apache License, Version 2.0 (the "License");
18329             you may not use this file except in compliance with the License.
18330             You may obtain a copy of the License at
18331              
18332             http://www.apache.org/licenses/LICENSE-2.0
18333              
18334             Unless required by applicable law or agreed to in writing, software
18335             distributed under the License is distributed on an "AS IS" BASIS,
18336             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18337             See the License for the specific language governing permissions and
18338             limitations under the License.
18339              
18340             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
18341             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
18342             */
18343              
18344             #ifndef ZOPFLI_ZOPFLI_H_
18345             #define ZOPFLI_ZOPFLI_H_
18346              
18347             #include
18348             #include /* for size_t */
18349              
18350             #ifdef __cplusplus
18351             extern "C" {
18352             #endif
18353              
18354             /*
18355             Options used throughout the program.
18356             */
18357             typedef struct ZopfliOptions {
18358             /* Whether to print output */
18359             int verbose;
18360              
18361             /* Whether to print more detailed output */
18362             int verbose_more;
18363              
18364             /*
18365             Maximum amount of times to rerun forward and backward pass to optimize LZ77
18366             compression cost. Good values: 10, 15 for small files, 5 for files over
18367             several MB in size or it will be too slow.
18368             */
18369             int numiterations;
18370              
18371             /*
18372             If true, splits the data in multiple deflate blocks with optimal choice
18373             for the block boundaries. Block splitting gives better compression. Default:
18374             true (1).
18375             */
18376             int blocksplitting;
18377              
18378             /*
18379             No longer used, left for compatibility.
18380             */
18381             int blocksplittinglast;
18382              
18383             /*
18384             Maximum amount of blocks to split into (0 for unlimited, but this can give
18385             extreme results that hurt compression on some files). Default value: 15.
18386             */
18387             int blocksplittingmax;
18388             } ZopfliOptions;
18389              
18390             /* Initializes options with default values. */
18391             void ZopfliInitOptions(ZopfliOptions* options);
18392              
18393             /* Output format */
18394             typedef enum {
18395             ZOPFLI_FORMAT_GZIP,
18396             ZOPFLI_FORMAT_ZLIB,
18397             ZOPFLI_FORMAT_DEFLATE
18398             } ZopfliFormat;
18399              
18400             /*
18401             Compresses according to the given output format and appends the result to the
18402             output.
18403              
18404             options: global program options
18405             output_type: the output format to use
18406             out: pointer to the dynamic output array to which the result is appended. Must
18407             be freed after use
18408             outsize: pointer to the dynamic output array size
18409             */
18410             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
18411             const unsigned char* in, size_t insize,
18412             unsigned char** out, size_t* outsize);
18413              
18414             #ifdef __cplusplus
18415             } // extern "C"
18416             #endif
18417              
18418             #endif /* ZOPFLI_ZOPFLI_H_ */
18419              
18420              
18421             /*
18422             Stores lit/length and dist pairs for LZ77.
18423             Parameter litlens: Contains the literal symbols or length values.
18424             Parameter dists: Contains the distances. A value is 0 to indicate that there is
18425             no dist and the corresponding litlens value is a literal instead of a length.
18426             Parameter size: The size of both the litlens and dists arrays.
18427             The memory can best be managed by using ZopfliInitLZ77Store to initialize it,
18428             ZopfliCleanLZ77Store to destroy it, and ZopfliStoreLitLenDist to append values.
18429              
18430             */
18431             typedef struct ZopfliLZ77Store {
18432             unsigned short* litlens; /* Lit or len. */
18433             unsigned short* dists; /* If 0: indicates literal in corresponding litlens,
18434             if > 0: length in corresponding litlens, this is the distance. */
18435             size_t size;
18436              
18437             const unsigned char* data; /* original data */
18438             size_t* pos; /* position in data where this LZ77 command begins */
18439              
18440             unsigned short* ll_symbol;
18441             unsigned short* d_symbol;
18442              
18443             /* Cumulative histograms wrapping around per chunk. Each chunk has the amount
18444             of distinct symbols as length, so using 1 value per LZ77 symbol, we have a
18445             precise histogram at every N symbols, and the rest can be calculated by
18446             looping through the actual symbols of this chunk. */
18447             size_t* ll_counts;
18448             size_t* d_counts;
18449             } ZopfliLZ77Store;
18450              
18451             void ZopfliInitLZ77Store(const unsigned char* data, ZopfliLZ77Store* store);
18452             void ZopfliCleanLZ77Store(ZopfliLZ77Store* store);
18453             void ZopfliCopyLZ77Store(const ZopfliLZ77Store* source, ZopfliLZ77Store* dest);
18454             void ZopfliStoreLitLenDist(unsigned short length, unsigned short dist,
18455             size_t pos, ZopfliLZ77Store* store);
18456             void ZopfliAppendLZ77Store(const ZopfliLZ77Store* store,
18457             ZopfliLZ77Store* target);
18458             /* Gets the amount of raw bytes that this range of LZ77 symbols spans. */
18459             size_t ZopfliLZ77GetByteRange(const ZopfliLZ77Store* lz77,
18460             size_t lstart, size_t lend);
18461             /* Gets the histogram of lit/len and dist symbols in the given range, using the
18462             cumulative histograms, so faster than adding one by one for large range. Does
18463             not add the one end symbol of value 256. */
18464             void ZopfliLZ77GetHistogram(const ZopfliLZ77Store* lz77,
18465             size_t lstart, size_t lend,
18466             size_t* ll_counts, size_t* d_counts);
18467              
18468             /*
18469             Some state information for compressing a block.
18470             This is currently a bit under-used (with mainly only the longest match cache),
18471             but is kept for easy future expansion.
18472             */
18473             typedef struct ZopfliBlockState {
18474             const ZopfliOptions* options;
18475              
18476             #ifdef ZOPFLI_LONGEST_MATCH_CACHE
18477             /* Cache for length/distance pairs found so far. */
18478             ZopfliLongestMatchCache* lmc;
18479             #endif
18480              
18481             /* The start (inclusive) and end (not inclusive) of the current block. */
18482             size_t blockstart;
18483             size_t blockend;
18484             } ZopfliBlockState;
18485              
18486             void ZopfliInitBlockState(const ZopfliOptions* options,
18487             size_t blockstart, size_t blockend, int add_lmc,
18488             ZopfliBlockState* s);
18489             void ZopfliCleanBlockState(ZopfliBlockState* s);
18490              
18491             /*
18492             Finds the longest match (length and corresponding distance) for LZ77
18493             compression.
18494             Even when not using "sublen", it can be more efficient to provide an array,
18495             because only then the caching is used.
18496             array: the data
18497             pos: position in the data to find the match for
18498             size: size of the data
18499             limit: limit length to maximum this value (default should be 258). This allows
18500             finding a shorter dist for that length (= less extra bits). Must be
18501             in the range [ZOPFLI_MIN_MATCH, ZOPFLI_MAX_MATCH].
18502             sublen: output array of 259 elements, or null. Has, for each length, the
18503             smallest distance required to reach this length. Only 256 of its 259 values
18504             are used, the first 3 are ignored (the shortest length is 3. It is purely
18505             for convenience that the array is made 3 longer).
18506             */
18507             void ZopfliFindLongestMatch(
18508             ZopfliBlockState *s, const ZopfliHash* h, const unsigned char* array,
18509             size_t pos, size_t size, size_t limit,
18510             unsigned short* sublen, unsigned short* distance, unsigned short* length);
18511              
18512             /*
18513             Verifies if length and dist are indeed valid, only used for assertion.
18514             */
18515             void ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
18516             unsigned short dist, unsigned short length);
18517              
18518             /*
18519             Does LZ77 using an algorithm similar to gzip, with lazy matching, rather than
18520             with the slow but better "squeeze" implementation.
18521             The result is placed in the ZopfliLZ77Store.
18522             If instart is larger than 0, it uses values before instart as starting
18523             dictionary.
18524             */
18525             void ZopfliLZ77Greedy(ZopfliBlockState* s, const unsigned char* in,
18526             size_t instart, size_t inend,
18527             ZopfliLZ77Store* store, ZopfliHash* h);
18528              
18529             #endif /* ZOPFLI_LZ77_H_ */
18530              
18531             /* zopfli.h */
18532             /*
18533             Copyright 2011 Google Inc. All Rights Reserved.
18534              
18535             Licensed under the Apache License, Version 2.0 (the "License");
18536             you may not use this file except in compliance with the License.
18537             You may obtain a copy of the License at
18538              
18539             http://www.apache.org/licenses/LICENSE-2.0
18540              
18541             Unless required by applicable law or agreed to in writing, software
18542             distributed under the License is distributed on an "AS IS" BASIS,
18543             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18544             See the License for the specific language governing permissions and
18545             limitations under the License.
18546              
18547             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
18548             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
18549             */
18550              
18551             #ifndef ZOPFLI_ZOPFLI_H_
18552             #define ZOPFLI_ZOPFLI_H_
18553              
18554             #include
18555             #include /* for size_t */
18556              
18557             #ifdef __cplusplus
18558             extern "C" {
18559             #endif
18560              
18561             /*
18562             Options used throughout the program.
18563             */
18564             typedef struct ZopfliOptions {
18565             /* Whether to print output */
18566             int verbose;
18567              
18568             /* Whether to print more detailed output */
18569             int verbose_more;
18570              
18571             /*
18572             Maximum amount of times to rerun forward and backward pass to optimize LZ77
18573             compression cost. Good values: 10, 15 for small files, 5 for files over
18574             several MB in size or it will be too slow.
18575             */
18576             int numiterations;
18577              
18578             /*
18579             If true, splits the data in multiple deflate blocks with optimal choice
18580             for the block boundaries. Block splitting gives better compression. Default:
18581             true (1).
18582             */
18583             int blocksplitting;
18584              
18585             /*
18586             No longer used, left for compatibility.
18587             */
18588             int blocksplittinglast;
18589              
18590             /*
18591             Maximum amount of blocks to split into (0 for unlimited, but this can give
18592             extreme results that hurt compression on some files). Default value: 15.
18593             */
18594             int blocksplittingmax;
18595             } ZopfliOptions;
18596              
18597             /* Initializes options with default values. */
18598             void ZopfliInitOptions(ZopfliOptions* options);
18599              
18600             /* Output format */
18601             typedef enum {
18602             ZOPFLI_FORMAT_GZIP,
18603             ZOPFLI_FORMAT_ZLIB,
18604             ZOPFLI_FORMAT_DEFLATE
18605             } ZopfliFormat;
18606              
18607             /*
18608             Compresses according to the given output format and appends the result to the
18609             output.
18610              
18611             options: global program options
18612             output_type: the output format to use
18613             out: pointer to the dynamic output array to which the result is appended. Must
18614             be freed after use
18615             outsize: pointer to the dynamic output array size
18616             */
18617             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
18618             const unsigned char* in, size_t insize,
18619             unsigned char** out, size_t* outsize);
18620              
18621             #ifdef __cplusplus
18622             } // extern "C"
18623             #endif
18624              
18625             #endif /* ZOPFLI_ZOPFLI_H_ */
18626              
18627              
18628             #ifdef __cplusplus
18629             extern "C" {
18630             #endif
18631              
18632             /*
18633             Compresses according to the deflate specification and append the compressed
18634             result to the output.
18635             This function will usually output multiple deflate blocks. If final is 1, then
18636             the final bit will be set on the last block.
18637              
18638             options: global program options
18639             btype: the deflate block type. Use 2 for best compression.
18640             -0: non compressed blocks (00)
18641             -1: blocks with fixed tree (01)
18642             -2: blocks with dynamic tree (10)
18643             final: whether this is the last section of the input, sets the final bit to the
18644             last deflate block.
18645             in: the input bytes
18646             insize: number of input bytes
18647             bp: bit pointer for the output array. This must initially be 0, and for
18648             consecutive calls must be reused (it can have values from 0-7). This is
18649             because deflate appends blocks as bit-based data, rather than on byte
18650             boundaries.
18651             out: pointer to the dynamic output array to which the result is appended. Must
18652             be freed after use.
18653             outsize: pointer to the dynamic output array size.
18654             */
18655             void ZopfliDeflate(const ZopfliOptions* options, int btype, int final,
18656             const unsigned char* in, size_t insize,
18657             unsigned char* bp, unsigned char** out, size_t* outsize);
18658              
18659             /*
18660             Like ZopfliDeflate, but allows to specify start and end byte with instart and
18661             inend. Only that part is compressed, but earlier bytes are still used for the
18662             back window.
18663             */
18664             void ZopfliDeflatePart(const ZopfliOptions* options, int btype, int final,
18665             const unsigned char* in, size_t instart, size_t inend,
18666             unsigned char* bp, unsigned char** out,
18667             size_t* outsize);
18668              
18669             /*
18670             Calculates block size in bits.
18671             litlens: lz77 lit/lengths
18672             dists: ll77 distances
18673             lstart: start of block
18674             lend: end of block (not inclusive)
18675             */
18676             double ZopfliCalculateBlockSize(const ZopfliLZ77Store* lz77,
18677             size_t lstart, size_t lend, int btype);
18678              
18679             /*
18680             Calculates block size in bits, automatically using the best btype.
18681             */
18682             double ZopfliCalculateBlockSizeAutoType(const ZopfliLZ77Store* lz77,
18683             size_t lstart, size_t lend);
18684              
18685             #ifdef __cplusplus
18686             } // extern "C"
18687             #endif
18688              
18689             #endif /* ZOPFLI_DEFLATE_H_ */
18690              
18691             /* gzip_container.h */
18692             /*
18693             Copyright 2013 Google Inc. All Rights Reserved.
18694              
18695             Licensed under the Apache License, Version 2.0 (the "License");
18696             you may not use this file except in compliance with the License.
18697             You may obtain a copy of the License at
18698              
18699             http://www.apache.org/licenses/LICENSE-2.0
18700              
18701             Unless required by applicable law or agreed to in writing, software
18702             distributed under the License is distributed on an "AS IS" BASIS,
18703             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18704             See the License for the specific language governing permissions and
18705             limitations under the License.
18706              
18707             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
18708             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
18709             */
18710              
18711             #ifndef ZOPFLI_GZIP_H_
18712             #define ZOPFLI_GZIP_H_
18713              
18714             /*
18715             Functions to compress according to the Gzip specification.
18716             */
18717              
18718             /* zopfli.h */
18719             /*
18720             Copyright 2011 Google Inc. All Rights Reserved.
18721              
18722             Licensed under the Apache License, Version 2.0 (the "License");
18723             you may not use this file except in compliance with the License.
18724             You may obtain a copy of the License at
18725              
18726             http://www.apache.org/licenses/LICENSE-2.0
18727              
18728             Unless required by applicable law or agreed to in writing, software
18729             distributed under the License is distributed on an "AS IS" BASIS,
18730             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18731             See the License for the specific language governing permissions and
18732             limitations under the License.
18733              
18734             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
18735             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
18736             */
18737              
18738             #ifndef ZOPFLI_ZOPFLI_H_
18739             #define ZOPFLI_ZOPFLI_H_
18740              
18741             #include
18742             #include /* for size_t */
18743              
18744             #ifdef __cplusplus
18745             extern "C" {
18746             #endif
18747              
18748             /*
18749             Options used throughout the program.
18750             */
18751             typedef struct ZopfliOptions {
18752             /* Whether to print output */
18753             int verbose;
18754              
18755             /* Whether to print more detailed output */
18756             int verbose_more;
18757              
18758             /*
18759             Maximum amount of times to rerun forward and backward pass to optimize LZ77
18760             compression cost. Good values: 10, 15 for small files, 5 for files over
18761             several MB in size or it will be too slow.
18762             */
18763             int numiterations;
18764              
18765             /*
18766             If true, splits the data in multiple deflate blocks with optimal choice
18767             for the block boundaries. Block splitting gives better compression. Default:
18768             true (1).
18769             */
18770             int blocksplitting;
18771              
18772             /*
18773             No longer used, left for compatibility.
18774             */
18775             int blocksplittinglast;
18776              
18777             /*
18778             Maximum amount of blocks to split into (0 for unlimited, but this can give
18779             extreme results that hurt compression on some files). Default value: 15.
18780             */
18781             int blocksplittingmax;
18782             } ZopfliOptions;
18783              
18784             /* Initializes options with default values. */
18785             void ZopfliInitOptions(ZopfliOptions* options);
18786              
18787             /* Output format */
18788             typedef enum {
18789             ZOPFLI_FORMAT_GZIP,
18790             ZOPFLI_FORMAT_ZLIB,
18791             ZOPFLI_FORMAT_DEFLATE
18792             } ZopfliFormat;
18793              
18794             /*
18795             Compresses according to the given output format and appends the result to the
18796             output.
18797              
18798             options: global program options
18799             output_type: the output format to use
18800             out: pointer to the dynamic output array to which the result is appended. Must
18801             be freed after use
18802             outsize: pointer to the dynamic output array size
18803             */
18804             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
18805             const unsigned char* in, size_t insize,
18806             unsigned char** out, size_t* outsize);
18807              
18808             #ifdef __cplusplus
18809             } // extern "C"
18810             #endif
18811              
18812             #endif /* ZOPFLI_ZOPFLI_H_ */
18813              
18814              
18815             #ifdef __cplusplus
18816             extern "C" {
18817             #endif
18818              
18819             /*
18820             Compresses according to the gzip specification and append the compressed
18821             result to the output.
18822              
18823             options: global program options
18824             out: pointer to the dynamic output array to which the result is appended. Must
18825             be freed after use.
18826             outsize: pointer to the dynamic output array size.
18827             */
18828             void ZopfliGzipCompress(const ZopfliOptions* options,
18829             const unsigned char* in, size_t insize,
18830             unsigned char** out, size_t* outsize);
18831              
18832             #ifdef __cplusplus
18833             } // extern "C"
18834             #endif
18835              
18836             #endif /* ZOPFLI_GZIP_H_ */
18837              
18838             /* zlib_container.h */
18839             /*
18840             Copyright 2013 Google Inc. All Rights Reserved.
18841              
18842             Licensed under the Apache License, Version 2.0 (the "License");
18843             you may not use this file except in compliance with the License.
18844             You may obtain a copy of the License at
18845              
18846             http://www.apache.org/licenses/LICENSE-2.0
18847              
18848             Unless required by applicable law or agreed to in writing, software
18849             distributed under the License is distributed on an "AS IS" BASIS,
18850             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18851             See the License for the specific language governing permissions and
18852             limitations under the License.
18853              
18854             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
18855             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
18856             */
18857              
18858             #ifndef ZOPFLI_ZLIB_H_
18859             #define ZOPFLI_ZLIB_H_
18860              
18861             /*
18862             Functions to compress according to the Zlib specification.
18863             */
18864              
18865             /* zopfli.h */
18866             /*
18867             Copyright 2011 Google Inc. All Rights Reserved.
18868              
18869             Licensed under the Apache License, Version 2.0 (the "License");
18870             you may not use this file except in compliance with the License.
18871             You may obtain a copy of the License at
18872              
18873             http://www.apache.org/licenses/LICENSE-2.0
18874              
18875             Unless required by applicable law or agreed to in writing, software
18876             distributed under the License is distributed on an "AS IS" BASIS,
18877             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18878             See the License for the specific language governing permissions and
18879             limitations under the License.
18880              
18881             Author: lode.vandevenne@gmail.com (Lode Vandevenne)
18882             Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
18883             */
18884              
18885             #ifndef ZOPFLI_ZOPFLI_H_
18886             #define ZOPFLI_ZOPFLI_H_
18887              
18888             #include
18889             #include /* for size_t */
18890              
18891             #ifdef __cplusplus
18892             extern "C" {
18893             #endif
18894              
18895             /*
18896             Options used throughout the program.
18897             */
18898             typedef struct ZopfliOptions {
18899             /* Whether to print output */
18900             int verbose;
18901              
18902             /* Whether to print more detailed output */
18903             int verbose_more;
18904              
18905             /*
18906             Maximum amount of times to rerun forward and backward pass to optimize LZ77
18907             compression cost. Good values: 10, 15 for small files, 5 for files over
18908             several MB in size or it will be too slow.
18909             */
18910             int numiterations;
18911              
18912             /*
18913             If true, splits the data in multiple deflate blocks with optimal choice
18914             for the block boundaries. Block splitting gives better compression. Default:
18915             true (1).
18916             */
18917             int blocksplitting;
18918              
18919             /*
18920             No longer used, left for compatibility.
18921             */
18922             int blocksplittinglast;
18923              
18924             /*
18925             Maximum amount of blocks to split into (0 for unlimited, but this can give
18926             extreme results that hurt compression on some files). Default value: 15.
18927             */
18928             int blocksplittingmax;
18929             } ZopfliOptions;
18930              
18931             /* Initializes options with default values. */
18932             void ZopfliInitOptions(ZopfliOptions* options);
18933              
18934             /* Output format */
18935             typedef enum {
18936             ZOPFLI_FORMAT_GZIP,
18937             ZOPFLI_FORMAT_ZLIB,
18938             ZOPFLI_FORMAT_DEFLATE
18939             } ZopfliFormat;
18940              
18941             /*
18942             Compresses according to the given output format and appends the result to the
18943             output.
18944              
18945             options: global program options
18946             output_type: the output format to use
18947             out: pointer to the dynamic output array to which the result is appended. Must
18948             be freed after use
18949             outsize: pointer to the dynamic output array size
18950             */
18951             void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
18952             const unsigned char* in, size_t insize,
18953             unsigned char** out, size_t* outsize);
18954              
18955             #ifdef __cplusplus
18956             } // extern "C"
18957             #endif
18958              
18959             #endif /* ZOPFLI_ZOPFLI_H_ */
18960              
18961              
18962             #ifdef __cplusplus
18963             extern "C" {
18964             #endif
18965              
18966             /*
18967             Compresses according to the zlib specification and append the compressed
18968             result to the output.
18969              
18970             options: global program options
18971             out: pointer to the dynamic output array to which the result is appended. Must
18972             be freed after use.
18973             outsize: pointer to the dynamic output array size.
18974             */
18975             void ZopfliZlibCompress(const ZopfliOptions* options,
18976             const unsigned char* in, size_t insize,
18977             unsigned char** out, size_t* outsize);
18978              
18979             #ifdef __cplusplus
18980             } // extern "C"
18981             #endif
18982              
18983             #endif /* ZOPFLI_ZLIB_H_ */
18984              
18985              
18986             #include
18987              
18988 3           void ZopfliCompress(const ZopfliOptions* options, ZopfliFormat output_type,
18989             const unsigned char* in, size_t insize,
18990             unsigned char** out, size_t* outsize) {
18991 3 50         if (output_type == ZOPFLI_FORMAT_GZIP) {
18992 3           ZopfliGzipCompress(options, in, insize, out, outsize);
18993 0 0         } else if (output_type == ZOPFLI_FORMAT_ZLIB) {
18994 0           ZopfliZlibCompress(options, in, insize, out, outsize);
18995 0 0         } else if (output_type == ZOPFLI_FORMAT_DEFLATE) {
18996 0           unsigned char bp = 0;
18997 0           ZopfliDeflate(options, 2 /* Dynamic block */, 1,
18998             in, insize, &bp, out, outsize);
18999             } else {
19000             assert(0);
19001             }
19002 3           }