Make a bunch of JBig2 classes independent of CJBig2_Object.
[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
9 #include "../../../include/fxcrt/fx_memory.h"
10
11 CJBig2_ArithIntDecoder::CJBig2_ArithIntDecoder() {
12   IAx = (JBig2ArithCtx*)FX_AllocOrDie(sizeof(JBig2ArithCtx), 512);
13   JBIG2_memset(IAx, 0, sizeof(JBig2ArithCtx) * 512);
14 }
15 CJBig2_ArithIntDecoder::~CJBig2_ArithIntDecoder() {
16   FX_Free(IAx);
17 }
18 int CJBig2_ArithIntDecoder::decode(CJBig2_ArithDecoder* pArithDecoder,
19                                    int* nResult) {
20   int PREV, V;
21   int S, D;
22   int nNeedBits, nTemp, i;
23   PREV = 1;
24   S = pArithDecoder->DECODE(IAx + PREV);
25   PREV = (PREV << 1) | S;
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           D = pArithDecoder->DECODE(IAx + PREV);
39           PREV = (PREV << 1) | D;
40           if (D) {
41             nNeedBits = 32;
42             V = 4436;
43           } else {
44             nNeedBits = 12;
45             V = 340;
46           }
47         } else {
48           nNeedBits = 8;
49           V = 84;
50         }
51       } else {
52         nNeedBits = 6;
53         V = 20;
54       }
55     } else {
56       nNeedBits = 4;
57       V = 4;
58     }
59   } else {
60     nNeedBits = 2;
61     V = 0;
62   }
63   nTemp = 0;
64   for (i = 0; i < nNeedBits; i++) {
65     D = pArithDecoder->DECODE(IAx + PREV);
66     if (PREV < 256) {
67       PREV = (PREV << 1) | D;
68     } else {
69       PREV = (((PREV << 1) | D) & 511) | 256;
70     }
71     nTemp = (nTemp << 1) | D;
72   }
73   V += nTemp;
74   if (S == 1 && V > 0) {
75     V = -V;
76   }
77   *nResult = V;
78   if (S == 1 && V == 0) {
79     return JBIG2_OOB;
80   }
81   return 0;
82 }
83 CJBig2_ArithIaidDecoder::CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA) {
84   SBSYMCODELEN = SBSYMCODELENA;
85   IAID =
86       (JBig2ArithCtx*)FX_AllocOrDie(sizeof(JBig2ArithCtx), (1 << SBSYMCODELEN));
87   JBIG2_memset(IAID, 0, sizeof(JBig2ArithCtx) * (int)(1 << SBSYMCODELEN));
88 }
89 CJBig2_ArithIaidDecoder::~CJBig2_ArithIaidDecoder() {
90   FX_Free(IAID);
91 }
92 int CJBig2_ArithIaidDecoder::decode(CJBig2_ArithDecoder* pArithDecoder,
93                                     int* nResult) {
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 }