clang-format all pdfium code.
[pdfium.git] / core / src / fxcodec / jbig2 / JBig2_ArithIntDecoder.cpp
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"
8 CJBig2_ArithIntDecoder::CJBig2_ArithIntDecoder() {
9   IAx = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), 512);
10   JBIG2_memset(IAx, 0, sizeof(JBig2ArithCtx) * 512);
11 }
12 CJBig2_ArithIntDecoder::~CJBig2_ArithIntDecoder() {
13   m_pModule->JBig2_Free(IAx);
14 }
15 int CJBig2_ArithIntDecoder::decode(CJBig2_ArithDecoder* pArithDecoder,
16                                    int* nResult) {
17   int PREV, V;
18   int S, D;
19   int nNeedBits, nTemp, i;
20   PREV = 1;
21   S = pArithDecoder->DECODE(IAx + PREV);
22   PREV = (PREV << 1) | S;
23   D = pArithDecoder->DECODE(IAx + PREV);
24   PREV = (PREV << 1) | D;
25   if (D) {
26     D = pArithDecoder->DECODE(IAx + PREV);
27     PREV = (PREV << 1) | D;
28     if (D) {
29       D = pArithDecoder->DECODE(IAx + PREV);
30       PREV = (PREV << 1) | D;
31       if (D) {
32         D = pArithDecoder->DECODE(IAx + PREV);
33         PREV = (PREV << 1) | D;
34         if (D) {
35           D = pArithDecoder->DECODE(IAx + PREV);
36           PREV = (PREV << 1) | D;
37           if (D) {
38             nNeedBits = 32;
39             V = 4436;
40           } else {
41             nNeedBits = 12;
42             V = 340;
43           }
44         } else {
45           nNeedBits = 8;
46           V = 84;
47         }
48       } else {
49         nNeedBits = 6;
50         V = 20;
51       }
52     } else {
53       nNeedBits = 4;
54       V = 4;
55     }
56   } else {
57     nNeedBits = 2;
58     V = 0;
59   }
60   nTemp = 0;
61   for (i = 0; i < nNeedBits; i++) {
62     D = pArithDecoder->DECODE(IAx + PREV);
63     if (PREV < 256) {
64       PREV = (PREV << 1) | D;
65     } else {
66       PREV = (((PREV << 1) | D) & 511) | 256;
67     }
68     nTemp = (nTemp << 1) | D;
69   }
70   V += nTemp;
71   if (S == 1 && V > 0) {
72     V = -V;
73   }
74   *nResult = V;
75   if (S == 1 && V == 0) {
76     return JBIG2_OOB;
77   }
78   return 0;
79 }
80 CJBig2_ArithIaidDecoder::CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA) {
81   SBSYMCODELEN = SBSYMCODELENA;
82   IAID = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx),
83                                                   (1 << SBSYMCODELEN));
84   JBIG2_memset(IAID, 0, sizeof(JBig2ArithCtx) * (int)(1 << SBSYMCODELEN));
85 }
86 CJBig2_ArithIaidDecoder::~CJBig2_ArithIaidDecoder() {
87   m_pModule->JBig2_Free(IAID);
88 }
89 int CJBig2_ArithIaidDecoder::decode(CJBig2_ArithDecoder* pArithDecoder,
90                                     int* nResult) {
91   int PREV;
92   int D;
93   int i;
94   PREV = 1;
95   for (i = 0; i < SBSYMCODELEN; i++) {
96     D = pArithDecoder->DECODE(IAID + PREV);
97     PREV = (PREV << 1) | D;
98   }
99   PREV = PREV - (1 << SBSYMCODELEN);
100   *nResult = PREV;
101   return 0;
102 }