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