Commit eb0fec00b10cd84140bf8e89f3c16cb67378fb60
1 parent
fc27221a
Refactor `Pages` methods: add `erase`, `find` and `update_cache`, refactor `QPDF…
…::removePage` to use `Pages::erase`, streamline cache handling in `Pages::update_cache`.
Showing
2 changed files
with
31 additions
and
8 deletions
libqpdf/QPDF_pages.cc
| ... | ... | @@ -241,13 +241,19 @@ Pages::getAllPagesInternal( |
| 241 | 241 | void |
| 242 | 242 | QPDF::updateAllPagesCache() |
| 243 | 243 | { |
| 244 | + m->pages.update_cache(); | |
| 245 | +} | |
| 246 | + | |
| 247 | +void | |
| 248 | +Pages::update_cache() | |
| 249 | +{ | |
| 244 | 250 | // Force regeneration of the pages cache. We force immediate recalculation of all_pages since |
| 245 | 251 | // users may have references to it that they got from calls to getAllPages(). We can defer |
| 246 | 252 | // recalculation of pageobj_to_pages_pos until needed. |
| 247 | 253 | m->all_pages.clear(); |
| 248 | 254 | m->pageobj_to_pages_pos.clear(); |
| 249 | 255 | m->pushed_inherited_attributes_to_pages = false; |
| 250 | - getAllPages(); | |
| 256 | + all(); | |
| 251 | 257 | } |
| 252 | 258 | |
| 253 | 259 | void |
| ... | ... | @@ -274,11 +280,11 @@ Pages::flattenPagesTree() |
| 274 | 280 | m->all_pages.at(pos).replaceKey("/Parent", pages); |
| 275 | 281 | } |
| 276 | 282 | |
| 277 | - pages.replaceKey("/Kids", QPDFObjectHandle::newArray(m->all_pages)); | |
| 283 | + pages.replaceKey("/Kids", Array(m->all_pages)); | |
| 278 | 284 | // /Count has not changed |
| 279 | 285 | if (pages.getKey("/Count").getUIntValue() != len) { |
| 280 | 286 | if (m->invalid_page_found && pages.getKey("/Count").getUIntValue() > len) { |
| 281 | - pages.replaceKey("/Count", QPDFObjectHandle::newInteger(toI(len))); | |
| 287 | + pages.replaceKey("/Count", Integer(len)); | |
| 282 | 288 | } else { |
| 283 | 289 | throw std::runtime_error("/Count is wrong after flattening pages tree"); |
| 284 | 290 | } |
| ... | ... | @@ -484,7 +490,13 @@ Pages::insertPage(QPDFObjectHandle newpage, int pos) |
| 484 | 490 | void |
| 485 | 491 | QPDF::removePage(QPDFObjectHandle page) |
| 486 | 492 | { |
| 487 | - int pos = findPage(page); // also ensures flat /Pages | |
| 493 | + m->pages.erase(page); | |
| 494 | +} | |
| 495 | + | |
| 496 | +void | |
| 497 | +Pages ::erase(QPDFObjectHandle& page) | |
| 498 | +{ | |
| 499 | + int pos = qpdf.findPage(page); // also ensures flat /Pages | |
| 488 | 500 | QTC::TC( |
| 489 | 501 | "qpdf", |
| 490 | 502 | "QPDF remove page", |
| ... | ... | @@ -492,7 +504,7 @@ QPDF::removePage(QPDFObjectHandle page) |
| 492 | 504 | (pos == toI(m->all_pages.size() - 1)) ? 1 // end |
| 493 | 505 | : 2); // remove in middle |
| 494 | 506 | |
| 495 | - QPDFObjectHandle pages = getRoot().getKey("/Pages"); | |
| 507 | + QPDFObjectHandle pages = qpdf.getRoot().getKey("/Pages"); | |
| 496 | 508 | QPDFObjectHandle kids = pages.getKey("/Kids"); |
| 497 | 509 | |
| 498 | 510 | kids.eraseItem(pos); |
| ... | ... | @@ -535,7 +547,13 @@ QPDF::findPage(QPDFObjectHandle& page) |
| 535 | 547 | int |
| 536 | 548 | QPDF::findPage(QPDFObjGen og) |
| 537 | 549 | { |
| 538 | - m->pages.flattenPagesTree(); | |
| 550 | + return m->pages.find(og); | |
| 551 | +} | |
| 552 | + | |
| 553 | +int | |
| 554 | +Pages ::find(QPDFObjGen og) | |
| 555 | +{ | |
| 556 | + flattenPagesTree(); | |
| 539 | 557 | auto it = m->pageobj_to_pages_pos.find(og); |
| 540 | 558 | if (it == m->pageobj_to_pages_pos.end()) { |
| 541 | 559 | throw QPDFExc( | ... | ... |
libqpdf/qpdf/QPDF_private.hh
| ... | ... | @@ -879,17 +879,22 @@ class QPDF::Doc::Pages: Common |
| 879 | 879 | return all().size(); |
| 880 | 880 | } |
| 881 | 881 | |
| 882 | + int find(QPDFObjGen og); | |
| 883 | + void erase(QPDFObjectHandle& page); | |
| 884 | + void update_cache(); | |
| 885 | + | |
| 882 | 886 | void insertPage(QPDFObjectHandle newpage, int pos); |
| 887 | + void pushInheritedAttributesToPage(bool allow_changes, bool warn_skipped_keys); | |
| 888 | + | |
| 889 | + private: | |
| 883 | 890 | void flattenPagesTree(); |
| 884 | 891 | void insertPageobjToPage(QPDFObjectHandle const& obj, int pos, bool check_duplicate); |
| 885 | - void pushInheritedAttributesToPage(bool allow_changes, bool warn_skipped_keys); | |
| 886 | 892 | void pushInheritedAttributesToPageInternal( |
| 887 | 893 | QPDFObjectHandle, |
| 888 | 894 | std::map<std::string, std::vector<QPDFObjectHandle>>&, |
| 889 | 895 | bool allow_changes, |
| 890 | 896 | bool warn_skipped_keys); |
| 891 | 897 | |
| 892 | - private: | |
| 893 | 898 | void getAllPagesInternal( |
| 894 | 899 | QPDFObjectHandle cur_pages, |
| 895 | 900 | QPDFObjGen::set& visited, | ... | ... |