diff options
Diffstat (limited to 'core/fpdfapi/parser')
-rw-r--r-- | core/fpdfapi/parser/cpdf_document.cpp | 13 | ||||
-rw-r--r-- | core/fpdfapi/parser/cpdf_document.h | 10 |
2 files changed, 22 insertions, 1 deletions
diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp index 7968d1b019..2e4baabe91 100644 --- a/core/fpdfapi/parser/cpdf_document.cpp +++ b/core/fpdfapi/parser/cpdf_document.cpp @@ -602,6 +602,19 @@ bool CPDF_Document::InsertNewPage(int iPage, CPDF_Dictionary* pPageDict) { return true; } +RetainPtr<CPDF_Page> CPDF_Document::GetOrCreatePDFPage( + CPDF_Dictionary* pPageDict) { + std::pair<uint32_t, uint32_t> key = {pPageDict->GetObjNum(), + pPageDict->GetGenNum()}; + if (m_PageMap[key]) + return RetainPtr<CPDF_Page>(m_PageMap[key].Get()); + + auto pPage = pdfium::MakeRetain<CPDF_Page>(this, pPageDict, true); + pPage->ParseContent(); + m_PageMap[key].Reset(pPage.Get()); + return pPage; +} + void CPDF_Document::DeletePage(int iPage) { CPDF_Dictionary* pPages = GetPagesDict(); if (!pPages) diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h index c2774b163a..c240e77567 100644 --- a/core/fpdfapi/parser/cpdf_document.h +++ b/core/fpdfapi/parser/cpdf_document.h @@ -8,6 +8,7 @@ #define CORE_FPDFAPI_PARSER_CPDF_DOCUMENT_H_ #include <functional> +#include <map> #include <memory> #include <set> #include <utility> @@ -64,6 +65,7 @@ class CPDF_Document : public CPDF_IndirectObjectHolder { const CPDF_Dictionary* GetInfo() const { return m_pInfoDict.Get(); } CPDF_Dictionary* GetInfo() { return m_pInfoDict.Get(); } + RetainPtr<CPDF_Page> GetOrCreatePDFPage(CPDF_Dictionary* pPageDict); void DeletePage(int iPage); int GetPageCount() const; bool IsPageLoaded(int iPage) const; @@ -167,7 +169,13 @@ class CPDF_Document : public CPDF_IndirectObjectHolder { std::unique_ptr<CPDF_DocRenderData> m_pDocRender; std::unique_ptr<JBig2_DocumentContext> m_pCodecContext; std::unique_ptr<CPDF_LinkList> m_pLinksContext; - std::vector<uint32_t> m_PageList; // Page number to page's dict objnum. + + // Page number (index) to page's dict objnum. + std::vector<uint32_t> m_PageList; + + // Dict {objnum, gennum} to page mapping. + std::map<std::pair<uint32_t, uint32_t>, CPDF_Page::ObservedPtr> m_PageMap; + UnownedPtr<Extension> m_pExtension; }; |