clang-format all pdfium code.
[pdfium.git] / core / src / fxcodec / jbig2 / JBig2_ArithDecoder.h
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 #ifndef _JBIG2_ARITHMETIC_DECODER_H_
8 #define _JBIG2_ARITHMETIC_DECODER_H_
9 #include "JBig2_Define.h"
10 #include "JBig2_BitStream.h"
11 #include "JBig2_ArithQe.h"
12 typedef struct {
13   unsigned int MPS;
14   unsigned int I;
15 } JBig2ArithCtx;
16 class CJBig2_ArithDecoder : public CJBig2_Object {
17  public:
18   CJBig2_ArithDecoder(CJBig2_BitStream* pStream);
19
20   ~CJBig2_ArithDecoder();
21
22   int DECODE(JBig2ArithCtx* pCX);
23
24  private:
25   void INITDEC();
26
27   void BYTEIN();
28   unsigned char B;
29   unsigned int C;
30   unsigned int A;
31   unsigned int CT;
32   CJBig2_BitStream* m_pStream;
33 };
34 inline CJBig2_ArithDecoder::CJBig2_ArithDecoder(CJBig2_BitStream* pStream) {
35   m_pStream = pStream;
36   INITDEC();
37 }
38 inline CJBig2_ArithDecoder::~CJBig2_ArithDecoder() {}
39 inline void CJBig2_ArithDecoder::INITDEC() {
40   B = m_pStream->getCurByte_arith();
41   C = (B ^ 0xff) << 16;
42   ;
43   BYTEIN();
44   C = C << 7;
45   CT = CT - 7;
46   A = 0x8000;
47 }
48 inline void CJBig2_ArithDecoder::BYTEIN() {
49   unsigned char B1;
50   if (B == 0xff) {
51     B1 = m_pStream->getNextByte_arith();
52     if (B1 > 0x8f) {
53       CT = 8;
54     } else {
55       m_pStream->incByteIdx();
56       B = B1;
57       C = C + 0xfe00 - (B << 9);
58       CT = 7;
59     }
60   } else {
61     m_pStream->incByteIdx();
62     B = m_pStream->getCurByte_arith();
63     C = C + 0xff00 - (B << 8);
64     CT = 8;
65   }
66 }
67 inline int CJBig2_ArithDecoder::DECODE(JBig2ArithCtx* pCX) {
68   if (!pCX || pCX->I >= JBIG2_QE_NUM) {
69     return 0;
70   }
71
72   int D;
73   const JBig2ArithQe* qe = &QeTable[pCX->I];
74   A = A - qe->Qe;
75   if ((C >> 16) < A) {
76     if (A & 0x8000) {
77       D = pCX->MPS;
78     } else {
79       if (A < qe->Qe) {
80         D = 1 - pCX->MPS;
81         if (qe->nSwitch == 1) {
82           pCX->MPS = 1 - pCX->MPS;
83         }
84         pCX->I = qe->NLPS;
85       } else {
86         D = pCX->MPS;
87         pCX->I = qe->NMPS;
88       }
89       do {
90         if (CT == 0) {
91           BYTEIN();
92         }
93         A <<= 1;
94         C <<= 1;
95         CT--;
96       } while ((A & 0x8000) == 0);
97     }
98   } else {
99     C -= A << 16;
100     if (A < qe->Qe) {
101       A = qe->Qe;
102       D = pCX->MPS;
103       pCX->I = qe->NMPS;
104     } else {
105       A = qe->Qe;
106       D = 1 - pCX->MPS;
107       if (qe->nSwitch == 1) {
108         pCX->MPS = 1 - pCX->MPS;
109       }
110       pCX->I = qe->NLPS;
111     }
112     do {
113       if (CT == 0) {
114         BYTEIN();
115       }
116       A <<= 1;
117       C <<= 1;
118       CT--;
119     } while ((A & 0x8000) == 0);
120   }
121   return D;
122 }
123 #endif