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,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,