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