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_GENERAL_DECODER_H_
8 #define _JBIG2_GENERAL_DECODER_H_
9 #include "../../../include/fxcodec/fx_codec_def.h"
10 #include "../../../include/fxcrt/fx_basic.h"
11 #include "JBig2_Define.h"
12 #include "JBig2_SymbolDict.h"
13 #include "JBig2_ArithDecoder.h"
14 #include "JBig2_ArithIntDecoder.h"
15 #include "../../../include/fxcrt/fx_coordinates.h"
16 class CJBig2_HuffmanTable;
17 class CJBig2_Image;
18 class CJBig2_PatternDict;
19 typedef enum {
20     JBIG2_CORNER_BOTTOMLEFT = 0,
21     JBIG2_CORNER_TOPLEFT	= 1,
22     JBIG2_CORNER_BOTTOMRIGHT = 2,
23     JBIG2_CORNER_TOPRIGHT	= 3
24 } JBig2Corner;
25 class CJBig2_GRDProc : public CJBig2_Object
26 {
27 public:
CJBig2_GRDProc()28     CJBig2_GRDProc()
29     {
30         m_loopIndex = 0;
31         m_pLine = NULL;
32         m_pPause = NULL;
33         m_DecodeType = 0;
34         LTP = 0;
35         m_ReplaceRect.left = 0;
36         m_ReplaceRect.bottom = 0;
37         m_ReplaceRect.top = 0;
38         m_ReplaceRect.right = 0;
39     }
40 
41     CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
42 
43     CJBig2_Image *decode_Arith_V2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
44 
45     CJBig2_Image *decode_Arith_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
46 
47     CJBig2_Image *decode_MMR(CJBig2_BitStream *pStream);
48     FXCODEC_STATUS Start_decode_Arith(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);
49     FXCODEC_STATUS Start_decode_Arith_V2(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);
50     FXCODEC_STATUS Start_decode_Arith_V1(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);
51     FXCODEC_STATUS Start_decode_MMR(CJBig2_Image** pImage, CJBig2_BitStream *pStream, IFX_Pause* pPause = NULL);
52     FXCODEC_STATUS Continue_decode(IFX_Pause* pPause);
GetReplaceRect()53     FX_RECT		   GetReplaceRect()
54     {
55         return m_ReplaceRect;
56     };
57 private:
58     FXCODEC_STATUS decode_Arith(IFX_Pause* pPause);
59     FXCODEC_STATUS decode_Arith_V2(IFX_Pause* pPause);
60     FXCODEC_STATUS decode_Arith_V1(IFX_Pause* pPause);
61     FXCODEC_STATUS decode_MMR();
62     FXCODEC_STATUS decode_Arith_Template0_opt3(CJBig2_Image*pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
63     FXCODEC_STATUS decode_Arith_Template0_unopt(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
64     FXCODEC_STATUS decode_Arith_Template1_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
65     FXCODEC_STATUS decode_Arith_Template1_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
66     FXCODEC_STATUS decode_Arith_Template2_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
67     FXCODEC_STATUS decode_Arith_Template2_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
68     FXCODEC_STATUS decode_Arith_Template3_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
69     FXCODEC_STATUS decode_Arith_Template3_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
70     FX_DWORD	m_loopIndex;
71     FX_BYTE *	m_pLine;
72     IFX_Pause*	m_pPause;
73     FXCODEC_STATUS	m_ProssiveStatus;
74     CJBig2_Image** m_pImage;
75     CJBig2_ArithDecoder *m_pArithDecoder;
76     JBig2ArithCtx *m_gbContext;
77     FX_WORD		m_DecodeType;
78     FX_BOOL LTP;
79     FX_RECT m_ReplaceRect;
80 private:
81 
82     CJBig2_Image *decode_Arith_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
83 
84     CJBig2_Image *decode_Arith_Template0_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
85 
86     CJBig2_Image *decode_Arith_Template0_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
87 
88     CJBig2_Image *decode_Arith_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
89 
90     CJBig2_Image *decode_Arith_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
91 
92     CJBig2_Image *decode_Arith_Template1_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
93 
94     CJBig2_Image *decode_Arith_Template1_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
95 
96     CJBig2_Image *decode_Arith_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
97 
98     CJBig2_Image *decode_Arith_Template2_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
99 
100     CJBig2_Image *decode_Arith_Template2_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
101 
102     CJBig2_Image *decode_Arith_Template2_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
103 
104     CJBig2_Image *decode_Arith_Template2_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
105 
106     CJBig2_Image *decode_Arith_Template3_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
107 
108     CJBig2_Image *decode_Arith_Template3_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
109 
110     CJBig2_Image *decode_Arith_Template3_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
111 
112     CJBig2_Image *decode_Arith_Template3_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
113 public:
114     FX_BOOL MMR;
115     FX_DWORD GBW;
116     FX_DWORD GBH;
117     FX_BYTE GBTEMPLATE;
118     FX_BOOL TPGDON;
119     FX_BOOL USESKIP;
120     CJBig2_Image * SKIP;
121     signed char GBAT[8];
122 };
123 class CJBig2_GRRDProc : public CJBig2_Object
124 {
125 public:
126 
127     CJBig2_Image *decode(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
128 
129     CJBig2_Image *decode_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
130 
131     CJBig2_Image *decode_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
132 
133     CJBig2_Image *decode_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
134 
135     CJBig2_Image *decode_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
136 
137     CJBig2_Image *decode_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
138 public:
139     FX_DWORD GRW;
140     FX_DWORD GRH;
141     FX_BOOL GRTEMPLATE;
142     CJBig2_Image *GRREFERENCE;
143     FX_INT32 GRREFERENCEDX;
144     FX_INT32 GRREFERENCEDY;
145     FX_BOOL TPGRON;
146     signed char	GRAT[4];
147 };
148 typedef struct {
149     CJBig2_ArithIntDecoder *IADT,
150                            *IAFS,
151                            *IADS,
152                            *IAIT,
153                            *IARI,
154                            *IARDW,
155                            *IARDH,
156                            *IARDX,
157                            *IARDY;
158     CJBig2_ArithIaidDecoder *IAID;
159 } JBig2IntDecoderState;
160 class CJBig2_TRDProc : public CJBig2_Object
161 {
162 public:
163 
164     CJBig2_Image *decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *grContext);
165 
166     CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext,
167                                JBig2IntDecoderState *pIDS = NULL);
168 public:
169     FX_BOOL SBHUFF;
170     FX_BOOL SBREFINE;
171     FX_DWORD SBW;
172     FX_DWORD SBH;
173     FX_DWORD SBNUMINSTANCES;
174     FX_DWORD SBSTRIPS;
175     FX_DWORD SBNUMSYMS;
176 
177     JBig2HuffmanCode *SBSYMCODES;
178     FX_BYTE SBSYMCODELEN;
179 
180     CJBig2_Image **SBSYMS;
181     FX_BOOL SBDEFPIXEL;
182 
183     JBig2ComposeOp SBCOMBOP;
184     FX_BOOL TRANSPOSED;
185 
186     JBig2Corner REFCORNER;
187     signed char SBDSOFFSET;
188     CJBig2_HuffmanTable *SBHUFFFS,
189                         *SBHUFFDS,
190                         *SBHUFFDT,
191                         *SBHUFFRDW,
192                         *SBHUFFRDH,
193                         *SBHUFFRDX,
194                         *SBHUFFRDY,
195                         *SBHUFFRSIZE;
196     FX_BOOL SBRTEMPLATE;
197     signed char SBRAT[4];
198 };
199 class CJBig2_SDDProc : public CJBig2_Object
200 {
201 public:
202 
203     CJBig2_SymbolDict *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext);
204 
205     CJBig2_SymbolDict *decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext, IFX_Pause* pPause);
206 public:
207     FX_BOOL SDHUFF;
208     FX_BOOL SDREFAGG;
209     FX_DWORD SDNUMINSYMS;
210     CJBig2_Image ** SDINSYMS;
211     FX_DWORD SDNUMNEWSYMS;
212     FX_DWORD SDNUMEXSYMS;
213     CJBig2_HuffmanTable *SDHUFFDH,
214                         *SDHUFFDW,
215                         *SDHUFFBMSIZE,
216                         *SDHUFFAGGINST;
217     FX_BYTE SDTEMPLATE;
218     signed char SDAT[8];
219     FX_BOOL SDRTEMPLATE;
220     signed char SDRAT[4];
221 };
222 class CJBig2_HTRDProc : public CJBig2_Object
223 {
224 public:
225 
226     CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
227 
228     CJBig2_Image *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);
229 public:
230     FX_DWORD HBW,
231              HBH;
232     FX_BOOL HMMR;
233     FX_BYTE HTEMPLATE;
234     FX_DWORD HNUMPATS;
235     CJBig2_Image **HPATS;
236     FX_BOOL HDEFPIXEL;
237     JBig2ComposeOp HCOMBOP;
238     FX_BOOL HENABLESKIP;
239     FX_DWORD HGW,
240              HGH;
241     FX_INT32 HGX,
242              HGY;
243     FX_WORD HRX,
244             HRY;
245     FX_BYTE HPW,
246             HPH;
247 };
248 class CJBig2_PDDProc : public CJBig2_Object
249 {
250 public:
251 
252     CJBig2_PatternDict *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
253 
254     CJBig2_PatternDict *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);
255 public:
256     FX_BOOL HDMMR;
257     FX_BYTE HDPW,
258             HDPH;
259     FX_DWORD GRAYMAX;
260     FX_BYTE HDTEMPLATE;
261 };
262 class CJBig2_GSIDProc : public CJBig2_Object
263 {
264 public:
265 
266     FX_DWORD *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
267 
268     FX_DWORD *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);
269 public:
270     FX_BOOL GSMMR;
271     FX_BOOL GSUSESKIP;
272     FX_BYTE GSBPP;
273     FX_DWORD GSW,
274              GSH;
275     FX_BYTE GSTEMPLATE;
276     CJBig2_Image *GSKIP;
277 };
278 #endif
279