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