Cleanup casting of FX_Alloc() return values.
[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 = FX_Alloc(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 = FX_Alloc(JBig2ArithCtx, 1 << SBSYMCODELEN);
86   JBIG2_memset(IAID, 0, sizeof(JBig2ArithCtx) * (int)(1 << SBSYMCODELEN));
87 }
88 CJBig2_ArithIaidDecoder::~CJBig2_ArithIaidDecoder() {
89   FX_Free(IAID);
90 }
91 int CJBig2_ArithIaidDecoder::decode(CJBig2_ArithDecoder* pArithDecoder,
92                                     int* nResult) {
93   int PREV;
94   int D;
95   int i;
96   PREV = 1;
97   for (i = 0; i < SBSYMCODELEN; i++) {
98     D = pArithDecoder->DECODE(IAID + PREV);
99     PREV = (PREV << 1) | D;
100   }
101   PREV = PREV - (1 << SBSYMCODELEN);
102   *nResult = PREV;
103   return 0;
104 }