1 // Copyright 2016 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_FPDFAPI_PAGE_CPDF_CONTENTPARSER_H_ 8 #define CORE_FPDFAPI_PAGE_CPDF_CONTENTPARSER_H_ 9 10 #include <stdint.h> 11 12 #include <memory> 13 #include <vector> 14 15 #include "core/fpdfapi/page/cpdf_form.h" 16 #include "core/fpdfapi/page/cpdf_pageobjectholder.h" 17 #include "core/fpdfapi/page/cpdf_streamcontentparser.h" 18 #include "core/fxcrt/fixed_size_data_vector.h" 19 #include "core/fxcrt/raw_span.h" 20 #include "core/fxcrt/retain_ptr.h" 21 #include "core/fxcrt/unowned_ptr.h" 22 #include "third_party/abseil-cpp/absl/types/variant.h" 23 24 class CPDF_AllStates; 25 class CPDF_Array; 26 class CPDF_Page; 27 class CPDF_PageObjectHolder; 28 class CPDF_Stream; 29 class CPDF_StreamAcc; 30 class CPDF_Type3Char; 31 class PauseIndicatorIface; 32 33 class CPDF_ContentParser { 34 public: 35 explicit CPDF_ContentParser(CPDF_Page* pPage); 36 CPDF_ContentParser(RetainPtr<const CPDF_Stream> pStream, 37 CPDF_PageObjectHolder* pPageObjectHolder, 38 const CPDF_AllStates* pGraphicStates, 39 const CFX_Matrix* pParentMatrix, 40 CPDF_Type3Char* pType3Char, 41 CPDF_Form::RecursionState* recursion_state); 42 ~CPDF_ContentParser(); 43 44 CPDF_PageObjectHolder::CTMMap TakeAllCTMs(); 45 46 // Returns whether to continue or not. 47 bool Continue(PauseIndicatorIface* pPause); 48 49 private: 50 enum class Stage : uint8_t { 51 kGetContent = 1, 52 kPrepareContent, 53 kParse, 54 kCheckClip, 55 kComplete, 56 }; 57 58 Stage GetContent(); 59 Stage PrepareContent(); 60 Stage Parse(); 61 Stage CheckClip(); 62 63 void HandlePageContentStream(const CPDF_Stream* pStream); 64 bool HandlePageContentArray(const CPDF_Array* pArray); 65 void HandlePageContentFailure(); 66 is_owned()67 bool is_owned() const { 68 return absl::holds_alternative<FixedSizeDataVector<uint8_t>>(m_Data); 69 } 70 pdfium::span<const uint8_t> GetData() const; 71 72 Stage m_CurrentStage; 73 UnownedPtr<CPDF_PageObjectHolder> const m_pPageObjectHolder; 74 UnownedPtr<CPDF_Type3Char> m_pType3Char; // Only used when parsing forms. 75 RetainPtr<CPDF_StreamAcc> m_pSingleStream; 76 std::vector<RetainPtr<CPDF_StreamAcc>> m_StreamArray; 77 std::vector<uint32_t> m_StreamSegmentOffsets; 78 absl::variant<pdfium::raw_span<const uint8_t>, FixedSizeDataVector<uint8_t>> 79 m_Data; 80 uint32_t m_nStreams = 0; 81 uint32_t m_CurrentOffset = 0; 82 // Only used when parsing pages. 83 CPDF_Form::RecursionState m_RecursionState; 84 85 // Must not outlive |m_RecursionState|. 86 std::unique_ptr<CPDF_StreamContentParser> m_pParser; 87 }; 88 89 #endif // CORE_FPDFAPI_PAGE_CPDF_CONTENTPARSER_H_ 90