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