Commit df493c352f3936b7b6597791c289175dffb3db57
1 parent
5d3f93be
Refactor optimizePagesTree
Split optimizePagesTree into a simpler top-level routine and a recursive internal routine.
Showing
2 changed files
with
22 additions
and
13 deletions
include/qpdf/QPDF.hh
| ... | ... | @@ -873,7 +873,8 @@ class QPDF |
| 873 | 873 | |
| 874 | 874 | // Methods to support optimization |
| 875 | 875 | |
| 876 | - void optimizePagesTree( | |
| 876 | + void optimizePagesTree(bool allow_changes); | |
| 877 | + void optimizePagesTreeInternal( | |
| 877 | 878 | QPDFObjectHandle, |
| 878 | 879 | std::map<std::string, std::vector<QPDFObjectHandle> >&, |
| 879 | 880 | int& pageno, bool allow_changes); | ... | ... |
libqpdf/QPDF_optimization.cc
| ... | ... | @@ -167,15 +167,7 @@ QPDF::optimize(std::map<int, int> const& object_stream_data, |
| 167 | 167 | |
| 168 | 168 | // Traverse pages tree pushing all inherited resources down to the |
| 169 | 169 | // page level. |
| 170 | - | |
| 171 | - // key_ancestors is a mapping of page attribute keys to a stack of | |
| 172 | - // Pages nodes that contain values for them. pageno is the | |
| 173 | - // current page sequence number numbered from 0. | |
| 174 | - std::map<std::string, std::vector<QPDFObjectHandle> > key_ancestors; | |
| 175 | - int pageno = 0; | |
| 176 | - optimizePagesTree(this->trailer.getKey("/Root").getKey("/Pages"), | |
| 177 | - key_ancestors, pageno, allow_changes); | |
| 178 | - assert(key_ancestors.empty()); | |
| 170 | + optimizePagesTree(allow_changes); | |
| 179 | 171 | |
| 180 | 172 | // Traverse document-level items |
| 181 | 173 | std::set<std::string> keys = this->trailer.getKeys(); |
| ... | ... | @@ -220,7 +212,23 @@ QPDF::optimize(std::map<int, int> const& object_stream_data, |
| 220 | 212 | } |
| 221 | 213 | |
| 222 | 214 | void |
| 223 | -QPDF::optimizePagesTree( | |
| 215 | +QPDF::optimizePagesTree(bool allow_changes) | |
| 216 | +{ | |
| 217 | + // Traverse pages tree pushing all inherited resources down to the | |
| 218 | + // page level. | |
| 219 | + | |
| 220 | + // key_ancestors is a mapping of page attribute keys to a stack of | |
| 221 | + // Pages nodes that contain values for them. pageno is the | |
| 222 | + // current page sequence number numbered from 0. | |
| 223 | + std::map<std::string, std::vector<QPDFObjectHandle> > key_ancestors; | |
| 224 | + int pageno = 0; | |
| 225 | + optimizePagesTreeInternal(this->trailer.getKey("/Root").getKey("/Pages"), | |
| 226 | + key_ancestors, pageno, allow_changes); | |
| 227 | + assert(key_ancestors.empty()); | |
| 228 | +} | |
| 229 | + | |
| 230 | +void | |
| 231 | +QPDF::optimizePagesTreeInternal( | |
| 224 | 232 | QPDFObjectHandle cur_pages, |
| 225 | 233 | std::map<std::string, std::vector<QPDFObjectHandle> >& key_ancestors, |
| 226 | 234 | int& pageno, bool allow_changes) |
| ... | ... | @@ -293,8 +301,8 @@ QPDF::optimizePagesTree( |
| 293 | 301 | int n = kids.getArrayNItems(); |
| 294 | 302 | for (int i = 0; i < n; ++i) |
| 295 | 303 | { |
| 296 | - optimizePagesTree(kids.getArrayItem(i), key_ancestors, pageno, | |
| 297 | - allow_changes); | |
| 304 | + optimizePagesTreeInternal( | |
| 305 | + kids.getArrayItem(i), key_ancestors, pageno, allow_changes); | |
| 298 | 306 | } |
| 299 | 307 | |
| 300 | 308 | // For each inheritable key, pop the stack. If the stack | ... | ... |