1b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne/*
2b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneCopyright 2011 Google Inc. All Rights Reserved.
3b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
4b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneLicensed under the Apache License, Version 2.0 (the "License");
5b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenneyou may not use this file except in compliance with the License.
6b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneYou may obtain a copy of the License at
7b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
8b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    http://www.apache.org/licenses/LICENSE-2.0
9b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
10b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneUnless required by applicable law or agreed to in writing, software
11b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennedistributed under the License is distributed on an "AS IS" BASIS,
12b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneSee the License for the specific language governing permissions and
14b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennelimitations under the License.
15b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
16b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneAuthor: lode.vandevenne@gmail.com (Lode Vandevenne)
17b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneAuthor: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
18b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne*/
19b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
20b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#include "util.h"
21b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
2225aeeecb0c8449ba6e87066373eaed5664b7b5ecLode Vandevenne#include "zopfli.h"
2325aeeecb0c8449ba6e87066373eaed5664b7b5ecLode Vandevenne
24b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#include <assert.h>
25b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#include <stdio.h>
26b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#include <stdlib.h>
27b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
28981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenneint ZopfliGetDistExtraBits(int dist) {
29b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#ifdef __GNUC__
30b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  if (dist < 5) return 0;
31b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  return (31 ^ __builtin_clz(dist - 1)) - 1; /* log2(dist - 1) - 1 */
32b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#else
33b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  if (dist < 5) return 0;
34b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 9) return 1;
35b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 17) return 2;
36b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 33) return 3;
37b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 65) return 4;
38b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 129) return 5;
39b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 257) return 6;
40b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 513) return 7;
41b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 1025) return 8;
42b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 2049) return 9;
43b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 4097) return 10;
44b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 8193) return 11;
45b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 16385) return 12;
46b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else return 13;
47b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#endif
48b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne}
49b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
50981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenneint ZopfliGetDistExtraBitsValue(int dist) {
51b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#ifdef __GNUC__
52b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  if (dist < 5) {
53b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    return 0;
54b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  } else {
55b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    int l = 31 ^ __builtin_clz(dist - 1); /* log2(dist - 1) */
56b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    return (dist - (1 + (1 << l))) & ((1 << (l - 1)) - 1);
57b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  }
58b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#else
59b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  if (dist < 5) return 0;
60b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 9) return (dist - 5) & 1;
61b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 17) return (dist - 9) & 3;
62b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 33) return (dist - 17) & 7;
63b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 65) return (dist - 33) & 15;
64b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 129) return (dist - 65) & 31;
65b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 257) return (dist - 129) & 63;
66b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 513) return (dist - 257) & 127;
67b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 1025) return (dist - 513) & 255;
68b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 2049) return (dist - 1025) & 511;
69b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 4097) return (dist - 2049) & 1023;
70b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 8193) return (dist - 4097) & 2047;
71b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else if (dist < 16385) return (dist - 8193) & 4095;
72b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  else return (dist - 16385) & 8191;
73b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#endif
74b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne}
75b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
76981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenneint ZopfliGetDistSymbol(int dist) {
77b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#ifdef __GNUC__
78b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  if (dist < 5) {
79b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    return dist - 1;
80b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  } else {
81b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    int l = (31 ^ __builtin_clz(dist - 1)); /* log2(dist - 1) */
82b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    int r = ((dist - 1) >> (l - 1)) & 1;
83b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    return l * 2 + r;
84b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  }
85b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#else
86b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  if (dist < 193) {
87b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    if (dist < 13) {  /* dist 0..13. */
88b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      if (dist < 5) return dist - 1;
89b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 7) return 4;
90b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 9) return 5;
91b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else return 6;
92b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    } else {  /* dist 13..193. */
93b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      if (dist < 17) return 7;
94b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 25) return 8;
95b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 33) return 9;
96b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 49) return 10;
97b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 65) return 11;
98b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 97) return 12;
99b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 129) return 13;
100b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else return 14;
101b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    }
102b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  } else {
103b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    if (dist < 2049) {  /* dist 193..2049. */
104b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      if (dist < 257) return 15;
105b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 385) return 16;
106b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 513) return 17;
107b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 769) return 18;
108b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 1025) return 19;
109b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 1537) return 20;
110b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else return 21;
111b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    } else {  /* dist 2049..32768. */
112b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      if (dist < 3073) return 22;
113b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 4097) return 23;
114b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 6145) return 24;
115b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 8193) return 25;
116b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 12289) return 26;
117b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 16385) return 27;
118b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else if (dist < 24577) return 28;
119b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      else return 29;
120b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    }
121b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  }
122b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#endif
123b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne}
124b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
125981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenneint ZopfliGetLengthExtraBits(int l) {
126b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  static const int table[259] = {
127b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
128b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
129b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
130b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
131b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
132b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
133b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
134b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
135b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
136b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
137b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
138b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
139b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
140b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
141b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
142b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0
143b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  };
144b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  return table[l];
145b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne}
146b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
147981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenneint ZopfliGetLengthExtraBitsValue(int l) {
148b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  static const int table[259] = {
149b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 0,
150b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    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,
151b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    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,
152b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
153b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2,
154b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
155b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
156b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
157b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6,
158b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
159b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
160b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 0
161b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  };
162b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  return table[l];
163b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne}
164b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
165b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne/*
166b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneReturns symbol in range [257-285] (inclusive).
167b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne*/
168981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenneint ZopfliGetLengthSymbol(int l) {
169b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  static const int table[259] = {
170b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    0, 0, 0, 257, 258, 259, 260, 261, 262, 263, 264,
171b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    265, 265, 266, 266, 267, 267, 268, 268,
172b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    269, 269, 269, 269, 270, 270, 270, 270,
173b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    271, 271, 271, 271, 272, 272, 272, 272,
174b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    273, 273, 273, 273, 273, 273, 273, 273,
175b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    274, 274, 274, 274, 274, 274, 274, 274,
176b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    275, 275, 275, 275, 275, 275, 275, 275,
177b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    276, 276, 276, 276, 276, 276, 276, 276,
178b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    277, 277, 277, 277, 277, 277, 277, 277,
179b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    277, 277, 277, 277, 277, 277, 277, 277,
180b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    278, 278, 278, 278, 278, 278, 278, 278,
181b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    278, 278, 278, 278, 278, 278, 278, 278,
182b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    279, 279, 279, 279, 279, 279, 279, 279,
183b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    279, 279, 279, 279, 279, 279, 279, 279,
184b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    280, 280, 280, 280, 280, 280, 280, 280,
185b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    280, 280, 280, 280, 280, 280, 280, 280,
186b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    281, 281, 281, 281, 281, 281, 281, 281,
187b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    281, 281, 281, 281, 281, 281, 281, 281,
188b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    281, 281, 281, 281, 281, 281, 281, 281,
189b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    281, 281, 281, 281, 281, 281, 281, 281,
190b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    282, 282, 282, 282, 282, 282, 282, 282,
191b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    282, 282, 282, 282, 282, 282, 282, 282,
192b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    282, 282, 282, 282, 282, 282, 282, 282,
193b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    282, 282, 282, 282, 282, 282, 282, 282,
194b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    283, 283, 283, 283, 283, 283, 283, 283,
195b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    283, 283, 283, 283, 283, 283, 283, 283,
196b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    283, 283, 283, 283, 283, 283, 283, 283,
197b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    283, 283, 283, 283, 283, 283, 283, 283,
198b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    284, 284, 284, 284, 284, 284, 284, 284,
199b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    284, 284, 284, 284, 284, 284, 284, 284,
200b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    284, 284, 284, 284, 284, 284, 284, 284,
201b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    284, 284, 284, 284, 284, 284, 284, 285
202b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  };
203b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  return table[l];
204b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne}
20525aeeecb0c8449ba6e87066373eaed5664b7b5ecLode Vandevenne
20625aeeecb0c8449ba6e87066373eaed5664b7b5ecLode Vandevennevoid ZopfliInitOptions(ZopfliOptions* options) {
20725aeeecb0c8449ba6e87066373eaed5664b7b5ecLode Vandevenne  options->verbose = 0;
208806be49c750347eb78f4d94bb21ad37aa9121f93Lode Vandevenne  options->verbose_more = 0;
20925aeeecb0c8449ba6e87066373eaed5664b7b5ecLode Vandevenne  options->numiterations = 15;
21025aeeecb0c8449ba6e87066373eaed5664b7b5ecLode Vandevenne  options->blocksplitting = 1;
21125aeeecb0c8449ba6e87066373eaed5664b7b5ecLode Vandevenne  options->blocksplittinglast = 0;
21225aeeecb0c8449ba6e87066373eaed5664b7b5ecLode Vandevenne  options->blocksplittingmax = 15;
21325aeeecb0c8449ba6e87066373eaed5664b7b5ecLode Vandevenne}
214