Commit 0356bcecc5f58b64d2cf02c68ca1934446cea9cb

Authored by m-holger
1 parent ff69773b

Tidy QPDF::pushInheritedAttributesToPageInternal

Remove unnecessary parameters.
Remove code that is unnecessary as result of a prior call to QPDF::getAllPages.
Avoid clearing and rebuilding of m->all_pages.
include/qpdf/QPDF.hh
... ... @@ -1616,10 +1616,8 @@ class QPDF
1616 1616 void pushInheritedAttributesToPageInternal(
1617 1617 QPDFObjectHandle,
1618 1618 std::map<std::string, std::vector<QPDFObjectHandle>>&,
1619   - std::vector<QPDFObjectHandle>& all_pages,
1620 1619 bool allow_changes,
1621   - bool warn_skipped_keys,
1622   - std::set<QPDFObjGen>& visited);
  1620 + bool warn_skipped_keys);
1623 1621 void updateObjectMaps(
1624 1622 ObjUser const& ou,
1625 1623 QPDFObjectHandle oh,
... ...
libqpdf/QPDF_optimization.cc
... ... @@ -148,15 +148,11 @@ QPDF::pushInheritedAttributesToPage(bool allow_changes, bool warn_skipped_keys)
148 148 // key_ancestors is a mapping of page attribute keys to a stack of
149 149 // Pages nodes that contain values for them.
150 150 std::map<std::string, std::vector<QPDFObjectHandle>> key_ancestors;
151   - this->m->all_pages.clear();
152   - std::set<QPDFObjGen> visited;
153 151 pushInheritedAttributesToPageInternal(
154 152 this->m->trailer.getKey("/Root").getKey("/Pages"),
155 153 key_ancestors,
156   - this->m->all_pages,
157 154 allow_changes,
158   - warn_skipped_keys,
159   - visited);
  155 + warn_skipped_keys);
160 156 if (!key_ancestors.empty()) {
161 157 throw std::logic_error("key_ancestors not empty after"
162 158 " pushing inherited attributes to pages");
... ... @@ -169,35 +165,9 @@ void
169 165 QPDF::pushInheritedAttributesToPageInternal(
170 166 QPDFObjectHandle cur_pages,
171 167 std::map<std::string, std::vector<QPDFObjectHandle>>& key_ancestors,
172   - std::vector<QPDFObjectHandle>& pages,
173 168 bool allow_changes,
174   - bool warn_skipped_keys,
175   - std::set<QPDFObjGen>& visited)
  169 + bool warn_skipped_keys)
176 170 {
177   - QPDFObjGen this_og = cur_pages.getObjGen();
178   - if (visited.count(this_og) > 0) {
179   - throw QPDFExc(
180   - qpdf_e_pages,
181   - this->m->file->getName(),
182   - this->m->last_object_description,
183   - 0,
184   - "Loop detected in /Pages structure (inherited attributes)");
185   - }
186   - visited.insert(this_og);
187   -
188   - if (!cur_pages.isDictionary()) {
189   - throw QPDFExc(
190   - qpdf_e_damaged_pdf,
191   - this->m->file->getName(),
192   - this->m->last_object_description,
193   - this->m->file->getLastOffset(),
194   - "invalid object in page tree");
195   - }
196   -
197   - // Extract the underlying dictionary object
198   - std::string type = cur_pages.getKey("/Type").getName();
199   -
200   - if (type == "/Pages") {
201 171 // Make a list of inheritable keys. Only the keys /MediaBox,
202 172 // /CropBox, /Resources, and /Rotate are inheritable
203 173 // attributes. Push this object onto the stack of pages nodes
... ... @@ -265,17 +235,25 @@ QPDF::pushInheritedAttributesToPageInternal(
265 235 }
266 236 }
267 237  
268   - // Visit descendant nodes.
269   - QPDFObjectHandle kids = cur_pages.getKey("/Kids");
270   - int n = kids.getArrayNItems();
271   - for (int i = 0; i < n; ++i) {
272   - pushInheritedAttributesToPageInternal(
273   - kids.getArrayItem(i),
274   - key_ancestors,
275   - pages,
276   - allow_changes,
277   - warn_skipped_keys,
278   - visited);
  238 + // Process descendant nodes.
  239 + for (auto& kid: cur_pages.getKey("/Kids").aitems()) {
  240 + if (kid.isDictionaryOfType("/Pages")) {
  241 + pushInheritedAttributesToPageInternal(
  242 + kid, key_ancestors, allow_changes, warn_skipped_keys);
  243 + } else {
  244 + // Add all available inheritable attributes not present in
  245 + // this object to this object.
  246 + for (auto const& iter: key_ancestors) {
  247 + std::string const& key = iter.first;
  248 + if (!kid.hasKey(key)) {
  249 + QTC::TC("qpdf", "QPDF opt resource inherited");
  250 + kid.replaceKey(key, iter.second.back());
  251 + } else {
  252 + QTC::TC(
  253 + "qpdf", "QPDF opt page resource hides ancestor");
  254 + }
  255 + }
  256 + }
279 257 }
280 258  
281 259 // For each inheritable key, pop the stack. If the stack
... ... @@ -295,28 +273,6 @@ QPDF::pushInheritedAttributesToPageInternal(
295 273 } else {
296 274 QTC::TC("qpdf", "QPDF opt no inheritable keys");
297 275 }
298   - } else if (type == "/Page") {
299   - // Add all available inheritable attributes not present in
300   - // this object to this object.
301   - for (auto const& iter: key_ancestors) {
302   - std::string const& key = iter.first;
303   - if (!cur_pages.hasKey(key)) {
304   - QTC::TC("qpdf", "QPDF opt resource inherited");
305   - cur_pages.replaceKey(key, iter.second.back());
306   - } else {
307   - QTC::TC("qpdf", "QPDF opt page resource hides ancestor");
308   - }
309   - }
310   - pages.push_back(cur_pages);
311   - } else {
312   - throw QPDFExc(
313   - qpdf_e_damaged_pdf,
314   - this->m->file->getName(),
315   - this->m->last_object_description,
316   - this->m->file->getLastOffset(),
317   - "invalid Type " + type + " in page tree");
318   - }
319   - visited.erase(this_og);
320 276 }
321 277  
322 278 void
... ...