From 36e9b370597051155c5ca6c4b1c2c3914fb332cf Mon Sep 17 00:00:00 2001 From: m-holger Date: Tue, 19 Aug 2025 19:40:08 +0100 Subject: [PATCH] Refactor `NNTreeIterator::resetLimits`: update to use `Dictionary` API, replace `getKey` with subscript operator, and simplify logic. --- libqpdf/NNTree.cc | 52 +++++++++++++++++++++++----------------------------- libqpdf/qpdf/NNTree.hh | 2 +- 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/libqpdf/NNTree.cc b/libqpdf/NNTree.cc index 05859fb..0cc64f0 100644 --- a/libqpdf/NNTree.cc +++ b/libqpdf/NNTree.cc @@ -135,60 +135,54 @@ NNTreeIterator::increment(bool backward) } void -NNTreeIterator::resetLimits(QPDFObjectHandle a_node, std::list::iterator parent) +NNTreeIterator::resetLimits(Dictionary a_node, std::list::iterator parent) { while (true) { if (parent == path.end()) { - a_node.removeKey("/Limits"); - break; + a_node.erase("/Limits"); + return; } - Array kids = a_node.getKey("/Kids"); - size_t nkids = kids.size(); - Array items = a_node.getKey(impl.itemsKey()); - size_t nitems = items.size(); - bool changed = true; QPDFObjectHandle first; QPDFObjectHandle last; + Array items = a_node[impl.itemsKey()]; + size_t nitems = items.size(); if (nitems >= 2) { first = items[0]; last = items[(nitems - 1u) & ~1u]; - } else if (nkids > 0) { - auto first_kid = kids[0]; - auto last_kid = kids[nkids - 1u]; - if (first_kid.isDictionary() && last_kid.isDictionary()) { - Array first_limits = first_kid.getKey("/Limits"); - Array last_limits = last_kid.getKey("/Limits"); - if (first_limits.size() >= 2 && last_limits.size() >= 2) { + } else { + Array kids = a_node["/Kids"]; + size_t nkids = kids.size(); + if (nkids > 0) { + Array first_limits = kids[0]["/Limits"]; + if (first_limits.size() >= 2) { first = first_limits[0]; - last = last_limits[1]; + last = kids[nkids - 1u]["/Limits"][1]; } } } - if (first && last) { - Array limits({first, last}); - Array olimits = a_node.getKey("/Limits"); + if (!(first && last)) { + impl.warn(a_node, "unable to determine limits"); + } else { + Array olimits = a_node["/Limits"]; if (olimits.size() == 2) { auto ofirst = olimits[0]; auto olast = olimits[1]; if (impl.keyValid(ofirst) && impl.keyValid(olast) && impl.compareKeys(first, ofirst) == 0 && impl.compareKeys(last, olast) == 0) { - changed = false; + return; } } - if (changed && !a_node.isSameObjectAs(path.begin()->node)) { - a_node.replaceKey("/Limits", limits); + if (a_node != path.begin()->node) { + a_node.replaceKey("/Limits", Array({first, last})); } - } else { - impl.warn(a_node, "unable to determine limits"); } - if (!changed || parent == path.begin()) { - break; - } else { - a_node = parent->node; - --parent; + if (parent == path.begin()) { + return; } + a_node = parent->node; + --parent; } } diff --git a/libqpdf/qpdf/NNTree.hh b/libqpdf/qpdf/NNTree.hh index cd41a86..32771bd 100644 --- a/libqpdf/qpdf/NNTree.hh +++ b/libqpdf/qpdf/NNTree.hh @@ -107,7 +107,7 @@ class NNTreeIterator final } qpdf::Dictionary getNextKid(PathElement& element, bool backward); void increment(bool backward); - void resetLimits(QPDFObjectHandle node, std::list::iterator parent); + void resetLimits(qpdf::Dictionary node, std::list::iterator parent); void split(QPDFObjectHandle to_split, std::list::iterator parent); std::list::iterator lastPathElement(); -- libgit2 0.21.4