1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file. 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "JBig2_ArithIntDecoder.h" 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCJBig2_ArithIntDecoder::CJBig2_ArithIntDecoder() 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IAx = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), 512); 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JBIG2_memset(IAx, 0, sizeof(JBig2ArithCtx) * 512); 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCJBig2_ArithIntDecoder::~CJBig2_ArithIntDecoder() 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pModule->JBig2_Free(IAx); 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CJBig2_ArithIntDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult) 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int PREV, V; 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int S, D; 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nNeedBits, nTemp, i; 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PREV = 1; 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov S = pArithDecoder->DECODE(IAx + PREV); 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PREV = (PREV << 1) | S; 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov D = pArithDecoder->DECODE(IAx + PREV); 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PREV = (PREV << 1) | D; 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(D) { 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov D = pArithDecoder->DECODE(IAx + PREV); 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PREV = (PREV << 1) | D; 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(D) { 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov D = pArithDecoder->DECODE(IAx + PREV); 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PREV = (PREV << 1) | D; 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(D) { 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov D = pArithDecoder->DECODE(IAx + PREV); 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PREV = (PREV << 1) | D; 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(D) { 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov D = pArithDecoder->DECODE(IAx + PREV); 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PREV = (PREV << 1) | D; 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(D) { 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nNeedBits = 32; 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov V = 4436; 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nNeedBits = 12; 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov V = 340; 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nNeedBits = 8; 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov V = 84; 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nNeedBits = 6; 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov V = 20; 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nNeedBits = 4; 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov V = 4; 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nNeedBits = 2; 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov V = 0; 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nTemp = 0; 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < nNeedBits; i++) { 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov D = pArithDecoder->DECODE(IAx + PREV); 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(PREV < 256) { 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PREV = (PREV << 1) | D; 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PREV = (((PREV << 1) | D) & 511) | 256; 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov nTemp = (nTemp << 1) | D; 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov V += nTemp; 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(S == 1 && V > 0) { 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov V = -V; 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *nResult = V; 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(S == 1 && V == 0) { 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return JBIG2_OOB; 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCJBig2_ArithIaidDecoder::CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA) 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SBSYMCODELEN = SBSYMCODELENA; 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IAID = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), (1 << SBSYMCODELEN)); 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JBIG2_memset(IAID, 0, sizeof(JBig2ArithCtx) * (int)(1 << SBSYMCODELEN)); 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCJBig2_ArithIaidDecoder::~CJBig2_ArithIaidDecoder() 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pModule->JBig2_Free(IAID); 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CJBig2_ArithIaidDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult) 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int PREV; 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int D; 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int i; 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PREV = 1; 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < SBSYMCODELEN; i++) { 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov D = pArithDecoder->DECODE(IAID + PREV); 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PREV = (PREV << 1) | D; 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov PREV = PREV - (1 << SBSYMCODELEN); 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *nResult = PREV; 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 106