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 _FX_CODEC_H_
8#define _FX_CODEC_H_
9#ifndef _FXCRT_EXTENSION_
10#include "../fxcrt/fx_ext.h"
11#endif
12#include "fx_codec_def.h"
13#include "fx_codec_provider.h"
14class CFX_DIBSource;
15class ICodec_ScanlineDecoder;
16class ICodec_BasicModule;
17class ICodec_FaxModule;
18class ICodec_JpegModule;
19class ICodec_JpxModule;
20class ICodec_Jbig2Module;
21class ICodec_IccModule;
22class ICodec_FlateModule;
23class ICodec_Jbig2Encoder;
24class ICodec_ScanlineDecoder;
25class CCodec_ModuleMgr : public CFX_Object
26{
27public:
28
29    static CCodec_ModuleMgr*	Create();
30
31    void				Destroy();
32
33    void				InitJbig2Decoder();
34
35    void				InitJpxDecoder();
36
37
38    void				InitIccDecoder();
39
40    ICodec_Jbig2Encoder*		CreateJbig2Encoder();
41protected:
42    CCodec_ModuleMgr();
43    ~CCodec_ModuleMgr();
44public:
45    ICodec_BasicModule*	GetBasicModule()
46    {
47        return m_pBasicModule;
48    }
49    ICodec_FaxModule*	GetFaxModule()
50    {
51        return m_pFaxModule;
52    }
53    ICodec_JpegModule*	GetJpegModule()
54    {
55        return m_pJpegModule;
56    }
57    ICodec_JpxModule*	GetJpxModule()
58    {
59        return m_pJpxModule;
60    }
61    ICodec_Jbig2Module*	GetJbig2Module()
62    {
63        return m_pJbig2Module;
64    }
65    ICodec_IccModule*	GetIccModule()
66    {
67        return m_pIccModule;
68    }
69    ICodec_FlateModule*	GetFlateModule()
70    {
71        return m_pFlateModule;
72    }
73protected:
74    ICodec_BasicModule*	m_pBasicModule;
75    ICodec_FaxModule*	m_pFaxModule;
76    ICodec_JpegModule*	m_pJpegModule;
77    ICodec_JpxModule*	m_pJpxModule;
78    ICodec_Jbig2Module*	m_pJbig2Module;
79    ICodec_IccModule*	m_pIccModule;
80    ICodec_FlateModule*	m_pFlateModule;
81
82};
83class ICodec_BasicModule : public CFX_Object
84{
85public:
86
87    virtual ~ICodec_BasicModule() {}
88    virtual FX_BOOL	RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
89                                    FX_DWORD& dest_size) = 0;
90    virtual FX_BOOL	A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
91                              FX_DWORD& dest_size) = 0;
92    virtual ICodec_ScanlineDecoder*	CreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
93            int nComps, int bpc) = 0;
94};
95class ICodec_ScanlineDecoder : public CFX_Object
96{
97public:
98
99    virtual ~ICodec_ScanlineDecoder() {}
100
101    virtual FX_DWORD	GetSrcOffset() = 0;
102
103    virtual void		DownScale(int dest_width, int dest_height) = 0;
104
105    virtual FX_LPBYTE	GetScanline(int line) = 0;
106
107    virtual FX_BOOL		SkipToScanline(int line, IFX_Pause* pPause) = 0;
108
109    virtual int			GetWidth() = 0;
110
111    virtual int			GetHeight() = 0;
112
113    virtual int			CountComps() = 0;
114
115    virtual int			GetBPC() = 0;
116
117    virtual FX_BOOL		IsColorTransformed() = 0;
118
119    virtual void		ClearImageData() = 0;
120};
121class ICodec_FlateModule : public CFX_Object
122{
123public:
124
125    virtual ~ICodec_FlateModule() {}
126    virtual ICodec_ScanlineDecoder*	CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
127            int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns) = 0;
128    virtual FX_DWORD	FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,
129                                         int predictor, int Colors, int BitsPerComponent, int Columns,
130                                         FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;
131    virtual FX_BOOL		Encode(const FX_BYTE* src_buf, FX_DWORD src_size,
132                               int predictor, int Colors, int BitsPerComponent, int Columns,
133                               FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;
134    virtual FX_BOOL		Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;
135};
136class ICodec_FaxModule : public CFX_Object
137{
138public:
139
140    virtual ~ICodec_FaxModule() {}
141
142    virtual ICodec_ScanlineDecoder*	CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
143            int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows) = 0;
144
145
146    virtual FX_BOOL		Encode(FX_LPCBYTE src_buf, int width, int height, int pitch,
147                               FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;
148};
149class ICodec_JpegModule : public CFX_Object
150{
151public:
152
153    virtual ~ICodec_JpegModule() {}
154
155    virtual void		SetPovider(IFX_JpegProvider* pJP) = 0;
156
157    virtual ICodec_ScanlineDecoder*	CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,
158            int width, int height, int nComps, FX_BOOL ColorTransform) = 0;
159
160    virtual FX_BOOL		LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,
161                                 int& num_components, int& bits_per_components, FX_BOOL& color_transform,
162                                 FX_LPBYTE* icc_buf_ptr = NULL, FX_DWORD* icc_length = NULL) = 0;
163
164    virtual FX_BOOL		Encode(const class CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality = 75,
165                               FX_LPCBYTE icc_buf = NULL, FX_DWORD icc_length = 0) = 0;
166
167    virtual void*		Start() = 0;
168
169    virtual void		Finish(void* pContext) = 0;
170
171    virtual void		Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size) = 0;
172
173    virtual int			ReadHeader(void* pContext, int* width, int* height, int* nComps) = 0;
174
175
176    virtual int			StartScanline(void* pContext, int down_scale) = 0;
177
178
179    virtual FX_BOOL		ReadScanline(void* pContext, FX_LPBYTE dest_buf) = 0;
180
181
182    virtual FX_DWORD	GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr = NULL) = 0;
183};
184class ICodec_JpxModule : public CFX_Object
185{
186public:
187
188    virtual ~ICodec_JpxModule() {}
189
190    virtual FX_LPVOID 	CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_BOOL useColorSpace = FALSE) = 0;
191
192    virtual void		GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,
193                                     FX_DWORD& codestream_nComps, FX_DWORD& output_nComps) = 0;
194
195    virtual FX_BOOL		Decode(FX_LPVOID ctx, FX_LPBYTE dest_data, int pitch,
196                               FX_BOOL bTranslateColor, FX_LPBYTE offsets) = 0;
197
198    virtual void		DestroyDecoder(FX_LPVOID ctx) = 0;
199};
200class ICodec_Jbig2Module : public CFX_Object
201{
202public:
203
204    virtual ~ICodec_Jbig2Module() {}
205
206    virtual FX_BOOL		Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
207                               FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch)  = 0;
208
209    virtual FX_BOOL		Decode(IFX_FileRead* file_ptr, FX_DWORD& width, FX_DWORD& height,
210                               FX_DWORD& pitch, FX_LPBYTE& dest_buf) = 0;
211    virtual void*				CreateJbig2Context() = 0;
212
213    virtual FXCODEC_STATUS		StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
214                                            FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause) = 0;
215
216    virtual FXCODEC_STATUS		StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,
217                                            FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause) = 0;
218    virtual FXCODEC_STATUS		ContinueDecode(void* pJbig2Content, IFX_Pause* pPause) = 0;
219    virtual void				DestroyJbig2Context(void* pJbig2Content) = 0;
220};
221class ICodec_Jbig2Encoder : public CFX_Object
222{
223public:
224
225    virtual ~ICodec_Jbig2Encoder() {}
226};
227class ICodec_IccModule : public CFX_Object
228{
229public:
230    typedef enum {
231        IccCS_Unknown = 0,
232        IccCS_XYZ,
233        IccCS_Lab,
234        IccCS_Luv,
235        IccCS_YCbCr,
236        IccCS_Yxy,
237        IccCS_Hsv,
238        IccCS_Hls,
239        IccCS_Gray,
240        IccCS_Rgb,
241        IccCS_Cmyk,
242        IccCS_Cmy
243    } IccCS;
244    typedef struct _IccParam {
245        FX_DWORD	Version;
246        IccCS		ColorSpace;
247        FX_DWORD	dwProfileType;
248        FX_DWORD	dwFormat;
249        FX_LPBYTE	pProfileData;
250        FX_DWORD	dwProfileSize;
251        double		Gamma;
252    } IccParam;
253
254    virtual ~ICodec_IccModule() {}
255
256    virtual IccCS			GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize) = 0;
257
258    virtual IccCS			GetProfileCS(IFX_FileRead* pFile) = 0;
259
260    virtual FX_LPVOID	CreateTransform(ICodec_IccModule::IccParam* pInputParam,
261                                        ICodec_IccModule::IccParam* pOutputParam,
262                                        ICodec_IccModule::IccParam* pProofParam = NULL,
263                                        FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,
264                                        FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,
265                                        FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,
266                                        FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING
267                                     ) = 0;
268
269
270    virtual FX_LPVOID	CreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent = 0,
271            FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT) = 0;
272
273    virtual FX_LPVOID	CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,
274            FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent = 0,
275            FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,
276            FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT
277                                          ) = 0;
278
279    virtual void			DestroyTransform(FX_LPVOID pTransform) = 0;
280
281    virtual void			Translate(FX_LPVOID pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues) = 0;
282
283    virtual void			TranslateScanline(FX_LPVOID pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels) = 0;
284};
285void AdobeCMYK_to_sRGB(FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B);
286void AdobeCMYK_to_sRGB1(FX_BYTE c, FX_BYTE m, FX_BYTE y, FX_BYTE k, FX_BYTE& R, FX_BYTE& G, FX_BYTE& B);
287FX_BOOL MD5ComputeID(FX_LPCVOID buf, FX_DWORD dwSize, FX_BYTE ID[16]);
288#endif
289