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