From 310438fb97a2363bd0901401ad2506febd64361b Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Tue, 8 Mar 2016 13:10:55 -0800 Subject: Split off CPDF_Document into its own .cpp/.h files. R=dsinclair@chromium.org Review URL: https://codereview.chromium.org/1780503002 . --- core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp | 1 + core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp | 1 + core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp | 1 + core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp | 1 + core/src/fpdfapi/fpdf_font/fpdf_font.cpp | 1 + core/src/fpdfapi/fpdf_page/fpdf_page.cpp | 1 + core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp | 1 + core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp | 1 + .../fpdfapi/fpdf_page/fpdf_page_graph_state.cpp | 1 + core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp | 1 + core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp | 1 + .../src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp | 1 + core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp | 1 + core/src/fpdfapi/fpdf_parser/cpdf_document.cpp | 350 +++++++++++++++++++++ .../fpdfapi/fpdf_parser/fpdf_parser_document.cpp | 338 -------------------- .../src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp | 1 + core/src/fpdfapi/fpdf_render/fpdf_render.cpp | 1 + core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp | 9 +- core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp | 1 + .../fpdfapi/fpdf_render/fpdf_render_loadimage.cpp | 1 + core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp | 1 + core/src/fpdfdoc/doc_action.cpp | 1 + core/src/fpdfdoc/doc_annot.cpp | 1 + core/src/fpdfdoc/doc_ap.cpp | 1 + core/src/fpdfdoc/doc_basic.cpp | 1 + core/src/fpdfdoc/doc_bookmark.cpp | 1 + core/src/fpdfdoc/doc_form.cpp | 1 + core/src/fpdfdoc/doc_formcontrol.cpp | 1 + core/src/fpdfdoc/doc_formfield.cpp | 1 + core/src/fpdfdoc/doc_metadata.cpp | 1 + core/src/fpdfdoc/doc_ocg.cpp | 1 + core/src/fpdfdoc/doc_tagged.cpp | 1 + core/src/fpdfdoc/doc_utils.cpp | 1 + core/src/fpdfdoc/doc_viewerPreferences.cpp | 1 + 34 files changed, 382 insertions(+), 346 deletions(-) create mode 100644 core/src/fpdfapi/fpdf_parser/cpdf_document.cpp delete mode 100644 core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp (limited to 'core/src') diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp index 77c58f0925..ad19b5d685 100644 --- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp +++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp @@ -4,6 +4,7 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_module.h" #include "core/include/fpdfapi/fpdf_page.h" #include "core/include/fpdfapi/fpdf_serial.h" diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp index 878dc2ab2a..ac01bf901c 100644 --- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp +++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp @@ -8,6 +8,7 @@ #include +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_parser.h" #include "core/include/fpdfapi/fpdf_serial.h" #include "core/include/fxcrt/fx_ext.h" diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp index bc3de20857..8b1571a496 100644 --- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp +++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp @@ -6,6 +6,7 @@ #include +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_module.h" #include "core/include/fpdfapi/fpdf_page.h" #include "core/src/fpdfapi/fpdf_page/pageint.h" diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp index 2b68a0403f..0d2f83682e 100644 --- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp +++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp @@ -4,6 +4,7 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_module.h" #include "core/include/fpdfapi/fpdf_page.h" #include "core/include/fpdfapi/fpdf_render.h" diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp index ecdb2d7deb..d9bc148326 100644 --- a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp +++ b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp @@ -6,6 +6,7 @@ #include "core/src/fpdfapi/fpdf_font/font_int.h" +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_module.h" #include "core/include/fpdfapi/fpdf_page.h" #include "core/include/fpdfapi/fpdf_pageobj.h" diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page.cpp index 77707624d2..1868d263d3 100644 --- a/core/src/fpdfapi/fpdf_page/fpdf_page.cpp +++ b/core/src/fpdfapi/fpdf_page/fpdf_page.cpp @@ -8,6 +8,7 @@ #include +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_module.h" #include "core/include/fpdfapi/fpdf_page.h" #include "third_party/base/stl_util.h" diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp index 49fb331a94..a43aff18cb 100644 --- a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp @@ -10,6 +10,7 @@ #include +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_module.h" #include "core/include/fpdfapi/fpdf_page.h" #include "core/include/fxcodec/fx_codec.h" diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp index 85b026f8e8..fbf236d472 100644 --- a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp @@ -7,6 +7,7 @@ #include "core/src/fpdfapi/fpdf_page/pageint.h" #include "core/include/fdrm/fx_crypt.h" +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_module.h" #include "core/include/fpdfapi/fpdf_page.h" #include "core/src/fpdfapi/fpdf_font/font_int.h" diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp index a294d3bce7..eff2ff4009 100644 --- a/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp @@ -8,6 +8,7 @@ #include +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_module.h" #include "core/include/fpdfapi/fpdf_page.h" #include "core/include/fpdfapi/fpdf_pageobj.h" diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp index c5e29a4b77..64d3264128 100644 --- a/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp @@ -6,6 +6,7 @@ #include "core/src/fpdfapi/fpdf_page/pageint.h" +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_page.h" #include "core/include/fpdfapi/fpdf_pageobj.h" diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp index 1df4f3db37..7114f764ac 100644 --- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp @@ -6,6 +6,7 @@ #include "core/src/fpdfapi/fpdf_page/pageint.h" +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_module.h" #include "core/include/fpdfapi/fpdf_page.h" #include "core/include/fpdfapi/fpdf_serial.h" diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp index b49607e743..a808c2948b 100644 --- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp @@ -8,6 +8,7 @@ #include +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_module.h" #include "core/include/fpdfapi/fpdf_page.h" #include "core/include/fxcodec/fx_codec.h" diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp index d56e65c084..0287b4fed3 100644 --- a/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp @@ -6,6 +6,7 @@ #include "core/src/fpdfapi/fpdf_page/pageint.h" +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_page.h" namespace { diff --git a/core/src/fpdfapi/fpdf_parser/cpdf_document.cpp b/core/src/fpdfapi/fpdf_parser/cpdf_document.cpp new file mode 100644 index 0000000000..f837c00509 --- /dev/null +++ b/core/src/fpdfapi/fpdf_parser/cpdf_document.cpp @@ -0,0 +1,350 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// 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 + +#include "core/include/fpdfapi/cpdf_document.h" + +#include + +#include "core/include/fpdfapi/fpdf_module.h" +#include "core/include/fpdfapi/fpdf_parser.h" +#include "core/include/fxge/fx_font.h" +#include "core/src/fpdfapi/fpdf_render/render_int.h" +#include "third_party/base/stl_util.h" + +namespace { + +int CountPages(CPDF_Dictionary* pPages, + std::set* visited_pages) { + int count = pPages->GetIntegerBy("Count"); + if (count > 0 && count < FPDF_PAGE_MAX_NUM) { + return count; + } + CPDF_Array* pKidList = pPages->GetArrayBy("Kids"); + if (!pKidList) { + return 0; + } + count = 0; + for (FX_DWORD i = 0; i < pKidList->GetCount(); i++) { + CPDF_Dictionary* pKid = pKidList->GetDictAt(i); + if (!pKid || pdfium::ContainsKey(*visited_pages, pKid)) { + continue; + } + if (pKid->KeyExist("Kids")) { + // Use |visited_pages| to help detect circular references of pages. + ScopedSetInsertion local_add(visited_pages, pKid); + count += CountPages(pKid, visited_pages); + } else { + // This page is a leaf node. + count++; + } + } + pPages->SetAtInteger("Count", count); + return count; +} + +} // namespace + +CPDF_Document::CPDF_Document(CPDF_Parser* pParser) + : CPDF_IndirectObjectHolder(pParser) { + ASSERT(pParser); + m_pRootDict = NULL; + m_pInfoDict = NULL; + m_bLinearized = FALSE; + m_dwFirstPageNo = 0; + m_dwFirstPageObjNum = 0; + m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this); + m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this); +} +CPDF_DocPageData* CPDF_Document::GetValidatePageData() { + if (m_pDocPage) { + return m_pDocPage; + } + m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this); + return m_pDocPage; +} +CPDF_DocRenderData* CPDF_Document::GetValidateRenderData() { + if (m_pDocRender) { + return m_pDocRender; + } + m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this); + return m_pDocRender; +} +void CPDF_Document::LoadDoc() { + m_LastObjNum = m_pParser->GetLastObjNum(); + CPDF_Object* pRootObj = GetIndirectObject(m_pParser->GetRootObjNum()); + if (!pRootObj) { + return; + } + m_pRootDict = pRootObj->GetDict(); + if (!m_pRootDict) { + return; + } + CPDF_Object* pInfoObj = GetIndirectObject(m_pParser->GetInfoObjNum()); + if (pInfoObj) { + m_pInfoDict = pInfoObj->GetDict(); + } + CPDF_Array* pIDArray = m_pParser->GetIDArray(); + if (pIDArray) { + m_ID1 = pIDArray->GetStringAt(0); + m_ID2 = pIDArray->GetStringAt(1); + } + m_PageList.SetSize(RetrievePageCount()); +} +void CPDF_Document::LoadAsynDoc(CPDF_Dictionary* pLinearized) { + m_bLinearized = TRUE; + m_LastObjNum = m_pParser->GetLastObjNum(); + CPDF_Object* pIndirectObj = GetIndirectObject(m_pParser->GetRootObjNum()); + m_pRootDict = pIndirectObj ? pIndirectObj->GetDict() : nullptr; + if (!m_pRootDict) { + return; + } + pIndirectObj = GetIndirectObject(m_pParser->GetInfoObjNum()); + m_pInfoDict = pIndirectObj ? pIndirectObj->GetDict() : nullptr; + CPDF_Array* pIDArray = m_pParser->GetIDArray(); + if (pIDArray) { + m_ID1 = pIDArray->GetStringAt(0); + m_ID2 = pIDArray->GetStringAt(1); + } + FX_DWORD dwPageCount = 0; + CPDF_Object* pCount = pLinearized->GetElement("N"); + if (ToNumber(pCount)) + dwPageCount = pCount->GetInteger(); + + m_PageList.SetSize(dwPageCount); + CPDF_Object* pNo = pLinearized->GetElement("P"); + if (ToNumber(pNo)) + m_dwFirstPageNo = pNo->GetInteger(); + + CPDF_Object* pObjNum = pLinearized->GetElement("O"); + if (ToNumber(pObjNum)) + m_dwFirstPageObjNum = pObjNum->GetInteger(); +} +void CPDF_Document::LoadPages() { + m_PageList.SetSize(RetrievePageCount()); +} +CPDF_Document::~CPDF_Document() { + if (m_pDocPage) { + CPDF_ModuleMgr::Get()->GetPageModule()->ReleaseDoc(this); + CPDF_ModuleMgr::Get()->GetPageModule()->ClearStockFont(this); + } + if (m_pDocRender) { + CPDF_ModuleMgr::Get()->GetRenderModule()->DestroyDocData(m_pDocRender); + } +} +#define FX_MAX_PAGE_LEVEL 1024 +CPDF_Dictionary* CPDF_Document::_FindPDFPage(CPDF_Dictionary* pPages, + int iPage, + int nPagesToGo, + int level) { + CPDF_Array* pKidList = pPages->GetArrayBy("Kids"); + if (!pKidList) { + if (nPagesToGo == 0) { + return pPages; + } + return NULL; + } + if (level >= FX_MAX_PAGE_LEVEL) { + return NULL; + } + int nKids = pKidList->GetCount(); + for (int i = 0; i < nKids; i++) { + CPDF_Dictionary* pKid = pKidList->GetDictAt(i); + if (!pKid) { + nPagesToGo--; + continue; + } + if (pKid == pPages) { + continue; + } + if (!pKid->KeyExist("Kids")) { + if (nPagesToGo == 0) { + return pKid; + } + m_PageList.SetAt(iPage - nPagesToGo, pKid->GetObjNum()); + nPagesToGo--; + } else { + int nPages = pKid->GetIntegerBy("Count"); + if (nPagesToGo < nPages) { + return _FindPDFPage(pKid, iPage, nPagesToGo, level + 1); + } + nPagesToGo -= nPages; + } + } + return NULL; +} + +CPDF_Dictionary* CPDF_Document::GetPage(int iPage) { + if (iPage < 0 || iPage >= m_PageList.GetSize()) + return nullptr; + + if (m_bLinearized && (iPage == (int)m_dwFirstPageNo)) { + if (CPDF_Dictionary* pDict = + ToDictionary(GetIndirectObject(m_dwFirstPageObjNum))) { + return pDict; + } + } + + int objnum = m_PageList.GetAt(iPage); + if (objnum) { + if (CPDF_Dictionary* pDict = ToDictionary(GetIndirectObject(objnum))) + return pDict; + } + + CPDF_Dictionary* pRoot = GetRoot(); + if (!pRoot) + return nullptr; + + CPDF_Dictionary* pPages = pRoot->GetDictBy("Pages"); + if (!pPages) + return nullptr; + + CPDF_Dictionary* pPage = _FindPDFPage(pPages, iPage, iPage, 0); + if (!pPage) + return nullptr; + + m_PageList.SetAt(iPage, pPage->GetObjNum()); + return pPage; +} + +int CPDF_Document::_FindPageIndex(CPDF_Dictionary* pNode, + FX_DWORD& skip_count, + FX_DWORD objnum, + int& index, + int level) { + if (pNode->KeyExist("Kids")) { + CPDF_Array* pKidList = pNode->GetArrayBy("Kids"); + if (!pKidList) { + return -1; + } + if (level >= FX_MAX_PAGE_LEVEL) { + return -1; + } + FX_DWORD count = pNode->GetIntegerBy("Count"); + if (count <= skip_count) { + skip_count -= count; + index += count; + return -1; + } + if (count && count == pKidList->GetCount()) { + for (FX_DWORD i = 0; i < count; i++) { + if (CPDF_Reference* pKid = ToReference(pKidList->GetElement(i))) { + if (pKid->GetRefObjNum() == objnum) { + m_PageList.SetAt(index + i, objnum); + return index + i; + } + } + } + } + for (FX_DWORD i = 0; i < pKidList->GetCount(); i++) { + CPDF_Dictionary* pKid = pKidList->GetDictAt(i); + if (!pKid) { + continue; + } + if (pKid == pNode) { + continue; + } + int found_index = + _FindPageIndex(pKid, skip_count, objnum, index, level + 1); + if (found_index >= 0) { + return found_index; + } + } + } else { + if (objnum == pNode->GetObjNum()) { + return index; + } + if (skip_count) { + skip_count--; + } + index++; + } + return -1; +} +int CPDF_Document::GetPageIndex(FX_DWORD objnum) { + FX_DWORD nPages = m_PageList.GetSize(); + FX_DWORD skip_count = 0; + FX_BOOL bSkipped = FALSE; + for (FX_DWORD i = 0; i < nPages; i++) { + FX_DWORD objnum1 = m_PageList.GetAt(i); + if (objnum1 == objnum) { + return i; + } + if (!bSkipped && objnum1 == 0) { + skip_count = i; + bSkipped = TRUE; + } + } + CPDF_Dictionary* pRoot = GetRoot(); + if (!pRoot) { + return -1; + } + CPDF_Dictionary* pPages = pRoot->GetDictBy("Pages"); + if (!pPages) { + return -1; + } + int index = 0; + return _FindPageIndex(pPages, skip_count, objnum, index); +} +int CPDF_Document::GetPageCount() const { + return m_PageList.GetSize(); +} + +int CPDF_Document::RetrievePageCount() const { + CPDF_Dictionary* pRoot = GetRoot(); + if (!pRoot) { + return 0; + } + CPDF_Dictionary* pPages = pRoot->GetDictBy("Pages"); + if (!pPages) { + return 0; + } + if (!pPages->KeyExist("Kids")) { + return 1; + } + std::set visited_pages; + visited_pages.insert(pPages); + return CountPages(pPages, &visited_pages); +} + +FX_DWORD CPDF_Document::GetUserPermissions(FX_BOOL bCheckRevision) const { + if (!m_pParser) { + return (FX_DWORD)-1; + } + return m_pParser->GetPermissions(bCheckRevision); +} + +FX_BOOL CPDF_Document::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) const { + auto it = m_IndirectObjs.find(objnum); + if (it != m_IndirectObjs.end()) { + CPDF_Stream* pStream = it->second->AsStream(); + bForm = pStream && pStream->GetDict()->GetStringBy("Subtype") == "Form"; + return TRUE; + } + if (!m_pParser) { + bForm = FALSE; + return TRUE; + } + return m_pParser->IsFormStream(objnum, bForm); +} + +void CPDF_Document::ClearPageData() { + if (m_pDocPage) + CPDF_ModuleMgr::Get()->GetPageModule()->ClearDoc(this); +} + +void CPDF_Document::ClearRenderData() { + if (m_pDocRender) + CPDF_ModuleMgr::Get()->GetRenderModule()->ClearDocData(m_pDocRender); +} + +void CPDF_Document::ClearRenderFont() { + if (!m_pDocRender) + return; + + CFX_FontCache* pCache = m_pDocRender->GetFontCache(); + if (pCache) + pCache->FreeCache(FALSE); +} diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp deleted file mode 100644 index a63b0ed336..0000000000 --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp +++ /dev/null @@ -1,338 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// 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 - -#include "core/include/fpdfapi/fpdf_parser.h" - -#include - -#include "core/include/fpdfapi/fpdf_module.h" -#include "third_party/base/stl_util.h" - -namespace { - -int CountPages(CPDF_Dictionary* pPages, - std::set* visited_pages) { - int count = pPages->GetIntegerBy("Count"); - if (count > 0 && count < FPDF_PAGE_MAX_NUM) { - return count; - } - CPDF_Array* pKidList = pPages->GetArrayBy("Kids"); - if (!pKidList) { - return 0; - } - count = 0; - for (FX_DWORD i = 0; i < pKidList->GetCount(); i++) { - CPDF_Dictionary* pKid = pKidList->GetDictAt(i); - if (!pKid || pdfium::ContainsKey(*visited_pages, pKid)) { - continue; - } - if (pKid->KeyExist("Kids")) { - // Use |visited_pages| to help detect circular references of pages. - ScopedSetInsertion local_add(visited_pages, pKid); - count += CountPages(pKid, visited_pages); - } else { - // This page is a leaf node. - count++; - } - } - pPages->SetAtInteger("Count", count); - return count; -} - -} // namespace - -CPDF_Document::CPDF_Document(CPDF_Parser* pParser) - : CPDF_IndirectObjectHolder(pParser) { - ASSERT(pParser); - m_pRootDict = NULL; - m_pInfoDict = NULL; - m_bLinearized = FALSE; - m_dwFirstPageNo = 0; - m_dwFirstPageObjNum = 0; - m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this); - m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this); -} -CPDF_DocPageData* CPDF_Document::GetValidatePageData() { - if (m_pDocPage) { - return m_pDocPage; - } - m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this); - return m_pDocPage; -} -CPDF_DocRenderData* CPDF_Document::GetValidateRenderData() { - if (m_pDocRender) { - return m_pDocRender; - } - m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this); - return m_pDocRender; -} -void CPDF_Document::LoadDoc() { - m_LastObjNum = m_pParser->GetLastObjNum(); - CPDF_Object* pRootObj = GetIndirectObject(m_pParser->GetRootObjNum()); - if (!pRootObj) { - return; - } - m_pRootDict = pRootObj->GetDict(); - if (!m_pRootDict) { - return; - } - CPDF_Object* pInfoObj = GetIndirectObject(m_pParser->GetInfoObjNum()); - if (pInfoObj) { - m_pInfoDict = pInfoObj->GetDict(); - } - CPDF_Array* pIDArray = m_pParser->GetIDArray(); - if (pIDArray) { - m_ID1 = pIDArray->GetStringAt(0); - m_ID2 = pIDArray->GetStringAt(1); - } - m_PageList.SetSize(RetrievePageCount()); -} -void CPDF_Document::LoadAsynDoc(CPDF_Dictionary* pLinearized) { - m_bLinearized = TRUE; - m_LastObjNum = m_pParser->GetLastObjNum(); - CPDF_Object* pIndirectObj = GetIndirectObject(m_pParser->GetRootObjNum()); - m_pRootDict = pIndirectObj ? pIndirectObj->GetDict() : nullptr; - if (!m_pRootDict) { - return; - } - pIndirectObj = GetIndirectObject(m_pParser->GetInfoObjNum()); - m_pInfoDict = pIndirectObj ? pIndirectObj->GetDict() : nullptr; - CPDF_Array* pIDArray = m_pParser->GetIDArray(); - if (pIDArray) { - m_ID1 = pIDArray->GetStringAt(0); - m_ID2 = pIDArray->GetStringAt(1); - } - FX_DWORD dwPageCount = 0; - CPDF_Object* pCount = pLinearized->GetElement("N"); - if (ToNumber(pCount)) - dwPageCount = pCount->GetInteger(); - - m_PageList.SetSize(dwPageCount); - CPDF_Object* pNo = pLinearized->GetElement("P"); - if (ToNumber(pNo)) - m_dwFirstPageNo = pNo->GetInteger(); - - CPDF_Object* pObjNum = pLinearized->GetElement("O"); - if (ToNumber(pObjNum)) - m_dwFirstPageObjNum = pObjNum->GetInteger(); -} -void CPDF_Document::LoadPages() { - m_PageList.SetSize(RetrievePageCount()); -} -CPDF_Document::~CPDF_Document() { - if (m_pDocPage) { - CPDF_ModuleMgr::Get()->GetPageModule()->ReleaseDoc(this); - CPDF_ModuleMgr::Get()->GetPageModule()->ClearStockFont(this); - } - if (m_pDocRender) { - CPDF_ModuleMgr::Get()->GetRenderModule()->DestroyDocData(m_pDocRender); - } -} -#define FX_MAX_PAGE_LEVEL 1024 -CPDF_Dictionary* CPDF_Document::_FindPDFPage(CPDF_Dictionary* pPages, - int iPage, - int nPagesToGo, - int level) { - CPDF_Array* pKidList = pPages->GetArrayBy("Kids"); - if (!pKidList) { - if (nPagesToGo == 0) { - return pPages; - } - return NULL; - } - if (level >= FX_MAX_PAGE_LEVEL) { - return NULL; - } - int nKids = pKidList->GetCount(); - for (int i = 0; i < nKids; i++) { - CPDF_Dictionary* pKid = pKidList->GetDictAt(i); - if (!pKid) { - nPagesToGo--; - continue; - } - if (pKid == pPages) { - continue; - } - if (!pKid->KeyExist("Kids")) { - if (nPagesToGo == 0) { - return pKid; - } - m_PageList.SetAt(iPage - nPagesToGo, pKid->GetObjNum()); - nPagesToGo--; - } else { - int nPages = pKid->GetIntegerBy("Count"); - if (nPagesToGo < nPages) { - return _FindPDFPage(pKid, iPage, nPagesToGo, level + 1); - } - nPagesToGo -= nPages; - } - } - return NULL; -} - -CPDF_Dictionary* CPDF_Document::GetPage(int iPage) { - if (iPage < 0 || iPage >= m_PageList.GetSize()) - return nullptr; - - if (m_bLinearized && (iPage == (int)m_dwFirstPageNo)) { - if (CPDF_Dictionary* pDict = - ToDictionary(GetIndirectObject(m_dwFirstPageObjNum))) { - return pDict; - } - } - - int objnum = m_PageList.GetAt(iPage); - if (objnum) { - if (CPDF_Dictionary* pDict = ToDictionary(GetIndirectObject(objnum))) - return pDict; - } - - CPDF_Dictionary* pRoot = GetRoot(); - if (!pRoot) - return nullptr; - - CPDF_Dictionary* pPages = pRoot->GetDictBy("Pages"); - if (!pPages) - return nullptr; - - CPDF_Dictionary* pPage = _FindPDFPage(pPages, iPage, iPage, 0); - if (!pPage) - return nullptr; - - m_PageList.SetAt(iPage, pPage->GetObjNum()); - return pPage; -} - -int CPDF_Document::_FindPageIndex(CPDF_Dictionary* pNode, - FX_DWORD& skip_count, - FX_DWORD objnum, - int& index, - int level) { - if (pNode->KeyExist("Kids")) { - CPDF_Array* pKidList = pNode->GetArrayBy("Kids"); - if (!pKidList) { - return -1; - } - if (level >= FX_MAX_PAGE_LEVEL) { - return -1; - } - FX_DWORD count = pNode->GetIntegerBy("Count"); - if (count <= skip_count) { - skip_count -= count; - index += count; - return -1; - } - if (count && count == pKidList->GetCount()) { - for (FX_DWORD i = 0; i < count; i++) { - if (CPDF_Reference* pKid = ToReference(pKidList->GetElement(i))) { - if (pKid->GetRefObjNum() == objnum) { - m_PageList.SetAt(index + i, objnum); - return index + i; - } - } - } - } - for (FX_DWORD i = 0; i < pKidList->GetCount(); i++) { - CPDF_Dictionary* pKid = pKidList->GetDictAt(i); - if (!pKid) { - continue; - } - if (pKid == pNode) { - continue; - } - int found_index = - _FindPageIndex(pKid, skip_count, objnum, index, level + 1); - if (found_index >= 0) { - return found_index; - } - } - } else { - if (objnum == pNode->GetObjNum()) { - return index; - } - if (skip_count) { - skip_count--; - } - index++; - } - return -1; -} -int CPDF_Document::GetPageIndex(FX_DWORD objnum) { - FX_DWORD nPages = m_PageList.GetSize(); - FX_DWORD skip_count = 0; - FX_BOOL bSkipped = FALSE; - for (FX_DWORD i = 0; i < nPages; i++) { - FX_DWORD objnum1 = m_PageList.GetAt(i); - if (objnum1 == objnum) { - return i; - } - if (!bSkipped && objnum1 == 0) { - skip_count = i; - bSkipped = TRUE; - } - } - CPDF_Dictionary* pRoot = GetRoot(); - if (!pRoot) { - return -1; - } - CPDF_Dictionary* pPages = pRoot->GetDictBy("Pages"); - if (!pPages) { - return -1; - } - int index = 0; - return _FindPageIndex(pPages, skip_count, objnum, index); -} -int CPDF_Document::GetPageCount() const { - return m_PageList.GetSize(); -} - -int CPDF_Document::RetrievePageCount() const { - CPDF_Dictionary* pRoot = GetRoot(); - if (!pRoot) { - return 0; - } - CPDF_Dictionary* pPages = pRoot->GetDictBy("Pages"); - if (!pPages) { - return 0; - } - if (!pPages->KeyExist("Kids")) { - return 1; - } - std::set visited_pages; - visited_pages.insert(pPages); - return CountPages(pPages, &visited_pages); -} - -FX_DWORD CPDF_Document::GetUserPermissions(FX_BOOL bCheckRevision) const { - if (!m_pParser) { - return (FX_DWORD)-1; - } - return m_pParser->GetPermissions(bCheckRevision); -} - -FX_BOOL CPDF_Document::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) const { - auto it = m_IndirectObjs.find(objnum); - if (it != m_IndirectObjs.end()) { - CPDF_Stream* pStream = it->second->AsStream(); - bForm = pStream && pStream->GetDict()->GetStringBy("Subtype") == "Form"; - return TRUE; - } - if (!m_pParser) { - bForm = FALSE; - return TRUE; - } - return m_pParser->IsFormStream(objnum, bForm); -} - -void CPDF_Document::ClearPageData() { - if (m_pDocPage) - CPDF_ModuleMgr::Get()->GetPageModule()->ClearDoc(this); -} - -void CPDF_Document::ClearRenderData() { - if (m_pDocRender) - CPDF_ModuleMgr::Get()->GetRenderModule()->ClearDocData(m_pDocRender); -} diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp index a00d1bc98d..2b61cdc2a2 100644 --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp @@ -12,6 +12,7 @@ #include #include +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_module.h" #include "core/include/fpdfapi/fpdf_page.h" #include "core/include/fxcrt/fx_ext.h" diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp index 4c7abea30c..c054f95abd 100644 --- a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp +++ b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp @@ -6,6 +6,7 @@ #include "core/src/fpdfapi/fpdf_render/render_int.h" +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_module.h" #include "core/include/fpdfapi/fpdf_render.h" #include "core/include/fxge/fx_ge.h" diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp index d95885f434..9636d1b23a 100644 --- a/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp +++ b/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp @@ -6,6 +6,7 @@ #include "core/src/fpdfapi/fpdf_render/render_int.h" +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_pageobj.h" #include "core/include/fpdfapi/fpdf_render.h" #include "core/include/fxge/fx_ge.h" @@ -331,11 +332,3 @@ void CPDF_ImageCacheEntry::CalcSize() { m_dwCacheSize = FPDF_ImageCache_EstimateImageSize(m_pCachedBitmap) + FPDF_ImageCache_EstimateImageSize(m_pCachedMask); } -void CPDF_Document::ClearRenderFont() { - if (m_pDocRender) { - CFX_FontCache* pCache = m_pDocRender->GetFontCache(); - if (pCache) { - pCache->FreeCache(FALSE); - } - } -} diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp index b91f258371..0f9b88e638 100644 --- a/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp +++ b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp @@ -9,6 +9,7 @@ #include #include +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_module.h" #include "core/include/fpdfapi/fpdf_pageobj.h" #include "core/include/fpdfapi/fpdf_render.h" diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp index 2aa1b0e6df..709733c56f 100644 --- a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp +++ b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp @@ -10,6 +10,7 @@ #include #include +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_module.h" #include "core/include/fpdfapi/fpdf_pageobj.h" #include "core/include/fpdfapi/fpdf_render.h" diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp index aa10809496..7051537ef3 100644 --- a/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp +++ b/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp @@ -6,6 +6,7 @@ #include "core/src/fpdfapi/fpdf_render/render_int.h" +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_pageobj.h" #include "core/include/fpdfapi/fpdf_render.h" #include "core/include/fxge/fx_ge.h" diff --git a/core/src/fpdfdoc/doc_action.cpp b/core/src/fpdfdoc/doc_action.cpp index 94235d2aee..9a0ba57951 100644 --- a/core/src/fpdfdoc/doc_action.cpp +++ b/core/src/fpdfdoc/doc_action.cpp @@ -4,6 +4,7 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfdoc/fpdf_doc.h" CPDF_Dest CPDF_Action::GetDest(CPDF_Document* pDoc) const { diff --git a/core/src/fpdfdoc/doc_annot.cpp b/core/src/fpdfdoc/doc_annot.cpp index 09b6e8d673..07fca72cab 100644 --- a/core/src/fpdfdoc/doc_annot.cpp +++ b/core/src/fpdfdoc/doc_annot.cpp @@ -4,6 +4,7 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_pageobj.h" #include "core/include/fpdfdoc/fpdf_doc.h" diff --git a/core/src/fpdfdoc/doc_ap.cpp b/core/src/fpdfdoc/doc_ap.cpp index 7fe06e2b5d..3028169cd9 100644 --- a/core/src/fpdfdoc/doc_ap.cpp +++ b/core/src/fpdfdoc/doc_ap.cpp @@ -4,6 +4,7 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfdoc/fpdf_ap.h" #include "core/include/fpdfdoc/fpdf_doc.h" #include "core/include/fpdfdoc/fpdf_vt.h" diff --git a/core/src/fpdfdoc/doc_basic.cpp b/core/src/fpdfdoc/doc_basic.cpp index bc88ddc828..09d74f546a 100644 --- a/core/src/fpdfdoc/doc_basic.cpp +++ b/core/src/fpdfdoc/doc_basic.cpp @@ -4,6 +4,7 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfdoc/fpdf_doc.h" const int nMaxRecursion = 32; diff --git a/core/src/fpdfdoc/doc_bookmark.cpp b/core/src/fpdfdoc/doc_bookmark.cpp index d7e2e2fcab..71c8f039f0 100644 --- a/core/src/fpdfdoc/doc_bookmark.cpp +++ b/core/src/fpdfdoc/doc_bookmark.cpp @@ -7,6 +7,7 @@ #include #include +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfdoc/fpdf_doc.h" CPDF_Bookmark CPDF_BookmarkTree::GetFirstChild( diff --git a/core/src/fpdfdoc/doc_form.cpp b/core/src/fpdfdoc/doc_form.cpp index 7a6db90f32..8080dc7597 100644 --- a/core/src/fpdfdoc/doc_form.cpp +++ b/core/src/fpdfdoc/doc_form.cpp @@ -4,6 +4,7 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfdoc/fpdf_doc.h" #include "core/src/fpdfdoc/doc_utils.h" #include "third_party/base/stl_util.h" diff --git a/core/src/fpdfdoc/doc_formcontrol.cpp b/core/src/fpdfdoc/doc_formcontrol.cpp index 4cfd4527e2..665da0acef 100644 --- a/core/src/fpdfdoc/doc_formcontrol.cpp +++ b/core/src/fpdfdoc/doc_formcontrol.cpp @@ -6,6 +6,7 @@ #include +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfdoc/fpdf_doc.h" CPDF_FormControl::CPDF_FormControl(CPDF_FormField* pField, diff --git a/core/src/fpdfdoc/doc_formfield.cpp b/core/src/fpdfdoc/doc_formfield.cpp index a7cc484361..915af33c29 100644 --- a/core/src/fpdfdoc/doc_formfield.cpp +++ b/core/src/fpdfdoc/doc_formfield.cpp @@ -4,6 +4,7 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfdoc/fpdf_doc.h" #include "core/src/fpdfdoc/doc_utils.h" diff --git a/core/src/fpdfdoc/doc_metadata.cpp b/core/src/fpdfdoc/doc_metadata.cpp index 593cffbebb..78364c4cbf 100644 --- a/core/src/fpdfdoc/doc_metadata.cpp +++ b/core/src/fpdfdoc/doc_metadata.cpp @@ -4,6 +4,7 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfdoc/fpdf_doc.h" #include "core/include/fxcrt/fx_xml.h" diff --git a/core/src/fpdfdoc/doc_ocg.cpp b/core/src/fpdfdoc/doc_ocg.cpp index a18924c1dc..6f6e54675b 100644 --- a/core/src/fpdfdoc/doc_ocg.cpp +++ b/core/src/fpdfdoc/doc_ocg.cpp @@ -4,6 +4,7 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfdoc/fpdf_doc.h" static int32_t FPDFDOC_OCG_FindGroup(const CPDF_Object* pObject, diff --git a/core/src/fpdfdoc/doc_tagged.cpp b/core/src/fpdfdoc/doc_tagged.cpp index a7eea11b02..d4ce4a4b31 100644 --- a/core/src/fpdfdoc/doc_tagged.cpp +++ b/core/src/fpdfdoc/doc_tagged.cpp @@ -4,6 +4,7 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfapi/fpdf_page.h" #include "core/include/fpdfapi/fpdf_parser.h" #include "core/include/fpdfdoc/fpdf_tagged.h" diff --git a/core/src/fpdfdoc/doc_utils.cpp b/core/src/fpdfdoc/doc_utils.cpp index 67a9324251..bc09c9a2c4 100644 --- a/core/src/fpdfdoc/doc_utils.cpp +++ b/core/src/fpdfdoc/doc_utils.cpp @@ -6,6 +6,7 @@ #include +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfdoc/fpdf_doc.h" #include "core/src/fpdfdoc/doc_utils.h" diff --git a/core/src/fpdfdoc/doc_viewerPreferences.cpp b/core/src/fpdfdoc/doc_viewerPreferences.cpp index 6ef09255c6..582f3a5a93 100644 --- a/core/src/fpdfdoc/doc_viewerPreferences.cpp +++ b/core/src/fpdfdoc/doc_viewerPreferences.cpp @@ -4,6 +4,7 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com +#include "core/include/fpdfapi/cpdf_document.h" #include "core/include/fpdfdoc/fpdf_doc.h" CPDF_ViewerPreferences::CPDF_ViewerPreferences(CPDF_Document* pDoc) -- cgit v1.2.3