sc/source/ui/view/viewdata.cxx |   48 ++++++++++++++++++++++++-----------------
 1 file changed, 29 insertions(+), 19 deletions(-)

New commits:
commit 0b18ae391fd87307cdbde21fa10f009cf4230585
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Tue Mar 25 14:57:09 2025 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Tue Mar 25 20:52:06 2025 +0100

    tdf#150623 speed up switching tabs in complex calc doc
    
    In some cases, we can use the faster ScTable functions which iterate
    directly over our compressed height data structure.
    Takes the tab switching time from 7 seconds to 2 seconds for me.
    
    Not sure why I had to exclude tiledrendering to make it happy.
    
    Change-Id: Ie438a2d3af5a347face76227e1cba4aaaed3f0b6
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183300
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>
    Tested-by: Jenkins

diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx
index 49b6e23ec698..68c4a9b736d6 100644
--- a/sc/source/ui/view/viewdata.cxx
+++ b/sc/source/ui/view/viewdata.cxx
@@ -2471,7 +2471,6 @@ Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW 
nWhereY, ScSplitPos eWhich,
         const_cast<ScViewData*>(this)->aScrSize.setHeight( 
pView->GetGridHeight(eWhichY) );
     }
 
-    sal_uInt16 nTSize;
     bool bIsTiledRendering = comphelper::LibreOfficeKit::isActive();
 
     SCCOL nPosX = GetPosX(eWhichX, nForTab);
@@ -2496,7 +2495,7 @@ Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW 
nWhereY, ScSplitPos eWhich,
                     nScrPosX = 0x7FFFFFFF;
                 else
                 {
-                    nTSize = mrDoc.GetColWidth(nX, nForTab);
+                    sal_uInt16 nTSize = mrDoc.GetColWidth(nX, nForTab);
                     if (nTSize)
                     {
                         tools::Long nSizeXPix = ToPixel( nTSize, nPPTX );
@@ -2516,7 +2515,7 @@ Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW 
nWhereY, ScSplitPos eWhich,
             for (SCCOL nX = nStartPosX; nX > nWhereX;)
             {
                 --nX;
-                nTSize = mrDoc.GetColWidth(nX, nForTab);
+                sal_uInt16 nTSize = mrDoc.GetColWidth(nX, nForTab);
                 if (nTSize)
                 {
                     tools::Long nSizeXPix = ToPixel( nTSize, nPPTX );
@@ -2550,26 +2549,37 @@ Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW 
nWhereY, ScSplitPos eWhich,
 
         if (nWhereY >= nStartPosY)
         {
-            for (SCROW nY = nStartPosY; nY < nWhereY && (bAllowNeg || 
bIsTiledRendering || nScrPosY <= aScrSize.Height()); nY++)
+            if (bAllowNeg && !bIsTiledRendering)
             {
-                if ( nY > mrDoc.MaxRow() )
+                // tdf#150623 If possible, use the faster range-based 
calculation functions.
+                if ( nStartPosY > mrDoc.MaxRow() )
                     nScrPosY = 0x7FFFFFFF;
                 else
+                    nScrPosY = mrDoc.GetScaledRowHeight(nStartPosY, nWhereY - 
1, nTabNo, nPPTY);
+            }
+            else
+            {
+                for (SCROW nY = nStartPosY; nY < nWhereY && (bAllowNeg || 
bIsTiledRendering || nScrPosY <= aScrSize.Height()); nY++)
                 {
-                    nTSize = mrDoc.GetRowHeight( nY, nTabNo );
-                    if (nTSize)
-                    {
-                        tools::Long nSizeYPix = ToPixel( nTSize, nPPTY );
-                        nScrPosY += nSizeYPix;
-                    }
-                    else if ( nY < mrDoc.MaxRow() )
+                    if ( nY > mrDoc.MaxRow() )
+                        nScrPosY = 0x7FFFFFFF;
+                    else
                     {
-                        // skip multiple hidden rows (forward only for now)
-                        SCROW nNext = mrDoc.FirstVisibleRow(nY + 1, 
mrDoc.MaxRow(), nTabNo);
-                        if ( nNext > mrDoc.MaxRow() )
-                            nY = mrDoc.MaxRow();
-                        else
-                            nY = nNext - 1;     // +=nDir advances to next 
visible row
+                        sal_uInt16 nTSize = mrDoc.GetRowHeight( nY, nTabNo );
+                        if (nTSize)
+                        {
+                            tools::Long nSizeYPix = ToPixel( nTSize, nPPTY );
+                            nScrPosY += nSizeYPix;
+                        }
+                        else if ( nY < mrDoc.MaxRow() )
+                        {
+                            // skip multiple hidden rows (forward only for now)
+                            SCROW nNext = mrDoc.FirstVisibleRow(nY + 1, 
mrDoc.MaxRow(), nTabNo);
+                            if ( nNext > mrDoc.MaxRow() )
+                                nY = mrDoc.MaxRow();
+                            else
+                                nY = nNext - 1;     // +=nDir advances to next 
visible row
+                        }
                     }
                 }
             }
@@ -2579,7 +2589,7 @@ Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW 
nWhereY, ScSplitPos eWhich,
             for (SCROW nY = nStartPosY; nY > nWhereY;)
             {
                 --nY;
-                nTSize = mrDoc.GetRowHeight(nY, nForTab);
+                sal_uInt16 nTSize = mrDoc.GetRowHeight(nY, nForTab);
                 if (nTSize)
                 {
                     tools::Long nSizeYPix = ToPixel( nTSize, nPPTY );

Reply via email to