// 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; }