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