571af614709ae2e2c91810bf6c47f1e11e5c476a
[pdfium.git] / core / src / fxcodec / codec / codec_int.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 #include <limits.h>\r
8 class CCodec_BasicModule : public ICodec_BasicModule\r
9 {\r
10 public:\r
11     virtual FX_BOOL     RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,\r
12                                     FX_DWORD& dest_size);\r
13     virtual FX_BOOL     A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,\r
14                               FX_DWORD& dest_size);\r
15     virtual ICodec_ScanlineDecoder*     CreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\r
16             int nComps, int bpc);\r
17 };\r
18 struct CCodec_ImageDataCache {\r
19     int                 m_Width, m_Height;\r
20     int                 m_nCachedLines;\r
21     FX_BYTE             m_Data;\r
22 };\r
23 class CCodec_ScanlineDecoder : public ICodec_ScanlineDecoder\r
24 {\r
25 public:\r
26 \r
27     CCodec_ScanlineDecoder();\r
28 \r
29     virtual ~CCodec_ScanlineDecoder();\r
30 \r
31     virtual FX_DWORD    GetSrcOffset()\r
32     {\r
33         return -1;\r
34     }\r
35 \r
36     virtual void                DownScale(int dest_width, int dest_height);\r
37 \r
38     FX_LPBYTE                   GetScanline(int line);\r
39 \r
40     FX_BOOL                             SkipToScanline(int line, IFX_Pause* pPause);\r
41 \r
42     int                                 GetWidth()\r
43     {\r
44         return m_OutputWidth;\r
45     }\r
46 \r
47     int                                 GetHeight()\r
48     {\r
49         return m_OutputHeight;\r
50     }\r
51 \r
52     int                                 CountComps()\r
53     {\r
54         return m_nComps;\r
55     }\r
56 \r
57     int                                 GetBPC()\r
58     {\r
59         return m_bpc;\r
60     }\r
61 \r
62     FX_BOOL                             IsColorTransformed()\r
63     {\r
64         return m_bColorTransformed;\r
65     }\r
66 \r
67     void                                ClearImageData()\r
68     {\r
69         if (m_pDataCache) {\r
70             FX_Free(m_pDataCache);\r
71         }\r
72         m_pDataCache = NULL;\r
73     }\r
74 protected:\r
75 \r
76     int                                 m_OrigWidth;\r
77 \r
78     int                                 m_OrigHeight;\r
79 \r
80     int                                 m_DownScale;\r
81 \r
82     int                                 m_OutputWidth;\r
83 \r
84     int                                 m_OutputHeight;\r
85 \r
86     int                                 m_nComps;\r
87 \r
88     int                                 m_bpc;\r
89 \r
90     int                                 m_Pitch;\r
91 \r
92     FX_BOOL                             m_bColorTransformed;\r
93 \r
94     FX_LPBYTE                   ReadNextLine();\r
95 \r
96     virtual FX_BOOL             v_Rewind() = 0;\r
97 \r
98     virtual FX_LPBYTE   v_GetNextLine() = 0;\r
99 \r
100     virtual void                v_DownScale(int dest_width, int dest_height) = 0;\r
101 \r
102     int                                 m_NextLine;\r
103 \r
104     FX_LPBYTE                   m_pLastScanline;\r
105 \r
106     CCodec_ImageDataCache*      m_pDataCache;\r
107 };\r
108 class CCodec_FaxModule : public ICodec_FaxModule\r
109 {\r
110 public:\r
111     virtual ICodec_ScanlineDecoder*     CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\r
112             int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows);\r
113     FX_BOOL             Encode(FX_LPCBYTE src_buf, int width, int height, int pitch, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\r
114 };\r
115 class CCodec_FlateModule : public ICodec_FlateModule\r
116 {\r
117 public:\r
118     virtual ICodec_ScanlineDecoder*     CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,\r
119             int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns);\r
120     virtual FX_DWORD FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,\r
121                                       int predictor, int Colors, int BitsPerComponent, int Columns,\r
122                                       FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\r
123     virtual FX_BOOL Encode(const FX_BYTE* src_buf, FX_DWORD src_size,\r
124                            int predictor, int Colors, int BitsPerComponent, int Columns,\r
125                            FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\r
126     virtual FX_BOOL             Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);\r
127 };\r
128 class CCodec_JpegModule : public ICodec_JpegModule\r
129 {\r
130 public:\r
131     CCodec_JpegModule() : m_pExtProvider(NULL) {}\r
132     void SetPovider(IFX_JpegProvider* pJP)\r
133     {\r
134         m_pExtProvider = pJP;\r
135     }\r
136     ICodec_ScanlineDecoder*     CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,\r
137                                           int width, int height, int nComps, FX_BOOL ColorTransform);\r
138     FX_BOOL             LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,\r
139                          int& num_components, int& bits_per_components, FX_BOOL& color_transform,\r
140                          FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length);\r
141     FX_BOOL             Encode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length);\r
142     virtual void*               Start();\r
143     virtual void                Finish(void* pContext);\r
144     virtual void                Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size);\r
145     virtual int                 ReadHeader(void* pContext, int* width, int* height, int* nComps);\r
146     virtual FX_BOOL             StartScanline(void* pContext, int down_scale);\r
147     virtual FX_BOOL             ReadScanline(void* pContext, FX_LPBYTE dest_buf);\r
148     virtual FX_DWORD    GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr);\r
149 protected:\r
150     IFX_JpegProvider* m_pExtProvider;\r
151 };\r
152 class CCodec_IccModule : public ICodec_IccModule\r
153 {\r
154 public:\r
155     virtual IccCS                       GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize);\r
156     virtual IccCS                       GetProfileCS(IFX_FileRead* pFile);\r
157     virtual FX_LPVOID           CreateTransform(ICodec_IccModule::IccParam* pInputParam,\r
158                                             ICodec_IccModule::IccParam* pOutputParam,\r
159                                             ICodec_IccModule::IccParam* pProofParam = NULL,\r
160                                             FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,\r
161                                             FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,\r
162                                             FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,\r
163                                             FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING\r
164                                       );\r
165     virtual FX_LPVOID           CreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent = 0,\r
166             FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT);\r
167     virtual FX_LPVOID           CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,\r
168             FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent = 0,\r
169             FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,\r
170             FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT\r
171                                            );\r
172     virtual void                        DestroyTransform(FX_LPVOID pTransform);\r
173     virtual void                        Translate(FX_LPVOID pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues);\r
174     virtual void                        TranslateScanline(FX_LPVOID pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels);\r
175     virtual ~CCodec_IccModule();\r
176 protected:\r
177     CFX_MapByteStringToPtr              m_MapTranform;\r
178     CFX_MapByteStringToPtr              m_MapProfile;\r
179     typedef enum {\r
180         Icc_CLASS_INPUT = 0,\r
181         Icc_CLASS_OUTPUT,\r
182         Icc_CLASS_PROOF,\r
183         Icc_CLASS_MAX\r
184     } Icc_CLASS;\r
185     FX_LPVOID           CreateProfile(ICodec_IccModule::IccParam* pIccParam, Icc_CLASS ic, CFX_BinaryBuf* pTransformKey);\r
186 };\r
187 class CCodec_JpxModule : public ICodec_JpxModule\r
188 {\r
189 public:\r
190     CCodec_JpxModule();\r
191     void*               CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_BOOL useColorSpace = FALSE);\r
192     void                GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,\r
193                              FX_DWORD& codestream_nComps, FX_DWORD& output_nComps);\r
194     FX_BOOL             Decode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets);\r
195     void                DestroyDecoder(void* ctx);\r
196 };\r
197 #include "../jbig2/JBig2_Context.h"\r
198 class CPDF_Jbig2Interface : public CFX_Object, public CJBig2_Module\r
199 {\r
200 public:\r
201     virtual void *JBig2_Malloc(FX_DWORD dwSize)\r
202     {\r
203         return FX_Alloc(FX_BYTE, dwSize);\r
204     }\r
205     virtual void *JBig2_Malloc2(FX_DWORD num, FX_DWORD dwSize)\r
206     {\r
207         if (dwSize && num >= UINT_MAX / dwSize) {\r
208             return NULL;\r
209         }\r
210         return FX_Alloc(FX_BYTE, num * dwSize);\r
211     }\r
212     virtual void *JBig2_Malloc3(FX_DWORD num, FX_DWORD dwSize, FX_DWORD dwSize2)\r
213     {\r
214         if (dwSize2 && dwSize >= UINT_MAX / dwSize2) {\r
215             return NULL;\r
216         }\r
217         FX_DWORD size = dwSize2 * dwSize;\r
218         if (size && num >= UINT_MAX / size) {\r
219             return NULL;\r
220         }\r
221         return FX_Alloc(FX_BYTE, num * size);\r
222     }\r
223     virtual void *JBig2_Realloc(FX_LPVOID pMem, FX_DWORD dwSize)\r
224     {\r
225         return FX_Realloc(FX_BYTE, pMem, dwSize);\r
226     }\r
227     virtual void JBig2_Free(FX_LPVOID pMem)\r
228     {\r
229         FX_Free(pMem);\r
230     }\r
231 };\r
232 class CCodec_Jbig2Context : public CFX_Object\r
233 {\r
234 public:\r
235     CCodec_Jbig2Context();\r
236     ~CCodec_Jbig2Context() {};\r
237     IFX_FileRead* m_file_ptr;\r
238     FX_DWORD m_width;\r
239     FX_DWORD m_height;\r
240     FX_LPBYTE m_src_buf;\r
241     FX_DWORD m_src_size;\r
242     FX_LPCBYTE m_global_data;\r
243     FX_DWORD m_global_size;\r
244     FX_LPBYTE m_dest_buf;\r
245     FX_DWORD m_dest_pitch;\r
246     FX_BOOL     m_bFileReader;\r
247     IFX_Pause* m_pPause;\r
248     CJBig2_Context* m_pContext;\r
249     CJBig2_Image* m_dest_image;\r
250 };\r
251 class CCodec_Jbig2Module : public ICodec_Jbig2Module\r
252 {\r
253 public:\r
254     CCodec_Jbig2Module() {};\r
255     ~CCodec_Jbig2Module();\r
256     FX_BOOL             Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,\r
257                        FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch);\r
258     FX_BOOL             Decode(IFX_FileRead* file_ptr,\r
259                        FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf);\r
260     void*                               CreateJbig2Context();\r
261     FXCODEC_STATUS              StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,\r
262                                     FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause);\r
263 \r
264     FXCODEC_STATUS              StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,\r
265                                     FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause);\r
266     FXCODEC_STATUS              ContinueDecode(void* pJbig2Context, IFX_Pause* pPause);\r
267     void                                DestroyJbig2Context(void* pJbig2Context);\r
268     CPDF_Jbig2Interface m_Module;\r
269 private:\r
270 };\r