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,13 +241,19 @@ Pages::getAllPagesInternal( | ||
| 241 | void | 241 | void |
| 242 | QPDF::updateAllPagesCache() | 242 | QPDF::updateAllPagesCache() |
| 243 | { | 243 | { |
| 244 | + m->pages.update_cache(); | ||
| 245 | +} | ||
| 246 | + | ||
| 247 | +void | ||
| 248 | +Pages::update_cache() | ||
| 249 | +{ | ||
| 244 | // Force regeneration of the pages cache. We force immediate recalculation of all_pages since | 250 | // Force regeneration of the pages cache. We force immediate recalculation of all_pages since |
| 245 | // users may have references to it that they got from calls to getAllPages(). We can defer | 251 | // users may have references to it that they got from calls to getAllPages(). We can defer |
| 246 | // recalculation of pageobj_to_pages_pos until needed. | 252 | // recalculation of pageobj_to_pages_pos until needed. |
| 247 | m->all_pages.clear(); | 253 | m->all_pages.clear(); |
| 248 | m->pageobj_to_pages_pos.clear(); | 254 | m->pageobj_to_pages_pos.clear(); |
| 249 | m->pushed_inherited_attributes_to_pages = false; | 255 | m->pushed_inherited_attributes_to_pages = false; |
| 250 | - getAllPages(); | 256 | + all(); |
| 251 | } | 257 | } |
| 252 | 258 | ||
| 253 | void | 259 | void |
| @@ -274,11 +280,11 @@ Pages::flattenPagesTree() | @@ -274,11 +280,11 @@ Pages::flattenPagesTree() | ||
| 274 | m->all_pages.at(pos).replaceKey("/Parent", pages); | 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 | // /Count has not changed | 284 | // /Count has not changed |
| 279 | if (pages.getKey("/Count").getUIntValue() != len) { | 285 | if (pages.getKey("/Count").getUIntValue() != len) { |
| 280 | if (m->invalid_page_found && pages.getKey("/Count").getUIntValue() > len) { | 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 | } else { | 288 | } else { |
| 283 | throw std::runtime_error("/Count is wrong after flattening pages tree"); | 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,7 +490,13 @@ Pages::insertPage(QPDFObjectHandle newpage, int pos) | ||
| 484 | void | 490 | void |
| 485 | QPDF::removePage(QPDFObjectHandle page) | 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 | QTC::TC( | 500 | QTC::TC( |
| 489 | "qpdf", | 501 | "qpdf", |
| 490 | "QPDF remove page", | 502 | "QPDF remove page", |
| @@ -492,7 +504,7 @@ QPDF::removePage(QPDFObjectHandle page) | @@ -492,7 +504,7 @@ QPDF::removePage(QPDFObjectHandle page) | ||
| 492 | (pos == toI(m->all_pages.size() - 1)) ? 1 // end | 504 | (pos == toI(m->all_pages.size() - 1)) ? 1 // end |
| 493 | : 2); // remove in middle | 505 | : 2); // remove in middle |
| 494 | 506 | ||
| 495 | - QPDFObjectHandle pages = getRoot().getKey("/Pages"); | 507 | + QPDFObjectHandle pages = qpdf.getRoot().getKey("/Pages"); |
| 496 | QPDFObjectHandle kids = pages.getKey("/Kids"); | 508 | QPDFObjectHandle kids = pages.getKey("/Kids"); |
| 497 | 509 | ||
| 498 | kids.eraseItem(pos); | 510 | kids.eraseItem(pos); |
| @@ -535,7 +547,13 @@ QPDF::findPage(QPDFObjectHandle& page) | @@ -535,7 +547,13 @@ QPDF::findPage(QPDFObjectHandle& page) | ||
| 535 | int | 547 | int |
| 536 | QPDF::findPage(QPDFObjGen og) | 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 | auto it = m->pageobj_to_pages_pos.find(og); | 557 | auto it = m->pageobj_to_pages_pos.find(og); |
| 540 | if (it == m->pageobj_to_pages_pos.end()) { | 558 | if (it == m->pageobj_to_pages_pos.end()) { |
| 541 | throw QPDFExc( | 559 | throw QPDFExc( |
libqpdf/qpdf/QPDF_private.hh
| @@ -879,17 +879,22 @@ class QPDF::Doc::Pages: Common | @@ -879,17 +879,22 @@ class QPDF::Doc::Pages: Common | ||
| 879 | return all().size(); | 879 | return all().size(); |
| 880 | } | 880 | } |
| 881 | 881 | ||
| 882 | + int find(QPDFObjGen og); | ||
| 883 | + void erase(QPDFObjectHandle& page); | ||
| 884 | + void update_cache(); | ||
| 885 | + | ||
| 882 | void insertPage(QPDFObjectHandle newpage, int pos); | 886 | void insertPage(QPDFObjectHandle newpage, int pos); |
| 887 | + void pushInheritedAttributesToPage(bool allow_changes, bool warn_skipped_keys); | ||
| 888 | + | ||
| 889 | + private: | ||
| 883 | void flattenPagesTree(); | 890 | void flattenPagesTree(); |
| 884 | void insertPageobjToPage(QPDFObjectHandle const& obj, int pos, bool check_duplicate); | 891 | void insertPageobjToPage(QPDFObjectHandle const& obj, int pos, bool check_duplicate); |
| 885 | - void pushInheritedAttributesToPage(bool allow_changes, bool warn_skipped_keys); | ||
| 886 | void pushInheritedAttributesToPageInternal( | 892 | void pushInheritedAttributesToPageInternal( |
| 887 | QPDFObjectHandle, | 893 | QPDFObjectHandle, |
| 888 | std::map<std::string, std::vector<QPDFObjectHandle>>&, | 894 | std::map<std::string, std::vector<QPDFObjectHandle>>&, |
| 889 | bool allow_changes, | 895 | bool allow_changes, |
| 890 | bool warn_skipped_keys); | 896 | bool warn_skipped_keys); |
| 891 | 897 | ||
| 892 | - private: | ||
| 893 | void getAllPagesInternal( | 898 | void getAllPagesInternal( |
| 894 | QPDFObjectHandle cur_pages, | 899 | QPDFObjectHandle cur_pages, |
| 895 | QPDFObjGen::set& visited, | 900 | QPDFObjGen::set& visited, |