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