1/*
2Copyright 2011 Google Inc. All Rights Reserved.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8    http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15
16Author: lode.vandevenne@gmail.com (Lode Vandevenne)
17Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
18*/
19
20#include "deflate.h"
21
22#include <assert.h>
23#include <stdio.h>
24#include <stdlib.h>
25
26#include "blocksplitter.h"
27#include "lz77.h"
28#include "squeeze.h"
29#include "tree.h"
30
31/*
32bp = bitpointer, always in range [0, 7].
33The outsize is number of necessary bytes to encode the bits.
34Given the value of bp and the amount of bytes, the amount of bits represented
35is not simply bytesize * 8 + bp because even representing one bit requires a
36whole byte. It is: (bp == 0) ? (bytesize * 8) : ((bytesize - 1) * 8 + bp)
37*/
38static void AddBit(int bit,
39                   unsigned char* bp, unsigned char** out, size_t* outsize) {
40  if (*bp == 0) ZOPFLI_APPEND_DATA(0, out, outsize);
41  (*out)[*outsize - 1] |= bit << *bp;
42  *bp = (*bp + 1) & 7;
43}
44
45static void AddBits(unsigned symbol, unsigned length,
46                    unsigned char* bp, unsigned char** out, size_t* outsize) {
47  /* TODO(lode): make more efficient (add more bits at once). */
48  unsigned i;
49  for (i = 0; i < length; i++) {
50    unsigned bit = (symbol >> i) & 1;
51    if (*bp == 0) ZOPFLI_APPEND_DATA(0, out, outsize);
52    (*out)[*outsize - 1] |= bit << *bp;
53    *bp = (*bp + 1) & 7;
54  }
55}
56
57/*
58Adds bits, like AddBits, but the order is inverted. The deflate specification
59uses both orders in one standard.
60*/
61static void AddHuffmanBits(unsigned symbol, unsigned length,
62                           unsigned char* bp, unsigned char** out,
63                           size_t* outsize) {
64  /* TODO(lode): make more efficient (add more bits at once). */
65  unsigned i;
66  for (i = 0; i < length; i++) {
67    unsigned bit = (symbol >> (length - i - 1)) & 1;
68    if (*bp == 0) ZOPFLI_APPEND_DATA(0, out, outsize);
69    (*out)[*outsize - 1] |= bit << *bp;
70    *bp = (*bp + 1) & 7;
71  }
72}
73
74/*
75Ensures there are at least 2 distance codes to support buggy decoders.
76Zlib 1.2.1 and below have a bug where it fails if there isn't at least 1
77distance code (with length > 0), even though it's valid according to the
78deflate spec to have 0 distance codes. On top of that, some mobile phones
79require at least two distance codes. To support these decoders too (but
80potentially at the cost of a few bytes), add dummy code lengths of 1.
81References to this bug can be found in the changelog of
82Zlib 1.2.2 and here: http://www.jonof.id.au/forum/index.php?topic=515.0.
83
84d_lengths: the 32 lengths of the distance codes.
85*/
86static void PatchDistanceCodesForBuggyDecoders(unsigned* d_lengths) {
87  int num_dist_codes = 0; /* Amount of non-zero distance codes */
88  int i;
89  for (i = 0; i < 30 /* Ignore the two unused codes from the spec */; i++) {
90    if (d_lengths[i]) num_dist_codes++;
91    if (num_dist_codes >= 2) return; /* Two or more codes is fine. */
92  }
93
94  if (num_dist_codes == 0) {
95    d_lengths[0] = d_lengths[1] = 1;
96  } else if (num_dist_codes == 1) {
97    d_lengths[d_lengths[0] ? 1 : 0] = 1;
98  }
99}
100
101/*
102Encodes the Huffman tree and returns how many bits its encoding takes. If out
103is a null pointer, only returns the size and runs faster.
104*/
105static size_t EncodeTree(const unsigned* ll_lengths,
106                         const unsigned* d_lengths,
107                         int use_16, int use_17, int use_18,
108                         unsigned char* bp,
109                         unsigned char** out, size_t* outsize) {
110  unsigned lld_total;  /* Total amount of literal, length, distance codes. */
111  /* Runlength encoded version of lengths of litlen and dist trees. */
112  unsigned* rle = 0;
113  unsigned* rle_bits = 0;  /* Extra bits for rle values 16, 17 and 18. */
114  size_t rle_size = 0;  /* Size of rle array. */
115  size_t rle_bits_size = 0;  /* Should have same value as rle_size. */
116  unsigned hlit = 29;  /* 286 - 257 */
117  unsigned hdist = 29;  /* 32 - 1, but gzip does not like hdist > 29.*/
118  unsigned hclen;
119  unsigned hlit2;
120  size_t i, j;
121  size_t clcounts[19];
122  unsigned clcl[19];  /* Code length code lengths. */
123  unsigned clsymbols[19];
124  /* The order in which code length code lengths are encoded as per deflate. */
125  static const unsigned order[19] = {
126    16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
127  };
128  int size_only = !out;
129  size_t result_size = 0;
130
131  for(i = 0; i < 19; i++) clcounts[i] = 0;
132
133  /* Trim zeros. */
134  while (hlit > 0 && ll_lengths[257 + hlit - 1] == 0) hlit--;
135  while (hdist > 0 && d_lengths[1 + hdist - 1] == 0) hdist--;
136  hlit2 = hlit + 257;
137
138  lld_total = hlit2 + hdist + 1;
139
140  for (i = 0; i < lld_total; i++) {
141    /* This is an encoding of a huffman tree, so now the length is a symbol */
142    unsigned char symbol = i < hlit2 ? ll_lengths[i] : d_lengths[i - hlit2];
143    unsigned count = 1;
144    if(use_16 || (symbol == 0 && (use_17 || use_18))) {
145      for (j = i + 1; j < lld_total && symbol ==
146          (j < hlit2 ? ll_lengths[j] : d_lengths[j - hlit2]); j++) {
147        count++;
148      }
149    }
150    i += count - 1;
151
152    /* Repetitions of zeroes */
153    if (symbol == 0 && count >= 3) {
154      if (use_18) {
155        while (count >= 11) {
156          unsigned count2 = count > 138 ? 138 : count;
157          if (!size_only) {
158            ZOPFLI_APPEND_DATA(18, &rle, &rle_size);
159            ZOPFLI_APPEND_DATA(count2 - 11, &rle_bits, &rle_bits_size);
160          }
161          clcounts[18]++;
162          count -= count2;
163        }
164      }
165      if (use_17) {
166        while (count >= 3) {
167          unsigned count2 = count > 10 ? 10 : count;
168          if (!size_only) {
169            ZOPFLI_APPEND_DATA(17, &rle, &rle_size);
170            ZOPFLI_APPEND_DATA(count2 - 3, &rle_bits, &rle_bits_size);
171          }
172          clcounts[17]++;
173          count -= count2;
174        }
175      }
176    }
177
178    /* Repetitions of any symbol */
179    if (use_16 && count >= 4) {
180      count--;  /* Since the first one is hardcoded. */
181      clcounts[symbol]++;
182      if (!size_only) {
183        ZOPFLI_APPEND_DATA(symbol, &rle, &rle_size);
184        ZOPFLI_APPEND_DATA(0, &rle_bits, &rle_bits_size);
185      }
186      while (count >= 3) {
187        unsigned count2 = count > 6 ? 6 : count;
188        if (!size_only) {
189          ZOPFLI_APPEND_DATA(16, &rle, &rle_size);
190          ZOPFLI_APPEND_DATA(count2 - 3, &rle_bits, &rle_bits_size);
191        }
192        clcounts[16]++;
193        count -= count2;
194      }
195    }
196
197    /* No or insufficient repetition */
198    clcounts[symbol] += count;
199    while (count > 0) {
200      if (!size_only) {
201        ZOPFLI_APPEND_DATA(symbol, &rle, &rle_size);
202        ZOPFLI_APPEND_DATA(0, &rle_bits, &rle_bits_size);
203      }
204      count--;
205    }
206  }
207
208  ZopfliCalculateBitLengths(clcounts, 19, 7, clcl);
209  if (!size_only) ZopfliLengthsToSymbols(clcl, 19, 7, clsymbols);
210
211  hclen = 15;
212  /* Trim zeros. */
213  while (hclen > 0 && clcounts[order[hclen + 4 - 1]] == 0) hclen--;
214
215  if (!size_only) {
216    AddBits(hlit, 5, bp, out, outsize);
217    AddBits(hdist, 5, bp, out, outsize);
218    AddBits(hclen, 4, bp, out, outsize);
219
220    for (i = 0; i < hclen + 4; i++) {
221      AddBits(clcl[order[i]], 3, bp, out, outsize);
222    }
223
224    for (i = 0; i < rle_size; i++) {
225      unsigned symbol = clsymbols[rle[i]];
226      AddHuffmanBits(symbol, clcl[rle[i]], bp, out, outsize);
227      /* Extra bits. */
228      if (rle[i] == 16) AddBits(rle_bits[i], 2, bp, out, outsize);
229      else if (rle[i] == 17) AddBits(rle_bits[i], 3, bp, out, outsize);
230      else if (rle[i] == 18) AddBits(rle_bits[i], 7, bp, out, outsize);
231    }
232  }
233
234  result_size += 14;  /* hlit, hdist, hclen bits */
235  result_size += (hclen + 4) * 3;  /* clcl bits */
236  for(i = 0; i < 19; i++) {
237    result_size += clcl[i] * clcounts[i];
238  }
239  /* Extra bits. */
240  result_size += clcounts[16] * 2;
241  result_size += clcounts[17] * 3;
242  result_size += clcounts[18] * 7;
243
244  /* Note: in case of "size_only" these are null pointers so no effect. */
245  free(rle);
246  free(rle_bits);
247
248  return result_size;
249}
250
251static void AddDynamicTree(const unsigned* ll_lengths,
252                           const unsigned* d_lengths,
253                           unsigned char* bp,
254                           unsigned char** out, size_t* outsize) {
255  int i;
256  int best = 0;
257  size_t bestsize = 0;
258
259  for(i = 0; i < 8; i++) {
260    size_t size = EncodeTree(ll_lengths, d_lengths,
261                             i & 1, i & 2, i & 4,
262                             0, 0, 0);
263    if (bestsize == 0 || size < bestsize) {
264      bestsize = size;
265      best = i;
266    }
267  }
268
269  EncodeTree(ll_lengths, d_lengths,
270             best & 1, best & 2, best & 4,
271             bp, out, outsize);
272}
273
274/*
275Gives the exact size of the tree, in bits, as it will be encoded in DEFLATE.
276*/
277static size_t CalculateTreeSize(const unsigned* ll_lengths,
278                                const unsigned* d_lengths) {
279  size_t result = 0;
280  int i;
281
282  for(i = 0; i < 8; i++) {
283    size_t size = EncodeTree(ll_lengths, d_lengths,
284                             i & 1, i & 2, i & 4,
285                             0, 0, 0);
286    if (result == 0 || size < result) result = size;
287  }
288
289  return result;
290}
291
292/*
293Adds all lit/len and dist codes from the lists as huffman symbols. Does not add
294end code 256. expected_data_size is the uncompressed block size, used for
295assert, but you can set it to 0 to not do the assertion.
296*/
297static void AddLZ77Data(const unsigned short* litlens,
298                        const unsigned short* dists,
299                        size_t lstart, size_t lend,
300                        size_t expected_data_size,
301                        const unsigned* ll_symbols, const unsigned* ll_lengths,
302                        const unsigned* d_symbols, const unsigned* d_lengths,
303                        unsigned char* bp,
304                        unsigned char** out, size_t* outsize) {
305  size_t testlength = 0;
306  size_t i;
307
308  for (i = lstart; i < lend; i++) {
309    unsigned dist = dists[i];
310    unsigned litlen = litlens[i];
311    if (dist == 0) {
312      assert(litlen < 256);
313      assert(ll_lengths[litlen] > 0);
314      AddHuffmanBits(ll_symbols[litlen], ll_lengths[litlen], bp, out, outsize);
315      testlength++;
316    } else {
317      unsigned lls = ZopfliGetLengthSymbol(litlen);
318      unsigned ds = ZopfliGetDistSymbol(dist);
319      assert(litlen >= 3 && litlen <= 288);
320      assert(ll_lengths[lls] > 0);
321      assert(d_lengths[ds] > 0);
322      AddHuffmanBits(ll_symbols[lls], ll_lengths[lls], bp, out, outsize);
323      AddBits(ZopfliGetLengthExtraBitsValue(litlen),
324              ZopfliGetLengthExtraBits(litlen),
325              bp, out, outsize);
326      AddHuffmanBits(d_symbols[ds], d_lengths[ds], bp, out, outsize);
327      AddBits(ZopfliGetDistExtraBitsValue(dist),
328              ZopfliGetDistExtraBits(dist),
329              bp, out, outsize);
330      testlength += litlen;
331    }
332  }
333  assert(expected_data_size == 0 || testlength == expected_data_size);
334}
335
336static void GetFixedTree(unsigned* ll_lengths, unsigned* d_lengths) {
337  size_t i;
338  for (i = 0; i < 144; i++) ll_lengths[i] = 8;
339  for (i = 144; i < 256; i++) ll_lengths[i] = 9;
340  for (i = 256; i < 280; i++) ll_lengths[i] = 7;
341  for (i = 280; i < 288; i++) ll_lengths[i] = 8;
342  for (i = 0; i < 32; i++) d_lengths[i] = 5;
343}
344
345/*
346Calculates size of the part after the header and tree of an LZ77 block, in bits.
347*/
348static size_t CalculateBlockSymbolSize(const unsigned* ll_lengths,
349                                       const unsigned* d_lengths,
350                                       const unsigned short* litlens,
351                                       const unsigned short* dists,
352                                       size_t lstart, size_t lend) {
353  size_t result = 0;
354  size_t i;
355  for (i = lstart; i < lend; i++) {
356    if (dists[i] == 0) {
357      result += ll_lengths[litlens[i]];
358    } else {
359      result += ll_lengths[ZopfliGetLengthSymbol(litlens[i])];
360      result += d_lengths[ZopfliGetDistSymbol(dists[i])];
361      result += ZopfliGetLengthExtraBits(litlens[i]);
362      result += ZopfliGetDistExtraBits(dists[i]);
363    }
364  }
365  result += ll_lengths[256]; /*end symbol*/
366  return result;
367}
368
369static size_t AbsDiff(size_t x, size_t y) {
370  if (x > y)
371    return x - y;
372  else
373    return y - x;
374}
375
376/*
377Change the population counts in a way that the consequent Hufmann tree
378compression, especially its rle-part will be more likely to compress this data
379more efficiently. length containts the size of the histogram.
380*/
381void OptimizeHuffmanForRle(int length, size_t* counts) {
382  int i, k, stride;
383  size_t symbol, sum, limit;
384  int* good_for_rle;
385
386  /* 1) We don't want to touch the trailing zeros. We may break the
387  rules of the format by adding more data in the distance codes. */
388  for (; length >= 0; --length) {
389    if (length == 0) {
390      return;
391    }
392    if (counts[length - 1] != 0) {
393      /* Now counts[0..length - 1] does not have trailing zeros. */
394      break;
395    }
396  }
397  /* 2) Let's mark all population counts that already can be encoded
398  with an rle code.*/
399  good_for_rle = (int*)malloc(length * sizeof(int));
400  for (i = 0; i < length; ++i) good_for_rle[i] = 0;
401
402  /* Let's not spoil any of the existing good rle codes.
403  Mark any seq of 0's that is longer than 5 as a good_for_rle.
404  Mark any seq of non-0's that is longer than 7 as a good_for_rle.*/
405  symbol = counts[0];
406  stride = 0;
407  for (i = 0; i < length + 1; ++i) {
408    if (i == length || counts[i] != symbol) {
409      if ((symbol == 0 && stride >= 5) || (symbol != 0 && stride >= 7)) {
410        for (k = 0; k < stride; ++k) {
411          good_for_rle[i - k - 1] = 1;
412        }
413      }
414      stride = 1;
415      if (i != length) {
416        symbol = counts[i];
417      }
418    } else {
419      ++stride;
420    }
421  }
422
423  /* 3) Let's replace those population counts that lead to more rle codes. */
424  stride = 0;
425  limit = counts[0];
426  sum = 0;
427  for (i = 0; i < length + 1; ++i) {
428    if (i == length || good_for_rle[i]
429        /* Heuristic for selecting the stride ranges to collapse. */
430        || AbsDiff(counts[i], limit) >= 4) {
431      if (stride >= 4 || (stride >= 3 && sum == 0)) {
432        /* The stride must end, collapse what we have, if we have enough (4). */
433        int count = (sum + stride / 2) / stride;
434        if (count < 1) count = 1;
435        if (sum == 0) {
436          /* Don't make an all zeros stride to be upgraded to ones. */
437          count = 0;
438        }
439        for (k = 0; k < stride; ++k) {
440          /* We don't want to change value at counts[i],
441          that is already belonging to the next stride. Thus - 1. */
442          counts[i - k - 1] = count;
443        }
444      }
445      stride = 0;
446      sum = 0;
447      if (i < length - 3) {
448        /* All interesting strides have a count of at least 4,
449        at least when non-zeros. */
450        limit = (counts[i] + counts[i + 1] +
451                 counts[i + 2] + counts[i + 3] + 2) / 4;
452      } else if (i < length) {
453        limit = counts[i];
454      } else {
455        limit = 0;
456      }
457    }
458    ++stride;
459    if (i != length) {
460      sum += counts[i];
461    }
462  }
463
464  free(good_for_rle);
465}
466
467/*
468Calculates the bit lengths for the symbols for dynamic blocks. Chooses bit
469lengths that give the smallest size of tree encoding + encoding of all the
470symbols to have smallest output size. This are not necessarily the ideal Huffman
471bit lengths.
472*/
473static void GetDynamicLengths(const unsigned short* litlens,
474                              const unsigned short* dists,
475                              size_t lstart, size_t lend,
476                              unsigned* ll_lengths, unsigned* d_lengths) {
477  size_t ll_counts[288];
478  size_t d_counts[32];
479
480  ZopfliLZ77Counts(litlens, dists, lstart, lend, ll_counts, d_counts);
481  OptimizeHuffmanForRle(288, ll_counts);
482  OptimizeHuffmanForRle(32, d_counts);
483  ZopfliCalculateBitLengths(ll_counts, 288, 15, ll_lengths);
484  ZopfliCalculateBitLengths(d_counts, 32, 15, d_lengths);
485  PatchDistanceCodesForBuggyDecoders(d_lengths);
486}
487
488double ZopfliCalculateBlockSize(const unsigned short* litlens,
489                                const unsigned short* dists,
490                                size_t lstart, size_t lend, int btype) {
491  unsigned ll_lengths[288];
492  unsigned d_lengths[32];
493
494  double result = 3; /* bfinal and btype bits */
495
496  assert(btype == 1 || btype == 2); /* This is not for uncompressed blocks. */
497
498  if(btype == 1) {
499    GetFixedTree(ll_lengths, d_lengths);
500  } else {
501    GetDynamicLengths(litlens, dists, lstart, lend, ll_lengths, d_lengths);
502    result += CalculateTreeSize(ll_lengths, d_lengths);
503  }
504
505  result += CalculateBlockSymbolSize(
506      ll_lengths, d_lengths, litlens, dists, lstart, lend);
507
508  return result;
509}
510
511/*
512Adds a deflate block with the given LZ77 data to the output.
513options: global program options
514btype: the block type, must be 1 or 2
515final: whether to set the "final" bit on this block, must be the last block
516litlens: literal/length array of the LZ77 data, in the same format as in
517    ZopfliLZ77Store.
518dists: distance array of the LZ77 data, in the same format as in
519    ZopfliLZ77Store.
520lstart: where to start in the LZ77 data
521lend: where to end in the LZ77 data (not inclusive)
522expected_data_size: the uncompressed block size, used for assert, but you can
523  set it to 0 to not do the assertion.
524bp: output bit pointer
525out: dynamic output array to append to
526outsize: dynamic output array size
527*/
528static void AddLZ77Block(const ZopfliOptions* options, int btype, int final,
529                         const unsigned short* litlens,
530                         const unsigned short* dists,
531                         size_t lstart, size_t lend,
532                         size_t expected_data_size,
533                         unsigned char* bp,
534                         unsigned char** out, size_t* outsize) {
535  unsigned ll_lengths[288];
536  unsigned d_lengths[32];
537  unsigned ll_symbols[288];
538  unsigned d_symbols[32];
539  size_t detect_block_size = *outsize;
540  size_t compressed_size;
541  size_t uncompressed_size = 0;
542  size_t i;
543
544  AddBit(final, bp, out, outsize);
545  AddBit(btype & 1, bp, out, outsize);
546  AddBit((btype & 2) >> 1, bp, out, outsize);
547
548  if (btype == 1) {
549    /* Fixed block. */
550    GetFixedTree(ll_lengths, d_lengths);
551  } else {
552    /* Dynamic block. */
553    unsigned detect_tree_size;
554    assert(btype == 2);
555
556    GetDynamicLengths(litlens, dists, lstart, lend, ll_lengths, d_lengths);
557
558    detect_tree_size = *outsize;
559    AddDynamicTree(ll_lengths, d_lengths, bp, out, outsize);
560    if (options->verbose) {
561      fprintf(stderr, "treesize: %d\n", (int)(*outsize - detect_tree_size));
562    }
563  }
564
565  ZopfliLengthsToSymbols(ll_lengths, 288, 15, ll_symbols);
566  ZopfliLengthsToSymbols(d_lengths, 32, 15, d_symbols);
567
568  detect_block_size = *outsize;
569  AddLZ77Data(litlens, dists, lstart, lend, expected_data_size,
570              ll_symbols, ll_lengths, d_symbols, d_lengths,
571              bp, out, outsize);
572  /* End symbol. */
573  AddHuffmanBits(ll_symbols[256], ll_lengths[256], bp, out, outsize);
574
575  for (i = lstart; i < lend; i++) {
576    uncompressed_size += dists[i] == 0 ? 1 : litlens[i];
577  }
578  compressed_size = *outsize - detect_block_size;
579  if (options->verbose) {
580    fprintf(stderr, "compressed block size: %d (%dk) (unc: %d)\n",
581           (int)compressed_size, (int)(compressed_size / 1024),
582           (int)(uncompressed_size));
583  }
584}
585
586static void DeflateDynamicBlock(const ZopfliOptions* options, int final,
587                                const unsigned char* in,
588                                size_t instart, size_t inend,
589                                unsigned char* bp,
590                                unsigned char** out, size_t* outsize) {
591  ZopfliBlockState s;
592  size_t blocksize = inend - instart;
593  ZopfliLZ77Store store;
594  int btype = 2;
595
596  ZopfliInitLZ77Store(&store);
597
598  s.options = options;
599  s.blockstart = instart;
600  s.blockend = inend;
601#ifdef ZOPFLI_LONGEST_MATCH_CACHE
602  s.lmc = (ZopfliLongestMatchCache*)malloc(sizeof(ZopfliLongestMatchCache));
603  ZopfliInitCache(blocksize, s.lmc);
604#endif
605
606  ZopfliLZ77Optimal(&s, in, instart, inend, &store);
607
608  /* For small block, encoding with fixed tree can be smaller. For large block,
609  don't bother doing this expensive test, dynamic tree will be better.*/
610  if (store.size < 1000) {
611    double dyncost, fixedcost;
612    ZopfliLZ77Store fixedstore;
613    ZopfliInitLZ77Store(&fixedstore);
614    ZopfliLZ77OptimalFixed(&s, in, instart, inend, &fixedstore);
615    dyncost = ZopfliCalculateBlockSize(store.litlens, store.dists,
616        0, store.size, 2);
617    fixedcost = ZopfliCalculateBlockSize(fixedstore.litlens, fixedstore.dists,
618        0, fixedstore.size, 1);
619    if (fixedcost < dyncost) {
620      btype = 1;
621      ZopfliCleanLZ77Store(&store);
622      store = fixedstore;
623    } else {
624      ZopfliCleanLZ77Store(&fixedstore);
625    }
626  }
627
628  AddLZ77Block(s.options, btype, final,
629               store.litlens, store.dists, 0, store.size,
630               blocksize, bp, out, outsize);
631
632#ifdef ZOPFLI_LONGEST_MATCH_CACHE
633  ZopfliCleanCache(s.lmc);
634  free(s.lmc);
635#endif
636  ZopfliCleanLZ77Store(&store);
637}
638
639static void DeflateFixedBlock(const ZopfliOptions* options, int final,
640                              const unsigned char* in,
641                              size_t instart, size_t inend,
642                              unsigned char* bp,
643                              unsigned char** out, size_t* outsize) {
644  ZopfliBlockState s;
645  size_t blocksize = inend - instart;
646  ZopfliLZ77Store store;
647
648  ZopfliInitLZ77Store(&store);
649
650  s.options = options;
651  s.blockstart = instart;
652  s.blockend = inend;
653#ifdef ZOPFLI_LONGEST_MATCH_CACHE
654  s.lmc = (ZopfliLongestMatchCache*)malloc(sizeof(ZopfliLongestMatchCache));
655  ZopfliInitCache(blocksize, s.lmc);
656#endif
657
658  ZopfliLZ77OptimalFixed(&s, in, instart, inend, &store);
659
660  AddLZ77Block(s.options, 1, final, store.litlens, store.dists, 0, store.size,
661               blocksize, bp, out, outsize);
662
663#ifdef ZOPFLI_LONGEST_MATCH_CACHE
664  ZopfliCleanCache(s.lmc);
665  free(s.lmc);
666#endif
667  ZopfliCleanLZ77Store(&store);
668}
669
670static void DeflateNonCompressedBlock(const ZopfliOptions* options, int final,
671                                      const unsigned char* in, size_t instart,
672                                      size_t inend,
673                                      unsigned char* bp,
674                                      unsigned char** out, size_t* outsize) {
675  size_t i;
676  size_t blocksize = inend - instart;
677  unsigned short nlen = ~blocksize;
678
679  (void)options;
680  assert(blocksize < 65536);  /* Non compressed blocks are max this size. */
681
682  AddBit(final, bp, out, outsize);
683  /* BTYPE 00 */
684  AddBit(0, bp, out, outsize);
685  AddBit(0, bp, out, outsize);
686
687  /* Any bits of input up to the next byte boundary are ignored. */
688  *bp = 0;
689
690  ZOPFLI_APPEND_DATA(blocksize % 256, out, outsize);
691  ZOPFLI_APPEND_DATA((blocksize / 256) % 256, out, outsize);
692  ZOPFLI_APPEND_DATA(nlen % 256, out, outsize);
693  ZOPFLI_APPEND_DATA((nlen / 256) % 256, out, outsize);
694
695  for (i = instart; i < inend; i++) {
696    ZOPFLI_APPEND_DATA(in[i], out, outsize);
697  }
698}
699
700static void DeflateBlock(const ZopfliOptions* options,
701                         int btype, int final,
702                         const unsigned char* in, size_t instart, size_t inend,
703                         unsigned char* bp,
704                         unsigned char** out, size_t* outsize) {
705  if (btype == 0) {
706    DeflateNonCompressedBlock(
707        options, final, in, instart, inend, bp, out, outsize);
708  } else if (btype == 1) {
709     DeflateFixedBlock(options, final, in, instart, inend, bp, out, outsize);
710  } else {
711    assert (btype == 2);
712    DeflateDynamicBlock(options, final, in, instart, inend, bp, out, outsize);
713  }
714}
715
716/*
717Does squeeze strategy where first block splitting is done, then each block is
718squeezed.
719Parameters: see description of the ZopfliDeflate function.
720*/
721static void DeflateSplittingFirst(const ZopfliOptions* options,
722                                  int btype, int final,
723                                  const unsigned char* in,
724                                  size_t instart, size_t inend,
725                                  unsigned char* bp,
726                                  unsigned char** out, size_t* outsize) {
727  size_t i;
728  size_t* splitpoints = 0;
729  size_t npoints = 0;
730  if (btype == 0) {
731    ZopfliBlockSplitSimple(in, instart, inend, 65535, &splitpoints, &npoints);
732  } else if (btype == 1) {
733    /* If all blocks are fixed tree, splitting into separate blocks only
734    increases the total size. Leave npoints at 0, this represents 1 block. */
735  } else {
736    ZopfliBlockSplit(options, in, instart, inend,
737                     options->blocksplittingmax, &splitpoints, &npoints);
738  }
739
740  for (i = 0; i <= npoints; i++) {
741    size_t start = i == 0 ? instart : splitpoints[i - 1];
742    size_t end = i == npoints ? inend : splitpoints[i];
743    DeflateBlock(options, btype, i == npoints && final, in, start, end,
744                 bp, out, outsize);
745  }
746
747  free(splitpoints);
748}
749
750/*
751Does squeeze strategy where first the best possible lz77 is done, and then based
752on that data, block splitting is done.
753Parameters: see description of the ZopfliDeflate function.
754*/
755static void DeflateSplittingLast(const ZopfliOptions* options,
756                                 int btype, int final,
757                                 const unsigned char* in,
758                                 size_t instart, size_t inend,
759                                 unsigned char* bp,
760                                 unsigned char** out, size_t* outsize) {
761  size_t i;
762  ZopfliBlockState s;
763  ZopfliLZ77Store store;
764  size_t* splitpoints = 0;
765  size_t npoints = 0;
766
767  if (btype == 0) {
768    /* This function only supports LZ77 compression. DeflateSplittingFirst
769       supports the special case of noncompressed data. Punt it to that one. */
770    DeflateSplittingFirst(options, btype, final,
771                          in, instart, inend,
772                          bp, out, outsize);
773  }
774  assert(btype == 1 || btype == 2);
775
776  ZopfliInitLZ77Store(&store);
777
778  s.options = options;
779  s.blockstart = instart;
780  s.blockend = inend;
781#ifdef ZOPFLI_LONGEST_MATCH_CACHE
782  s.lmc = (ZopfliLongestMatchCache*)malloc(sizeof(ZopfliLongestMatchCache));
783  ZopfliInitCache(inend - instart, s.lmc);
784#endif
785
786  if (btype == 2) {
787    ZopfliLZ77Optimal(&s, in, instart, inend, &store);
788  } else {
789    assert (btype == 1);
790    ZopfliLZ77OptimalFixed(&s, in, instart, inend, &store);
791  }
792
793  if (btype == 1) {
794    /* If all blocks are fixed tree, splitting into separate blocks only
795    increases the total size. Leave npoints at 0, this represents 1 block. */
796  } else {
797    ZopfliBlockSplitLZ77(options, store.litlens, store.dists, store.size,
798                         options->blocksplittingmax, &splitpoints, &npoints);
799  }
800
801  for (i = 0; i <= npoints; i++) {
802    size_t start = i == 0 ? 0 : splitpoints[i - 1];
803    size_t end = i == npoints ? store.size : splitpoints[i];
804    AddLZ77Block(options, btype, i == npoints && final,
805                 store.litlens, store.dists, start, end, 0,
806                 bp, out, outsize);
807  }
808
809#ifdef ZOPFLI_LONGEST_MATCH_CACHE
810  ZopfliCleanCache(s.lmc);
811  free(s.lmc);
812#endif
813
814  ZopfliCleanLZ77Store(&store);
815  free(splitpoints);
816}
817
818/*
819Deflate a part, to allow ZopfliDeflate() to use multiple master blocks if
820needed.
821It is possible to call this function multiple times in a row, shifting
822instart and inend to next bytes of the data. If instart is larger than 0, then
823previous bytes are used as the initial dictionary for LZ77.
824This function will usually output multiple deflate blocks. If final is 1, then
825the final bit will be set on the last block.
826*/
827void ZopfliDeflatePart(const ZopfliOptions* options, int btype, int final,
828                       const unsigned char* in, size_t instart, size_t inend,
829                       unsigned char* bp, unsigned char** out,
830                       size_t* outsize) {
831  if (options->blocksplitting) {
832    if (options->blocksplittinglast) {
833      DeflateSplittingLast(options, btype, final, in, instart, inend,
834                           bp, out, outsize);
835    } else {
836      DeflateSplittingFirst(options, btype, final, in, instart, inend,
837                            bp, out, outsize);
838    }
839  } else {
840    DeflateBlock(options, btype, final, in, instart, inend, bp, out, outsize);
841  }
842}
843
844void ZopfliDeflate(const ZopfliOptions* options, int btype, int final,
845                   const unsigned char* in, size_t insize,
846                   unsigned char* bp, unsigned char** out, size_t* outsize) {
847#if ZOPFLI_MASTER_BLOCK_SIZE == 0
848  ZopfliDeflatePart(options, btype, final, in, 0, insize, bp, out, outsize);
849#else
850  size_t i = 0;
851  while (i < insize) {
852    int masterfinal = (i + ZOPFLI_MASTER_BLOCK_SIZE >= insize);
853    int final2 = final && masterfinal;
854    size_t size = masterfinal ? insize - i : ZOPFLI_MASTER_BLOCK_SIZE;
855    ZopfliDeflatePart(options, btype, final2,
856                      in, i, i + size, bp, out, outsize);
857    i += size;
858  }
859#endif
860  if (options->verbose) {
861    fprintf(stderr,
862            "Original Size: %d, Deflate: %d, Compression: %f%% Removed\n",
863            (int)insize, (int)*outsize,
864            100.0 * (double)(insize - *outsize) / (double)insize);
865  }
866}
867