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>
8class CCodec_BasicModule : public ICodec_BasicModule
9{
10public:
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};
18struct CCodec_ImageDataCache {
19    int			m_Width, m_Height;
20    int			m_nCachedLines;
21    FX_BYTE		m_Data;
22};
23class CCodec_ScanlineDecoder : public ICodec_ScanlineDecoder
24{
25public:
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    }
74protected:
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};
108class CCodec_FaxModule : public ICodec_FaxModule
109{
110public:
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};
115class CCodec_FlateModule : public ICodec_FlateModule
116{
117public:
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};
128class CCodec_JpegModule : public ICodec_JpegModule
129{
130public:
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);
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);
149protected:
150    IFX_JpegProvider* m_pExtProvider;
151};
152class CCodec_IccModule : public ICodec_IccModule
153{
154public:
155    virtual IccCS			GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize);
156    virtual IccCS			GetProfileCS(IFX_FileRead* pFile);
157    virtual FX_LPVOID		CreateTransform(ICodec_IccModule::IccParam* pInputParam,
158                                            ICodec_IccModule::IccParam* pOutputParam,
159                                            ICodec_IccModule::IccParam* pProofParam = NULL,
160                                            FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,
161                                            FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,
162                                            FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,
163                                            FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING
164                                      );
165    virtual FX_LPVOID		CreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent = 0,
166            FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT);
167    virtual FX_LPVOID		CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,
168            FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent = 0,
169            FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,
170            FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT
171                                           );
172    virtual void			DestroyTransform(FX_LPVOID pTransform);
173    virtual void			Translate(FX_LPVOID pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues);
174    virtual void			TranslateScanline(FX_LPVOID pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels);
175    virtual ~CCodec_IccModule();
176protected:
177    CFX_MapByteStringToPtr		m_MapTranform;
178    CFX_MapByteStringToPtr		m_MapProfile;
179    typedef enum {
180        Icc_CLASS_INPUT = 0,
181        Icc_CLASS_OUTPUT,
182        Icc_CLASS_PROOF,
183        Icc_CLASS_MAX
184    } Icc_CLASS;
185    FX_LPVOID		CreateProfile(ICodec_IccModule::IccParam* pIccParam, Icc_CLASS ic, CFX_BinaryBuf* pTransformKey);
186};
187class CCodec_JpxModule : public ICodec_JpxModule
188{
189public:
190    CCodec_JpxModule();
191    void*		CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_BOOL useColorSpace = FALSE);
192    void		GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,
193                             FX_DWORD& codestream_nComps, FX_DWORD& output_nComps);
194    FX_BOOL		Decode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets);
195    void		DestroyDecoder(void* ctx);
196};
197#include "../jbig2/JBig2_Context.h"
198class CPDF_Jbig2Interface : public CFX_Object, public CJBig2_Module
199{
200public:
201    virtual void *JBig2_Malloc(FX_DWORD dwSize)
202    {
203        return FX_Alloc(FX_BYTE, dwSize);
204    }
205    virtual void *JBig2_Malloc2(FX_DWORD num, FX_DWORD dwSize)
206    {
207        if (dwSize && num >= UINT_MAX / dwSize) {
208            return NULL;
209        }
210        return FX_Alloc(FX_BYTE, num * dwSize);
211    }
212    virtual void *JBig2_Malloc3(FX_DWORD num, FX_DWORD dwSize, FX_DWORD dwSize2)
213    {
214        if (dwSize2 && dwSize >= UINT_MAX / dwSize2) {
215            return NULL;
216        }
217        FX_DWORD size = dwSize2 * dwSize;
218        if (size && num >= UINT_MAX / size) {
219            return NULL;
220        }
221        return FX_Alloc(FX_BYTE, num * size);
222    }
223    virtual void *JBig2_Realloc(FX_LPVOID pMem, FX_DWORD dwSize)
224    {
225        return FX_Realloc(FX_BYTE, pMem, dwSize);
226    }
227    virtual void JBig2_Free(FX_LPVOID pMem)
228    {
229        FX_Free(pMem);
230    }
231};
232class CCodec_Jbig2Context : public CFX_Object
233{
234public:
235    CCodec_Jbig2Context();
236    ~CCodec_Jbig2Context() {};
237    IFX_FileRead* m_file_ptr;
238    FX_DWORD m_width;
239    FX_DWORD m_height;
240    FX_LPBYTE m_src_buf;
241    FX_DWORD m_src_size;
242    FX_LPCBYTE m_global_data;
243    FX_DWORD m_global_size;
244    FX_LPBYTE m_dest_buf;
245    FX_DWORD m_dest_pitch;
246    FX_BOOL	m_bFileReader;
247    IFX_Pause* m_pPause;
248    CJBig2_Context* m_pContext;
249    CJBig2_Image* m_dest_image;
250};
251class CCodec_Jbig2Module : public ICodec_Jbig2Module
252{
253public:
254    CCodec_Jbig2Module() {};
255    ~CCodec_Jbig2Module();
256    FX_BOOL		Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
257                       FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch);
258    FX_BOOL		Decode(IFX_FileRead* file_ptr,
259                       FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf);
260    void*				CreateJbig2Context();
261    FXCODEC_STATUS		StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
262                                    FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause);
263
264    FXCODEC_STATUS		StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,
265                                    FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause);
266    FXCODEC_STATUS		ContinueDecode(void* pJbig2Context, IFX_Pause* pPause);
267    void				DestroyJbig2Context(void* pJbig2Context);
268    CPDF_Jbig2Interface	m_Module;
269private:
270};
271