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"
CJBig2_ArithIntDecoder()8 CJBig2_ArithIntDecoder::CJBig2_ArithIntDecoder()
9 {
10 IAx = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), 512);
11 JBIG2_memset(IAx, 0, sizeof(JBig2ArithCtx) * 512);
12 }
~CJBig2_ArithIntDecoder()13 CJBig2_ArithIntDecoder::~CJBig2_ArithIntDecoder()
14 {
15 m_pModule->JBig2_Free(IAx);
16 }
decode(CJBig2_ArithDecoder * pArithDecoder,int * nResult)17 int 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 }
CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA)82 CJBig2_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 }
~CJBig2_ArithIaidDecoder()88 CJBig2_ArithIaidDecoder::~CJBig2_ArithIaidDecoder()
89 {
90 m_pModule->JBig2_Free(IAID);
91 }
decode(CJBig2_ArithDecoder * pArithDecoder,int * nResult)92 int 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