1 // Copyright 2014 The PDFium Authors 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 #ifndef CORE_FXCODEC_JBIG2_JBIG2_CONTEXT_H_ 8 #define CORE_FXCODEC_JBIG2_JBIG2_CONTEXT_H_ 9 10 #include <list> 11 #include <memory> 12 #include <utility> 13 #include <vector> 14 15 #include "core/fxcodec/fx_codec_def.h" 16 #include "core/fxcodec/jbig2/JBig2_DocumentContext.h" 17 #include "core/fxcodec/jbig2/JBig2_Page.h" 18 #include "core/fxcodec/jbig2/JBig2_Segment.h" 19 #include "core/fxcrt/unowned_ptr.h" 20 #include "third_party/base/containers/span.h" 21 22 class CJBig2_ArithDecoder; 23 class CJBig2_GRDProc; 24 class PauseIndicatorIface; 25 26 #define JBIG2_MIN_SEGMENT_SIZE 11 27 28 enum class JBig2_Result { kSuccess, kFailure, kEndReached }; 29 30 class CJBig2_Context { 31 public: 32 static std::unique_ptr<CJBig2_Context> Create( 33 pdfium::span<const uint8_t> pGlobalSpan, 34 uint64_t global_key, 35 pdfium::span<const uint8_t> pSrcSpan, 36 uint64_t src_key, 37 std::list<CJBig2_CachePair>* pSymbolDictCache); 38 39 ~CJBig2_Context(); 40 41 static bool HuffmanAssignCode(JBig2HuffmanCode* SBSYMCODES, uint32_t NTEMP); 42 43 bool GetFirstPage(pdfium::span<uint8_t> pBuf, 44 int32_t width, 45 int32_t height, 46 int32_t stride, 47 PauseIndicatorIface* pPause); 48 49 bool Continue(PauseIndicatorIface* pPause); GetProcessingStatus()50 FXCODEC_STATUS GetProcessingStatus() const { return m_ProcessingStatus; } 51 52 private: 53 CJBig2_Context(pdfium::span<const uint8_t> pSrcSpan, 54 uint64_t src_key, 55 std::list<CJBig2_CachePair>* pSymbolDictCache, 56 bool bIsGlobal); 57 58 JBig2_Result DecodeSequential(PauseIndicatorIface* pPause); 59 60 CJBig2_Segment* FindSegmentByNumber(uint32_t dwNumber); 61 CJBig2_Segment* FindReferredTableSegmentByIndex(CJBig2_Segment* pSegment, 62 int32_t nIndex); 63 64 JBig2_Result ParseSegmentHeader(CJBig2_Segment* pSegment); 65 JBig2_Result ParseSegmentData(CJBig2_Segment* pSegment, 66 PauseIndicatorIface* pPause); 67 JBig2_Result ProcessingParseSegmentData(CJBig2_Segment* pSegment, 68 PauseIndicatorIface* pPause); 69 JBig2_Result ParseSymbolDict(CJBig2_Segment* pSegment); 70 JBig2_Result ParseTextRegion(CJBig2_Segment* pSegment); 71 JBig2_Result ParsePatternDict(CJBig2_Segment* pSegment, 72 PauseIndicatorIface* pPause); 73 JBig2_Result ParseHalftoneRegion(CJBig2_Segment* pSegment, 74 PauseIndicatorIface* pPause); 75 JBig2_Result ParseGenericRegion(CJBig2_Segment* pSegment, 76 PauseIndicatorIface* pPause); 77 JBig2_Result ParseGenericRefinementRegion(CJBig2_Segment* pSegment); 78 JBig2_Result ParseTable(CJBig2_Segment* pSegment); 79 JBig2_Result ParseRegionInfo(JBig2RegionInfo* pRI); 80 81 std::vector<JBig2HuffmanCode> DecodeSymbolIDHuffmanTable(uint32_t SBNUMSYMS); 82 const CJBig2_HuffmanTable* GetHuffmanTable(size_t idx); 83 84 std::unique_ptr<CJBig2_Context> m_pGlobalContext; 85 std::unique_ptr<CJBig2_BitStream> m_pStream; 86 std::vector<std::unique_ptr<CJBig2_Segment>> m_SegmentList; 87 std::vector<std::unique_ptr<JBig2PageInfo>> m_PageInfoList; 88 std::unique_ptr<CJBig2_Image> m_pPage; 89 std::vector<std::unique_ptr<CJBig2_HuffmanTable>> m_HuffmanTables; 90 const bool m_bIsGlobal; 91 bool m_bInPage = false; 92 bool m_bBufSpecified = false; 93 int32_t m_PauseStep = 10; 94 FXCODEC_STATUS m_ProcessingStatus = FXCODEC_STATUS::kFrameReady; 95 std::vector<JBig2ArithCtx> m_gbContext; 96 std::unique_ptr<CJBig2_ArithDecoder> m_pArithDecoder; 97 std::unique_ptr<CJBig2_GRDProc> m_pGRD; 98 std::unique_ptr<CJBig2_Segment> m_pSegment; 99 uint32_t m_nOffset = 0; 100 JBig2RegionInfo m_ri = {}; 101 UnownedPtr<std::list<CJBig2_CachePair>> const m_pSymbolDictCache; 102 }; 103 104 #endif // CORE_FXCODEC_JBIG2_JBIG2_CONTEXT_H_ 105