sc/inc/column.hxx               |    1 
 sc/source/core/data/column3.cxx |   13 ++++++++++
 sc/source/core/data/table1.cxx  |    2 -
 sc/source/ui/inc/printfun.hxx   |   20 +++------------
 sc/source/ui/unoobj/docuno.cxx  |   20 +++++++--------
 sc/source/ui/view/preview.cxx   |   10 +------
 sc/source/ui/view/printfun.cxx  |   52 ++++------------------------------------
 7 files changed, 38 insertions(+), 80 deletions(-)

New commits:
commit 2ad14abcf790002ac6fe09afbc5a2cae46f62085
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Mon Apr 1 18:48:04 2024 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Tue Apr 2 07:53:30 2024 +0200

    tdf#160399 speed up print preview
    
    shave about 2-5% off the cycles here
    
    Change-Id: I23adffa4715d3dd28a92d48603a236115fb7d680
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165647
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 9980ec1724b5..e8dec1fb437a 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -467,6 +467,7 @@ public:
     ScFormulaCell * const * GetFormulaCellBlockAddress( SCROW nRow, size_t& 
rBlockSize ) const;
     CellType    GetCellType( SCROW nRow ) const;
     SCSIZE      GetCellCount() const;
+    bool        IsCellCountZero() const;
     sal_uInt64  GetWeightedCount() const;
     sal_uInt64  GetWeightedCount(SCROW nStartRow, SCROW nEndRow) const;
     sal_uInt64  GetCodeCount() const;       // RPN-Code in formulas
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index 76a8f7bef9a9..c1805ecf5f09 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -3277,6 +3277,19 @@ SCSIZE ScColumn::GetCellCount() const
     return aFunc.getCount();
 }
 
+bool ScColumn::IsCellCountZero() const
+{
+    auto it = maCells.begin();
+    auto itEnd = maCells.end();
+    for (; it != itEnd; ++it)
+    {
+        const sc::CellStoreType::value_type& node = *it;
+        if (node.size != 0)
+            return false;
+    }
+    return true;
+}
+
 FormulaError ScColumn::GetErrCode( SCROW nRow ) const
 {
     std::pair<sc::CellStoreType::const_iterator,size_t> aPos = 
maCells.position(nRow);
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index 1764d400e44a..34e40d7882e6 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -2097,7 +2097,7 @@ void ScTable::ExtendPrintArea( OutputDevice* pDev,
             {
                 if ( j >= aCol.size() )
                     break;
-                if (aCol[j].GetCellCount() == 0) // empty
+                if (aCol[j].IsCellCountZero()) // empty
                     nEmptyCount++;
             }
             if (nEmptyCount)
commit e1e48bba55ff68397d514ab3771850678312f348
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Mon Apr 1 18:40:26 2024 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Tue Apr 2 07:53:21 2024 +0200

    tdf#160399 speed up print preview
    
    takes time from 2.5s to 1s for me
    
    Store all of the PrintPageRanges in the ScPrintState
    save/restore data structure, means we don't recompute the data
    in that structure, so of which is quite expensive.
    
    Change-Id: If65c8ca1cce25ff228c483f173b19b456056dc57
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165646
    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 2e9dd7bb49d1..04c1019e0f80 100644
--- a/sc/source/ui/inc/printfun.hxx
+++ b/sc/source/ui/inc/printfun.hxx
@@ -181,7 +181,9 @@ public:
 
 } // end sc namespace
 
-struct ScPrintState //  Save Variables from ScPrintFunc
+// Used to save expensive-to-compute data from ScPrintFunc in between
+// uses of ScPrintFunc
+struct ScPrintState
 {
     SCTAB   nPrintTab;
     SCCOL   nStartCol;
@@ -190,21 +192,13 @@ struct ScPrintState //  Save Variables from ScPrintFunc
     SCROW   nEndRow;
     bool    bPrintAreaValid; // the 4 variables above are set
     sal_uInt16  nZoom;
-    size_t  nPagesX;
-    size_t  nPagesY;
     tools::Long    nTabPages;
     tools::Long    nTotalPages;
     tools::Long    nPageStart;
     tools::Long    nDocPages;
 
     // Additional state of page ranges
-    bool bSavedStateRanges;
-    sc::PrintPageRangesInput aPrintPageRangesInput;
-    size_t nTotalY;
-    // 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;
+    sc::PrintPageRanges m_aRanges;
 
     ScPrintState()
         : nPrintTab(0)
@@ -214,14 +208,10 @@ struct ScPrintState //  Save Variables from ScPrintFunc
         , nEndRow(0)
         , bPrintAreaValid(false)
         , nZoom(0)
-        , nPagesX(0)
-        , nPagesY(0)
         , nTabPages(0)
         , nTotalPages(0)
         , nPageStart(0)
         , nDocPages(0)
-        , bSavedStateRanges(false)
-        , nTotalY(0)
     {}
 };
 
@@ -381,7 +371,7 @@ public:
 
     void            ResetBreaks( SCTAB nTab );
 
-    void            GetPrintState(ScPrintState& rState, bool bSavePageRanges = 
false);
+    void            GetPrintState(ScPrintState& rState);
     bool            GetLastSourceRange( ScRange& rRange ) const;
     sal_uInt16      GetLeftMargin() const{return nLeftMargin;}
     sal_uInt16      GetRightMargin() const{return nRightMargin;}
diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index a9bf8cc3c0c9..9a6d01a43ed1 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -2154,7 +2154,7 @@ uno::Sequence<beans::PropertyValue> SAL_CALL 
ScModelObj::getRenderer( sal_Int32
         if (!m_pPrintState || nRenderer == nTabStart)
         {
             m_pPrintState.reset(new ScPrintState());
-            pPrintFunc->GetPrintState(*m_pPrintState, true);
+            pPrintFunc->GetPrintState(*m_pPrintState);
         }
 
         aPageSize.Width = convertTwipToMm100(aTwips.Width());
@@ -2434,12 +2434,12 @@ static void lcl_PDFExportMediaShapeScreen(const 
OutputDevice* pDev, const ScPrin
                         if (bTopDown) // top-bottom page order
                         {
                             nX1 = 0;
-                            for (size_t i = 0; i < rState.nPagesX; ++i)
+                            for (size_t i = 0; i < rState.m_aRanges.m_nPagesX; 
++i)
                             {
-                                nX2 = (*rState.xPageEndX)[i];
-                                for (size_t j = 0; j < rState.nPagesY; ++j)
+                                nX2 = (*rState.m_aRanges.m_xPageEndX)[i];
+                                for (size_t j = 0; j < 
rState.m_aRanges.m_nPagesY; ++j)
                                 {
-                                    auto& rPageRow = (*rState.xPageRows)[j];
+                                    auto& rPageRow = 
(*rState.m_aRanges.m_xPageRows)[j];
                                     nY1 = rPageRow.GetStartRow();
                                     nY2 = rPageRow.GetEndRow();
 
@@ -2459,15 +2459,15 @@ static void lcl_PDFExportMediaShapeScreen(const 
OutputDevice* pDev, const ScPrin
                         }
                         else // left to right page order
                         {
-                            for (size_t i = 0; i < rState.nPagesY; ++i)
+                            for (size_t i = 0; i < rState.m_aRanges.m_nPagesY; 
++i)
                             {
-                                auto& rPageRow = (*rState.xPageRows)[i];
+                                auto& rPageRow = 
(*rState.m_aRanges.m_xPageRows)[i];
                                 nY1 = rPageRow.GetStartRow();
                                 nY2 = rPageRow.GetEndRow();
                                 nX1 = 0;
-                                for (size_t j = 0; j < rState.nPagesX; ++j)
+                                for (size_t j = 0; j < 
rState.m_aRanges.m_nPagesX; ++j)
                                 {
-                                    nX2 = (*rState.xPageEndX)[j];
+                                    nX2 = (*rState.m_aRanges.m_xPageEndX)[j];
 
                                     tools::Rectangle 
aPageRect(rDoc.GetMMRect(nX1, nY1, nX2, nY2, nTab));
                                     tools::Rectangle 
aTmpRect(aPageRect.GetIntersection(pObj->GetCurrentBoundRect()));
@@ -2772,7 +2772,7 @@ void SAL_CALL ScModelObj::render( sal_Int32 nSelRenderer, 
const uno::Any& aSelec
     if (!m_pPrintState)
     {
         m_pPrintState.reset(new ScPrintState());
-        pPrintFunc->GetPrintState(*m_pPrintState, true);
+        pPrintFunc->GetPrintState(*m_pPrintState);
     }
 
     lcl_PDFExportBookmarkHelper(pDev, rDoc, pPrintFuncCache, aMark, nTab);
diff --git a/sc/source/ui/view/preview.cxx b/sc/source/ui/view/preview.cxx
index ac7de60f8fda..908a766c68f5 100644
--- a/sc/source/ui/view/preview.cxx
+++ b/sc/source/ui/view/preview.cxx
@@ -197,13 +197,7 @@ void ScPreview::TestLastPage()
     {
         nTab = 0;
         nPageNo = nTabPage = nTabStart = nDisplayStart = 0;
-        aState.nPrintTab = 0;
-        aState.nStartCol = aState.nEndCol = 0;
-        aState.nStartRow = aState.nEndRow = 0;
-        aState.nZoom = 0;
-        aState.nPagesX = aState.nPagesY = 0;
-        aState.nTabPages = aState.nTotalPages =
-        aState.nPageStart = aState.nDocPages = 0;
+        aState = ScPrintState();
     }
 }
 
@@ -736,7 +730,7 @@ void ScPreview::SetZoom(sal_uInt16 nNewZoom)
     pViewShell->UpdateNeededScrollBars(true);
     bInSetZoom = false;
 
-    bStateValid = false;
+//    bStateValid = false;
     InvalidateLocationData( SfxHintId::ScAccVisAreaChanged );
     DoInvalidate();
     Invalidate();
diff --git a/sc/source/ui/view/printfun.cxx b/sc/source/ui/view/printfun.cxx
index d9ba4a0064a9..91069c4456c5 100644
--- a/sc/source/ui/view/printfun.cxx
+++ b/sc/source/ui/view/printfun.cxx
@@ -254,29 +254,15 @@ ScPrintFunc::ScPrintFunc(ScDocShell* pShell, SfxPrinter* 
pNewPrinter, const ScPr
     nEndRow     = rState.nEndRow;
     bPrintAreaValid = rState.bPrintAreaValid;
     nZoom       = rState.nZoom;
-    m_aRanges.m_nPagesX = rState.nPagesX;
-    m_aRanges.m_nPagesY = rState.nPagesY;
+//    m_aRanges.m_nPagesX = rState.nPagesX;
+//    m_aRanges.m_nPagesY = rState.nPagesY;
+    m_aRanges = rState.m_aRanges;
     nTabPages   = rState.nTabPages;
     nTotalPages = rState.nTotalPages;
     nPageStart  = rState.nPageStart;
     nDocPages   = rState.nDocPages;
     bFromPrintState = true;
 
-    if (rState.bSavedStateRanges)
-    {
-        m_aRanges.m_nTotalY = rState.nTotalY;
-        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 );
 }
@@ -338,33 +324,17 @@ ScPrintFunc::ScPrintFunc(OutputDevice* pOutDev, 
ScDocShell* pShell, const ScPrin
     nEndRow     = rState.nEndRow;
     bPrintAreaValid = rState.bPrintAreaValid;
     nZoom       = rState.nZoom;
-    m_aRanges.m_nPagesX = rState.nPagesX;
-    m_aRanges.m_nPagesY = rState.nPagesY;
+    m_aRanges   = rState.m_aRanges;
     nTabPages   = rState.nTabPages;
     nTotalPages = rState.nTotalPages;
     nPageStart  = rState.nPageStart;
     nDocPages   = rState.nDocPages;
     bFromPrintState = true;
 
-    if (rState.bSavedStateRanges)
-    {
-        m_aRanges.m_nTotalY = rState.nTotalY;
-        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 );
 }
 
-void ScPrintFunc::GetPrintState(ScPrintState& rState,  bool bSavePageRanges)
+void ScPrintFunc::GetPrintState(ScPrintState& rState)
 {
     rState.nPrintTab    = nPrintTab;
     rState.nStartCol    = nStartCol;
@@ -373,21 +343,11 @@ void ScPrintFunc::GetPrintState(ScPrintState& rState,  
bool bSavePageRanges)
     rState.nEndRow      = nEndRow;
     rState.bPrintAreaValid = bPrintAreaValid;
     rState.nZoom        = nZoom;
-    rState.nPagesX      = m_aRanges.m_nPagesX;
-    rState.nPagesY      = m_aRanges.m_nPagesY;
     rState.nTabPages    = nTabPages;
     rState.nTotalPages  = nTotalPages;
     rState.nPageStart   = nPageStart;
     rState.nDocPages    = nDocPages;
-    if (bSavePageRanges)
-    {
-        rState.bSavedStateRanges = true;
-        rState.nTotalY = m_aRanges.m_nTotalY;
-        rState.xPageEndX = m_aRanges.m_xPageEndX;
-        rState.xPageEndY = m_aRanges.m_xPageEndY;
-        rState.xPageRows = m_aRanges.m_xPageRows;
-        rState.aPrintPageRangesInput = m_aRanges.m_aInput;
-    }
+    rState.m_aRanges = m_aRanges;
 }
 
 bool ScPrintFunc::GetLastSourceRange( ScRange& rRange ) const

Reply via email to