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. 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef CORE_FXCODEC_JBIG2_JBIG2_CONTEXT_H_ 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define CORE_FXCODEC_JBIG2_JBIG2_CONTEXT_H_ 9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <list> 11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <memory> 12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <utility> 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector> 14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_object.h" 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcodec/fx_codec_def.h" 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcodec/jbig2/JBig2_Page.h" 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcodec/jbig2/JBig2_Segment.h" 19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_safe_types.h" 20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CJBig2_ArithDecoder; 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CJBig2_GRDProc; 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CPDF_StreamAcc; 24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannclass IFX_PauseIndicator; 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Cache is keyed by the ObjNum of a stream and an index within the stream. 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannusing CJBig2_CacheKey = std::pair<uint32_t, uint32_t>; 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannusing CJBig2_CachePair = 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::pair<CJBig2_CacheKey, std::unique_ptr<CJBig2_SymbolDict>>; 30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define JBIG2_SUCCESS 0 32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define JBIG2_FAILED -1 33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define JBIG2_ERROR_TOO_SHORT -2 34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define JBIG2_ERROR_FATAL -3 35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define JBIG2_END_OF_PAGE 2 36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define JBIG2_END_OF_FILE 3 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define JBIG2_ERROR_LIMIT -6 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define JBIG2_MIN_SEGMENT_SIZE 11 39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannclass CJBig2_Context { 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann public: 42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CJBig2_Context(const RetainPtr<CPDF_StreamAcc>& pGlobalStream, 43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const RetainPtr<CPDF_StreamAcc>& pSrcStream, 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::list<CJBig2_CachePair>* pSymbolDictCache, 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bIsGlobal); 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ~CJBig2_Context(); 47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t getFirstPage(uint8_t* pBuf, 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t width, 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t height, 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t stride, 52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IFX_PauseIndicator* pPause); 53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t Continue(IFX_PauseIndicator* pPause); 55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FXCODEC_STATUS GetProcessingStatus() const { return m_ProcessingStatus; } 56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann private: 58d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t decodeSequential(IFX_PauseIndicator* pPause); 59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t decodeRandomFirstPage(IFX_PauseIndicator* pPause); 60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t decodeRandom(IFX_PauseIndicator* pPause); 61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CJBig2_Segment* findSegmentByNumber(uint32_t dwNumber); 63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CJBig2_Segment* findReferredSegmentByTypeAndIndex(CJBig2_Segment* pSegment, 64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann uint8_t cType, 65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t nIndex); 66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t parseSegmentHeader(CJBig2_Segment* pSegment); 68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t parseSegmentData(CJBig2_Segment* pSegment, 69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IFX_PauseIndicator* pPause); 70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t ProcessingParseSegmentData(CJBig2_Segment* pSegment, 71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IFX_PauseIndicator* pPause); 72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t parseSymbolDict(CJBig2_Segment* pSegment); 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t parseTextRegion(CJBig2_Segment* pSegment); 74d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t parsePatternDict(CJBig2_Segment* pSegment, 75d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IFX_PauseIndicator* pPause); 76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t parseHalftoneRegion(CJBig2_Segment* pSegment, 77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IFX_PauseIndicator* pPause); 78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t parseGenericRegion(CJBig2_Segment* pSegment, 79d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IFX_PauseIndicator* pPause); 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t parseGenericRefinementRegion(CJBig2_Segment* pSegment); 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t parseTable(CJBig2_Segment* pSegment); 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t parseRegionInfo(JBig2RegionInfo* pRI); 83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 84d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<JBig2HuffmanCode> decodeSymbolIDHuffmanTable( 85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CJBig2_BitStream* pStream, 86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t SBNUMSYMS); 87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void huffman_assign_code(JBig2HuffmanCode* SBSYMCODES, int NTEMP); 89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CJBig2_Context> m_pGlobalContext; 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::unique_ptr<CJBig2_BitStream> m_pStream; 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CJBig2_Segment>> m_SegmentList; 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<JBig2PageInfo>> m_PageInfoList; 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::unique_ptr<CJBig2_Image> m_pPage; 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann size_t m_nSegmentDecoded; 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bool m_bInPage; 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bool m_bBufSpecified; 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int32_t m_PauseStep; 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXCODEC_STATUS m_ProcessingStatus; 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<JBig2ArithCtx> m_gbContext; 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::unique_ptr<CJBig2_ArithDecoder> m_pArithDecoder; 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::unique_ptr<CJBig2_GRDProc> m_pGRD; 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::unique_ptr<CJBig2_Segment> m_pSegment; 104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FX_SAFE_UINT32 m_dwOffset; 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann JBig2RegionInfo m_ri; 106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann std::list<CJBig2_CachePair>* const m_pSymbolDictCache; 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann bool m_bIsGlobal; 108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif // CORE_FXCODEC_JBIG2_JBIG2_CONTEXT_H_ 111