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