Commit 98d8d4728af4a25198c6156fe1cc602fafa2dbd1

Authored by m-holger
1 parent e7dad11b

Refactor `QPDFJob::handleUnderlaysAndOverlays`: replace nested maps with vector-…

…based structure for page mapping, improve indexing logic, and clean up redundant variables.
include/qpdf/QPDFJob.hh
@@ -472,12 +472,12 @@ class QPDFJob @@ -472,12 +472,12 @@ class QPDFJob
472 bool shouldRemoveUnreferencedResources(QPDF& pdf); 472 bool shouldRemoveUnreferencedResources(QPDF& pdf);
473 void handleRotations(QPDF& pdf); 473 void handleRotations(QPDF& pdf);
474 void getUOPagenos( 474 void getUOPagenos(
475 - std::vector<UnderOverlay>& uo, std::map<int, std::map<size_t, std::vector<int>>>& pagenos); 475 + std::vector<UnderOverlay>& uo, std::vector<std::map<size_t, std::vector<int>>>& pagenos);
476 void handleUnderOverlay(QPDF& pdf); 476 void handleUnderOverlay(QPDF& pdf);
477 std::string doUnderOverlayForPage( 477 std::string doUnderOverlayForPage(
478 QPDF& pdf, 478 QPDF& pdf,
479 UnderOverlay& uo, 479 UnderOverlay& uo,
480 - std::map<int, std::map<size_t, std::vector<int>>>& pagenos, 480 + std::vector<std::map<size_t, std::vector<int>>>& pagenos,
481 PageNo const& page_idx, 481 PageNo const& page_idx,
482 size_t uo_idx, 482 size_t uo_idx,
483 std::map<int, std::map<size_t, QPDFObjectHandle>>& fo, 483 std::map<int, std::map<size_t, QPDFObjectHandle>>& fo,
libqpdf/QPDFJob.cc
@@ -1911,13 +1911,13 @@ std::string @@ -1911,13 +1911,13 @@ std::string
1911 QPDFJob::doUnderOverlayForPage( 1911 QPDFJob::doUnderOverlayForPage(
1912 QPDF& pdf, 1912 QPDF& pdf,
1913 UnderOverlay& uo, 1913 UnderOverlay& uo,
1914 - std::map<int, std::map<size_t, std::vector<int>>>& pagenos, 1914 + std::vector<std::map<size_t, std::vector<int>>>& pagenos,
1915 PageNo const& pageno, 1915 PageNo const& pageno,
1916 size_t uo_idx, 1916 size_t uo_idx,
1917 std::map<int, std::map<size_t, QPDFObjectHandle>>& fo, 1917 std::map<int, std::map<size_t, QPDFObjectHandle>>& fo,
1918 QPDFPageObjectHelper& dest_page) 1918 QPDFPageObjectHelper& dest_page)
1919 { 1919 {
1920 - if (!(uo.pdf && pagenos.contains(pageno.no) && pagenos[pageno.no].contains(uo_idx))) { 1920 + if (!(uo.pdf && pagenos[pageno.idx].contains(uo_idx))) {
1921 return ""; 1921 return "";
1922 } 1922 }
1923 auto& dest_afdh = dest_page.qpdf()->acroform(); 1923 auto& dest_afdh = dest_page.qpdf()->acroform();
@@ -1926,7 +1926,7 @@ QPDFJob::doUnderOverlayForPage( @@ -1926,7 +1926,7 @@ QPDFJob::doUnderOverlayForPage(
1926 std::string content; 1926 std::string content;
1927 int min_suffix = 1; 1927 int min_suffix = 1;
1928 QPDFObjectHandle resources = dest_page.getAttribute("/Resources", true); 1928 QPDFObjectHandle resources = dest_page.getAttribute("/Resources", true);
1929 - for (PageNo from_no: pagenos[pageno.no][uo_idx]) { 1929 + for (PageNo from_no: pagenos[pageno.idx][uo_idx]) {
1930 doIfVerbose([&](Pipeline& v, std::string const& prefix) { 1930 doIfVerbose([&](Pipeline& v, std::string const& prefix) {
1931 v << " " << uo.filename << " " << uo.which << " " << from_no.no << "\n"; 1931 v << " " << uo.filename << " " << uo.which << " " << from_no.no << "\n";
1932 }); 1932 });
@@ -1958,14 +1958,15 @@ QPDFJob::doUnderOverlayForPage( @@ -1958,14 +1958,15 @@ QPDFJob::doUnderOverlayForPage(
1958 void 1958 void
1959 QPDFJob::getUOPagenos( 1959 QPDFJob::getUOPagenos(
1960 std::vector<QPDFJob::UnderOverlay>& uos, 1960 std::vector<QPDFJob::UnderOverlay>& uos,
1961 - std::map<int, std::map<size_t, std::vector<int>>>& pagenos) 1961 + std::vector<std::map<size_t, std::vector<int>>>& pagenos)
1962 { 1962 {
1963 size_t uo_idx = 0; 1963 size_t uo_idx = 0;
1964 for (auto const& uo: uos) { 1964 for (auto const& uo: uos) {
1965 size_t page_idx = 0; 1965 size_t page_idx = 0;
1966 size_t from_size = uo.from_pagenos.size(); 1966 size_t from_size = uo.from_pagenos.size();
1967 size_t repeat_size = uo.repeat_pagenos.size(); 1967 size_t repeat_size = uo.repeat_pagenos.size();
1968 - for (int to_pageno: uo.to_pagenos) { 1968 + for (int to_pageno_i: uo.to_pagenos) {
  1969 + size_t to_pageno = static_cast<size_t>(to_pageno_i - 1);
1969 if (page_idx < from_size) { 1970 if (page_idx < from_size) {
1970 pagenos[to_pageno][uo_idx].push_back(uo.from_pagenos.at(page_idx)); 1971 pagenos[to_pageno][uo_idx].push_back(uo.from_pagenos.at(page_idx));
1971 } else if (repeat_size) { 1972 } else if (repeat_size) {
@@ -1991,12 +1992,12 @@ QPDFJob::handleUnderOverlay(QPDF&amp; pdf) @@ -1991,12 +1992,12 @@ QPDFJob::handleUnderOverlay(QPDF&amp; pdf)
1991 validateUnderOverlay(pdf, &uo); 1992 validateUnderOverlay(pdf, &uo);
1992 } 1993 }
1993 1994
1994 - auto const& main_pages = pdf.getAllPages(); 1995 + auto const& dest_pages = pdf.getAllPages();
1995 1996
1996 - // First map key is 1-based page number. Second is index into the overlay/underlay vector. Watch  
1997 - // out to not reverse the keys or be off by one.  
1998 - std::map<int, std::map<size_t, std::vector<int>>> underlay_pagenos;  
1999 - std::map<int, std::map<size_t, std::vector<int>>> overlay_pagenos; 1997 + // First vector key is 0-based page number. Second is index into the overlay/underlay vector.
  1998 + // Watch out to not reverse the keys or be off by one.
  1999 + std::vector<std::map<size_t, std::vector<int>>> underlay_pagenos(dest_pages.size());
  2000 + std::vector<std::map<size_t, std::vector<int>>> overlay_pagenos(dest_pages.size());
2000 getUOPagenos(m->underlay, underlay_pagenos); 2001 getUOPagenos(m->underlay, underlay_pagenos);
2001 getUOPagenos(m->overlay, overlay_pagenos); 2002 getUOPagenos(m->overlay, overlay_pagenos);
2002 doIfVerbose([&](Pipeline& v, std::string const& prefix) { 2003 doIfVerbose([&](Pipeline& v, std::string const& prefix) {
@@ -2006,11 +2007,12 @@ QPDFJob::handleUnderOverlay(QPDF&amp; pdf) @@ -2006,11 +2007,12 @@ QPDFJob::handleUnderOverlay(QPDF&amp; pdf)
2006 std::map<int, std::map<size_t, QPDFObjectHandle>> underlay_fo; 2007 std::map<int, std::map<size_t, QPDFObjectHandle>> underlay_fo;
2007 std::map<int, std::map<size_t, QPDFObjectHandle>> overlay_fo; 2008 std::map<int, std::map<size_t, QPDFObjectHandle>> overlay_fo;
2008 PageNo dest_page_no; 2009 PageNo dest_page_no;
2009 - for (QPDFPageObjectHelper dest_page: main_pages) { 2010 + for (QPDFPageObjectHelper dest_page: dest_pages) {
2010 doIfVerbose([&](Pipeline& v, std::string const& prefix) { 2011 doIfVerbose([&](Pipeline& v, std::string const& prefix) {
2011 v << " page " << dest_page_no.no << "\n"; 2012 v << " page " << dest_page_no.no << "\n";
2012 }); 2013 });
2013 - if (underlay_pagenos[dest_page_no.no].empty() && overlay_pagenos[dest_page_no.no].empty()) { 2014 + if (underlay_pagenos[dest_page_no.idx].empty() &&
  2015 + overlay_pagenos[dest_page_no.idx].empty()) {
2014 ++dest_page_no; 2016 ++dest_page_no;
2015 continue; 2017 continue;
2016 } 2018 }