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 "../../../include/fxcodec/fx_codec.h"
14 #include "../jbig2/JBig2_Context.h"
15 #include "../fx_libopenjpeg/libopenjpeg20/openjpeg.h"  // For OPJ_SIZE_T.
16 
17 class CCodec_BasicModule : public ICodec_BasicModule
18 {
19 public:
20     virtual FX_BOOL	RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
21                                     FX_DWORD& dest_size);
22     virtual FX_BOOL	A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
23                               FX_DWORD& dest_size);
24     virtual ICodec_ScanlineDecoder*	CreateRunLengthDecoder(FX_LPCBYTE 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     FX_BYTE		m_Data;
31 };
32 class CCodec_ScanlineDecoder : public ICodec_ScanlineDecoder
33 {
34 public:
35 
36     CCodec_ScanlineDecoder();
37 
38     virtual ~CCodec_ScanlineDecoder();
39 
GetSrcOffset()40     virtual FX_DWORD	GetSrcOffset()
41     {
42         return -1;
43     }
44 
45     virtual void		DownScale(int dest_width, int dest_height);
46 
47     FX_LPBYTE			GetScanline(int line);
48 
49     FX_BOOL				SkipToScanline(int line, IFX_Pause* pPause);
50 
GetWidth()51     int					GetWidth()
52     {
53         return m_OutputWidth;
54     }
55 
GetHeight()56     int					GetHeight()
57     {
58         return m_OutputHeight;
59     }
60 
CountComps()61     int					CountComps()
62     {
63         return m_nComps;
64     }
65 
GetBPC()66     int					GetBPC()
67     {
68         return m_bpc;
69     }
70 
IsColorTransformed()71     FX_BOOL				IsColorTransformed()
72     {
73         return m_bColorTransformed;
74     }
75 
ClearImageData()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     FX_LPBYTE			ReadNextLine();
104 
105     virtual FX_BOOL		v_Rewind() = 0;
106 
107     virtual FX_LPBYTE	v_GetNextLine() = 0;
108 
109     virtual void		v_DownScale(int dest_width, int dest_height) = 0;
110 
111     int					m_NextLine;
112 
113     FX_LPBYTE			m_pLastScanline;
114 
115     CCodec_ImageDataCache*	m_pDataCache;
116 };
117 class CCodec_FaxModule : public ICodec_FaxModule
118 {
119 public:
120     virtual ICodec_ScanlineDecoder*	CreateDecoder(FX_LPCBYTE 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(FX_LPCBYTE src_buf, int width, int height, int pitch, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
123 };
124 class CCodec_FlateModule : public ICodec_FlateModule
125 {
126 public:
127     virtual ICodec_ScanlineDecoder*	CreateDecoder(FX_LPCBYTE 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 FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,
130                                       int predictor, int Colors, int BitsPerComponent, int Columns,
131                                       FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
132     virtual FX_BOOL Encode(const FX_BYTE* src_buf, FX_DWORD src_size,
133                            int predictor, int Colors, int BitsPerComponent, int Columns,
134                            FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
135     virtual FX_BOOL		Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
136 };
137 class CCodec_JpegModule : public ICodec_JpegModule
138 {
139 public:
CCodec_JpegModule()140     CCodec_JpegModule() : m_pExtProvider(NULL) {}
SetPovider(IFX_JpegProvider * pJP)141     void SetPovider(IFX_JpegProvider* pJP)
142     {
143         m_pExtProvider = pJP;
144     }
145     ICodec_ScanlineDecoder*	CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,
146                                           int width, int height, int nComps, FX_BOOL ColorTransform);
147     FX_BOOL		LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,
148                          int& num_components, int& bits_per_components, FX_BOOL& color_transform,
149                          FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length);
150     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);
151     virtual void*		Start();
152     virtual void		Finish(void* pContext);
153     virtual void		Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size);
154     virtual int			ReadHeader(void* pContext, int* width, int* height, int* nComps);
155     virtual FX_BOOL		StartScanline(void* pContext, int down_scale);
156     virtual FX_BOOL		ReadScanline(void* pContext, FX_LPBYTE dest_buf);
157     virtual FX_DWORD	GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr);
158 protected:
159     IFX_JpegProvider* m_pExtProvider;
160 };
161 class CCodec_IccModule : public ICodec_IccModule
162 {
163 public:
164     virtual IccCS			GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize);
165     virtual IccCS			GetProfileCS(IFX_FileRead* pFile);
166     virtual FX_LPVOID		CreateTransform(ICodec_IccModule::IccParam* pInputParam,
167                                             ICodec_IccModule::IccParam* pOutputParam,
168                                             ICodec_IccModule::IccParam* pProofParam = NULL,
169                                             FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,
170                                             FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,
171                                             FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,
172                                             FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING
173                                       );
174     virtual FX_LPVOID		CreateTransform_sRGB(FX_LPCBYTE pProfileData, FX_DWORD dwProfileSize, FX_INT32& nComponents, FX_INT32 intent = 0,
175             FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT);
176     virtual FX_LPVOID		CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, FX_DWORD dwSrcProfileSize, FX_INT32& nSrcComponents,
177             FX_LPCBYTE pDstProfileData, FX_DWORD dwDstProfileSize, FX_INT32 intent = 0,
178             FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,
179             FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT
180                                            );
181     virtual void			DestroyTransform(FX_LPVOID pTransform);
182     virtual void			Translate(FX_LPVOID pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues);
183     virtual void			TranslateScanline(FX_LPVOID pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels);
SetComponents(FX_DWORD nComponents)184     virtual void                        SetComponents(FX_DWORD nComponents) {m_nComponents = nComponents;}
185     virtual ~CCodec_IccModule();
186 protected:
187     CFX_MapByteStringToPtr		m_MapTranform;
188     CFX_MapByteStringToPtr		m_MapProfile;
189     FX_DWORD                            m_nComponents;
190     typedef enum {
191         Icc_CLASS_INPUT = 0,
192         Icc_CLASS_OUTPUT,
193         Icc_CLASS_PROOF,
194         Icc_CLASS_MAX
195     } Icc_CLASS;
196     FX_LPVOID		CreateProfile(ICodec_IccModule::IccParam* pIccParam, Icc_CLASS ic, CFX_BinaryBuf* pTransformKey);
197 };
198 class CCodec_JpxModule : public ICodec_JpxModule
199 {
200 public:
201     CCodec_JpxModule();
202     void*		CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_BOOL useColorSpace = FALSE);
203     void		GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,
204                              FX_DWORD& codestream_nComps, FX_DWORD& output_nComps);
205     FX_BOOL		Decode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets);
206     void		DestroyDecoder(void* ctx);
207 };
208 class CPDF_Jbig2Interface : public CJBig2_Module
209 {
210 public:
JBig2_Malloc(FX_DWORD dwSize)211     virtual void *JBig2_Malloc(FX_DWORD dwSize)
212     {
213         return FX_Alloc(FX_BYTE, dwSize);
214     }
JBig2_Malloc2(FX_DWORD num,FX_DWORD dwSize)215     virtual void *JBig2_Malloc2(FX_DWORD num, FX_DWORD dwSize)
216     {
217         if (dwSize && num >= UINT_MAX / dwSize) {
218             return NULL;
219         }
220         return FX_Alloc(FX_BYTE, num * dwSize);
221     }
JBig2_Malloc3(FX_DWORD num,FX_DWORD dwSize,FX_DWORD dwSize2)222     virtual void *JBig2_Malloc3(FX_DWORD num, FX_DWORD dwSize, FX_DWORD dwSize2)
223     {
224         if (dwSize2 && dwSize >= UINT_MAX / dwSize2) {
225             return NULL;
226         }
227         FX_DWORD size = dwSize2 * dwSize;
228         if (size && num >= UINT_MAX / size) {
229             return NULL;
230         }
231         return FX_Alloc(FX_BYTE, num * size);
232     }
JBig2_Realloc(FX_LPVOID pMem,FX_DWORD dwSize)233     virtual void *JBig2_Realloc(FX_LPVOID pMem, FX_DWORD dwSize)
234     {
235         return FX_Realloc(FX_BYTE, pMem, dwSize);
236     }
JBig2_Free(FX_LPVOID pMem)237     virtual void JBig2_Free(FX_LPVOID pMem)
238     {
239         FX_Free(pMem);
240     }
241 };
242 class CCodec_Jbig2Context
243 {
244 public:
245     CCodec_Jbig2Context();
~CCodec_Jbig2Context()246     ~CCodec_Jbig2Context() {};
247     IFX_FileRead* m_file_ptr;
248     FX_DWORD m_width;
249     FX_DWORD m_height;
250     FX_LPBYTE m_src_buf;
251     FX_DWORD m_src_size;
252     FX_LPCBYTE m_global_data;
253     FX_DWORD m_global_size;
254     FX_LPBYTE m_dest_buf;
255     FX_DWORD m_dest_pitch;
256     FX_BOOL	m_bFileReader;
257     IFX_Pause* m_pPause;
258     CJBig2_Context* m_pContext;
259     CJBig2_Image* m_dest_image;
260 };
261 class CCodec_Jbig2Module : public ICodec_Jbig2Module
262 {
263 public:
CCodec_Jbig2Module()264     CCodec_Jbig2Module() {};
265     ~CCodec_Jbig2Module();
266     FX_BOOL		Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
267                        FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch);
268     FX_BOOL		Decode(IFX_FileRead* file_ptr,
269                        FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf);
270     void*				CreateJbig2Context();
271     FXCODEC_STATUS		StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
272                                     FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause);
273 
274     FXCODEC_STATUS		StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,
275                                     FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause);
276     FXCODEC_STATUS		ContinueDecode(void* pJbig2Context, IFX_Pause* pPause);
277     void				DestroyJbig2Context(void* pJbig2Context);
278     CPDF_Jbig2Interface	m_Module;
279     std::list<CJBig2_CachePair> m_SymbolDictCache;
280 private:
281 };
282 
283 struct DecodeData {
284 public:
DecodeDataDecodeData285     DecodeData(unsigned char* src_data, OPJ_SIZE_T src_size) :
286         src_data(src_data), src_size(src_size), offset(0) {
287     }
288     unsigned char* src_data;
289     OPJ_SIZE_T     src_size;
290     OPJ_SIZE_T     offset;
291 };
292 
293 /* Wrappers for C-style callbacks. */
294 OPJ_SIZE_T opj_read_from_memory (void* p_buffer, OPJ_SIZE_T nb_bytes,  void* p_user_data);
295 OPJ_SIZE_T opj_write_from_memory (void* p_buffer, OPJ_SIZE_T nb_bytes, void* p_user_data);
296 OPJ_OFF_T opj_skip_from_memory (OPJ_OFF_T nb_bytes, void* p_user_data);
297 OPJ_BOOL opj_seek_from_memory (OPJ_OFF_T nb_bytes, void* p_user_data);
298 
299 #endif  // CORE_SRC_FXCODEC_CODEC_CODEC_INT_H_
300