Commit 36e9b370597051155c5ca6c4b1c2c3914fb332cf

Authored by m-holger
1 parent 233e46b5

Refactor `NNTreeIterator::resetLimits`: update to use `Dictionary` API, replace …

…`getKey` with subscript operator, and simplify logic.
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();
... ...