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 472 bool shouldRemoveUnreferencedResources(QPDF& pdf);
473 473 void handleRotations(QPDF& pdf);
474 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 476 void handleUnderOverlay(QPDF& pdf);
477 477 std::string doUnderOverlayForPage(
478 478 QPDF& pdf,
479 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 481 PageNo const& page_idx,
482 482 size_t uo_idx,
483 483 std::map<int, std::map<size_t, QPDFObjectHandle>>& fo,
... ...
libqpdf/QPDFJob.cc
... ... @@ -1911,13 +1911,13 @@ std::string
1911 1911 QPDFJob::doUnderOverlayForPage(
1912 1912 QPDF& pdf,
1913 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 1915 PageNo const& pageno,
1916 1916 size_t uo_idx,
1917 1917 std::map<int, std::map<size_t, QPDFObjectHandle>>& fo,
1918 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 1921 return "";
1922 1922 }
1923 1923 auto& dest_afdh = dest_page.qpdf()->acroform();
... ... @@ -1926,7 +1926,7 @@ QPDFJob::doUnderOverlayForPage(
1926 1926 std::string content;
1927 1927 int min_suffix = 1;
1928 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 1930 doIfVerbose([&](Pipeline& v, std::string const& prefix) {
1931 1931 v << " " << uo.filename << " " << uo.which << " " << from_no.no << "\n";
1932 1932 });
... ... @@ -1958,14 +1958,15 @@ QPDFJob::doUnderOverlayForPage(
1958 1958 void
1959 1959 QPDFJob::getUOPagenos(
1960 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 1963 size_t uo_idx = 0;
1964 1964 for (auto const& uo: uos) {
1965 1965 size_t page_idx = 0;
1966 1966 size_t from_size = uo.from_pagenos.size();
1967 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 1970 if (page_idx < from_size) {
1970 1971 pagenos[to_pageno][uo_idx].push_back(uo.from_pagenos.at(page_idx));
1971 1972 } else if (repeat_size) {
... ... @@ -1991,12 +1992,12 @@ QPDFJob::handleUnderOverlay(QPDF&amp; pdf)
1991 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 2001 getUOPagenos(m->underlay, underlay_pagenos);
2001 2002 getUOPagenos(m->overlay, overlay_pagenos);
2002 2003 doIfVerbose([&](Pipeline& v, std::string const& prefix) {
... ... @@ -2006,11 +2007,12 @@ QPDFJob::handleUnderOverlay(QPDF&amp; pdf)
2006 2007 std::map<int, std::map<size_t, QPDFObjectHandle>> underlay_fo;
2007 2008 std::map<int, std::map<size_t, QPDFObjectHandle>> overlay_fo;
2008 2009 PageNo dest_page_no;
2009   - for (QPDFPageObjectHelper dest_page: main_pages) {
  2010 + for (QPDFPageObjectHelper dest_page: dest_pages) {
2010 2011 doIfVerbose([&](Pipeline& v, std::string const& prefix) {
2011 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 2016 ++dest_page_no;
2015 2017 continue;
2016 2018 }
... ...