1
//========================================================================
3
// JArithmeticDecoder.cc
5
// Copyright 2002-2004 Glyph & Cog, LLC
7
//========================================================================
11
#ifdef USE_GCC_PRAGMAS
12
#pragma implementation
17
#include "JArithmeticDecoder.h"
19
//------------------------------------------------------------------------
20
// JArithmeticDecoderStates
21
//------------------------------------------------------------------------
23
JArithmeticDecoderStats::JArithmeticDecoderStats(int contextSizeA) {
24
contextSize = contextSizeA;
25
cxTab = (Guchar *)gmallocn(contextSize, sizeof(Guchar));
29
JArithmeticDecoderStats::~JArithmeticDecoderStats() {
33
JArithmeticDecoderStats *JArithmeticDecoderStats::copy() {
34
JArithmeticDecoderStats *stats;
36
stats = new JArithmeticDecoderStats(contextSize);
37
memcpy(stats->cxTab, cxTab, contextSize);
41
void JArithmeticDecoderStats::reset() {
42
memset(cxTab, 0, contextSize);
45
void JArithmeticDecoderStats::copyFrom(JArithmeticDecoderStats *stats) {
46
memcpy(cxTab, stats->cxTab, contextSize);
49
void JArithmeticDecoderStats::setEntry(Guint cx, int i, int mps) {
50
cxTab[cx] = (i << 1) + mps;
53
//------------------------------------------------------------------------
55
//------------------------------------------------------------------------
57
Guint JArithmeticDecoder::qeTab[47] = {
58
0x56010000, 0x34010000, 0x18010000, 0x0AC10000,
59
0x05210000, 0x02210000, 0x56010000, 0x54010000,
60
0x48010000, 0x38010000, 0x30010000, 0x24010000,
61
0x1C010000, 0x16010000, 0x56010000, 0x54010000,
62
0x51010000, 0x48010000, 0x38010000, 0x34010000,
63
0x30010000, 0x28010000, 0x24010000, 0x22010000,
64
0x1C010000, 0x18010000, 0x16010000, 0x14010000,
65
0x12010000, 0x11010000, 0x0AC10000, 0x09C10000,
66
0x08A10000, 0x05210000, 0x04410000, 0x02A10000,
67
0x02210000, 0x01410000, 0x01110000, 0x00850000,
68
0x00490000, 0x00250000, 0x00150000, 0x00090000,
69
0x00050000, 0x00010000, 0x56010000
72
int JArithmeticDecoder::nmpsTab[47] = {
73
1, 2, 3, 4, 5, 38, 7, 8, 9, 10, 11, 12, 13, 29, 15, 16,
74
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
75
33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 45, 46
78
int JArithmeticDecoder::nlpsTab[47] = {
79
1, 6, 9, 12, 29, 33, 6, 14, 14, 14, 17, 18, 20, 21, 14, 14,
80
15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
81
30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 46
84
int JArithmeticDecoder::switchTab[47] = {
85
1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,
86
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
87
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
90
JArithmeticDecoder::JArithmeticDecoder() {
96
inline Guint JArithmeticDecoder::readByte() {
103
return (Guint)str->getChar() & 0xff;
106
JArithmeticDecoder::~JArithmeticDecoder() {
110
void JArithmeticDecoder::start() {
115
c = (buf0 ^ 0xff) << 16;
122
void JArithmeticDecoder::restart(int dataLenA) {
125
oldDataLen = dataLen;
127
if (oldDataLen == -1) {
129
} else if (oldDataLen <= -2) {
135
void JArithmeticDecoder::cleanup() {
137
while (dataLen > 0) {
144
int JArithmeticDecoder::decodeBit(Guint context,
145
JArithmeticDecoderStats *stats) {
150
iCX = stats->cxTab[context] >> 1;
151
mpsCX = stats->cxTab[context] & 1;
155
if (a & 0x80000000) {
161
if (switchTab[iCX]) {
162
stats->cxTab[context] = (nlpsTab[iCX] << 1) | (1 - mpsCX);
164
stats->cxTab[context] = (nlpsTab[iCX] << 1) | mpsCX;
168
stats->cxTab[context] = (nmpsTab[iCX] << 1) | mpsCX;
178
} while (!(a & 0x80000000));
185
stats->cxTab[context] = (nmpsTab[iCX] << 1) | mpsCX;
188
if (switchTab[iCX]) {
189
stats->cxTab[context] = (nlpsTab[iCX] << 1) | (1 - mpsCX);
191
stats->cxTab[context] = (nlpsTab[iCX] << 1) | mpsCX;
203
} while (!(a & 0x80000000));
208
int JArithmeticDecoder::decodeByte(Guint context,
209
JArithmeticDecoderStats *stats) {
214
for (i = 0; i < 8; ++i) {
215
byte = (byte << 1) | decodeBit(context, stats);
220
GBool JArithmeticDecoder::decodeInt(int *x, JArithmeticDecoderStats *stats) {
226
s = decodeIntBit(stats);
227
if (decodeIntBit(stats)) {
228
if (decodeIntBit(stats)) {
229
if (decodeIntBit(stats)) {
230
if (decodeIntBit(stats)) {
231
if (decodeIntBit(stats)) {
233
for (i = 0; i < 32; ++i) {
234
v = (v << 1) | decodeIntBit(stats);
239
for (i = 0; i < 12; ++i) {
240
v = (v << 1) | decodeIntBit(stats);
246
for (i = 0; i < 8; ++i) {
247
v = (v << 1) | decodeIntBit(stats);
253
for (i = 0; i < 6; ++i) {
254
v = (v << 1) | decodeIntBit(stats);
259
v = decodeIntBit(stats);
260
v = (v << 1) | decodeIntBit(stats);
261
v = (v << 1) | decodeIntBit(stats);
262
v = (v << 1) | decodeIntBit(stats);
266
v = decodeIntBit(stats);
267
v = (v << 1) | decodeIntBit(stats);
281
int JArithmeticDecoder::decodeIntBit(JArithmeticDecoderStats *stats) {
284
bit = decodeBit(prev, stats);
286
prev = (prev << 1) | bit;
288
prev = (((prev << 1) | bit) & 0x1ff) | 0x100;
293
Guint JArithmeticDecoder::decodeIAID(Guint codeLen,
294
JArithmeticDecoderStats *stats) {
299
for (i = 0; i < codeLen; ++i) {
300
bit = decodeBit(prev, stats);
301
prev = (prev << 1) | bit;
303
return prev - (1 << codeLen);
306
void JArithmeticDecoder::byteIn() {
313
c = c + 0xfe00 - (buf0 << 9);
319
c = c + 0xff00 - (buf0 << 8);