blob: 1e115848a3764121249f117ae8c3d5071a501d82 [file] [log] [blame]
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#include "JBig2_ArithIntDecoder.h"
CJBig2_ArithIntDecoder::CJBig2_ArithIntDecoder()
{
IAx = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), 512);
JBIG2_memset(IAx, 0, sizeof(JBig2ArithCtx) * 512);
}
CJBig2_ArithIntDecoder::~CJBig2_ArithIntDecoder()
{
m_pModule->JBig2_Free(IAx);
}
int CJBig2_ArithIntDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult)
{
int PREV, V;
int S, D;
int nNeedBits, nTemp, i;
PREV = 1;
S = pArithDecoder->DECODE(IAx + PREV);
PREV = (PREV << 1) | S;
D = pArithDecoder->DECODE(IAx + PREV);
PREV = (PREV << 1) | D;
if(D) {
D = pArithDecoder->DECODE(IAx + PREV);
PREV = (PREV << 1) | D;
if(D) {
D = pArithDecoder->DECODE(IAx + PREV);
PREV = (PREV << 1) | D;
if(D) {
D = pArithDecoder->DECODE(IAx + PREV);
PREV = (PREV << 1) | D;
if(D) {
D = pArithDecoder->DECODE(IAx + PREV);
PREV = (PREV << 1) | D;
if(D) {
nNeedBits = 32;
V = 4436;
} else {
nNeedBits = 12;
V = 340;
}
} else {
nNeedBits = 8;
V = 84;
}
} else {
nNeedBits = 6;
V = 20;
}
} else {
nNeedBits = 4;
V = 4;
}
} else {
nNeedBits = 2;
V = 0;
}
nTemp = 0;
for(i = 0; i < nNeedBits; i++) {
D = pArithDecoder->DECODE(IAx + PREV);
if(PREV < 256) {
PREV = (PREV << 1) | D;
} else {
PREV = (((PREV << 1) | D) & 511) | 256;
}
nTemp = (nTemp << 1) | D;
}
V += nTemp;
if(S == 1 && V > 0) {
V = -V;
}
*nResult = V;
if(S == 1 && V == 0) {
return JBIG2_OOB;
}
return 0;
}
CJBig2_ArithIaidDecoder::CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA)
{
SBSYMCODELEN = SBSYMCODELENA;
IAID = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), (1 << SBSYMCODELEN));
JBIG2_memset(IAID, 0, sizeof(JBig2ArithCtx) * (int)(1 << SBSYMCODELEN));
}
CJBig2_ArithIaidDecoder::~CJBig2_ArithIaidDecoder()
{
m_pModule->JBig2_Free(IAID);
}
int CJBig2_ArithIaidDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult)
{
int PREV;
int D;
int i;
PREV = 1;
for(i = 0; i < SBSYMCODELEN; i++) {
D = pArithDecoder->DECODE(IAID + PREV);
PREV = (PREV << 1) | D;
}
PREV = PREV - (1 << SBSYMCODELEN);
*nResult = PREV;
return 0;
}