sc/inc/fillinfo.hxx                     |    2 +-
 sc/qa/unit/ucalc_condformat.cxx         |    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 +++---
 8 files changed, 18 insertions(+), 15 deletions(-)

New commits:
commit 382d0d417c88b47c546a000921596d88d811d073
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: Sat Jan 20 12:36:01 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>

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/qa/unit/ucalc_condformat.cxx b/sc/qa/unit/ucalc_condformat.cxx
index 7a0abc7cf026..1b7480b2fc9a 100644
--- a/sc/qa/unit/ucalc_condformat.cxx
+++ b/sc/qa/unit/ucalc_condformat.cxx
@@ -366,7 +366,7 @@ CPPUNIT_TEST_FIXTURE(TestCondformat, 
testColorScaleInMergedCell)
     m_pDoc->DoMerge(0, 0, 0, 1, 0);  // A1:A2
     CPPUNIT_ASSERT(m_pDoc->IsMerged(ScAddress(0, 0, 0)));
 
-    ScTableInfo aTabInfo;
+    ScTableInfo aTabInfo(0, 2);
     m_pDoc->FillInfo(aTabInfo, 0, 0, 0, 1, 0, 1, 1, false, false);
     RowInfo* pRowInfo = aTabInfo.mpRowInfo.get();
 
diff --git a/sc/source/core/data/fillinfo.cxx b/sc/source/core/data/fillinfo.cxx
index 4a573e1c21da..b2c0fc374b04 100644
--- a/sc/source/core/data/fillinfo.cxx
+++ b/sc/source/core/data/fillinfo.cxx
@@ -1069,13 +1069,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 e2c6b4b27949..cd7841a059a7 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 186243702985..6c6b915f51df 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -5169,7 +5169,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 b6ef7367ff68..2fb30575193c 100644
--- a/sc/source/ui/view/gridwin4.cxx
+++ b/sc/source/ui/view/gridwin4.cxx
@@ -550,7 +550,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() );
@@ -1664,7 +1664,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 2392aed34ef5..ce2053c97f61 100644
--- a/sc/source/ui/view/printfun.cxx
+++ b/sc/source/ui/view/printfun.cxx
@@ -557,7 +557,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 );
@@ -1402,7 +1402,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");
@@ -1614,7 +1614,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 );

Reply via email to