7#include "core/fxcodec/jbig2/JBig2_HuffmanTable.h"
12#include "core/fxcodec/jbig2/JBig2_BitStream.h"
13#include "core/fxcodec/jbig2/JBig2_Context.h"
14#include "core/fxcrt/check.h"
15#include "core/fxcrt/compiler_specific.h"
16#include "core/fxcrt/fx_safe_types.h"
17#include "core/fxcrt/unowned_ptr_exclusion.h"
21struct JBig2TableLine {
33constexpr JBig2TableLine kTableLine1[] = {{1, 4, 0},
39constexpr JBig2TableLine kTableLine2[] = {{1, 0, 0}, {2, 0, 1}, {3, 0, 2},
40 {4, 3, 3}, {5, 6, 11}, {0, 32, -1},
41 {6, 32, 75}, {6, 0, 0}};
43constexpr JBig2TableLine kTableLine3[] = {
44 {8, 8, -256}, {1, 0, 0}, {2, 0, 1}, {3, 0, 2}, {4, 3, 3},
45 {5, 6, 11}, {8, 32, -257}, {7, 32, 75}, {6, 0, 0}};
47constexpr JBig2TableLine kTableLine4[] = {{1, 0, 1}, {2, 0, 2}, {3, 0, 3},
48 {4, 3, 4}, {5, 6, 12}, {0, 32, -1},
51constexpr JBig2TableLine kTableLine5[] = {{7, 8, -255}, {1, 0, 1}, {2, 0, 2},
52 {3, 0, 3}, {4, 3, 4}, {5, 6, 12},
53 {7, 32, -256}, {6, 32, 76}};
55constexpr JBig2TableLine kTableLine6[] = {
56 {5, 10, -2048}, {4, 9, -1024}, {4, 8, -512}, {4, 7, -256}, {5, 6, -128},
57 {5, 5, -64}, {4, 5, -32}, {2, 7, 0}, {3, 7, 128}, {3, 8, 256},
58 {4, 9, 512}, {4, 10, 1024}, {6, 32, -2049}, {6, 32, 2048}};
60constexpr JBig2TableLine kTableLine7[] = {
61 {4, 9, -1024}, {3, 8, -512}, {4, 7, -256}, {5, 6, -128}, {5, 5, -64},
62 {4, 5, -32}, {4, 5, 0}, {5, 5, 32}, {5, 6, 64}, {4, 7, 128},
63 {3, 8, 256}, {3, 9, 512}, {3, 10, 1024}, {5, 32, -1025}, {5, 32, 2048}};
65constexpr JBig2TableLine kTableLine8[] = {
66 {8, 3, -15}, {9, 1, -7}, {8, 1, -5}, {9, 0, -3}, {7, 0, -2},
67 {4, 0, -1}, {2, 1, 0}, {5, 0, 2}, {6, 0, 3}, {3, 4, 4},
68 {6, 1, 20}, {4, 4, 22}, {4, 5, 38}, {5, 6, 70}, {5, 7, 134},
69 {6, 7, 262}, {7, 8, 390}, {6, 10, 646}, {9, 32, -16}, {9, 32, 1670},
72constexpr JBig2TableLine kTableLine9[] = {
73 {8, 4, -31}, {9, 2, -15}, {8, 2, -11}, {9, 1, -7}, {7, 1, -5},
74 {4, 1, -3}, {3, 1, -1}, {3, 1, 1}, {5, 1, 3}, {6, 1, 5},
75 {3, 5, 7}, {6, 2, 39}, {4, 5, 43}, {4, 6, 75}, {5, 7, 139},
76 {5, 8, 267}, {6, 8, 523}, {7, 9, 779}, {6, 11, 1291}, {9, 32, -32},
77 {9, 32, 3339}, {2, 0, 0}};
79constexpr JBig2TableLine kTableLine10[] = {
80 {7, 4, -21}, {8, 0, -5}, {7, 0, -4}, {5, 0, -3}, {2, 2, -2},
81 {5, 0, 2}, {6, 0, 3}, {7, 0, 4}, {8, 0, 5}, {2, 6, 6},
82 {5, 5, 70}, {6, 5, 102}, {6, 6, 134}, {6, 7, 198}, {6, 8, 326},
83 {6, 9, 582}, {6, 10, 1094}, {7, 11, 2118}, {8, 32, -22}, {8, 32, 4166},
86constexpr JBig2TableLine kTableLine11[] = {
87 {1, 0, 1}, {2, 1, 2}, {4, 0, 4}, {4, 1, 5}, {5, 1, 7},
88 {5, 2, 9}, {6, 2, 13}, {7, 2, 17}, {7, 3, 21}, {7, 4, 29},
89 {7, 5, 45}, {7, 6, 77}, {0, 32, 0}, {7, 32, 141}};
91constexpr JBig2TableLine kTableLine12[] = {
92 {1, 0, 1}, {2, 0, 2}, {3, 1, 3}, {5, 0, 5}, {5, 1, 6},
93 {6, 1, 8}, {7, 0, 10}, {7, 1, 11}, {7, 2, 13}, {7, 3, 17},
94 {7, 4, 25}, {8, 5, 41}, {0, 32, 0}, {8, 32, 73}};
96constexpr JBig2TableLine kTableLine13[] = {
97 {1, 0, 1}, {3, 0, 2}, {4, 0, 3}, {5, 0, 4}, {4, 1, 5},
98 {3, 3, 7}, {6, 1, 15}, {6, 2, 17}, {6, 3, 21}, {6, 4, 29},
99 {6, 5, 45}, {7, 6, 77}, {0, 32, 0}, {7, 32, 141}};
101constexpr JBig2TableLine kTableLine14[] = {{3, 0, -2}, {3, 0, -1}, {1, 0, 0},
102 {3, 0, 1}, {3, 0, 2}, {0, 32, -3},
105constexpr JBig2TableLine kTableLine15[] = {
106 {7, 4, -24}, {6, 2, -8}, {5, 1, -4}, {4, 0, -2}, {3, 0, -1},
107 {1, 0, 0}, {3, 0, 1}, {4, 0, 2}, {5, 1, 3}, {6, 2, 5},
108 {7, 4, 9}, {7, 32, -25}, {7, 32, 25}};
110constexpr std::array<
const HuffmanTable, 16> kHuffmanTables = {{
112 {
false, kTableLine1,
std::size(kTableLine1)},
113 {
true, kTableLine2,
std::size(kTableLine2)},
114 {
true, kTableLine3,
std::size(kTableLine3)},
115 {
false, kTableLine4,
std::size(kTableLine4)},
116 {
false, kTableLine5,
std::size(kTableLine5)},
117 {
false, kTableLine6,
std::size(kTableLine6)},
118 {
false, kTableLine7,
std::size(kTableLine7)},
119 {
true, kTableLine8,
std::size(kTableLine8)},
120 {
true, kTableLine9,
std::size(kTableLine9)},
121 {
true, kTableLine10,
std::size(kTableLine10)},
122 {
false, kTableLine11,
std::size(kTableLine11)},
123 {
false, kTableLine12,
std::size(kTableLine12)},
124 {
false, kTableLine13,
std::size(kTableLine13)},
125 {
false, kTableLine14,
std::size(kTableLine14)},
126 {
false, kTableLine15,
std::size(kTableLine15)},
129static_assert(CJBig2_HuffmanTable::kNumHuffmanTables ==
130 std::size(kHuffmanTables),
131 "kNumHuffmanTables must be equal to the size of kHuffmanTables");
137 DCHECK(idx < kNumHuffmanTables);
138 const HuffmanTable& table = kHuffmanTables[idx];
140 NTEMP =
pdfium::checked_cast<uint32_t>(table.size);
141 m_bOK = ParseFromStandardTable(idx);
146 : HTOOB(
false), NTEMP(0) {
147 m_bOK = ParseFromCodedBuffer(pStream);
153 const JBig2TableLine* pTable = kHuffmanTables[idx].lines;
155 RANGELEN.resize(NTEMP);
156 RANGELOW.resize(NTEMP);
158 for (uint32_t i = 0; i < NTEMP; ++i) {
159 CODES[i].codelen = pTable[i].PREFLEN;
160 RANGELEN[i] = pTable[i].RANDELEN;
161 RANGELOW[i] = pTable[i].RANGELOW;
164 return CJBig2_Context::HuffmanAssignCode(CODES);
172 HTOOB = !!(cTemp & 0x01);
173 unsigned char HTPS = ((cTemp >> 1) & 0x07) + 1;
174 unsigned char HTRS = ((cTemp >> 4) & 0x07) + 1;
182 const int low =
static_cast<
int>(HTLOW);
183 const int high =
static_cast<
int>(HTHIGH);
187 ExtendBuffers(
false);
190 if ((pStream->readNBits(HTPS, &CODES[NTEMP].codelen) == -1) ||
191 (pStream->readNBits(HTRS, &RANGELEN[NTEMP]) == -1) ||
192 (
static_cast<size_t>(RANGELEN[NTEMP]) >= 8 *
sizeof(cur_low))) {
195 RANGELOW[NTEMP] = cur_low.ValueOrDie();
197 if (RANGELEN[NTEMP] >= 32)
200 cur_low += (1 << RANGELEN[NTEMP]);
201 if (!cur_low.IsValid())
204 }
while (cur_low.ValueOrDie() < high);
206 if (pStream->readNBits(HTPS, &CODES[NTEMP].codelen) == -1)
209 RANGELEN[NTEMP] = 32;
210 if (low ==
std::numeric_limits<
int>::min())
213 RANGELOW[NTEMP] = low - 1;
216 if (pStream->readNBits(HTPS, &CODES[NTEMP].codelen) == -1)
219 RANGELEN[NTEMP] = 32;
220 RANGELOW[NTEMP] = high;
224 if (pStream->readNBits(HTPS, &CODES[NTEMP].codelen) == -1)
230 return CJBig2_Context::HuffmanAssignCode(
231 pdfium::make_span(CODES).first(NTEMP));
238 size_t size = CODES.size();
245 RANGELEN.resize(size);
246 RANGELOW.resize(size);
int32_t readInteger(uint32_t *dwResult)
int32_t read1Byte(uint8_t *cResult)
CJBig2_HuffmanTable(size_t idx)
CJBig2_HuffmanTable(CJBig2_BitStream *pStream)
pdfium::CheckedNumeric< int32_t > FX_SAFE_INT32
#define UNOWNED_PTR_EXCLUSION