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