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 int form_count = 0; 33 }; 34 35 // Helper method to choose the first non-null resources dictionary. 36 static CPDF_Dictionary* ChooseResourcesDict(CPDF_Dictionary* pResources, 37 CPDF_Dictionary* pParentResources, 38 CPDF_Dictionary* pPageResources); 39 40 CPDF_Form(CPDF_Document* pDocument, 41 RetainPtr<CPDF_Dictionary> pPageResources, 42 RetainPtr<CPDF_Stream> pFormStream); 43 CPDF_Form(CPDF_Document* pDocument, 44 RetainPtr<CPDF_Dictionary> pPageResources, 45 RetainPtr<CPDF_Stream> pFormStream, 46 CPDF_Dictionary* pParentResources); 47 ~CPDF_Form() override; 48 49 // CPDF_Font::FormIface: 50 void ParseContentForType3Char(CPDF_Type3Char* pType3Char) override; 51 bool HasPageObjects() const override; 52 CFX_FloatRect CalcBoundingBox() const override; 53 absl::optional<std::pair<RetainPtr<CFX_DIBitmap>, CFX_Matrix>> 54 GetBitmapAndMatrixFromSoleImageOfForm() const override; 55 56 void ParseContent(); 57 void ParseContent(const CPDF_AllStates* pGraphicStates, 58 const CFX_Matrix* pParentMatrix, 59 RecursionState* recursion_state); 60 61 RetainPtr<const CPDF_Stream> GetStream() const; 62 63 private: 64 void ParseContentInternal(const CPDF_AllStates* pGraphicStates, 65 const CFX_Matrix* pParentMatrix, 66 CPDF_Type3Char* pType3Char, 67 RecursionState* recursion_state); 68 69 RecursionState m_RecursionState; 70 RetainPtr<CPDF_Stream> const m_pFormStream; 71 }; 72 73 #endif // CORE_FPDFAPI_PAGE_CPDF_FORM_H_ 74