sc/source/ui/inc/printfun.hxx | 14 ++--- sc/source/ui/view/printfun.cxx | 112 ++++++++++++++++++++++++----------------- 2 files changed, 75 insertions(+), 51 deletions(-)
New commits: commit 580b5f6a3bf671f6590f40795d7cb9e46d52cf9f Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Sun Jul 4 21:33:21 2021 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Mon Jul 5 12:55:28 2021 +0200 speed up exporting very large spreadsheets to pdf(2) e.g. the one in tdf#102216 instead of copying the data we want back and forth, just share it via shared_ptr. takes it from 6min28s to 1m21 Change-Id: I44d174264baa875e1922d1d46ee07de0e8cbaf0b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118383 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sc/source/ui/inc/printfun.hxx b/sc/source/ui/inc/printfun.hxx index 1a5eddea03cd..9ad5c27e547b 100644 --- a/sc/source/ui/inc/printfun.hxx +++ b/sc/source/ui/inc/printfun.hxx @@ -123,9 +123,10 @@ class PrintPageRanges public: PrintPageRanges(); - std::vector<SCCOL> m_aPageEndX; - std::vector<SCROW> m_aPageEndY; - std::map<size_t, ScPageRowEntry> m_aPageRows; + // use shared_ptr to avoid copying this (potentially large) data back and forth + std::shared_ptr<std::vector<SCCOL>> m_xPageEndX; + std::shared_ptr<std::vector<SCROW>> m_xPageEndY; + std::shared_ptr<std::map<size_t, ScPageRowEntry>> m_xPageRows; size_t m_nPagesX; size_t m_nPagesY; @@ -165,9 +166,10 @@ struct ScPrintState // Save Variables from ScPrintFunc bool bSavedStateRanges; sc::PrintPageRangesInput aPrintPageRangesInput; size_t nTotalY; - std::vector<SCCOL> aPageEndX; - std::vector<SCROW> aPageEndY; - std::map<size_t, ScPageRowEntry> aPageRows; + // use shared_ptr to avoid copying this (potentially large) map back and forth + std::shared_ptr<std::vector<SCCOL>> xPageEndX; + std::shared_ptr<std::vector<SCROW>> xPageEndY; + std::shared_ptr<std::map<size_t, ScPageRowEntry>> xPageRows; ScPrintState() : nPrintTab(0) diff --git a/sc/source/ui/view/printfun.cxx b/sc/source/ui/view/printfun.cxx index 37f782773f52..e02e4badcab6 100644 --- a/sc/source/ui/view/printfun.cxx +++ b/sc/source/ui/view/printfun.cxx @@ -219,6 +219,9 @@ ScPrintFunc::ScPrintFunc( ScDocShell* pShell, SfxPrinter* pNewPrinter, SCTAB nTa { pDev = pPrinter.get(); aSrcOffset = pPrinter->PixelToLogic(pPrinter->GetPageOffsetPixel(), MapMode(MapUnit::Map100thMM)); + m_aRanges.m_xPageEndX = std::make_shared<std::vector<SCCOL>>(); + m_aRanges.m_xPageEndY = std::make_shared<std::vector<SCROW>>(); + m_aRanges.m_xPageRows = std::make_shared<std::map<size_t, ScPageRowEntry>>(); Construct( pOptions ); } @@ -255,11 +258,17 @@ ScPrintFunc::ScPrintFunc(ScDocShell* pShell, SfxPrinter* pNewPrinter, if (rState.bSavedStateRanges) { m_aRanges.m_nTotalY = rState.nTotalY; - m_aRanges.m_aPageEndX = rState.aPageEndX; - m_aRanges.m_aPageEndY = rState.aPageEndY; - m_aRanges.m_aPageRows = rState.aPageRows; + m_aRanges.m_xPageEndX = rState.xPageEndX; + m_aRanges.m_xPageEndY = rState.xPageEndY; + m_aRanges.m_xPageRows = rState.xPageRows; m_aRanges.m_aInput = rState.aPrintPageRangesInput; } + else + { + m_aRanges.m_xPageEndX = std::make_shared<std::vector<SCCOL>>(); + m_aRanges.m_xPageEndY = std::make_shared<std::vector<SCROW>>(); + m_aRanges.m_xPageRows = std::make_shared<std::map<size_t, ScPageRowEntry>>(); + } aSrcOffset = pPrinter->PixelToLogic(pPrinter->GetPageOffsetPixel(), MapMode(MapUnit::Map100thMM)); Construct( pOptions ); @@ -287,6 +296,9 @@ ScPrintFunc::ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell, SCTAB nTab, pPageData ( nullptr ) { pDev = pOutDev; + m_aRanges.m_xPageEndX = std::make_shared<std::vector<SCCOL>>(); + m_aRanges.m_xPageEndY = std::make_shared<std::vector<SCROW>>(); + m_aRanges.m_xPageRows = std::make_shared<std::map<size_t, ScPageRowEntry>>(); Construct( pOptions ); } @@ -323,11 +335,17 @@ ScPrintFunc::ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell, if (rState.bSavedStateRanges) { m_aRanges.m_nTotalY = rState.nTotalY; - m_aRanges.m_aPageEndX = rState.aPageEndX; - m_aRanges.m_aPageEndY = rState.aPageEndY; - m_aRanges.m_aPageRows = rState.aPageRows; + m_aRanges.m_xPageEndX = rState.xPageEndX; + m_aRanges.m_xPageEndY = rState.xPageEndY; + m_aRanges.m_xPageRows = rState.xPageRows; m_aRanges.m_aInput = rState.aPrintPageRangesInput; } + else + { + m_aRanges.m_xPageEndX = std::make_shared<std::vector<SCCOL>>(); + m_aRanges.m_xPageEndY = std::make_shared<std::vector<SCROW>>(); + m_aRanges.m_xPageRows = std::make_shared<std::map<size_t, ScPageRowEntry>>(); + } Construct( pOptions ); } @@ -351,9 +369,9 @@ void ScPrintFunc::GetPrintState(ScPrintState& rState, bool bSavePageRanges) { rState.bSavedStateRanges = true; rState.nTotalY = m_aRanges.m_nTotalY; - rState.aPageEndX = m_aRanges.m_aPageEndX; - rState.aPageEndY = m_aRanges.m_aPageEndY; - rState.aPageRows = m_aRanges.m_aPageRows; + rState.xPageEndX = m_aRanges.m_xPageEndX; + rState.xPageEndY = m_aRanges.m_xPageEndY; + rState.xPageRows = m_aRanges.m_xPageRows; rState.aPrintPageRangesInput = m_aRanges.m_aInput; } } @@ -376,23 +394,23 @@ void ScPrintFunc::FillPageData() rData.SetPrintRange( ScRange( nStartCol, nStartRow, nPrintTab, nEndCol, nEndRow, nPrintTab ) ); // #i123672# - if(m_aRanges.m_aPageEndX.empty()) + if(m_aRanges.m_xPageEndX->empty()) { OSL_ENSURE(false, "vector access error for maPageEndX (!)"); } else { - rData.SetPagesX( m_aRanges.m_nPagesX, m_aRanges.m_aPageEndX.data()); + rData.SetPagesX( m_aRanges.m_nPagesX, m_aRanges.m_xPageEndX->data()); } // #i123672# - if(m_aRanges.m_aPageEndY.empty()) + if(m_aRanges.m_xPageEndY->empty()) { OSL_ENSURE(false, "vector access error for maPageEndY (!)"); } else { - rData.SetPagesY( m_aRanges.m_nTotalY, m_aRanges.m_aPageEndY.data()); + rData.SetPagesY( m_aRanges.m_nTotalY, m_aRanges.m_xPageEndY->data()); } // Settings @@ -2482,7 +2500,7 @@ tools::Long ScPrintFunc::CountPages() // sets also nPag CalcZoom(i); if ( aTableParam.bSkipEmpty ) for (nY=0; nY< m_aRanges.m_nPagesY; nY++) - nPages += m_aRanges.m_aPageRows[nY].CountVisible(); + nPages += (*m_aRanges.m_xPageRows)[nY].CountVisible(); else nPages += static_cast<tools::Long>(m_aRanges.m_nPagesX) * m_aRanges.m_nPagesY; if ( pPageData ) @@ -2494,7 +2512,7 @@ tools::Long ScPrintFunc::CountPages() // sets also nPag CalcZoom(RANGENO_NORANGE); // calculate Zoom if ( aTableParam.bSkipEmpty ) for (nY=0; nY<m_aRanges.m_nPagesY; nY++) - nPages += m_aRanges.m_aPageRows[nY].CountVisible(); + nPages += (*m_aRanges.m_xPageRows)[nY].CountVisible(); else nPages += static_cast<tools::Long>(m_aRanges.m_nPagesX) * m_aRanges.m_nPagesY; if ( pPageData ) @@ -2685,13 +2703,14 @@ tools::Long ScPrintFunc::DoPrint( const MultiSelection& rPageRanges, nX1 = nStartCol; for (nCountX=0; nCountX<m_aRanges.m_nPagesX; nCountX++) { - OSL_ENSURE(nCountX < m_aRanges.m_aPageEndX.size(), "vector access error for aPageEndX (!)"); - nX2 = m_aRanges.m_aPageEndX[nCountX]; + OSL_ENSURE(nCountX < m_aRanges.m_xPageEndX->size(), "vector access error for aPageEndX (!)"); + nX2 = (*m_aRanges.m_xPageEndX)[nCountX]; for (nCountY=0; nCountY<m_aRanges.m_nPagesY; nCountY++) { - nY1 = m_aRanges.m_aPageRows[nCountY].GetStartRow(); - nY2 = m_aRanges.m_aPageRows[nCountY].GetEndRow(); - if ( !aTableParam.bSkipEmpty || !m_aRanges.m_aPageRows[nCountY].IsHidden(nCountX) ) + auto& rPageRow = (*m_aRanges.m_xPageRows)[nCountY]; + nY1 = rPageRow.GetStartRow(); + nY2 = rPageRow.GetEndRow(); + if ( !aTableParam.bSkipEmpty || !rPageRow.IsHidden(nCountX) ) { if ( rPageRanges.IsSelected( nPageNo+nStartPage+1 ) ) { @@ -2709,14 +2728,15 @@ tools::Long ScPrintFunc::DoPrint( const MultiSelection& rPageRanges, { for (nCountY=0; nCountY<m_aRanges.m_nPagesY; nCountY++) { - nY1 = m_aRanges.m_aPageRows[nCountY].GetStartRow(); - nY2 = m_aRanges.m_aPageRows[nCountY].GetEndRow(); + auto& rPageRow = (*m_aRanges.m_xPageRows)[nCountY]; + nY1 = rPageRow.GetStartRow(); + nY2 = rPageRow.GetEndRow(); nX1 = nStartCol; for (nCountX=0; nCountX<m_aRanges.m_nPagesX; nCountX++) { - OSL_ENSURE(nCountX < m_aRanges.m_aPageEndX.size(), "vector access error for aPageEndX"); - nX2 = m_aRanges.m_aPageEndX[nCountX]; - if ( !aTableParam.bSkipEmpty || !m_aRanges.m_aPageRows[nCountY].IsHidden(nCountX) ) + OSL_ENSURE(nCountX < m_aRanges.m_xPageEndX->size(), "vector access error for aPageEndX"); + nX2 = (*m_aRanges.m_xPageEndX)[nCountX]; + if ( !aTableParam.bSkipEmpty || !rPageRow.IsHidden(nCountX) ) { if ( rPageRanges.IsSelected( nPageNo+nStartPage+1 ) ) { @@ -3073,9 +3093,9 @@ void PrintPageRanges::calculate(ScDocument& rDoc, rDoc.SetPageSize(nPrintTab, rDocSize); // #i123672# use dynamic mem to react on size changes - if (m_aPageEndX.size() < static_cast<size_t>(rDoc.MaxCol()) + 1) + if (m_xPageEndX->size() < static_cast<size_t>(rDoc.MaxCol()) + 1) { - m_aPageEndX.resize(rDoc.MaxCol()+1, SCCOL()); + m_xPageEndX->resize(rDoc.MaxCol()+1, SCCOL()); } if (bPrintArea) @@ -3091,9 +3111,9 @@ void PrintPageRanges::calculate(ScDocument& rDoc, const size_t nRealCnt = nEndRow - nStartRow + 1; // #i123672# use dynamic mem to react on size changes - if (m_aPageEndY.size() < nRealCnt+1) + if (m_xPageEndY->size() < nRealCnt+1) { - m_aPageEndY.resize(nRealCnt + 1, SCROW()); + m_xPageEndY->resize(nRealCnt + 1, SCROW()); } // Page alignment/splitting after breaks in Col/RowFlags @@ -3110,8 +3130,8 @@ void PrintPageRanges::calculate(ScDocument& rDoc, bool bPageBreak(rDoc.HasColBreak(i, nPrintTab) & ScBreakType::Page); if (i > nStartCol && bVisCol && bPageBreak) { - OSL_ENSURE(m_nPagesX < m_aPageEndX.size(), "vector access error for aPageEndX"); - m_aPageEndX[m_nPagesX] = i-1; + OSL_ENSURE(m_nPagesX < m_xPageEndX->size(), "vector access error for aPageEndX"); + (*m_xPageEndX)[m_nPagesX] = i-1; ++m_nPagesX; bVisCol = false; } @@ -3120,8 +3140,8 @@ void PrintPageRanges::calculate(ScDocument& rDoc, } if (bVisCol) // also at the end, no empty pages { - OSL_ENSURE(m_nPagesX < m_aPageEndX.size(), "vector access error for aPageEndX"); - m_aPageEndX[m_nPagesX] = nEndCol; + OSL_ENSURE(m_nPagesX < m_xPageEndX->size(), "vector access error for aPageEndX"); + (*m_xPageEndX)[m_nPagesX] = nEndCol; ++m_nPagesX; } @@ -3143,17 +3163,18 @@ void PrintPageRanges::calculate(ScDocument& rDoc, if (nRow > nStartRow && bVisRow && bPageBreak) { - OSL_ENSURE(m_nTotalY < m_aPageEndY.size(), "vector access error for rPageEndY"); - m_aPageEndY[m_nTotalY] = nRow - 1; + OSL_ENSURE(m_nTotalY < m_xPageEndY->size(), "vector access error for rPageEndY"); + (*m_xPageEndY)[m_nTotalY] = nRow - 1; ++m_nTotalY; if (!bSkipEmpty || !rDoc.IsPrintEmpty(nPrintTab, nStartCol, nPageStartRow, nEndCol, nRow-1)) { - m_aPageRows[m_nPagesY].SetStartRow(nPageStartRow); - m_aPageRows[m_nPagesY].SetEndRow(nRow - 1); - m_aPageRows[m_nPagesY].SetPagesX(m_nPagesX); + auto& rPageRow = (*m_xPageRows)[m_nPagesY]; + rPageRow.SetStartRow(nPageStartRow); + rPageRow.SetEndRow(nRow - 1); + rPageRow.SetPagesX(m_nPagesX); if (bSkipEmpty) - lcl_SetHidden(rDoc, nPrintTab, m_aPageRows[m_nPagesY], nStartCol, m_aPageEndX); + lcl_SetHidden(rDoc, nPrintTab, rPageRow, nStartCol, *m_xPageEndX); ++m_nPagesY; } @@ -3183,17 +3204,18 @@ void PrintPageRanges::calculate(ScDocument& rDoc, if (!bVisRow) return; - OSL_ENSURE(m_nTotalY < m_aPageEndY.size(), "vector access error for maPageEndY"); - m_aPageEndY[m_nTotalY] = nEndRow; + OSL_ENSURE(m_nTotalY < m_xPageEndY->size(), "vector access error for maPageEndY"); + (*m_xPageEndY)[m_nTotalY] = nEndRow; ++m_nTotalY; if (!bSkipEmpty || !rDoc.IsPrintEmpty(nPrintTab, nStartCol, nPageStartRow, nEndCol, nEndRow)) { - m_aPageRows[m_nPagesY].SetStartRow(nPageStartRow); - m_aPageRows[m_nPagesY].SetEndRow(nEndRow); - m_aPageRows[m_nPagesY].SetPagesX(m_nPagesX); + auto& rPageRow = (*m_xPageRows)[m_nPagesY]; + rPageRow.SetStartRow(nPageStartRow); + rPageRow.SetEndRow(nEndRow); + rPageRow.SetPagesX(m_nPagesX); if (bSkipEmpty) - lcl_SetHidden(rDoc, nPrintTab, m_aPageRows[m_nPagesY], nStartCol, m_aPageEndX); + lcl_SetHidden(rDoc, nPrintTab, rPageRow, nStartCol, *m_xPageEndX); ++m_nPagesY; } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits