e8faf3f78f8d514cf7d260a67117cab7e9d4fc0c
[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 "../fxcrt/fx_basic.h"
11 #include "fx_codec_def.h"
12 #include "fx_codec_provider.h"
13
14 class CFX_DIBSource;
15 class ICodec_ScanlineDecoder;
16 class ICodec_BasicModule;
17 class ICodec_FaxModule;
18 class ICodec_JpegModule;
19 class ICodec_JpxModule;
20 class ICodec_Jbig2Module;
21 class ICodec_IccModule;
22 class ICodec_FlateModule;
23 class ICodec_Jbig2Encoder;
24 class ICodec_ScanlineDecoder;
25 class CCodec_ModuleMgr
26 {
27 public:
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();
41 protected:
42     CCodec_ModuleMgr();
43     ~CCodec_ModuleMgr();
44 public:
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     }
73 protected:
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 };
83 class ICodec_BasicModule
84 {
85 public:
86
87     virtual ~ICodec_BasicModule() {}
88     virtual FX_BOOL     RunLengthEncode(const uint8_t* src_buf, FX_DWORD src_size, uint8_t*& dest_buf,
89                                     FX_DWORD& dest_size) = 0;
90     virtual FX_BOOL     A85Encode(const uint8_t* src_buf, FX_DWORD src_size, uint8_t*& dest_buf,
91                               FX_DWORD& dest_size) = 0;
92     virtual ICodec_ScanlineDecoder*     CreateRunLengthDecoder(const uint8_t* src_buf, FX_DWORD src_size, int width, int height,
93             int nComps, int bpc) = 0;
94 };
95 class ICodec_ScanlineDecoder
96 {
97 public:
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 uint8_t*    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 };
121 class ICodec_FlateModule
122 {
123 public:
124
125     virtual ~ICodec_FlateModule() {}
126     virtual ICodec_ScanlineDecoder*     CreateDecoder(const uint8_t* 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 uint8_t* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,
129                                          int predictor, int Colors, int BitsPerComponent, int Columns,
130                                          FX_DWORD estimated_size, uint8_t*& dest_buf, FX_DWORD& dest_size) = 0;
131     virtual FX_BOOL             Encode(const uint8_t* src_buf, FX_DWORD src_size,
132                                int predictor, int Colors, int BitsPerComponent, int Columns,
133                                uint8_t*& dest_buf, FX_DWORD& dest_size) = 0;
134     virtual FX_BOOL             Encode(const uint8_t* src_buf, FX_DWORD src_size, uint8_t*& dest_buf, FX_DWORD& dest_size) = 0;
135 };
136 class ICodec_FaxModule
137 {
138 public:
139
140     virtual ~ICodec_FaxModule() {}
141
142     virtual ICodec_ScanlineDecoder*     CreateDecoder(const uint8_t* 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(const uint8_t* src_buf, int width, int height, int pitch,
147                                uint8_t*& dest_buf, FX_DWORD& dest_size) = 0;
148 };
149 class ICodec_JpegModule
150 {
151 public:
152
153     virtual ~ICodec_JpegModule() {}
154
155     virtual void                SetPovider(IFX_JpegProvider* pJP) = 0;
156
157     virtual ICodec_ScanlineDecoder*     CreateDecoder(const uint8_t* src_buf, FX_DWORD src_size,
158             int width, int height, int nComps, FX_BOOL ColorTransform) = 0;
159
160     virtual FX_BOOL             LoadInfo(const uint8_t* src_buf, FX_DWORD src_size, int& width, int& height,
161                                  int& num_components, int& bits_per_components, FX_BOOL& color_transform,
162                                  uint8_t** icc_buf_ptr = NULL, FX_DWORD* icc_length = NULL) = 0;
163
164     virtual FX_BOOL             Encode(const class CFX_DIBSource* pSource, uint8_t*& dest_buf, FX_STRSIZE& dest_size, int quality = 75,
165                                const uint8_t* 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, const uint8_t* 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, uint8_t* dest_buf) = 0;
180
181
182     virtual FX_DWORD    GetAvailInput(void* pContext, uint8_t** avail_buf_ptr = NULL) = 0;
183 };
184 class ICodec_JpxModule
185 {
186 public:
187
188     virtual ~ICodec_JpxModule() {}
189
190     virtual void*       CreateDecoder(const uint8_t* src_buf, FX_DWORD src_size, FX_BOOL useColorSpace = FALSE) = 0;
191
192     virtual void                GetImageInfo(void* ctx, FX_DWORD& width, FX_DWORD& height,
193                                      FX_DWORD& codestream_nComps, FX_DWORD& output_nComps) = 0;
194
195     virtual FX_BOOL             Decode(void* ctx, uint8_t* dest_data, int pitch,
196                                FX_BOOL bTranslateColor, uint8_t* offsets) = 0;
197
198     virtual void                DestroyDecoder(void* ctx) = 0;
199 };
200 class ICodec_Jbig2Module
201 {
202 public:
203
204     virtual ~ICodec_Jbig2Module() {}
205
206     virtual FX_BOOL             Decode(FX_DWORD width, FX_DWORD height, const uint8_t* src_buf, FX_DWORD src_size,
207                                const uint8_t* global_data, FX_DWORD global_size, uint8_t* 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, uint8_t*& dest_buf) = 0;
211     virtual void*                               CreateJbig2Context() = 0;
212
213     virtual FXCODEC_STATUS              StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, const uint8_t* src_buf, FX_DWORD src_size,
214                                             const uint8_t* global_data, FX_DWORD global_size, uint8_t* 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, uint8_t*& 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 };
221 class ICodec_Jbig2Encoder
222 {
223 public:
224
225     virtual ~ICodec_Jbig2Encoder() {}
226 };
227 class ICodec_IccModule
228 {
229 public:
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         uint8_t*        pProfileData;
250         FX_DWORD        dwProfileSize;
251         double          Gamma;
252     } IccParam;
253
254     virtual ~ICodec_IccModule() {}
255
256     virtual IccCS                       GetProfileCS(const uint8_t* pProfileData, unsigned int dwProfileSize) = 0;
257
258     virtual IccCS                       GetProfileCS(IFX_FileRead* pFile) = 0;
259
260     virtual void*       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 void*       CreateTransform_sRGB(const uint8_t* pProfileData, FX_DWORD dwProfileSize, int32_t& nComponents, int32_t intent = 0,
271             FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT) = 0;
272
273     virtual void*       CreateTransform_CMYK(const uint8_t* pSrcProfileData, FX_DWORD dwSrcProfileSize, int32_t& nSrcComponents,
274             const uint8_t* pDstProfileData, FX_DWORD dwDstProfileSize, int32_t intent = 0,
275             FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,
276             FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT
277                                           ) = 0;
278
279     virtual void                        DestroyTransform(void* pTransform) = 0;
280
281     virtual void                        Translate(void* pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues) = 0;
282
283     virtual void                        TranslateScanline(void* pTransform, uint8_t* pDest, const uint8_t* pSrc, int pixels) = 0;
284     virtual void                        SetComponents(FX_DWORD nComponents) = 0;
285 };
286 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);
287 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);
288 FX_BOOL MD5ComputeID(const void* buf, FX_DWORD dwSize, uint8_t ID[16]);
289
290 #endif  // CORE_INCLUDE_FXCODEC_FX_CODEC_H_