Make CPDF_Document::FindPageIndex() standalone.
FindPageIndex() does not use any CPDF_Document members, so make it an
anonymous function.
Change-Id: Id9decc91136d0eae147dc08fb746d024cc4d7abc
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/67594
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp
index d26d5c4..9991e3a 100644
--- a/core/fpdfapi/parser/cpdf_document.cpp
+++ b/core/fpdfapi/parser/cpdf_document.cpp
@@ -58,6 +58,56 @@
return count;
}
+int FindPageIndex(const CPDF_Dictionary* pNode,
+ uint32_t* skip_count,
+ uint32_t objnum,
+ int* index,
+ int level) {
+ if (!pNode->KeyExist("Kids")) {
+ if (objnum == pNode->GetObjNum())
+ return *index;
+
+ if (*skip_count)
+ (*skip_count)--;
+
+ (*index)++;
+ return -1;
+ }
+
+ const CPDF_Array* pKidList = pNode->GetArrayFor("Kids");
+ if (!pKidList)
+ return -1;
+
+ if (level >= kMaxPageLevel)
+ return -1;
+
+ size_t count = pNode->GetIntegerFor("Count");
+ if (count <= *skip_count) {
+ (*skip_count) -= count;
+ (*index) += count;
+ return -1;
+ }
+
+ if (count && count == pKidList->size()) {
+ for (size_t i = 0; i < count; i++) {
+ const CPDF_Reference* pKid = ToReference(pKidList->GetObjectAt(i));
+ if (pKid && pKid->GetRefObjNum() == objnum)
+ return static_cast<int>(*index + i);
+ }
+ }
+
+ for (size_t i = 0; i < pKidList->size(); i++) {
+ const CPDF_Dictionary* pKid = pKidList->GetDictAt(i);
+ if (!pKid || pKid == pNode)
+ continue;
+
+ int found_index = FindPageIndex(pKid, skip_count, objnum, index, level + 1);
+ if (found_index >= 0)
+ return found_index;
+ }
+ return -1;
+}
+
} // namespace
CPDF_Document::CPDF_Document(std::unique_ptr<RenderDataIface> pRenderData,
@@ -243,56 +293,6 @@
m_PageList[iPage] = objNum;
}
-int CPDF_Document::FindPageIndex(const CPDF_Dictionary* pNode,
- uint32_t* skip_count,
- uint32_t objnum,
- int* index,
- int level) const {
- if (!pNode->KeyExist("Kids")) {
- if (objnum == pNode->GetObjNum())
- return *index;
-
- if (*skip_count)
- (*skip_count)--;
-
- (*index)++;
- return -1;
- }
-
- const CPDF_Array* pKidList = pNode->GetArrayFor("Kids");
- if (!pKidList)
- return -1;
-
- if (level >= kMaxPageLevel)
- return -1;
-
- size_t count = pNode->GetIntegerFor("Count");
- if (count <= *skip_count) {
- (*skip_count) -= count;
- (*index) += count;
- return -1;
- }
-
- if (count && count == pKidList->size()) {
- for (size_t i = 0; i < count; i++) {
- const CPDF_Reference* pKid = ToReference(pKidList->GetObjectAt(i));
- if (pKid && pKid->GetRefObjNum() == objnum)
- return static_cast<int>(*index + i);
- }
- }
-
- for (size_t i = 0; i < pKidList->size(); i++) {
- const CPDF_Dictionary* pKid = pKidList->GetDictAt(i);
- if (!pKid || pKid == pNode)
- continue;
-
- int found_index = FindPageIndex(pKid, skip_count, objnum, index, level + 1);
- if (found_index >= 0)
- return found_index;
- }
- return -1;
-}
-
int CPDF_Document::GetPageIndex(uint32_t objnum) {
uint32_t nPages = m_PageList.size();
uint32_t skip_count = 0;
diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h
index 54e4a29..26be5ea 100644
--- a/core/fpdfapi/parser/cpdf_document.h
+++ b/core/fpdfapi/parser/cpdf_document.h
@@ -150,11 +150,6 @@
int RetrievePageCount();
// When this method is called, m_pTreeTraversal[level] exists.
CPDF_Dictionary* TraversePDFPages(int iPage, int* nPagesToGo, size_t level);
- int FindPageIndex(const CPDF_Dictionary* pNode,
- uint32_t* skip_count,
- uint32_t objnum,
- int* index,
- int level) const;
RetainPtr<CPDF_Object> ParseIndirectObject(uint32_t objnum) override;
const CPDF_Dictionary* GetPagesDict() const;
CPDF_Dictionary* GetPagesDict();