// Copyright 2016 The PDFium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #ifndef CORE_FPDFAPI_PAGE_CPDF_DOCPAGEDATA_H_ #define CORE_FPDFAPI_PAGE_CPDF_DOCPAGEDATA_H_ #include #include #include #include "core/fpdfapi/font/cpdf_font.h" #include "core/fpdfapi/page/cpdf_colorspace.h" #include "core/fpdfapi/parser/cpdf_document.h" #include "core/fxcrt/bytestring.h" #include "core/fxcrt/fx_codepage_forward.h" #include "core/fxcrt/fx_coordinates.h" #include "core/fxcrt/observed_ptr.h" #include "core/fxcrt/retain_ptr.h" class CFX_Font; class CPDF_Dictionary; class CPDF_FontEncoding; class CPDF_IccProfile; class CPDF_Image; class CPDF_Object; class CPDF_Pattern; class CPDF_Stream; class CPDF_StreamAcc; class CPDF_DocPageData final : public CPDF_Document::PageDataIface, public CPDF_Font::FormFactoryIface { public: static CPDF_DocPageData* FromDocument(const CPDF_Document* pDoc); CPDF_DocPageData(); ~CPDF_DocPageData() override; // CPDF_Document::PageDataIface: void ClearStockFont() override; RetainPtr GetFontFileStreamAcc( RetainPtr pFontStream) override; void MaybePurgeFontFileStreamAcc( RetainPtr&& pStreamAcc) override; void MaybePurgeImage(uint32_t dwStreamObjNum) override; // CPDF_Font::FormFactoryIFace: std::unique_ptr CreateForm( CPDF_Document* pDocument, RetainPtr pPageResources, RetainPtr pFormStream) override; bool IsForceClear() const { return m_bForceClear; } RetainPtr AddFont(std::unique_ptr pFont, FX_Charset charset); RetainPtr GetFont(RetainPtr pFontDict); RetainPtr AddStandardFont(const ByteString& fontName, const CPDF_FontEncoding* pEncoding); RetainPtr GetStandardFont(const ByteString& fontName, const CPDF_FontEncoding* pEncoding); #if BUILDFLAG(IS_WIN) RetainPtr AddWindowsFont(LOGFONTA* pLogFont); #endif // Loads a colorspace. RetainPtr GetColorSpace(const CPDF_Object* pCSObj, const CPDF_Dictionary* pResources); // Loads a colorspace in a context that might be while loading another // colorspace. |pVisited| is passed recursively to avoid circular calls // involving CPDF_ColorSpace::Load(). RetainPtr GetColorSpaceGuarded( const CPDF_Object* pCSObj, const CPDF_Dictionary* pResources, std::set* pVisited); RetainPtr GetPattern(RetainPtr pPatternObj, const CFX_Matrix& matrix); RetainPtr GetShading(RetainPtr pPatternObj, const CFX_Matrix& matrix); RetainPtr GetImage(uint32_t dwStreamObjNum); RetainPtr GetIccProfile( RetainPtr pProfileStream); private: // Loads a colorspace in a context that might be while loading another // colorspace, or even in a recursive call from this method itself. |pVisited| // is passed recursively to avoid circular calls involving // CPDF_ColorSpace::Load() and |pVisitedInternal| is also passed recursively // to avoid circular calls with this method calling itself. RetainPtr GetColorSpaceInternal( const CPDF_Object* pCSObj, const CPDF_Dictionary* pResources, std::set* pVisited, std::set* pVisitedInternal); size_t CalculateEncodingDict(FX_Charset charset, CPDF_Dictionary* pBaseDict); RetainPtr ProcessbCJK( RetainPtr pBaseDict, FX_Charset charset, ByteString basefont, std::function Insert); bool m_bForceClear = false; // Specific destruction order may be required between maps. std::map> m_HashProfileMap; std::map, ObservedPtr> m_ColorSpaceMap; std::map, RetainPtr> m_FontFileMap; std::map, ObservedPtr> m_IccProfileMap; std::map, ObservedPtr> m_PatternMap; std::map> m_ImageMap; std::map, ObservedPtr> m_FontMap; }; #endif // CORE_FPDFAPI_PAGE_CPDF_DOCPAGEDATA_H_