Commit 36e9b370597051155c5ca6c4b1c2c3914fb332cf
1 parent
233e46b5
Refactor `NNTreeIterator::resetLimits`: update to use `Dictionary` API, replace …
…`getKey` with subscript operator, and simplify logic.
Showing
2 changed files
with
24 additions
and
30 deletions
libqpdf/NNTree.cc
| @@ -135,60 +135,54 @@ NNTreeIterator::increment(bool backward) | @@ -135,60 +135,54 @@ NNTreeIterator::increment(bool backward) | ||
| 135 | } | 135 | } |
| 136 | 136 | ||
| 137 | void | 137 | void |
| 138 | -NNTreeIterator::resetLimits(QPDFObjectHandle a_node, std::list<PathElement>::iterator parent) | 138 | +NNTreeIterator::resetLimits(Dictionary a_node, std::list<PathElement>::iterator parent) |
| 139 | { | 139 | { |
| 140 | while (true) { | 140 | while (true) { |
| 141 | if (parent == path.end()) { | 141 | if (parent == path.end()) { |
| 142 | - a_node.removeKey("/Limits"); | ||
| 143 | - break; | 142 | + a_node.erase("/Limits"); |
| 143 | + return; | ||
| 144 | } | 144 | } |
| 145 | - Array kids = a_node.getKey("/Kids"); | ||
| 146 | - size_t nkids = kids.size(); | ||
| 147 | - Array items = a_node.getKey(impl.itemsKey()); | ||
| 148 | - size_t nitems = items.size(); | ||
| 149 | 145 | ||
| 150 | - bool changed = true; | ||
| 151 | QPDFObjectHandle first; | 146 | QPDFObjectHandle first; |
| 152 | QPDFObjectHandle last; | 147 | QPDFObjectHandle last; |
| 148 | + Array items = a_node[impl.itemsKey()]; | ||
| 149 | + size_t nitems = items.size(); | ||
| 153 | if (nitems >= 2) { | 150 | if (nitems >= 2) { |
| 154 | first = items[0]; | 151 | first = items[0]; |
| 155 | last = items[(nitems - 1u) & ~1u]; | 152 | last = items[(nitems - 1u) & ~1u]; |
| 156 | - } else if (nkids > 0) { | ||
| 157 | - auto first_kid = kids[0]; | ||
| 158 | - auto last_kid = kids[nkids - 1u]; | ||
| 159 | - if (first_kid.isDictionary() && last_kid.isDictionary()) { | ||
| 160 | - Array first_limits = first_kid.getKey("/Limits"); | ||
| 161 | - Array last_limits = last_kid.getKey("/Limits"); | ||
| 162 | - if (first_limits.size() >= 2 && last_limits.size() >= 2) { | 153 | + } else { |
| 154 | + Array kids = a_node["/Kids"]; | ||
| 155 | + size_t nkids = kids.size(); | ||
| 156 | + if (nkids > 0) { | ||
| 157 | + Array first_limits = kids[0]["/Limits"]; | ||
| 158 | + if (first_limits.size() >= 2) { | ||
| 163 | first = first_limits[0]; | 159 | first = first_limits[0]; |
| 164 | - last = last_limits[1]; | 160 | + last = kids[nkids - 1u]["/Limits"][1]; |
| 165 | } | 161 | } |
| 166 | } | 162 | } |
| 167 | } | 163 | } |
| 168 | - if (first && last) { | ||
| 169 | - Array limits({first, last}); | ||
| 170 | - Array olimits = a_node.getKey("/Limits"); | 164 | + if (!(first && last)) { |
| 165 | + impl.warn(a_node, "unable to determine limits"); | ||
| 166 | + } else { | ||
| 167 | + Array olimits = a_node["/Limits"]; | ||
| 171 | if (olimits.size() == 2) { | 168 | if (olimits.size() == 2) { |
| 172 | auto ofirst = olimits[0]; | 169 | auto ofirst = olimits[0]; |
| 173 | auto olast = olimits[1]; | 170 | auto olast = olimits[1]; |
| 174 | if (impl.keyValid(ofirst) && impl.keyValid(olast) && | 171 | if (impl.keyValid(ofirst) && impl.keyValid(olast) && |
| 175 | impl.compareKeys(first, ofirst) == 0 && impl.compareKeys(last, olast) == 0) { | 172 | impl.compareKeys(first, ofirst) == 0 && impl.compareKeys(last, olast) == 0) { |
| 176 | - changed = false; | 173 | + return; |
| 177 | } | 174 | } |
| 178 | } | 175 | } |
| 179 | - if (changed && !a_node.isSameObjectAs(path.begin()->node)) { | ||
| 180 | - a_node.replaceKey("/Limits", limits); | 176 | + if (a_node != path.begin()->node) { |
| 177 | + a_node.replaceKey("/Limits", Array({first, last})); | ||
| 181 | } | 178 | } |
| 182 | - } else { | ||
| 183 | - impl.warn(a_node, "unable to determine limits"); | ||
| 184 | } | 179 | } |
| 185 | 180 | ||
| 186 | - if (!changed || parent == path.begin()) { | ||
| 187 | - break; | ||
| 188 | - } else { | ||
| 189 | - a_node = parent->node; | ||
| 190 | - --parent; | 181 | + if (parent == path.begin()) { |
| 182 | + return; | ||
| 191 | } | 183 | } |
| 184 | + a_node = parent->node; | ||
| 185 | + --parent; | ||
| 192 | } | 186 | } |
| 193 | } | 187 | } |
| 194 | 188 |
libqpdf/qpdf/NNTree.hh
| @@ -107,7 +107,7 @@ class NNTreeIterator final | @@ -107,7 +107,7 @@ class NNTreeIterator final | ||
| 107 | } | 107 | } |
| 108 | qpdf::Dictionary getNextKid(PathElement& element, bool backward); | 108 | qpdf::Dictionary getNextKid(PathElement& element, bool backward); |
| 109 | void increment(bool backward); | 109 | void increment(bool backward); |
| 110 | - void resetLimits(QPDFObjectHandle node, std::list<PathElement>::iterator parent); | 110 | + void resetLimits(qpdf::Dictionary node, std::list<PathElement>::iterator parent); |
| 111 | 111 | ||
| 112 | void split(QPDFObjectHandle to_split, std::list<PathElement>::iterator parent); | 112 | void split(QPDFObjectHandle to_split, std::list<PathElement>::iterator parent); |
| 113 | std::list<PathElement>::iterator lastPathElement(); | 113 | std::list<PathElement>::iterator lastPathElement(); |