Split up JBig2_GeneralDecoder.cpp.
[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 #include "JBig2_Define.h"
11
12 CJBig2_ArithIntDecoder::CJBig2_ArithIntDecoder() {
13   IAx = FX_Alloc(JBig2ArithCtx, 512);
14   JBIG2_memset(IAx, 0, sizeof(JBig2ArithCtx) * 512);
15 }
16 CJBig2_ArithIntDecoder::~CJBig2_ArithIntDecoder() {
17   FX_Free(IAx);
18 }
19 int CJBig2_ArithIntDecoder::decode(CJBig2_ArithDecoder* pArithDecoder,
20                                    int* nResult) {
21   int PREV, V;
22   int S, D;
23   int nNeedBits, nTemp, i;
24   PREV = 1;
25   S = pArithDecoder->DECODE(IAx + PREV);
26   PREV = (PREV << 1) | S;
27   D = pArithDecoder->DECODE(IAx + PREV);
28   PREV = (PREV << 1) | D;
29   if (D) {
30     D = pArithDecoder->DECODE(IAx + PREV);
31     PREV = (PREV << 1) | D;
32     if (D) {
33       D = pArithDecoder->DECODE(IAx + PREV);
34       PREV = (PREV << 1) | D;
35       if (D) {
36         D = pArithDecoder->DECODE(IAx + PREV);
37         PREV = (PREV << 1) | D;
38         if (D) {
39           D = pArithDecoder->DECODE(IAx + PREV);
40           PREV = (PREV << 1) | D;
41           if (D) {
42             nNeedBits = 32;
43             V = 4436;
44           } else {
45             nNeedBits = 12;
46             V = 340;
47           }
48         } else {
49           nNeedBits = 8;
50           V = 84;
51         }
52       } else {
53         nNeedBits = 6;
54         V = 20;
55       }
56     } else {
57       nNeedBits = 4;
58       V = 4;
59     }
60   } else {
61     nNeedBits = 2;
62     V = 0;
63   }
64   nTemp = 0;
65   for (i = 0; i < nNeedBits; i++) {
66     D = pArithDecoder->DECODE(IAx + PREV);
67     if (PREV < 256) {
68       PREV = (PREV << 1) | D;
69     } else {
70       PREV = (((PREV << 1) | D) & 511) | 256;
71     }
72     nTemp = (nTemp << 1) | D;
73   }
74   V += nTemp;
75   if (S == 1 && V > 0) {
76     V = -V;
77   }
78   *nResult = V;
79   if (S == 1 && V == 0) {
80     return JBIG2_OOB;
81   }
82   return 0;
83 }
84 CJBig2_ArithIaidDecoder::CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA) {
85   SBSYMCODELEN = SBSYMCODELENA;
86   IAID = FX_Alloc(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 }