78672e62ee43b0f8a184fd360044e7cf5945635e
[pdfium.git] / core / src / fxcodec / codec / codec_int.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 #include <limits.h>
8 class CCodec_BasicModule : public ICodec_BasicModule
9 {
10 public:
11     virtual FX_BOOL     RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
12                                     FX_DWORD& dest_size);
13     virtual FX_BOOL     A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
14                               FX_DWORD& dest_size);
15     virtual ICodec_ScanlineDecoder*     CreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
16             int nComps, int bpc);
17 };
18 struct CCodec_ImageDataCache {
19     int                 m_Width, m_Height;
20     int                 m_nCachedLines;
21     FX_BYTE             m_Data;
22 };
23 class CCodec_ScanlineDecoder : public ICodec_ScanlineDecoder
24 {
25 public:
26
27     CCodec_ScanlineDecoder();
28
29     virtual ~CCodec_ScanlineDecoder();
30
31     virtual FX_DWORD    GetSrcOffset()
32     {
33         return -1;
34     }
35
36     virtual void                DownScale(int dest_width, int dest_height);
37
38     FX_LPBYTE                   GetScanline(int line);
39
40     FX_BOOL                             SkipToScanline(int line, IFX_Pause* pPause);
41
42     int                                 GetWidth()
43     {
44         return m_OutputWidth;
45     }
46
47     int                                 GetHeight()
48     {
49         return m_OutputHeight;
50     }
51
52     int                                 CountComps()
53     {
54         return m_nComps;
55     }
56
57     int                                 GetBPC()
58     {
59         return m_bpc;
60     }
61
62     FX_BOOL                             IsColorTransformed()
63     {
64         return m_bColorTransformed;
65     }
66
67     void                                ClearImageData()
68     {
69         if (m_pDataCache) {
70             FX_Free(m_pDataCache);
71         }
72         m_pDataCache = NULL;
73     }
74 protected:
75
76     int                                 m_OrigWidth;
77
78     int                                 m_OrigHeight;
79
80     int                                 m_DownScale;
81
82     int                                 m_OutputWidth;
83
84     int                                 m_OutputHeight;
85
86     int                                 m_nComps;
87
88     int                                 m_bpc;
89
90     int                                 m_Pitch;
91
92     FX_BOOL                             m_bColorTransformed;
93
94     FX_LPBYTE                   ReadNextLine();
95
96     virtual FX_BOOL             v_Rewind() = 0;
97
98     virtual FX_LPBYTE   v_GetNextLine() = 0;
99
100     virtual void                v_DownScale(int dest_width, int dest_height) = 0;
101
102     int                                 m_NextLine;
103
104     FX_LPBYTE                   m_pLastScanline;
105
106     CCodec_ImageDataCache*      m_pDataCache;
107 };
108 class CCodec_FaxModule : public ICodec_FaxModule
109 {
110 public:
111     virtual ICodec_ScanlineDecoder*     CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
112             int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows);
113     FX_BOOL             Encode(FX_LPCBYTE src_buf, int width, int height, int pitch, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
114 };
115 class CCodec_FlateModule : public ICodec_FlateModule
116 {
117 public:
118     virtual ICodec_ScanlineDecoder*     CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
119             int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns);
120     virtual FX_DWORD FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,
121                                       int predictor, int Colors, int BitsPerComponent, int Columns,
122                                       FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
123     virtual FX_BOOL Encode(const FX_BYTE* src_buf, FX_DWORD src_size,
124                            int predictor, int Colors, int BitsPerComponent, int Columns,
125                            FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
126     virtual FX_BOOL             Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
127 };
128 class CCodec_JpegModule : public ICodec_JpegModule
129 {
130 public:
131     CCodec_JpegModule() : m_pExtProvider(NULL) {}
132     void SetPovider(IFX_JpegProvider* pJP)
133     {
134         m_pExtProvider = pJP;
135     }
136     ICodec_ScanlineDecoder*     CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,
137                                           int width, int height, int nComps, FX_BOOL ColorTransform);
138     FX_BOOL             LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,
139                          int& num_components, int& bits_per_components, FX_BOOL& color_transform,
140                          FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length);
141     FX_BOOL             Encode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length);
142     virtual void*               Start();
143     virtual void                Finish(void* pContext);
144     virtual void                Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size);
145     virtual int                 ReadHeader(void* pContext, int* width, int* height, int* nComps);
146     virtual FX_BOOL             StartScanline(void* pContext, int down_scale);
147     virtual FX_BOOL             ReadScanline(void* pContext, FX_LPBYTE dest_buf);
148     virtual FX_DWORD    GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr);
149 protected:
150     IFX_JpegProvider* m_pExtProvider;
151 };
152 class CCodec_IccModule : public ICodec_IccModule
153 {
154 public:
155     virtual IccCS                       GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize);
156     virtual IccCS                       GetProfileCS(IFX_FileRead* pFile);
157     virtual FX_LPVOID           CreateTransform(ICodec_IccModule::IccParam* pInputParam,
158                                             ICodec_IccModule::IccParam* pOutputParam,
159                                             ICodec_IccModule::IccParam* pProofParam = NULL,
160                                             FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,
161                                             FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,
162                                             FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,
163                                             FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING
164                                       );
165     virtual FX_LPVOID           CreateTransform_sRGB(FX_LPCBYTE pProfileData, FX_DWORD dwProfileSize, FX_INT32& nComponents, FX_INT32 intent = 0,
166             FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT);
167     virtual FX_LPVOID           CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, FX_DWORD dwSrcProfileSize, FX_INT32& nSrcComponents,
168             FX_LPCBYTE pDstProfileData, FX_DWORD dwDstProfileSize, FX_INT32 intent = 0,
169             FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,
170             FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT
171                                            );
172     virtual void                        DestroyTransform(FX_LPVOID pTransform);
173     virtual void                        Translate(FX_LPVOID pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues);
174     virtual void                        TranslateScanline(FX_LPVOID pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels);
175     virtual void                        SetComponents(FX_DWORD nComponents) {m_nComponents = nComponents;}
176     virtual ~CCodec_IccModule();
177 protected:
178     CFX_MapByteStringToPtr              m_MapTranform;
179     CFX_MapByteStringToPtr              m_MapProfile;
180     FX_DWORD                            m_nComponents;
181     typedef enum {
182         Icc_CLASS_INPUT = 0,
183         Icc_CLASS_OUTPUT,
184         Icc_CLASS_PROOF,
185         Icc_CLASS_MAX
186     } Icc_CLASS;
187     FX_LPVOID           CreateProfile(ICodec_IccModule::IccParam* pIccParam, Icc_CLASS ic, CFX_BinaryBuf* pTransformKey);
188 };
189 class CCodec_JpxModule : public ICodec_JpxModule
190 {
191 public:
192     CCodec_JpxModule();
193     void*               CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_BOOL useColorSpace = FALSE);
194     void                GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,
195                              FX_DWORD& codestream_nComps, FX_DWORD& output_nComps);
196     FX_BOOL             Decode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets);
197     void                DestroyDecoder(void* ctx);
198 };
199 #include "../jbig2/JBig2_Context.h"
200 class CPDF_Jbig2Interface : public CFX_Object, public CJBig2_Module
201 {
202 public:
203     virtual void *JBig2_Malloc(FX_DWORD dwSize)
204     {
205         return FX_Alloc(FX_BYTE, dwSize);
206     }
207     virtual void *JBig2_Malloc2(FX_DWORD num, FX_DWORD dwSize)
208     {
209         if (dwSize && num >= UINT_MAX / dwSize) {
210             return NULL;
211         }
212         return FX_Alloc(FX_BYTE, num * dwSize);
213     }
214     virtual void *JBig2_Malloc3(FX_DWORD num, FX_DWORD dwSize, FX_DWORD dwSize2)
215     {
216         if (dwSize2 && dwSize >= UINT_MAX / dwSize2) {
217             return NULL;
218         }
219         FX_DWORD size = dwSize2 * dwSize;
220         if (size && num >= UINT_MAX / size) {
221             return NULL;
222         }
223         return FX_Alloc(FX_BYTE, num * size);
224     }
225     virtual void *JBig2_Realloc(FX_LPVOID pMem, FX_DWORD dwSize)
226     {
227         return FX_Realloc(FX_BYTE, pMem, dwSize);
228     }
229     virtual void JBig2_Free(FX_LPVOID pMem)
230     {
231         FX_Free(pMem);
232     }
233 };
234 class CCodec_Jbig2Context : public CFX_Object
235 {
236 public:
237     CCodec_Jbig2Context();
238     ~CCodec_Jbig2Context() {};
239     IFX_FileRead* m_file_ptr;
240     FX_DWORD m_width;
241     FX_DWORD m_height;
242     FX_LPBYTE m_src_buf;
243     FX_DWORD m_src_size;
244     FX_LPCBYTE m_global_data;
245     FX_DWORD m_global_size;
246     FX_LPBYTE m_dest_buf;
247     FX_DWORD m_dest_pitch;
248     FX_BOOL     m_bFileReader;
249     IFX_Pause* m_pPause;
250     CJBig2_Context* m_pContext;
251     CJBig2_Image* m_dest_image;
252 };
253 class CCodec_Jbig2Module : public ICodec_Jbig2Module
254 {
255 public:
256     CCodec_Jbig2Module() {};
257     ~CCodec_Jbig2Module();
258     FX_BOOL             Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
259                        FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch);
260     FX_BOOL             Decode(IFX_FileRead* file_ptr,
261                        FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf);
262     void*                               CreateJbig2Context();
263     FXCODEC_STATUS              StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
264                                     FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause);
265
266     FXCODEC_STATUS              StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,
267                                     FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause);
268     FXCODEC_STATUS              ContinueDecode(void* pJbig2Context, IFX_Pause* pPause);
269     void                                DestroyJbig2Context(void* pJbig2Context);
270     CPDF_Jbig2Interface m_Module;
271 private:
272 };