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 | 135 | } |
| 136 | 136 | |
| 137 | 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 | 140 | while (true) { |
| 141 | 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 | 146 | QPDFObjectHandle first; |
| 152 | 147 | QPDFObjectHandle last; |
| 148 | + Array items = a_node[impl.itemsKey()]; | |
| 149 | + size_t nitems = items.size(); | |
| 153 | 150 | if (nitems >= 2) { |
| 154 | 151 | first = items[0]; |
| 155 | 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 | 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 | 168 | if (olimits.size() == 2) { |
| 172 | 169 | auto ofirst = olimits[0]; |
| 173 | 170 | auto olast = olimits[1]; |
| 174 | 171 | if (impl.keyValid(ofirst) && impl.keyValid(olast) && |
| 175 | 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 | 107 | } |
| 108 | 108 | qpdf::Dictionary getNextKid(PathElement& element, bool backward); |
| 109 | 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 | 112 | void split(QPDFObjectHandle to_split, std::list<PathElement>::iterator parent); |
| 113 | 113 | std::list<PathElement>::iterator lastPathElement(); | ... | ... |