From f38df27aa3eae905e3ee90365099335e317173d8 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Tue, 18 Dec 2018 13:08:55 -0500 Subject: Add QPDFNumberTreeObjectHelper --- libqpdf/QPDFNumberTreeObjectHelper.cc | 122 ++++++++++++++++++++++++++++++++++ libqpdf/build.mk | 1 + 2 files changed, 123 insertions(+) create mode 100644 libqpdf/QPDFNumberTreeObjectHelper.cc (limited to 'libqpdf') diff --git a/libqpdf/QPDFNumberTreeObjectHelper.cc b/libqpdf/QPDFNumberTreeObjectHelper.cc new file mode 100644 index 00000000..bf360cf5 --- /dev/null +++ b/libqpdf/QPDFNumberTreeObjectHelper.cc @@ -0,0 +1,122 @@ +#include +#include + +QPDFNumberTreeObjectHelper::Members::~Members() +{ +} + +QPDFNumberTreeObjectHelper::Members::Members() +{ +} + +QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper(QPDFObjectHandle oh) : + QPDFObjectHelper(oh), + m(new Members()) +{ + updateMap(oh); +} + +void +QPDFNumberTreeObjectHelper::updateMap(QPDFObjectHandle oh) +{ + if (this->m->seen.count(oh.getObjGen())) + { + return; + } + this->m->seen.insert(oh.getObjGen()); + QPDFObjectHandle nums = oh.getKey("/Nums"); + if (nums.isArray()) + { + size_t nitems = nums.getArrayNItems(); + size_t i = 0; + while (i < nitems - 1) + { + QPDFObjectHandle num = nums.getArrayItem(i); + if (num.isInteger()) + { + ++i; + QPDFObjectHandle obj = nums.getArrayItem(i); + this->m->entries[num.getIntValue()] = obj; + } + ++i; + } + } + QPDFObjectHandle kids = oh.getKey("/Kids"); + if (kids.isArray()) + { + size_t nitems = kids.getArrayNItems(); + for (size_t i = 0; i < nitems; ++i) + { + updateMap(kids.getArrayItem(i)); + } + } +} + + +QPDFNumberTreeObjectHelper::numtree_number +QPDFNumberTreeObjectHelper::getMin() +{ + if (this->m->entries.empty()) + { + return 0; + } + // Our map is sorted in reverse. + return this->m->entries.rbegin()->first; +} + +QPDFNumberTreeObjectHelper::numtree_number +QPDFNumberTreeObjectHelper::getMax() +{ + if (this->m->entries.empty()) + { + return 0; + } + // Our map is sorted in reverse. + return this->m->entries.begin()->first; +} + +bool +QPDFNumberTreeObjectHelper::hasIndex(numtree_number idx) +{ + return this->m->entries.count(idx) != 0; +} + +bool +QPDFNumberTreeObjectHelper::findObject( + numtree_number idx, QPDFObjectHandle& oh) +{ + Members::idx_map::iterator i = this->m->entries.find(idx); + if (i == this->m->entries.end()) + { + return false; + } + oh = (*i).second; + return true; +} + +bool +QPDFNumberTreeObjectHelper::findObjectAtOrBelow( + numtree_number idx, QPDFObjectHandle& oh, + numtree_number& offset) +{ + Members::idx_map::iterator i = this->m->entries.lower_bound(idx); + if (i == this->m->entries.end()) + { + return false; + } + oh = (*i).second; + offset = idx - (*i).first; + return true; +} + +std::map +QPDFNumberTreeObjectHelper::getAsMap() const +{ + std::map result; + for (Members::idx_map::const_iterator iter = this->m->entries.begin(); + iter != this->m->entries.end(); ++iter) + { + result[(*iter).first] = (*iter).second; + } + return result; +} diff --git a/libqpdf/build.mk b/libqpdf/build.mk index 61ea4b2d..147bb16a 100644 --- a/libqpdf/build.mk +++ b/libqpdf/build.mk @@ -40,6 +40,7 @@ SRCS_libqpdf = \ libqpdf/QPDFAnnotationObjectHelper.cc \ libqpdf/QPDFExc.cc \ libqpdf/QPDFFormFieldObjectHelper.cc \ + libqpdf/QPDFNumberTreeObjectHelper.cc \ libqpdf/QPDFObjGen.cc \ libqpdf/QPDFObject.cc \ libqpdf/QPDFObjectHandle.cc \ -- cgit v1.2.3-54-g00ecf