summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArtem Strygin <art-snake@yandex-team.ru>2017-08-23 22:16:13 +0300
committerChromium commit bot <commit-bot@chromium.org>2017-08-29 22:48:11 +0000
commit3fab4e35539e29c4ded08a424db3b1c7fbfa03fc (patch)
tree9fec7999573c13fc0dd9998053b611b14101be49
parent93e67c955aaa061e80b6fd462592d883051b174c (diff)
downloadpdfium-3fab4e35539e29c4ded08a424db3b1c7fbfa03fc.tar.xz
Optimize receiving page, if it have not obj num.
Make all pages dictionary are not inlined. Original fix: https://codereview.chromium.org/2491583002 Change-Id: Ie3aa662182a70ef6ef1d6121c0576c171e0060dd Reviewed-on: https://pdfium-review.googlesource.com/11810 Reviewed-by: dsinclair <dsinclair@chromium.org> Commit-Queue: Art Snake <art-snake@yandex-team.ru>
-rw-r--r--core/fpdfapi/parser/cpdf_document.cpp10
-rw-r--r--core/fpdfapi/parser/cpdf_document_unittest.cpp12
2 files changed, 8 insertions, 14 deletions
diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp
index 9bfb16b97e..6aedc09d14 100644
--- a/core/fpdfapi/parser/cpdf_document.cpp
+++ b/core/fpdfapi/parser/cpdf_document.cpp
@@ -426,6 +426,7 @@ CPDF_Dictionary* CPDF_Document::TraversePDFPages(int iPage,
i++) {
if (*nPagesToGo == 0)
break;
+ pKidList->ConvertToIndirectObjectAt(i, this);
CPDF_Dictionary* pKid = pKidList->GetDictAt(i);
if (!pKid) {
(*nPagesToGo)--;
@@ -499,15 +500,6 @@ CPDF_Dictionary* CPDF_Document::GetPage(int iPage) {
if (!pPages)
return nullptr;
- if (iPage - m_iNextPageToTraverse + 1 <= 0) {
- // This can happen when the page does not have an object number. On repeated
- // calls to this function for the same page index, this condition causes
- // TraversePDFPages() to incorrectly return nullptr.
- // Example "testing/corpus/fx/other/jetman_std.pdf"
- // We should restart traversing in this case.
- // TODO(art-snake): optimize this.
- ResetTraversal();
- }
if (m_pTreeTraversal.empty()) {
ResetTraversal();
m_pTreeTraversal.push_back(std::make_pair(pPages, 0));
diff --git a/core/fpdfapi/parser/cpdf_document_unittest.cpp b/core/fpdfapi/parser/cpdf_document_unittest.cpp
index 2715508015..9e03c96697 100644
--- a/core/fpdfapi/parser/cpdf_document_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_document_unittest.cpp
@@ -113,7 +113,7 @@ class CPDF_TestDocumentWithPageWithoutPageNum : public CPDF_Document {
allPages->AddNew<CPDF_Reference>(
this, AddIndirectObject(CreateNumberedPage(1))->GetObjNum());
// Page without pageNum.
- allPages->Add(CreateNumberedPage(2));
+ inlined_page_ = allPages->Add(CreateNumberedPage(2));
CPDF_Dictionary* pagesDict =
CreatePageTreeNode(std::move(allPages), this, 3);
m_pOwnedRootDict = pdfium::MakeUnique<CPDF_Dictionary>();
@@ -123,8 +123,11 @@ class CPDF_TestDocumentWithPageWithoutPageNum : public CPDF_Document {
m_PageList.resize(3);
}
+ const CPDF_Object* inlined_page() const { return inlined_page_; }
+
private:
std::unique_ptr<CPDF_Dictionary> m_pOwnedRootDict;
+ const CPDF_Object* inlined_page_;
};
class TestLinearized : public CPDF_LinearizedHeader {
@@ -171,12 +174,11 @@ TEST_F(cpdf_document_test, GetPages) {
}
TEST_F(cpdf_document_test, GetPageWithoutObjNumTwice) {
- std::unique_ptr<CPDF_TestDocumentWithPageWithoutPageNum> document =
- pdfium::MakeUnique<CPDF_TestDocumentWithPageWithoutPageNum>();
+ auto document = pdfium::MakeUnique<CPDF_TestDocumentWithPageWithoutPageNum>();
const CPDF_Dictionary* page = document->GetPage(2);
ASSERT_TRUE(page);
- // This is page without obj num.
- ASSERT_EQ(0ul, page->GetObjNum());
+ ASSERT_EQ(document->inlined_page(), page);
+
const CPDF_Dictionary* second_call_page = document->GetPage(2);
EXPECT_TRUE(second_call_page);
EXPECT_EQ(page, second_call_page);