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