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