From 27053d81ca80a2f9433abf3e9c393d2914c91ad8 Mon Sep 17 00:00:00 2001 From: dsinclair Date: Tue, 2 Aug 2016 15:43:46 -0700 Subject: Splitting fpdfdoc/doc_* part III. This CL cleans up the remaining doc_* files, splitting into .h and .pp files as needed. Review-Url: https://codereview.chromium.org/2190983002 --- core/fpdfdoc/cpdf_numbertree.cpp | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 core/fpdfdoc/cpdf_numbertree.cpp (limited to 'core/fpdfdoc/cpdf_numbertree.cpp') diff --git a/core/fpdfdoc/cpdf_numbertree.cpp b/core/fpdfdoc/cpdf_numbertree.cpp new file mode 100644 index 0000000000..9e2881f414 --- /dev/null +++ b/core/fpdfdoc/cpdf_numbertree.cpp @@ -0,0 +1,52 @@ +// Copyright 2016 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/fpdfdoc/cpdf_numbertree.h" + +#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" +#include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" + +namespace { + +CPDF_Object* SearchNumberNode(const CPDF_Dictionary* pNode, int num) { + CPDF_Array* pLimits = pNode->GetArrayBy("Limits"); + if (pLimits && + (num < pLimits->GetIntegerAt(0) || num > pLimits->GetIntegerAt(1))) { + return nullptr; + } + CPDF_Array* pNumbers = pNode->GetArrayBy("Nums"); + if (pNumbers) { + for (size_t i = 0; i < pNumbers->GetCount() / 2; i++) { + int index = pNumbers->GetIntegerAt(i * 2); + if (num == index) + return pNumbers->GetDirectObjectAt(i * 2 + 1); + if (index > num) + break; + } + return nullptr; + } + + CPDF_Array* pKids = pNode->GetArrayBy("Kids"); + if (!pKids) + return nullptr; + + for (size_t i = 0; i < pKids->GetCount(); i++) { + CPDF_Dictionary* pKid = pKids->GetDictAt(i); + if (!pKid) + continue; + + CPDF_Object* pFound = SearchNumberNode(pKid, num); + if (pFound) + return pFound; + } + return nullptr; +} + +} // namespace + +CPDF_Object* CPDF_NumberTree::LookupValue(int num) const { + return SearchNumberNode(m_pRoot, num); +} -- cgit v1.2.3