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 );