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,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& pdf) | @@ -1991,12 +1992,12 @@ QPDFJob::handleUnderOverlay(QPDF& 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& pdf) | @@ -2006,11 +2007,12 @@ QPDFJob::handleUnderOverlay(QPDF& 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 | } |