Initial commit.
[pdfium.git] / core / src / fxcodec / jbig2 / JBig2_ArithDecoder.h
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4  \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #ifndef _JBIG2_ARITHMETIC_DECODER_H_\r
8 #define _JBIG2_ARITHMETIC_DECODER_H_\r
9 #include "JBig2_Define.h"\r
10 #include "JBig2_BitStream.h"\r
11 #include "JBig2_ArithQe.h"\r
12 typedef struct {\r
13     unsigned int MPS;\r
14     unsigned int I;\r
15 } JBig2ArithCtx;\r
16 class CJBig2_ArithDecoder : public CJBig2_Object\r
17 {\r
18 public:\r
19 \r
20     CJBig2_ArithDecoder(CJBig2_BitStream *pStream);\r
21 \r
22     ~CJBig2_ArithDecoder();\r
23 \r
24     int DECODE(JBig2ArithCtx *pCX);\r
25 private:\r
26 \r
27     void INITDEC();\r
28 \r
29     void BYTEIN();\r
30     unsigned char B;\r
31     unsigned int C;\r
32     unsigned int A;\r
33     unsigned int CT;\r
34     CJBig2_BitStream *m_pStream;\r
35 };\r
36 inline CJBig2_ArithDecoder::CJBig2_ArithDecoder(CJBig2_BitStream *pStream)\r
37 {\r
38     m_pStream = pStream;\r
39     INITDEC();\r
40 }\r
41 inline CJBig2_ArithDecoder::~CJBig2_ArithDecoder()\r
42 {\r
43 }\r
44 inline void CJBig2_ArithDecoder::INITDEC()\r
45 {\r
46     B = m_pStream->getCurByte_arith();\r
47     C = (B ^ 0xff) << 16;;\r
48     BYTEIN();\r
49     C = C << 7;\r
50     CT = CT - 7;\r
51     A = 0x8000;\r
52 }\r
53 inline void CJBig2_ArithDecoder::BYTEIN()\r
54 {\r
55     unsigned char B1;\r
56     if(B == 0xff) {\r
57         B1 = m_pStream->getNextByte_arith();\r
58         if(B1 > 0x8f) {\r
59             CT = 8;\r
60         } else {\r
61             m_pStream->incByteIdx();\r
62             B = B1;\r
63             C = C + 0xfe00 - (B << 9);\r
64             CT = 7;\r
65         }\r
66     } else {\r
67         m_pStream->incByteIdx();\r
68         B = m_pStream->getCurByte_arith();\r
69         C = C + 0xff00 - (B << 8);\r
70         CT = 8;\r
71     }\r
72 }\r
73 inline int CJBig2_ArithDecoder::DECODE(JBig2ArithCtx *pCX)\r
74 {\r
75     int D;\r
76     const JBig2ArithQe * qe = &QeTable[pCX->I];\r
77     A = A - qe->Qe;\r
78     if((C >> 16) < A) {\r
79         if(A & 0x8000) {\r
80             D = pCX->MPS;\r
81         } else {\r
82             if(A < qe->Qe) {\r
83                 D = 1 - pCX->MPS;\r
84                 if(qe->nSwitch == 1) {\r
85                     pCX->MPS = 1 - pCX->MPS;\r
86                 }\r
87                 pCX->I = qe->NLPS;\r
88             } else {\r
89                 D = pCX->MPS;\r
90                 pCX->I = qe->NMPS;\r
91             }\r
92             do {\r
93                 if (CT == 0) {\r
94                     BYTEIN();\r
95                 }\r
96                 A <<= 1;\r
97                 C <<= 1;\r
98                 CT--;\r
99             } while ((A & 0x8000) == 0);\r
100         }\r
101     } else {\r
102         C -= A << 16;\r
103         if(A < qe->Qe) {\r
104             A = qe->Qe;\r
105             D = pCX->MPS;\r
106             pCX->I = qe->NMPS;\r
107         } else {\r
108             A = qe->Qe;\r
109             D = 1 - pCX->MPS;\r
110             if(qe->nSwitch == 1) {\r
111                 pCX->MPS = 1 - pCX->MPS;\r
112             }\r
113             pCX->I = qe->NLPS;\r
114         }\r
115         do {\r
116             if (CT == 0) {\r
117                 BYTEIN();\r
118             }\r
119             A <<= 1;\r
120             C <<= 1;\r
121             CT--;\r
122         } while ((A & 0x8000) == 0);\r
123     }\r
124     return D;\r
125 }\r
126 #endif\r