From 98d8d4728af4a25198c6156fe1cc602fafa2dbd1 Mon Sep 17 00:00:00 2001 From: m-holger Date: Sun, 14 Sep 2025 15:22:50 +0100 Subject: [PATCH] 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 | 4 ++-- libqpdf/QPDFJob.cc | 26 ++++++++++++++------------ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/include/qpdf/QPDFJob.hh b/include/qpdf/QPDFJob.hh index a448695..048a4eb 100644 --- a/include/qpdf/QPDFJob.hh +++ b/include/qpdf/QPDFJob.hh @@ -472,12 +472,12 @@ class QPDFJob bool shouldRemoveUnreferencedResources(QPDF& pdf); void handleRotations(QPDF& pdf); void getUOPagenos( - std::vector& uo, std::map>>& pagenos); + std::vector& uo, std::vector>>& pagenos); void handleUnderOverlay(QPDF& pdf); std::string doUnderOverlayForPage( QPDF& pdf, UnderOverlay& uo, - std::map>>& pagenos, + std::vector>>& pagenos, PageNo const& page_idx, size_t uo_idx, std::map>& fo, diff --git a/libqpdf/QPDFJob.cc b/libqpdf/QPDFJob.cc index a893ca1..85eab6b 100644 --- a/libqpdf/QPDFJob.cc +++ b/libqpdf/QPDFJob.cc @@ -1911,13 +1911,13 @@ std::string QPDFJob::doUnderOverlayForPage( QPDF& pdf, UnderOverlay& uo, - std::map>>& pagenos, + std::vector>>& pagenos, PageNo const& pageno, size_t uo_idx, std::map>& fo, QPDFPageObjectHelper& dest_page) { - if (!(uo.pdf && pagenos.contains(pageno.no) && pagenos[pageno.no].contains(uo_idx))) { + if (!(uo.pdf && pagenos[pageno.idx].contains(uo_idx))) { return ""; } auto& dest_afdh = dest_page.qpdf()->acroform(); @@ -1926,7 +1926,7 @@ QPDFJob::doUnderOverlayForPage( std::string content; int min_suffix = 1; QPDFObjectHandle resources = dest_page.getAttribute("/Resources", true); - for (PageNo from_no: pagenos[pageno.no][uo_idx]) { + for (PageNo from_no: pagenos[pageno.idx][uo_idx]) { doIfVerbose([&](Pipeline& v, std::string const& prefix) { v << " " << uo.filename << " " << uo.which << " " << from_no.no << "\n"; }); @@ -1958,14 +1958,15 @@ QPDFJob::doUnderOverlayForPage( void QPDFJob::getUOPagenos( std::vector& uos, - std::map>>& pagenos) + std::vector>>& pagenos) { size_t uo_idx = 0; for (auto const& uo: uos) { size_t page_idx = 0; size_t from_size = uo.from_pagenos.size(); size_t repeat_size = uo.repeat_pagenos.size(); - for (int to_pageno: uo.to_pagenos) { + for (int to_pageno_i: uo.to_pagenos) { + size_t to_pageno = static_cast(to_pageno_i - 1); if (page_idx < from_size) { pagenos[to_pageno][uo_idx].push_back(uo.from_pagenos.at(page_idx)); } else if (repeat_size) { @@ -1991,12 +1992,12 @@ QPDFJob::handleUnderOverlay(QPDF& pdf) validateUnderOverlay(pdf, &uo); } - auto const& main_pages = pdf.getAllPages(); + auto const& dest_pages = pdf.getAllPages(); - // First map key is 1-based page number. Second is index into the overlay/underlay vector. Watch - // out to not reverse the keys or be off by one. - std::map>> underlay_pagenos; - std::map>> overlay_pagenos; + // First vector key is 0-based page number. Second is index into the overlay/underlay vector. + // Watch out to not reverse the keys or be off by one. + std::vector>> underlay_pagenos(dest_pages.size()); + std::vector>> overlay_pagenos(dest_pages.size()); getUOPagenos(m->underlay, underlay_pagenos); getUOPagenos(m->overlay, overlay_pagenos); doIfVerbose([&](Pipeline& v, std::string const& prefix) { @@ -2006,11 +2007,12 @@ QPDFJob::handleUnderOverlay(QPDF& pdf) std::map> underlay_fo; std::map> overlay_fo; PageNo dest_page_no; - for (QPDFPageObjectHelper dest_page: main_pages) { + for (QPDFPageObjectHelper dest_page: dest_pages) { doIfVerbose([&](Pipeline& v, std::string const& prefix) { v << " page " << dest_page_no.no << "\n"; }); - if (underlay_pagenos[dest_page_no.no].empty() && overlay_pagenos[dest_page_no.no].empty()) { + if (underlay_pagenos[dest_page_no.idx].empty() && + overlay_pagenos[dest_page_no.idx].empty()) { ++dest_page_no; continue; } -- libgit2 0.21.4