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