Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / core / src / fxcodec / codec / codec_int.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 #include <limits.h>
8 class CCodec_BasicModule : public ICodec_BasicModule
9 {
10 public:
11     virtual FX_BOOL     RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
12                                     FX_DWORD& dest_size);
13     virtual FX_BOOL     A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
14                               FX_DWORD& dest_size);
15     virtual ICodec_ScanlineDecoder*     CreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
16             int nComps, int bpc);
17 };
18 struct CCodec_ImageDataCache {
19     int                 m_Width, m_Height;
20     int                 m_nCachedLines;
21     FX_BYTE             m_Data;
22 };
23 class CCodec_ScanlineDecoder : public ICodec_ScanlineDecoder
24 {
25 public:
26
27     CCodec_ScanlineDecoder();
28
29     virtual ~CCodec_ScanlineDecoder();
30
31     virtual FX_DWORD    GetSrcOffset()
32     {
33         return -1;
34     }
35
36     virtual void                DownScale(int dest_width, int dest_height);
37
38     FX_LPBYTE                   GetScanline(int line);
39
40     FX_BOOL                             SkipToScanline(int line, IFX_Pause* pPause);
41
42     int                                 GetWidth()
43     {
44         return m_OutputWidth;
45     }
46
47     int                                 GetHeight()
48     {
49         return m_OutputHeight;
50     }
51
52     int                                 CountComps()
53     {
54         return m_nComps;
55     }
56
57     int                                 GetBPC()
58     {
59         return m_bpc;
60     }
61
62     FX_BOOL                             IsColorTransformed()
63     {
64         return m_bColorTransformed;
65     }
66
67     void                                ClearImageData()
68     {
69         if (m_pDataCache) {
70             FX_Free(m_pDataCache);
71         }
72         m_pDataCache = NULL;
73     }
74 protected:
75
76     int                                 m_OrigWidth;
77
78     int                                 m_OrigHeight;
79
80     int                                 m_DownScale;
81
82     int                                 m_OutputWidth;
83
84     int                                 m_OutputHeight;
85
86     int                                 m_nComps;
87
88     int                                 m_bpc;
89
90     int                                 m_Pitch;
91
92     FX_BOOL                             m_bColorTransformed;
93
94     FX_LPBYTE                   ReadNextLine();
95
96     virtual FX_BOOL             v_Rewind() = 0;
97
98     virtual FX_LPBYTE   v_GetNextLine() = 0;
99
100     virtual void                v_DownScale(int dest_width, int dest_height) = 0;
101
102     int                                 m_NextLine;
103
104     FX_LPBYTE                   m_pLastScanline;
105
106     CCodec_ImageDataCache*      m_pDataCache;
107 };
108 class CCodec_FaxModule : public ICodec_FaxModule
109 {
110 public:
111     virtual ICodec_ScanlineDecoder*     CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
112             int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows);
113     FX_BOOL             Encode(FX_LPCBYTE src_buf, int width, int height, int pitch, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
114 };
115 class CCodec_FlateModule : public ICodec_FlateModule
116 {
117 public:
118     virtual ICodec_ScanlineDecoder*     CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
119             int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns);
120     virtual FX_DWORD FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,
121                                       int predictor, int Colors, int BitsPerComponent, int Columns,
122                                       FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
123     virtual FX_BOOL Encode(const FX_BYTE* src_buf, FX_DWORD src_size,
124                            int predictor, int Colors, int BitsPerComponent, int Columns,
125                            FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
126     virtual FX_BOOL             Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
127 };
128 class CCodec_JpegModule : public ICodec_JpegModule
129 {
130 public:
131     CCodec_JpegModule() : m_pExtProvider(NULL) {}
132     void SetPovider(IFX_JpegProvider* pJP)
133     {
134         m_pExtProvider = pJP;
135     }
136     ICodec_ScanlineDecoder*     CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,
137                                           int width, int height, int nComps, FX_BOOL ColorTransform);
138     FX_BOOL             LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,
139                          int& num_components, int& bits_per_components, FX_BOOL& color_transform,
140                          FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length);
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);
142     virtual void*               Start();
143     virtual void                Finish(void* pContext);
144     virtual void                Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size);
145     virtual int                 ReadHeader(void* pContext, int* width, int* height, int* nComps, CFX_DIBAttribute* pAttribute = NULL);\r
146     virtual FX_BOOL             StartScanline(void* pContext, int down_scale);
147     virtual FX_BOOL             ReadScanline(void* pContext, FX_LPBYTE dest_buf);
148     virtual FX_DWORD    GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr);
149 protected:
150     IFX_JpegProvider* m_pExtProvider;
151 };
152 #define PNG_ERROR_SIZE 256\r
153 class CCodec_PngModule : public ICodec_PngModule\r
154 {\r
155 public:\r
156     CCodec_PngModule()\r
157     {\r
158         FXSYS_memset8(m_szLastError, '\0', PNG_ERROR_SIZE);\r
159     }\r
160 \r
161     virtual void*               Start(void* pModule);\r
162     virtual void                Finish(void* pContext);\r
163     virtual FX_BOOL             Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_DIBAttribute* pAttribute);\r
164 protected:\r
165     FX_CHAR                             m_szLastError[PNG_ERROR_SIZE];\r
166 };\r
167 class CCodec_GifModule : public ICodec_GifModule\r
168 {\r
169 public:\r
170     CCodec_GifModule()\r
171     {\r
172         FXSYS_memset8(m_szLastError, '\0', 256);\r
173     }\r
174     virtual void*               Start(void* pModule);\r
175     virtual void                Finish(void* pContext);\r
176     virtual FX_DWORD    GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr);\r
177     virtual void                Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size);\r
178 \r
179     virtual FX_INT32    ReadHeader(void* pContext, int* width, int* height,\r
180                                    int* pal_num, void** pal_pp, int* bg_index, CFX_DIBAttribute* pAttribute);\r
181 \r
182     virtual FX_INT32    LoadFrameInfo(void* pContext, int* frame_num);\r
183 \r
184     virtual FX_INT32    LoadFrame(void* pContext, int frame_num, CFX_DIBAttribute* pAttribute);\r
185 \r
186 protected:\r
187     FX_CHAR                             m_szLastError[256];\r
188 };\r
189 class CCodec_BmpModule : public ICodec_BmpModule\r
190 {\r
191 public:\r
192     CCodec_BmpModule()\r
193     {\r
194         FXSYS_memset8(m_szLastError, '\0', 256);\r
195     }\r
196     virtual void*               Start(void* pModule);\r
197     virtual void                Finish(void* pContext);\r
198     virtual FX_DWORD    GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr);\r
199     virtual void                Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size);\r
200     virtual FX_INT32    ReadHeader(void* pContext, FX_INT32* width, FX_INT32* height, FX_BOOL* tb_flag, FX_INT32* components, FX_INT32* pal_num, FX_DWORD** pal_pp, CFX_DIBAttribute* pAttribute);\r
201     virtual FX_INT32    LoadImage(void* pContext);\r
202 \r
203 protected:\r
204     FX_CHAR                             m_szLastError[256];\r
205 };\r
206 class CCodec_IccModule : public ICodec_IccModule
207 {
208 public:
209     virtual IccCS                       GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize);
210     virtual IccCS                       GetProfileCS(IFX_FileRead* pFile);
211     virtual FX_LPVOID           CreateTransform(ICodec_IccModule::IccParam* pInputParam,
212                                             ICodec_IccModule::IccParam* pOutputParam,
213                                             ICodec_IccModule::IccParam* pProofParam = NULL,
214                                             FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,
215                                             FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,
216                                             FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,
217                                             FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING
218                                       );
219     virtual FX_LPVOID           CreateTransform_sRGB(FX_LPCBYTE pProfileData, FX_DWORD dwProfileSize, FX_INT32& nComponents, FX_INT32 intent = 0,
220             FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT);
221     virtual FX_LPVOID           CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, FX_DWORD dwSrcProfileSize, FX_INT32& nSrcComponents,
222             FX_LPCBYTE pDstProfileData, FX_DWORD dwDstProfileSize, FX_INT32 intent = 0,
223             FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,
224             FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT
225                                            );
226     virtual void                        DestroyTransform(FX_LPVOID pTransform);
227     virtual void                        Translate(FX_LPVOID pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues);
228     virtual void                        TranslateScanline(FX_LPVOID pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels);
229     virtual void                        SetComponents(FX_DWORD nComponents) {m_nComponents = nComponents;}
230     virtual ~CCodec_IccModule();
231 protected:
232     CFX_MapByteStringToPtr              m_MapTranform;
233     CFX_MapByteStringToPtr              m_MapProfile;
234     FX_DWORD                            m_nComponents;
235     typedef enum {
236         Icc_CLASS_INPUT = 0,
237         Icc_CLASS_OUTPUT,
238         Icc_CLASS_PROOF,
239         Icc_CLASS_MAX
240     } Icc_CLASS;
241     FX_LPVOID           CreateProfile(ICodec_IccModule::IccParam* pIccParam, Icc_CLASS ic, CFX_BinaryBuf* pTransformKey);
242 };
243 class CCodec_JpxModule : public ICodec_JpxModule
244 {
245 public:
246     CCodec_JpxModule();
247     void*               CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_BOOL useColorSpace = FALSE);
248     void                GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,
249                              FX_DWORD& codestream_nComps, FX_DWORD& output_nComps);
250     FX_BOOL             Decode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets);
251     void                DestroyDecoder(void* ctx);
252 };
253 class CCodec_TiffModule : public ICodec_TiffModule\r
254 {\r
255 public:\r
256     virtual FX_LPVOID   CreateDecoder(IFX_FileRead* file_ptr);\r
257     virtual void                GetFrames(FX_LPVOID ctx, FX_INT32& frames);\r
258     virtual FX_BOOL             LoadFrameInfo(FX_LPVOID ctx, FX_INT32 frame, FX_DWORD& width, FX_DWORD& height, FX_DWORD& comps, FX_DWORD& bpc, CFX_DIBAttribute* pAttribute = NULL);\r
259     virtual FX_BOOL             Decode(FX_LPVOID ctx, class CFX_DIBitmap* pDIBitmap);\r
260     virtual void                DestroyDecoder(FX_LPVOID ctx);\r
261 };\r
262 #include "../jbig2/JBig2_Context.h"
263 class CPDF_Jbig2Interface : public CFX_Object, public CJBig2_Module
264 {
265 public:
266     virtual void *JBig2_Malloc(FX_DWORD dwSize)
267     {
268         return FX_Alloc(FX_BYTE, dwSize);
269     }
270     virtual void *JBig2_Malloc2(FX_DWORD num, FX_DWORD dwSize)
271     {
272         if (dwSize && num >= UINT_MAX / dwSize) {
273             return NULL;
274         }
275         return FX_Alloc(FX_BYTE, num * dwSize);
276     }
277     virtual void *JBig2_Malloc3(FX_DWORD num, FX_DWORD dwSize, FX_DWORD dwSize2)
278     {
279         if (dwSize2 && dwSize >= UINT_MAX / dwSize2) {
280             return NULL;
281         }
282         FX_DWORD size = dwSize2 * dwSize;
283         if (size && num >= UINT_MAX / size) {
284             return NULL;
285         }
286         return FX_Alloc(FX_BYTE, num * size);
287     }
288     virtual void *JBig2_Realloc(FX_LPVOID pMem, FX_DWORD dwSize)
289     {
290         return FX_Realloc(FX_BYTE, pMem, dwSize);
291     }
292     virtual void JBig2_Free(FX_LPVOID pMem)
293     {
294         FX_Free(pMem);
295     }
296 };
297 class CCodec_Jbig2Context : public CFX_Object
298 {
299 public:
300     CCodec_Jbig2Context();
301     ~CCodec_Jbig2Context() {};
302     IFX_FileRead* m_file_ptr;
303     FX_DWORD m_width;
304     FX_DWORD m_height;
305     FX_LPBYTE m_src_buf;
306     FX_DWORD m_src_size;
307     FX_LPCBYTE m_global_data;
308     FX_DWORD m_global_size;
309     FX_LPBYTE m_dest_buf;
310     FX_DWORD m_dest_pitch;
311     FX_BOOL     m_bFileReader;
312     IFX_Pause* m_pPause;
313     CJBig2_Context* m_pContext;
314     CJBig2_Image* m_dest_image;
315 };
316 class CCodec_Jbig2Module : public ICodec_Jbig2Module
317 {
318 public:
319     CCodec_Jbig2Module() {};
320     ~CCodec_Jbig2Module();
321     FX_BOOL             Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
322                        FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch);
323     FX_BOOL             Decode(IFX_FileRead* file_ptr,
324                        FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf);
325     void*                               CreateJbig2Context();
326     FXCODEC_STATUS              StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
327                                     FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause);
328
329     FXCODEC_STATUS              StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,
330                                     FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause);
331     FXCODEC_STATUS              ContinueDecode(void* pJbig2Context, IFX_Pause* pPause);
332     void                                DestroyJbig2Context(void* pJbig2Context);
333     CPDF_Jbig2Interface m_Module;
334 private:
335 };
336 class CFX_DIBAttributeExif : public IFX_DIBAttributeExif\r
337 {\r
338 public:\r
339     CFX_DIBAttributeExif();\r
340     ~CFX_DIBAttributeExif();\r
341     virtual FX_BOOL             GetInfo(FX_WORD tag, FX_LPVOID val);\r
342 \r
343     FX_BOOL ParseExif(CFX_MapPtrTemplate<FX_DWORD, FX_LPBYTE>* pHead, FX_LPBYTE data, FX_DWORD len, CFX_MapPtrTemplate<FX_DWORD, FX_LPBYTE>* pVal);\r
344 \r
345     typedef FX_WORD (*_Read2Bytes)(FX_LPBYTE data);\r
346     typedef FX_DWORD (*_Read4Bytes)(FX_LPBYTE data);\r
347     FX_LPBYTE ParseExifIFH(FX_LPBYTE data, FX_DWORD len, _Read2Bytes* pReadWord, _Read4Bytes* pReadDword);\r
348     FX_BOOL ParseExifIFD(CFX_MapPtrTemplate<FX_DWORD, FX_LPBYTE>* pMap, FX_LPBYTE data, FX_DWORD len);\r
349 \r
350     FX_LPBYTE                   m_pExifData;\r
351 \r
352     FX_DWORD                    m_dwExifDataLen;\r
353 \r
354     void                                clear();\r
355     _Read2Bytes m_readWord;\r
356     _Read4Bytes m_readDword;\r
357     CFX_MapPtrTemplate<FX_DWORD, FX_LPBYTE> m_TagHead;\r
358     CFX_MapPtrTemplate<FX_DWORD, FX_LPBYTE> m_TagVal;\r
359 };\r