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();