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