sc/inc/fillinfo.hxx | 2 +- sc/source/core/data/fillinfo.cxx | 13 ++++++++----- sc/source/ui/app/inputhdl.cxx | 2 +- sc/source/ui/miscdlgs/datatableview.cxx | 2 +- sc/source/ui/view/gridwin.cxx | 2 +- sc/source/ui/view/gridwin4.cxx | 4 ++-- sc/source/ui/view/printfun.cxx | 6 +++--- 7 files changed, 17 insertions(+), 14 deletions(-)
New commits: commit a86c00414a43c5d87981ffae1018cb242c5e5e1d Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Fri Jan 19 14:27:10 2024 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Mon Jan 22 12:33:07 2024 +0100 cool#6893 reduce allocation in ScGridWindow::PaintTile the code is needlessly allocating way more rows than we need, especially when we have page to the bottom of a large document. Make it so we allocate exactly the number of rows we need, instead of allocating a default large number of rows (1024). Which reveals that we need to allocate two extra rows, not sure why. Change-Id: I9ca38f2712480ee8c0c3254061c92e457e328416 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162277 Reviewed-by: Michael Meeks <michael.me...@collabora.com> Tested-by: Noel Grandin <noel.gran...@collabora.co.uk> Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162366 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> diff --git a/sc/inc/fillinfo.hxx b/sc/inc/fillinfo.hxx index 81086ed358ba..30e4b7540a67 100644 --- a/sc/inc/fillinfo.hxx +++ b/sc/inc/fillinfo.hxx @@ -268,7 +268,7 @@ struct ScTableInfo SCSIZE mnArrCapacity; bool mbPageMode; - explicit ScTableInfo(const SCSIZE capacity = 1024); + explicit ScTableInfo(SCROW nStartRow, SCROW nEndRow); ~ScTableInfo(); ScTableInfo(const ScTableInfo&) = delete; const ScTableInfo& operator=(const ScTableInfo&) = delete; diff --git a/sc/source/core/data/fillinfo.cxx b/sc/source/core/data/fillinfo.cxx index 2dc9d5960128..193211b1f3ec 100644 --- a/sc/source/core/data/fillinfo.cxx +++ b/sc/source/core/data/fillinfo.cxx @@ -1049,13 +1049,16 @@ void ScDocument::FillInfo( rArray.MirrorSelfX(); } -ScTableInfo::ScTableInfo(const SCSIZE capacity) - : mpRowInfo(new RowInfo[capacity]) - , mnArrCount(0) - , mnArrCapacity(capacity) +/// We seem to need to allocate two extra rows here, not sure why +/// +ScTableInfo::ScTableInfo(SCROW nStartRow, SCROW nEndRow) + : mnArrCount(0) + , mnArrCapacity(nEndRow - nStartRow + 3) , mbPageMode(false) { - memset(static_cast<void*>(mpRowInfo.get()), 0, mnArrCapacity * sizeof(RowInfo)); + assert(nStartRow >= 0); + assert(nEndRow >= nStartRow); + mpRowInfo.reset(new RowInfo[nEndRow - nStartRow + 3] {}); } ScTableInfo::~ScTableInfo() diff --git a/sc/source/ui/app/inputhdl.cxx b/sc/source/ui/app/inputhdl.cxx index 18d6bb98b792..1c5f0a108f69 100644 --- a/sc/source/ui/app/inputhdl.cxx +++ b/sc/source/ui/app/inputhdl.cxx @@ -523,7 +523,7 @@ ReferenceMark ScInputHandler::GetReferenceMark( const ScViewData& rViewData, ScD Fraction aZoomX = rViewData.GetZoomX(); Fraction aZoomY = rViewData.GetZoomY(); - ScTableInfo aTabInfo; + ScTableInfo aTabInfo(nY1, nY2); pDocSh->GetDocument().FillInfo( aTabInfo, nX1, nY1, nX2, nY2, nTab, nPPTX, nPPTY, false, false ); diff --git a/sc/source/ui/miscdlgs/datatableview.cxx b/sc/source/ui/miscdlgs/datatableview.cxx index 649f85bfc1a2..2ad901f4b110 100644 --- a/sc/source/ui/miscdlgs/datatableview.cxx +++ b/sc/source/ui/miscdlgs/datatableview.cxx @@ -257,7 +257,7 @@ void ScDataTableView::Paint(vcl::RenderContext& rRenderContext, const tools::Rec SCCOL nMaxVisibleCol = findColFromPos(aSize.Width() - mnScrollBarSize, mpDoc.get(), mnFirstVisibleCol); SCROW nMaxVisibleRow = findRowFromPos(aSize.Height(), mpDoc.get(), mnFirstVisibleRow); - ScTableInfo aTableInfo; + ScTableInfo aTableInfo(mnFirstVisibleRow, nMaxVisibleRow); mpDoc->FillInfo(aTableInfo, mnFirstVisibleCol, mnFirstVisibleRow, nMaxVisibleCol, nMaxVisibleRow, 0, 0.06666, 0.06666, false, false); ScOutputData aOutput(&rRenderContext, OUTTYPE_WINDOW, aTableInfo, mpDoc.get(), 0, nRowHeaderWidth, nColHeaderHeight, mnFirstVisibleCol, mnFirstVisibleRow, nMaxVisibleCol, nMaxVisibleRow, nPPTX, nPPTY); diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx index 9bd88d69d10d..0f3f9ff8b92b 100644 --- a/sc/source/ui/view/gridwin.cxx +++ b/sc/source/ui/view/gridwin.cxx @@ -5100,7 +5100,7 @@ void ScGridWindow::UpdateFormulaRange(SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2 double nPPTX = mrViewData.GetPPTX(); double nPPTY = mrViewData.GetPPTY(); - ScTableInfo aTabInfo; + ScTableInfo aTabInfo(nY1, nY2); rDoc.FillInfo( aTabInfo, nX1, nY1, nX2, nY2, nTab, nPPTX, nPPTY, false, false ); Fraction aZoomX = mrViewData.GetZoomX(); diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index ad1097af8643..368d92320df0 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -530,7 +530,7 @@ void ScGridWindow::Draw( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2, ScUpdateMod // data block - ScTableInfo aTabInfo; + ScTableInfo aTabInfo(nY1, nY2); rDoc.FillInfo( aTabInfo, nX1, nY1, nX2, nY2, nTab, nPPTX, nPPTY, false, rOpts.GetOption(VOPT_FORMULAS), &mrViewData.GetMarkData() ); @@ -1571,7 +1571,7 @@ void ScGridWindow::PaintTile( VirtualDevice& rDevice, aAbsMode.SetOrigin(aOrigin); rDevice.SetMapMode(aAbsMode); - ScTableInfo aTabInfo(nEndRow + 3); + ScTableInfo aTabInfo(nTopLeftTileRow, nBottomRightTileRow); rDoc.FillInfo(aTabInfo, nTopLeftTileCol, nTopLeftTileRow, nBottomRightTileCol, nBottomRightTileRow, nTab, fPPTX, fPPTY, false, false); diff --git a/sc/source/ui/view/printfun.cxx b/sc/source/ui/view/printfun.cxx index ecd9754795e3..87edd0e132a2 100644 --- a/sc/source/ui/view/printfun.cxx +++ b/sc/source/ui/view/printfun.cxx @@ -554,7 +554,7 @@ void ScPrintFunc::DrawToDev(ScDocument& rDoc, OutputDevice* pDev, double /* nPri // Assemble data - ScTableInfo aTabInfo; + ScTableInfo aTabInfo(nY1, nY2); rDoc.FillInfo( aTabInfo, nX1, nY1, nX2, nY2, nTab, nScaleX, nScaleY, false, bFormula ); lcl_HidePrint( aTabInfo, nX1, nX2 ); @@ -1399,7 +1399,7 @@ void ScPrintFunc::DrawBorder( tools::Long nScrX, tools::Long nScrY, tools::Long pBorderDoc->InitUndo( rDoc, 0,0, true,true ); pBorderDoc->ApplyAttr( 0,0,0, *pBorderData ); - ScTableInfo aTabInfo; + ScTableInfo aTabInfo(0, 1); pBorderDoc->FillInfo( aTabInfo, 0,0, 0,0, 0, nScaleX, nScaleY, false, false ); OSL_ENSURE(aTabInfo.mnArrCount,"nArrCount == 0"); @@ -1611,7 +1611,7 @@ void ScPrintFunc::PrintArea( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2, // Assemble data - ScTableInfo aTabInfo; + ScTableInfo aTabInfo(nY1, nY2); rDoc.FillInfo( aTabInfo, nX1, nY1, nX2, nY2, nPrintTab, nScaleX, nScaleY, true, aTableParam.bFormulas ); lcl_HidePrint( aTabInfo, nX1, nX2 );