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_FORM_H_ 8 #define CORE_FPDFAPI_PAGE_CPDF_FORM_H_ 9 10 #include <set> 11 #include <utility> 12 13 #include "core/fpdfapi/font/cpdf_font.h" 14 #include "core/fpdfapi/page/cpdf_pageobjectholder.h" 15 #include "core/fxcrt/retain_ptr.h" 16 17 class CFX_Matrix; 18 class CPDF_AllStates; 19 class CPDF_Dictionary; 20 class CPDF_Document; 21 class CPDF_Stream; 22 class CPDF_Type3Char; 23 24 class CPDF_Form final : public CPDF_PageObjectHolder, 25 public CPDF_Font::FormIface { 26 public: 27 struct RecursionState { 28 RecursionState(); 29 ~RecursionState(); 30 31 std::set<const uint8_t*> parsed_set; 32 }; 33 34 // Helper method to choose the first non-null resources dictionary. 35 static CPDF_Dictionary* ChooseResourcesDict(CPDF_Dictionary* pResources, 36 CPDF_Dictionary* pParentResources, 37 CPDF_Dictionary* pPageResources); 38 39 CPDF_Form(CPDF_Document* pDocument, 40 RetainPtr<CPDF_Dictionary> pPageResources, 41 RetainPtr<CPDF_Stream> pFormStream); 42 CPDF_Form(CPDF_Document* pDocument, 43 RetainPtr<CPDF_Dictionary> pPageResources, 44 RetainPtr<CPDF_Stream> pFormStream, 45 CPDF_Dictionary* pParentResources); 46 ~CPDF_Form() override; 47 48 // CPDF_Font::FormIface: 49 void ParseContentForType3Char(CPDF_Type3Char* pType3Char) override; 50 bool HasPageObjects() const override; 51 CFX_FloatRect CalcBoundingBox() const override; 52 std::optional<std::pair<RetainPtr<CFX_DIBitmap>, CFX_Matrix>> 53 GetBitmapAndMatrixFromSoleImageOfForm() const override; 54 55 void ParseContent(); 56 void ParseContent(const CPDF_AllStates* pGraphicStates, 57 const CFX_Matrix* pParentMatrix, 58 RecursionState* recursion_state); 59 60 RetainPtr<const CPDF_Stream> GetStream() const; 61 62 private: 63 void ParseContentInternal(const CPDF_AllStates* pGraphicStates, 64 const CFX_Matrix* pParentMatrix, 65 CPDF_Type3Char* pType3Char, 66 RecursionState* recursion_state); 67 68 RecursionState m_RecursionState; 69 RetainPtr<CPDF_Stream> const m_pFormStream; 70 }; 71 72 #endif // CORE_FPDFAPI_PAGE_CPDF_FORM_H_ 73