Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[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 _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"
14 class CFX_DIBSource;
15 class ICodec_ScanlineDecoder;
16 class ICodec_ProgressiveDecoder;\r
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_PngModule;\r
26 class ICodec_GifModule;\r
27 class ICodec_BmpModule;\r
28 class ICodec_TiffModule;\r
29 class CFX_DIBAttribute;\r
30 class ICodec_ScanlineDecoder;
31 class CCodec_ModuleMgr : public CFX_Object
32 {
33 public:
34
35     static CCodec_ModuleMgr*    Create();
36
37     void                                Destroy();
38
39     void                                InitJbig2Decoder();
40
41     void                                InitJpxDecoder();
42
43
44     void                                InitIccDecoder();
45
46 \r
47     ICodec_ProgressiveDecoder*  CreateProgressiveDecoder();\r
48 \r
49     ICodec_Jbig2Encoder*                CreateJbig2Encoder();
50 protected:
51     CCodec_ModuleMgr();
52     ~CCodec_ModuleMgr();
53 public:
54     ICodec_BasicModule* GetBasicModule()
55     {
56         return m_pBasicModule;
57     }
58     ICodec_FaxModule*   GetFaxModule()
59     {
60         return m_pFaxModule;
61     }
62     ICodec_JpegModule*  GetJpegModule()
63     {
64         return m_pJpegModule;
65     }
66     ICodec_JpxModule*   GetJpxModule()
67     {
68         return m_pJpxModule;
69     }
70     ICodec_Jbig2Module* GetJbig2Module()
71     {
72         return m_pJbig2Module;
73     }
74     ICodec_IccModule*   GetIccModule()
75     {
76         return m_pIccModule;
77     }
78     ICodec_FlateModule* GetFlateModule()
79     {
80         return m_pFlateModule;
81     }
82     ICodec_PngModule*   GetPngModule()\r
83     {\r
84         return m_pPngModule;\r
85     }\r
86     ICodec_GifModule*   GetGifModule()\r
87     {\r
88         return m_pGifModule;\r
89     }\r
90     ICodec_BmpModule*   GetBmpModule()\r
91     {\r
92         return m_pBmpModule;\r
93     }\r
94     ICodec_TiffModule*  GetTiffModule()\r
95     {\r
96         return m_pTiffModule;\r
97     }\r
98 protected:
99     ICodec_BasicModule* m_pBasicModule;
100     ICodec_FaxModule*   m_pFaxModule;
101     ICodec_JpegModule*  m_pJpegModule;
102     ICodec_JpxModule*   m_pJpxModule;
103     ICodec_Jbig2Module* m_pJbig2Module;
104     ICodec_IccModule*   m_pIccModule;
105     ICodec_FlateModule* m_pFlateModule;
106     ICodec_PngModule*   m_pPngModule;\r
107     ICodec_GifModule*   m_pGifModule;\r
108     ICodec_BmpModule*   m_pBmpModule;\r
109     ICodec_TiffModule*  m_pTiffModule;\r
110
111 };
112 class ICodec_BasicModule : public CFX_Object
113 {
114 public:
115
116     virtual ~ICodec_BasicModule() {}
117     virtual FX_BOOL     RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
118                                     FX_DWORD& dest_size) = 0;
119     virtual FX_BOOL     A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
120                               FX_DWORD& dest_size) = 0;
121     virtual ICodec_ScanlineDecoder*     CreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
122             int nComps, int bpc) = 0;
123 };
124 class ICodec_ScanlineDecoder : public CFX_Object
125 {
126 public:
127
128     virtual ~ICodec_ScanlineDecoder() {}
129
130     virtual FX_DWORD    GetSrcOffset() = 0;
131
132     virtual void                DownScale(int dest_width, int dest_height) = 0;
133
134     virtual FX_LPBYTE   GetScanline(int line) = 0;
135
136     virtual FX_BOOL             SkipToScanline(int line, IFX_Pause* pPause) = 0;
137
138     virtual int                 GetWidth() = 0;
139
140     virtual int                 GetHeight() = 0;
141
142     virtual int                 CountComps() = 0;
143
144     virtual int                 GetBPC() = 0;
145
146     virtual FX_BOOL             IsColorTransformed() = 0;
147
148     virtual void                ClearImageData() = 0;
149 };
150 class ICodec_FlateModule : public CFX_Object
151 {
152 public:
153
154     virtual ~ICodec_FlateModule() {}
155     virtual ICodec_ScanlineDecoder*     CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
156             int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns) = 0;
157     virtual FX_DWORD    FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,
158                                          int predictor, int Colors, int BitsPerComponent, int Columns,
159                                          FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;
160     virtual FX_BOOL             Encode(const FX_BYTE* src_buf, FX_DWORD src_size,
161                                int predictor, int Colors, int BitsPerComponent, int Columns,
162                                FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;
163     virtual FX_BOOL             Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;
164 };
165 class ICodec_FaxModule : public CFX_Object
166 {
167 public:
168
169     virtual ~ICodec_FaxModule() {}
170
171     virtual ICodec_ScanlineDecoder*     CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
172             int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows) = 0;
173
174
175     virtual FX_BOOL             Encode(FX_LPCBYTE src_buf, int width, int height, int pitch,
176                                FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;
177 };
178 class ICodec_JpegModule : public CFX_Object
179 {
180 public:
181
182     virtual ~ICodec_JpegModule() {}
183
184     virtual void                SetPovider(IFX_JpegProvider* pJP) = 0;
185
186     virtual ICodec_ScanlineDecoder*     CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,
187             int width, int height, int nComps, FX_BOOL ColorTransform) = 0;
188
189     virtual FX_BOOL             LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,
190                                  int& num_components, int& bits_per_components, FX_BOOL& color_transform,
191                                  FX_LPBYTE* icc_buf_ptr = NULL, FX_DWORD* icc_length = NULL) = 0;
192
193     virtual FX_BOOL             Encode(const class CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality = 75,
194                                FX_LPCBYTE icc_buf = NULL, FX_DWORD icc_length = 0) = 0;
195
196     virtual void*               Start() = 0;
197
198     virtual void                Finish(void* pContext) = 0;
199
200     virtual void                Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size) = 0;
201
202     virtual int                 ReadHeader(void* pContext, int* width, int* height, int* nComps, CFX_DIBAttribute* pAttribute = NULL) = 0;\r
203
204
205     virtual int                 StartScanline(void* pContext, int down_scale) = 0;
206
207
208     virtual FX_BOOL             ReadScanline(void* pContext, FX_LPBYTE dest_buf) = 0;
209
210
211     virtual FX_DWORD    GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr = NULL) = 0;
212 };
213 class ICodec_JpxModule : public CFX_Object
214 {
215 public:
216
217     virtual ~ICodec_JpxModule() {}
218
219     virtual FX_LPVOID   CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_BOOL useColorSpace = FALSE) = 0;
220
221     virtual void                GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,
222                                      FX_DWORD& codestream_nComps, FX_DWORD& output_nComps) = 0;
223
224     virtual FX_BOOL             Decode(FX_LPVOID ctx, FX_LPBYTE dest_data, int pitch,
225                                FX_BOOL bTranslateColor, FX_LPBYTE offsets) = 0;
226
227     virtual void                DestroyDecoder(FX_LPVOID ctx) = 0;
228 };
229 class ICodec_PngModule : public CFX_Object\r
230 {\r
231 public:\r
232 \r
233     virtual ~ICodec_PngModule() {}\r
234 \r
235     virtual void*               Start(void* pModule) = 0;\r
236 \r
237     virtual void                Finish(void* pContext) = 0;\r
238 \r
239     virtual FX_BOOL             Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_DIBAttribute* pAttribute = NULL) = 0;\r
240 \r
241     FX_BOOL                             (*ReadHeaderCallback)(void* pModule, int width, int height, int bpc, int pass, int* color_type, double* gamma);\r
242 \r
243     FX_BOOL                             (*AskScanlineBufCallback)(void* pModule, int line, FX_LPBYTE& src_buf);\r
244 \r
245     void                                (*FillScanlineBufCompletedCallback)(void* pModule, int pass, int line);\r
246 };\r
247 class ICodec_GifModule : public CFX_Object\r
248 {\r
249 public:\r
250 \r
251     virtual ~ICodec_GifModule() {}\r
252 \r
253     virtual void*               Start(void* pModule) = 0;\r
254 \r
255     virtual void                Finish(void* pContext) = 0;\r
256 \r
257     virtual FX_DWORD    GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr = NULL) = 0;\r
258 \r
259     virtual void                Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size) = 0;\r
260 \r
261     virtual FX_INT32    ReadHeader(void* pContext, int* width, int* height,\r
262                                    int* pal_num, void** pal_pp, int* bg_index, CFX_DIBAttribute* pAttribute = NULL) = 0;\r
263 \r
264     virtual FX_INT32    LoadFrameInfo(void* pContext, int* frame_num) = 0;\r
265 \r
266     void                                (*RecordCurrentPositionCallback)(void* pModule, FX_DWORD& cur_pos);\r
267 \r
268     FX_LPBYTE                   (*AskLocalPaletteBufCallback)(void* pModule, FX_INT32 frame_num, FX_INT32 pal_size);\r
269 \r
270     virtual FX_INT32    LoadFrame(void* pContext, int frame_num, CFX_DIBAttribute* pAttribute = NULL) = 0;\r
271 \r
272     FX_BOOL                             (*InputRecordPositionBufCallback)(void* pModule, FX_DWORD rcd_pos, const FX_RECT& img_rc,\r
273             FX_INT32 pal_num, void* pal_ptr,\r
274             FX_INT32 delay_time, FX_BOOL user_input,\r
275             FX_INT32 trans_index, FX_INT32 disposal_method, FX_BOOL interlace);\r
276 \r
277     void                                (*ReadScanlineCallback)(void* pModule, FX_INT32 row_num, FX_LPBYTE row_buf);\r
278 };\r
279 class ICodec_BmpModule : public CFX_Object\r
280 {\r
281 public:\r
282 \r
283     virtual ~ICodec_BmpModule() {}\r
284 \r
285     virtual void*               Start(void* pModule) = 0;\r
286 \r
287     virtual void                Finish(void* pContext) = 0;\r
288 \r
289     virtual FX_DWORD    GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr = NULL) = 0;\r
290 \r
291     virtual void                Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size) = 0;\r
292 \r
293     virtual FX_INT32    ReadHeader(void* pContext, FX_INT32* width, FX_INT32* height, FX_BOOL* tb_flag, FX_INT32* components,\r
294                                    int* pal_num, FX_DWORD** pal_pp, CFX_DIBAttribute* pAttribute = NULL) = 0;\r
295 \r
296     virtual FX_INT32    LoadImage(void* pContext) = 0;\r
297 \r
298     FX_BOOL                             (*InputImagePositionBufCallback)(void* pModule, FX_DWORD rcd_pos);\r
299 \r
300     void                                (*ReadScanlineCallback)(void* pModule, FX_INT32 row_num, FX_LPBYTE row_buf);\r
301 };\r
302 class ICodec_TiffModule : public CFX_Object\r
303 {\r
304 public:\r
305 \r
306     virtual ~ICodec_TiffModule() {}\r
307 \r
308     virtual FX_LPVOID   CreateDecoder(IFX_FileRead* file_ptr) = 0;\r
309 \r
310 \r
311     virtual void                GetFrames(FX_LPVOID ctx, FX_INT32& frames) = 0;\r
312 \r
313     virtual FX_BOOL             LoadFrameInfo(FX_LPVOID ctx, FX_INT32 frame, FX_DWORD& width, FX_DWORD& height, FX_DWORD& comps, FX_DWORD& bpc, CFX_DIBAttribute* pAttribute = NULL) = 0;\r
314 \r
315 \r
316     virtual FX_BOOL             Decode(FX_LPVOID ctx, class CFX_DIBitmap* pDIBitmap) = 0;\r
317 \r
318     virtual void                DestroyDecoder(FX_LPVOID ctx) = 0;\r
319 };\r
320 class ICodec_Jbig2Module : public CFX_Object
321 {
322 public:
323
324     virtual ~ICodec_Jbig2Module() {}
325
326     virtual FX_BOOL             Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
327                                FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch)  = 0;
328
329     virtual FX_BOOL             Decode(IFX_FileRead* file_ptr, FX_DWORD& width, FX_DWORD& height,
330                                FX_DWORD& pitch, FX_LPBYTE& dest_buf) = 0;
331     virtual void*                               CreateJbig2Context() = 0;
332
333     virtual FXCODEC_STATUS              StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
334                                             FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause) = 0;
335
336     virtual FXCODEC_STATUS              StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,
337                                             FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause) = 0;
338     virtual FXCODEC_STATUS              ContinueDecode(void* pJbig2Content, IFX_Pause* pPause) = 0;
339     virtual void                                DestroyJbig2Context(void* pJbig2Content) = 0;
340 };
341 class ICodec_ProgressiveDecoder : public CFX_Object\r
342 {\r
343 public:\r
344 \r
345     virtual ~ICodec_ProgressiveDecoder() {}\r
346 \r
347     virtual FXCODEC_STATUS              LoadImageInfo(IFX_FileRead* pFile, FXCODEC_IMAGE_TYPE imageType = FXCODEC_IMAGE_UNKNOWN, CFX_DIBAttribute* pAttribute = NULL) = 0;\r
348 \r
349     virtual FXCODEC_IMAGE_TYPE  GetType() = 0;\r
350 \r
351     virtual FX_INT32                    GetWidth() = 0;\r
352 \r
353     virtual FX_INT32                    GetHeight() = 0;\r
354 \r
355     virtual FX_INT32                    GetNumComponents() = 0;\r
356 \r
357     virtual FX_INT32                    GetBPC() = 0;\r
358 \r
359     virtual void                                SetClipBox(FX_RECT* clip) = 0;\r
360 \r
361     virtual FXCODEC_STATUS              GetFrames(FX_INT32& frames, IFX_Pause* pPause = NULL) = 0;\r
362 \r
363     virtual FXCODEC_STATUS              StartDecode(class CFX_DIBitmap* pDIBitmap,\r
364                                             FX_INT32 start_x, FX_INT32 start_y, FX_INT32 size_x, FX_INT32 size_y,\r
365                                             FX_INT32 frames = 0, FX_BOOL bInterpol = TRUE) = 0;\r
366 \r
367     virtual FXCODEC_STATUS              ContinueDecode(IFX_Pause* pPause = NULL) = 0;\r
368 };\r
369 class ICodec_Jbig2Encoder : public CFX_Object
370 {
371 public:
372
373     virtual ~ICodec_Jbig2Encoder() {}
374 };
375 class ICodec_IccModule : public CFX_Object
376 {
377 public:
378     typedef enum {
379         IccCS_Unknown = 0,
380         IccCS_XYZ,
381         IccCS_Lab,
382         IccCS_Luv,
383         IccCS_YCbCr,
384         IccCS_Yxy,
385         IccCS_Hsv,
386         IccCS_Hls,
387         IccCS_Gray,
388         IccCS_Rgb,
389         IccCS_Cmyk,
390         IccCS_Cmy
391     } IccCS;
392     typedef struct _IccParam {
393         FX_DWORD        Version;
394         IccCS           ColorSpace;
395         FX_DWORD        dwProfileType;
396         FX_DWORD        dwFormat;
397         FX_LPBYTE       pProfileData;
398         FX_DWORD        dwProfileSize;
399         double          Gamma;
400     } IccParam;
401
402     virtual ~ICodec_IccModule() {}
403
404     virtual IccCS                       GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize) = 0;
405
406     virtual IccCS                       GetProfileCS(IFX_FileRead* pFile) = 0;
407
408     virtual FX_LPVOID   CreateTransform(ICodec_IccModule::IccParam* pInputParam,
409                                         ICodec_IccModule::IccParam* pOutputParam,
410                                         ICodec_IccModule::IccParam* pProofParam = NULL,
411                                         FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,
412                                         FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,
413                                         FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,
414                                         FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING
415                                      ) = 0;
416
417
418     virtual FX_LPVOID   CreateTransform_sRGB(FX_LPCBYTE pProfileData, FX_DWORD dwProfileSize, FX_INT32& nComponents, FX_INT32 intent = 0,
419             FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT) = 0;
420
421     virtual FX_LPVOID   CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, FX_DWORD dwSrcProfileSize, FX_INT32& nSrcComponents,
422             FX_LPCBYTE pDstProfileData, FX_DWORD dwDstProfileSize, FX_INT32 intent = 0,
423             FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,
424             FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT
425                                           ) = 0;
426
427     virtual void                        DestroyTransform(FX_LPVOID pTransform) = 0;
428
429     virtual void                        Translate(FX_LPVOID pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues) = 0;
430
431     virtual void                        TranslateScanline(FX_LPVOID pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels) = 0;
432     virtual void                        SetComponents(FX_DWORD nComponents) = 0;
433 };
434 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);
435 void AdobeCMYK_to_sRGB1(FX_BYTE c, FX_BYTE m, FX_BYTE y, FX_BYTE k, FX_BYTE& R, FX_BYTE& G, FX_BYTE& B);
436 FX_BOOL MD5ComputeID(FX_LPCVOID buf, FX_DWORD dwSize, FX_BYTE ID[16]);
437 class CFX_DIBAttribute : public CFX_Object\r
438 {\r
439 public:\r
440     CFX_DIBAttribute();\r
441     ~CFX_DIBAttribute();\r
442 \r
443     FX_INT32            m_nXDPI;\r
444 \r
445     FX_INT32            m_nYDPI;\r
446 \r
447     FX_FLOAT            m_fAspectRatio;\r
448 \r
449     FX_WORD                     m_wDPIUnit;\r
450 \r
451     CFX_ByteString      m_strAuthor;\r
452 \r
453     FX_BYTE                     m_strTime[20];\r
454 \r
455     FX_INT32            m_nGifLeft;\r
456     FX_INT32            m_nGifTop;\r
457 \r
458     FX_DWORD*           m_pGifLocalPalette;\r
459 \r
460     FX_DWORD            m_nGifLocalPalNum;\r
461 \r
462     FX_INT32            m_nBmpCompressType;\r
463     class IFX_DIBAttributeExif* m_pExif;\r
464 };\r
465 class IFX_DIBAttributeExif : public CFX_Object\r
466 {\r
467 public:\r
468     virtual ~IFX_DIBAttributeExif() {};\r
469     virtual FX_BOOL             GetInfo(FX_WORD tag, FX_LPVOID val) = 0;\r
470 };\r
471 #endif