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