| Index: core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp
|
| diff --git a/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp b/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp
|
| index b194faf4ee7fb281c248d95f48f2b64e70d2e06f..49be94135564fbcec79efa0c792d6659bcaddf3a 100644
|
| --- a/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp
|
| +++ b/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp
|
| @@ -6,100 +6,92 @@
|
|
|
| #include "JBig2_ArithIntDecoder.h"
|
|
|
| -#include "../../../include/fxcrt/fx_memory.h"
|
| -#include "JBig2_Define.h"
|
| +#include "../../../include/fxcrt/fx_basic.h"
|
| +
|
| +namespace {
|
| +
|
| +int ShiftOr(int val, int bitwise_or_val) {
|
| + return (val << 1) | bitwise_or_val;
|
| +}
|
| +
|
| +const struct ArithIntDecodeData {
|
| + int nNeedBits;
|
| + int nValue;
|
| +} g_ArithIntDecodeData[] = {
|
| + {2, 0},
|
| + {4, 4},
|
| + {6, 20},
|
| + {8, 84},
|
| + {12, 340},
|
| + {32, 4436},
|
| +};
|
| +
|
| +size_t RecursiveDecode(CJBig2_ArithDecoder* decoder,
|
| + std::vector<JBig2ArithCtx>* context,
|
| + int* prev,
|
| + size_t depth) {
|
| + static const size_t kDepthEnd = FX_ArraySize(g_ArithIntDecodeData) - 1;
|
| + if (depth == kDepthEnd)
|
| + return kDepthEnd;
|
| +
|
| + JBig2ArithCtx* pCX = &(*context)[*prev];
|
| + int D = decoder->DECODE(pCX);
|
| + *prev = ShiftOr(*prev, D);
|
| + if (!D)
|
| + return depth;
|
| + return RecursiveDecode(decoder, context, prev, depth + 1);
|
| +}
|
| +
|
| +} // namespace
|
|
|
| CJBig2_ArithIntDecoder::CJBig2_ArithIntDecoder() {
|
| - IAx = FX_Alloc(JBig2ArithCtx, 512);
|
| - JBIG2_memset(IAx, 0, sizeof(JBig2ArithCtx) * 512);
|
| + m_IAx.resize(512);
|
| }
|
| +
|
| CJBig2_ArithIntDecoder::~CJBig2_ArithIntDecoder() {
|
| - FX_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;
|
| +
|
| +bool CJBig2_ArithIntDecoder::decode(CJBig2_ArithDecoder* pArithDecoder,
|
| + int* nResult) {
|
| + int PREV = 1;
|
| + const int S = pArithDecoder->DECODE(&m_IAx[PREV]);
|
| + PREV = ShiftOr(PREV, S);
|
| +
|
| + const size_t nDecodeDataIndex =
|
| + RecursiveDecode(pArithDecoder, &m_IAx, &PREV, 0);
|
| +
|
| + int nTemp = 0;
|
| + for (int i = 0; i < g_ArithIntDecodeData[nDecodeDataIndex].nNeedBits; ++i) {
|
| + int D = pArithDecoder->DECODE(&m_IAx[PREV]);
|
| + PREV = ShiftOr(PREV, D);
|
| + if (PREV >= 256)
|
| + PREV = (PREV & 511) | 256;
|
| + nTemp = ShiftOr(nTemp, D);
|
| }
|
| - return 0;
|
| + int nValue = g_ArithIntDecodeData[nDecodeDataIndex].nValue;
|
| + nValue += nTemp;
|
| + if (S == 1 && nValue > 0)
|
| + nValue = -nValue;
|
| +
|
| + *nResult = nValue;
|
| + return S != 1 || nValue != 0;
|
| }
|
| -CJBig2_ArithIaidDecoder::CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA) {
|
| - SBSYMCODELEN = SBSYMCODELENA;
|
| - IAID = FX_Alloc(JBig2ArithCtx, 1 << SBSYMCODELEN);
|
| - JBIG2_memset(IAID, 0, sizeof(JBig2ArithCtx) * (int)(1 << SBSYMCODELEN));
|
| +
|
| +CJBig2_ArithIaidDecoder::CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA)
|
| + : SBSYMCODELEN(SBSYMCODELENA) {
|
| + m_IAID.resize(1 << SBSYMCODELEN);
|
| }
|
| +
|
| CJBig2_ArithIaidDecoder::~CJBig2_ArithIaidDecoder() {
|
| - FX_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;
|
| +
|
| +void CJBig2_ArithIaidDecoder::decode(CJBig2_ArithDecoder* pArithDecoder,
|
| + FX_DWORD* nResult) {
|
| + int PREV = 1;
|
| + for (unsigned char i = 0; i < SBSYMCODELEN; ++i) {
|
| + JBig2ArithCtx* pCX = &m_IAID[PREV];
|
| + int D = pArithDecoder->DECODE(pCX);
|
| + PREV = ShiftOr(PREV, D);
|
| }
|
| - PREV = PREV - (1 << SBSYMCODELEN);
|
| - *nResult = PREV;
|
| - return 0;
|
| + *nResult = PREV - (1 << SBSYMCODELEN);
|
| }
|
|
|