130625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Copyright 2013 Google Inc. All Rights Reserved.
230625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka
330625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   Licensed under the Apache License, Version 2.0 (the "License");
430625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   you may not use this file except in compliance with the License.
530625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   You may obtain a copy of the License at
630625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka
730625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   http://www.apache.org/licenses/LICENSE-2.0
830625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka
930625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   Unless required by applicable law or agreed to in writing, software
1030625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   distributed under the License is distributed on an "AS IS" BASIS,
1130625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1230625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   See the License for the specific language governing permissions and
1330625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   limitations under the License.
1430625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka
1530625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   Lookup tables to map prefix codes to value ranges. This is used during
1630625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   decoding of the block lengths, literal insertion lengths and copy lengths.
1730625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka*/
1804163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka
1904163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka#ifndef BROTLI_DEC_PREFIX_H_
2004163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka#define BROTLI_DEC_PREFIX_H_
2104163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka
2230625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Represents the range of values belonging to a prefix code: */
2330625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* [offset, offset + 2^nbits) */
2404163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadkastruct PrefixCodeRange {
2504163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  int offset;
2604163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  int nbits;
2704163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka};
2804163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka
2904163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadkastatic const struct PrefixCodeRange kBlockLengthPrefixCode[] = {
3004163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  {   1,  2}, {    5,  2}, {  9,   2}, {  13,  2},
3104163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  {  17,  3}, {   25,  3}, {  33,  3}, {  41,  3},
3204163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  {  49,  4}, {   65,  4}, {  81,  4}, {  97,  4},
3304163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  { 113,  5}, {  145,  5}, { 177,  5}, { 209,  5},
3404163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  { 241,  6}, {  305,  6}, { 369,  7}, { 497,  8},
3504163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  { 753,  9}, { 1265, 10}, {2289, 11}, {4337, 12},
3604163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  {8433, 13}, {16625, 24}
3704163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka};
3804163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka
3904163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadkastatic const struct PrefixCodeRange kInsertLengthPrefixCode[] = {
4004163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  {   0,  0}, {   1,  0}, {  2,   0}, {    3,  0},
4104163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  {   4,  0}, {   5,  0}, {  6,   1}, {    8,  1},
4204163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  {  10,  2}, {  14,  2}, { 18,   3}, {   26,  3},
4304163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  {  34,  4}, {  50,  4}, { 66,   5}, {   98,  5},
4404163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  { 130,  6}, { 194,  7}, { 322,  8}, {  578,  9},
4504163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  {1090, 10}, {2114, 12}, {6210, 14}, {22594, 24},
4604163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka};
4704163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka
4804163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadkastatic const struct PrefixCodeRange kCopyLengthPrefixCode[] = {
4904163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  {  2, 0}, {   3,  0}, {   4,  0}, {   5,  0},
5004163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  {  6, 0}, {   7,  0}, {   8,  0}, {   9,  0},
5104163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  { 10, 1}, {  12,  1}, {  14,  2}, {  18,  2},
5204163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  { 22, 3}, {  30,  3}, {  38,  4}, {  54,  4},
5304163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  { 70, 5}, { 102,  5}, { 134,  6}, { 198,  7},
5404163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka  {326, 8}, { 582,  9}, {1094, 10}, {2118, 24},
5504163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka};
5604163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka
5704163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadkastatic const int kInsertRangeLut[9] = {
58437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  0, 0, 8, 8, 0, 16, 8, 16, 16,
5904163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka};
6004163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka
6104163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadkastatic const int kCopyRangeLut[9] = {
62437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  0, 8, 0, 8, 16, 0, 16, 8, 16,
6304163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka};
6404163a87d098f14e890c2a3fd240af7f09099711Zoltan Szabadka
6530625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka#endif  /* BROTLI_DEC_PREFIX_H_ */
66