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_DOCPAGEDATA_H_ 8 #define CORE_FPDFAPI_PAGE_CPDF_DOCPAGEDATA_H_ 9 10 #include <map> 11 #include <memory> 12 #include <set> 13 14 #include "core/fpdfapi/font/cpdf_font.h" 15 #include "core/fpdfapi/page/cpdf_colorspace.h" 16 #include "core/fpdfapi/parser/cpdf_document.h" 17 #include "core/fxcrt/bytestring.h" 18 #include "core/fxcrt/fx_codepage_forward.h" 19 #include "core/fxcrt/fx_coordinates.h" 20 #include "core/fxcrt/retain_ptr.h" 21 22 class CFX_Font; 23 class CPDF_Dictionary; 24 class CPDF_FontEncoding; 25 class CPDF_IccProfile; 26 class CPDF_Image; 27 class CPDF_Object; 28 class CPDF_Pattern; 29 class CPDF_Stream; 30 class CPDF_StreamAcc; 31 32 class CPDF_DocPageData final : public CPDF_Document::PageDataIface, 33 public CPDF_Font::FormFactoryIface { 34 public: 35 static CPDF_DocPageData* FromDocument(const CPDF_Document* pDoc); 36 37 CPDF_DocPageData(); 38 ~CPDF_DocPageData() override; 39 40 // CPDF_Document::PageDataIface: 41 void ClearStockFont() override; 42 RetainPtr<CPDF_StreamAcc> GetFontFileStreamAcc( 43 RetainPtr<const CPDF_Stream> pFontStream) override; 44 void MaybePurgeFontFileStreamAcc( 45 RetainPtr<CPDF_StreamAcc>&& pStreamAcc) override; 46 void MaybePurgeImage(uint32_t dwStreamObjNum) override; 47 48 // CPDF_Font::FormFactoryIFace: 49 std::unique_ptr<CPDF_Font::FormIface> CreateForm( 50 CPDF_Document* pDocument, 51 RetainPtr<CPDF_Dictionary> pPageResources, 52 RetainPtr<CPDF_Stream> pFormStream) override; 53 IsForceClear()54 bool IsForceClear() const { return m_bForceClear; } 55 56 RetainPtr<CPDF_Font> AddFont(std::unique_ptr<CFX_Font> pFont, 57 FX_Charset charset); 58 RetainPtr<CPDF_Font> GetFont(RetainPtr<CPDF_Dictionary> pFontDict); 59 RetainPtr<CPDF_Font> AddStandardFont(const ByteString& fontName, 60 const CPDF_FontEncoding* pEncoding); 61 RetainPtr<CPDF_Font> GetStandardFont(const ByteString& fontName, 62 const CPDF_FontEncoding* pEncoding); 63 #if BUILDFLAG(IS_WIN) 64 RetainPtr<CPDF_Font> AddWindowsFont(LOGFONTA* pLogFont); 65 #endif 66 67 // Loads a colorspace. 68 RetainPtr<CPDF_ColorSpace> GetColorSpace(const CPDF_Object* pCSObj, 69 const CPDF_Dictionary* pResources); 70 71 // Loads a colorspace in a context that might be while loading another 72 // colorspace. |pVisited| is passed recursively to avoid circular calls 73 // involving CPDF_ColorSpace::Load(). 74 RetainPtr<CPDF_ColorSpace> GetColorSpaceGuarded( 75 const CPDF_Object* pCSObj, 76 const CPDF_Dictionary* pResources, 77 std::set<const CPDF_Object*>* pVisited); 78 79 RetainPtr<CPDF_Pattern> GetPattern(RetainPtr<CPDF_Object> pPatternObj, 80 const CFX_Matrix& matrix); 81 RetainPtr<CPDF_ShadingPattern> GetShading(RetainPtr<CPDF_Object> pPatternObj, 82 const CFX_Matrix& matrix); 83 84 RetainPtr<CPDF_Image> GetImage(uint32_t dwStreamObjNum); 85 86 RetainPtr<CPDF_IccProfile> GetIccProfile( 87 RetainPtr<const CPDF_Stream> pProfileStream); 88 89 private: 90 // Loads a colorspace in a context that might be while loading another 91 // colorspace, or even in a recursive call from this method itself. |pVisited| 92 // is passed recursively to avoid circular calls involving 93 // CPDF_ColorSpace::Load() and |pVisitedInternal| is also passed recursively 94 // to avoid circular calls with this method calling itself. 95 RetainPtr<CPDF_ColorSpace> GetColorSpaceInternal( 96 const CPDF_Object* pCSObj, 97 const CPDF_Dictionary* pResources, 98 std::set<const CPDF_Object*>* pVisited, 99 std::set<const CPDF_Object*>* pVisitedInternal); 100 101 size_t CalculateEncodingDict(FX_Charset charset, CPDF_Dictionary* pBaseDict); 102 RetainPtr<CPDF_Dictionary> ProcessbCJK( 103 RetainPtr<CPDF_Dictionary> pBaseDict, 104 FX_Charset charset, 105 ByteString basefont, 106 std::function<void(wchar_t, wchar_t, CPDF_Array*)> Insert); 107 108 bool m_bForceClear = false; 109 110 // Specific destruction order may be required between maps. 111 std::map<ByteString, RetainPtr<const CPDF_Stream>> m_HashProfileMap; 112 std::map<RetainPtr<const CPDF_Array>, RetainPtr<CPDF_ColorSpace>> 113 m_ColorSpaceMap; 114 std::map<RetainPtr<const CPDF_Stream>, RetainPtr<CPDF_StreamAcc>> 115 m_FontFileMap; 116 std::map<RetainPtr<const CPDF_Stream>, RetainPtr<CPDF_IccProfile>> 117 m_IccProfileMap; 118 std::map<RetainPtr<const CPDF_Object>, RetainPtr<CPDF_Pattern>> 119 m_PatternMap; 120 std::map<uint32_t, RetainPtr<CPDF_Image>> m_ImageMap; 121 std::map<RetainPtr<const CPDF_Dictionary>, RetainPtr<CPDF_Font>> m_FontMap; 122 }; 123 124 #endif // CORE_FPDFAPI_PAGE_CPDF_DOCPAGEDATA_H_ 125