f46530e005023959f799a11902dcded33e924abf
[pdfium.git] / core / src / fxcodec / jbig2 / JBig2_Context.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_CONTEXT_H_
8 #define _JBIG2_CONTEXT_H_
9 #include "JBig2_Module.h"
10 #include "JBig2_List.h"
11 #include "JBig2_Segment.h"
12 #include "JBig2_Page.h"
13 #include "JBig2_GeneralDecoder.h"
14 #include "../../../include/fxcodec/fx_codec_def.h"
15 #include "../../../include/fxcrt/fx_basic.h"
16 #include <utility>
17 typedef std::pair<FX_BYTE*, CJBig2_SymbolDict*> CJBig2_CachePair;
18 typedef enum {
19     JBIG2_OUT_OF_PAGE = 0,
20     JBIG2_IN_PAGE,
21 } JBig2State;
22 #define JBIG2_SUCCESS                    0
23 #define JBIG2_FAILED                    -1
24 #define JBIG2_ERROR_TOO_SHORT   -2
25 #define JBIG2_ERROR_FETAL               -3
26 #define JBIG2_END_OF_PAGE                2
27 #define JBIG2_END_OF_FILE                3
28 #define JBIG2_ERROR_FILE_FORMAT -4
29 #define JBIG2_ERROR_STREAM_TYPE -5
30 #define JBIG2_ERROR_LIMIT               -6
31 #define JBIG2_FILE_STREAM                       0
32 #define JBIG2_SQUENTIAL_STREAM          1
33 #define JBIG2_RANDOM_STREAM                     2
34 #define JBIG2_EMBED_STREAM                      3
35 #define JBIG2_MIN_SEGMENT_SIZE                                  11
36 class CJBig2_Context : public CJBig2_Object
37 {
38 public:
39
40     static CJBig2_Context *CreateContext(CJBig2_Module *pModule, FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,
41                                          FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, std::list<CJBig2_CachePair>* pSymbolDictCache, IFX_Pause* pPause = NULL);
42
43     static void DestroyContext(CJBig2_Context *pContext);
44
45     FX_INT32 getFirstPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause);
46
47     FX_INT32 getNextPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause);
48
49     FX_INT32 getFirstPage(CJBig2_Image **image, IFX_Pause* pPause);
50
51     FX_INT32 getNextPage(CJBig2_Image **image, IFX_Pause* pPause);
52     FX_INT32 Continue(IFX_Pause* pPause);
53     FXCODEC_STATUS GetProcessiveStatus()
54     {
55         return m_ProcessiveStatus;
56     };
57 private:
58
59     CJBig2_Context(FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,
60                    FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, std::list<CJBig2_CachePair>* pSymbolDictCache, IFX_Pause* pPause);
61
62     ~CJBig2_Context();
63
64     FX_INT32 decodeFile(IFX_Pause* pPause);
65
66     FX_INT32 decode_SquentialOrgnazation(IFX_Pause* pPause);
67
68     FX_INT32 decode_EmbedOrgnazation(IFX_Pause* pPause);
69
70     FX_INT32 decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause);
71
72     FX_INT32 decode_RandomOrgnazation(IFX_Pause* pPause);
73
74     CJBig2_Segment *findSegmentByNumber(FX_DWORD dwNumber);
75
76     CJBig2_Segment *findReferredSegmentByTypeAndIndex(CJBig2_Segment *pSegment, FX_BYTE cType, FX_INT32 nIndex);
77
78     FX_INT32 parseSegmentHeader(CJBig2_Segment *pSegment);
79
80     FX_INT32 parseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause);
81     FX_INT32 ProcessiveParseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause);
82
83     FX_INT32 parseSymbolDict(CJBig2_Segment *pSegment, IFX_Pause* pPause);
84
85     FX_INT32 parseTextRegion(CJBig2_Segment *pSegment);
86
87     FX_INT32 parsePatternDict(CJBig2_Segment *pSegment, IFX_Pause* pPause);
88
89     FX_INT32 parseHalftoneRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause);
90
91     FX_INT32 parseGenericRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause);
92
93     FX_INT32 parseGenericRefinementRegion(CJBig2_Segment *pSegment);
94
95     FX_INT32 parseTable(CJBig2_Segment *pSegment);
96
97     FX_INT32 parseRegionInfo(JBig2RegionInfo *pRI);
98
99
100
101     JBig2HuffmanCode *decodeSymbolIDHuffmanTable(CJBig2_BitStream *pStream, FX_DWORD SBNUMSYMS);
102
103     void huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP);
104
105     void huffman_assign_code(JBig2HuffmanCode *SBSYMCODES, int NTEMP);
106
107 private:
108
109     CJBig2_Context *m_pGlobalContext;
110
111     FX_INT32 m_nStreamType;
112
113     CJBig2_BitStream *m_pStream;
114
115     FX_INT32 m_nState;
116
117     CJBig2_List<CJBig2_Segment> *m_pSegmentList;
118
119     CJBig2_List<JBig2PageInfo> *m_pPageInfoList;
120
121     CJBig2_Image *m_pPage;
122
123     FX_BOOL m_bBufSpecified;
124
125     FX_INT32 m_nSegmentDecoded;
126     IFX_Pause*  m_pPause;
127     FX_INT32    m_PauseStep;
128     FXCODEC_STATUS m_ProcessiveStatus;
129     FX_BOOL     m_bFirstPage;
130     CJBig2_ArithDecoder *m_pArithDecoder;
131     CJBig2_GRDProc *m_pGRD;
132     JBig2ArithCtx *m_gbContext;
133     CJBig2_Segment *m_pSegment;
134     FX_DWORD m_dwOffset;
135     JBig2RegionInfo m_ri;
136     std::list<CJBig2_CachePair>* m_pSymbolDictCache;
137 };
138 #endif