Commit eb0fec00b10cd84140bf8e89f3c16cb67378fb60

Authored by m-holger
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`.
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,
... ...