Commit 98d8d4728af4a25198c6156fe1cc602fafa2dbd1
1 parent
e7dad11b
Refactor `QPDFJob::handleUnderlaysAndOverlays`: replace nested maps with vector-…
…based structure for page mapping, improve indexing logic, and clean up redundant variables.
Showing
2 changed files
with
16 additions
and
14 deletions
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& 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& 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 | } | ... | ... |