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