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,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();