Commit 32aa516535792733ae63eec3121b963d31bafb2d

Authored by m-holger
1 parent e62cf819

Refactor `QPDFJob::doUnderOverlayForPage`: replace `page_idx` with `PageNo`, eli…

…minate redundant variables, and simplify underlay/overlay page handling logic.
include/qpdf/QPDFJob.hh
@@ -478,10 +478,9 @@ class QPDFJob @@ -478,10 +478,9 @@ class QPDFJob
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::map<int, std::map<size_t, std::vector<int>>>& pagenos,
481 - size_t 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,
484 - std::vector<QPDFPageObjectHelper>& pages,  
485 QPDFPageObjectHelper& dest_page); 484 QPDFPageObjectHelper& dest_page);
486 void validateUnderOverlay(QPDF& pdf, UnderOverlay* uo); 485 void validateUnderOverlay(QPDF& pdf, UnderOverlay* uo);
487 void handleTransformations(QPDF& pdf); 486 void handleTransformations(QPDF& pdf);
libqpdf/QPDFJob.cc
@@ -1915,26 +1915,25 @@ QPDFJob::doUnderOverlayForPage( @@ -1915,26 +1915,25 @@ QPDFJob::doUnderOverlayForPage(
1915 QPDF& pdf, 1915 QPDF& pdf,
1916 UnderOverlay& uo, 1916 UnderOverlay& uo,
1917 std::map<int, std::map<size_t, std::vector<int>>>& pagenos, 1917 std::map<int, std::map<size_t, std::vector<int>>>& pagenos,
1918 - size_t page_idx, 1918 + PageNo const& pageno,
1919 size_t uo_idx, 1919 size_t uo_idx,
1920 std::map<int, std::map<size_t, QPDFObjectHandle>>& fo, 1920 std::map<int, std::map<size_t, QPDFObjectHandle>>& fo,
1921 - std::vector<QPDFPageObjectHelper>& pages,  
1922 QPDFPageObjectHelper& dest_page) 1921 QPDFPageObjectHelper& dest_page)
1923 { 1922 {
1924 - int pageno = 1 + QIntC::to_int(page_idx);  
1925 - if (!(pagenos.contains(pageno) && pagenos[pageno].contains(uo_idx))) { 1923 + if (!(uo.pdf && pagenos.contains(pageno.no) && pagenos[pageno.no].contains(uo_idx))) {
1926 return ""; 1924 return "";
1927 } 1925 }
1928 auto& dest_afdh = dest_page.qpdf()->acroform(); 1926 auto& dest_afdh = dest_page.qpdf()->acroform();
1929 1927
  1928 + auto const& pages = uo.pdf->getAllPages();
1930 std::string content; 1929 std::string content;
1931 int min_suffix = 1; 1930 int min_suffix = 1;
1932 QPDFObjectHandle resources = dest_page.getAttribute("/Resources", true); 1931 QPDFObjectHandle resources = dest_page.getAttribute("/Resources", true);
1933 - for (PageNo from_no: pagenos[pageno][uo_idx]) { 1932 + for (PageNo from_no: pagenos[pageno.no][uo_idx]) {
1934 doIfVerbose([&](Pipeline& v, std::string const& prefix) { 1933 doIfVerbose([&](Pipeline& v, std::string const& prefix) {
1935 v << " " << uo.filename << " " << uo.which << " " << from_no.no << "\n"; 1934 v << " " << uo.filename << " " << uo.which << " " << from_no.no << "\n";
1936 }); 1935 });
1937 - auto from_page = pages.at(from_no.idx); 1936 + QPDFPageObjectHelper from_page = pages.at(from_no.idx);
1938 if (!fo[from_no.no].contains(uo_idx)) { 1937 if (!fo[from_no.no].contains(uo_idx)) {
1939 fo[from_no.no][uo_idx] = pdf.copyForeignObject(from_page.getFormXObjectForPage()); 1938 fo[from_no.no][uo_idx] = pdf.copyForeignObject(from_page.getFormXObjectForPage());
1940 } 1939 }
@@ -2007,19 +2006,6 @@ QPDFJob::handleUnderOverlay(QPDF&amp; pdf) @@ -2007,19 +2006,6 @@ QPDFJob::handleUnderOverlay(QPDF&amp; pdf)
2007 v << prefix << ": processing underlay/overlay\n"; 2006 v << prefix << ": processing underlay/overlay\n";
2008 }); 2007 });
2009 2008
2010 - auto get_pages = [](std::vector<UnderOverlay>& v,  
2011 - std::vector<std::vector<QPDFPageObjectHelper>>& v_out) {  
2012 - for (auto const& uo: v) {  
2013 - if (uo.pdf) {  
2014 - v_out.push_back(QPDFPageDocumentHelper(*(uo.pdf)).getAllPages());  
2015 - }  
2016 - }  
2017 - };  
2018 - std::vector<std::vector<QPDFPageObjectHelper>> upages;  
2019 - get_pages(m->underlay, upages);  
2020 - std::vector<std::vector<QPDFPageObjectHelper>> opages;  
2021 - get_pages(m->overlay, opages);  
2022 -  
2023 std::map<int, std::map<size_t, QPDFObjectHandle>> underlay_fo; 2009 std::map<int, std::map<size_t, QPDFObjectHandle>> underlay_fo;
2024 std::map<int, std::map<size_t, QPDFObjectHandle>> overlay_fo; 2010 std::map<int, std::map<size_t, QPDFObjectHandle>> overlay_fo;
2025 PageNo dest_page_no; 2011 PageNo dest_page_no;
@@ -2047,14 +2033,7 @@ QPDFJob::handleUnderOverlay(QPDF&amp; pdf) @@ -2047,14 +2033,7 @@ QPDFJob::handleUnderOverlay(QPDF&amp; pdf)
2047 std::string content; 2033 std::string content;
2048 for (auto& underlay: m->underlay) { 2034 for (auto& underlay: m->underlay) {
2049 content += doUnderOverlayForPage( 2035 content += doUnderOverlayForPage(
2050 - pdf,  
2051 - underlay,  
2052 - underlay_pagenos,  
2053 - dest_page_no.idx,  
2054 - uo_idx,  
2055 - underlay_fo,  
2056 - upages[uo_idx],  
2057 - dest_page); 2036 + pdf, underlay, underlay_pagenos, dest_page_no, uo_idx, underlay_fo, dest_page);
2058 ++uo_idx; 2037 ++uo_idx;
2059 } 2038 }
2060 content += dest_page.placeFormXObject( 2039 content += dest_page.placeFormXObject(
@@ -2067,14 +2046,7 @@ QPDFJob::handleUnderOverlay(QPDF&amp; pdf) @@ -2067,14 +2046,7 @@ QPDFJob::handleUnderOverlay(QPDF&amp; pdf)
2067 uo_idx = 0; 2046 uo_idx = 0;
2068 for (auto& overlay: m->overlay) { 2047 for (auto& overlay: m->overlay) {
2069 content += doUnderOverlayForPage( 2048 content += doUnderOverlayForPage(
2070 - pdf,  
2071 - overlay,  
2072 - overlay_pagenos,  
2073 - dest_page_no.idx,  
2074 - uo_idx,  
2075 - overlay_fo,  
2076 - opages[uo_idx],  
2077 - dest_page); 2049 + pdf, overlay, overlay_pagenos, dest_page_no, uo_idx, overlay_fo, dest_page);
2078 ++uo_idx; 2050 ++uo_idx;
2079 } 2051 }
2080 dest_page.getObjectHandle().replaceKey("/Contents", pdf.newStream(content)); 2052 dest_page.getObjectHandle().replaceKey("/Contents", pdf.newStream(content));