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