summaryrefslogtreecommitdiff
path: root/sc/source
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2019-11-12 16:00:55 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2019-11-15 07:19:01 +0100
commitfeec8e3c34e08b621098a17f1011dccd0b4f7f4c (patch)
treea8d2de8e92b6fb223cf86689f283c157175bedfc /sc/source
parent8c85782bbe46963e2be32c3cb406982f1790fc2f (diff)
reduce iteration in ScViewData::GetScrPos
we already have a ScTable::GetRowHeightScaled method that uses spans, so use that. Change-Id: I126292b4a8b37ebf2d4f737dcbfdadc31226531e Reviewed-on: https://gerrit.libreoffice.org/82520 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'sc/source')
-rw-r--r--sc/source/core/data/document.cxx4
-rw-r--r--sc/source/core/data/table2.cxx28
-rw-r--r--sc/source/ui/view/viewdata.cxx29
3 files changed, 37 insertions, 24 deletions
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index ec4a0e3e610a..4c550e670863 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -4183,7 +4183,7 @@ SCROW ScDocument::GetRowForHeight( SCTAB nTab, sal_uLong nHeight ) const
}
sal_uLong ScDocument::GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow,
- SCTAB nTab, double fScale ) const
+ SCTAB nTab, double fScale, const sal_uLong* pnMaxHeight ) const
{
// faster for a single row
if (nStartRow == nEndRow)
@@ -4194,7 +4194,7 @@ sal_uLong ScDocument::GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow,
return 0;
if ( ValidTab(nTab) && nTab < static_cast<SCTAB>(maTabs.size()) && maTabs[nTab] )
- return maTabs[nTab]->GetScaledRowHeight( nStartRow, nEndRow, fScale);
+ return maTabs[nTab]->GetScaledRowHeight( nStartRow, nEndRow, fScale, pnMaxHeight );
OSL_FAIL("wrong sheet number");
return 0;
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 4c36c7b63494..f1a0f37dcbbf 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -3243,7 +3243,7 @@ sal_uLong ScTable::GetRowHeight( SCROW nStartRow, SCROW nEndRow, bool bHiddenAsZ
return (nEndRow - nStartRow + 1) * static_cast<sal_uLong>(ScGlobal::nStdRowHeight);
}
-sal_uLong ScTable::GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, double fScale ) const
+sal_uLong ScTable::GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, double fScale, const sal_uLong* pnMaxHeight ) const
{
OSL_ENSURE(ValidRow(nStartRow) && ValidRow(nEndRow),"wrong row number");
@@ -3269,8 +3269,18 @@ sal_uLong ScTable::GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, double fS
SCROW nSegmentEnd = std::min( nLastRow, aData.mnRow2 );
// round-down a single height value, multiply resulting (pixel) values
- sal_uLong nOneHeight = static_cast<sal_uLong>( aData.mnValue * fScale );
- nHeight += nOneHeight * ( nSegmentEnd + 1 - nRow );
+ const sal_uLong nOneHeight = static_cast<sal_uLong>( aData.mnValue * fScale );
+ SCROW nRowsInSegment = nSegmentEnd + 1 - nRow;
+ if (pnMaxHeight)
+ {
+ nRowsInSegment = std::min(nRowsInSegment, static_cast<SCROW>(*pnMaxHeight / nOneHeight + 1));
+ nHeight += nOneHeight * nRowsInSegment;
+ if (nHeight > *pnMaxHeight)
+ return nHeight;
+ }
+ else
+ nHeight += nOneHeight * nRowsInSegment;
+
nRow = nSegmentEnd + 1;
}
@@ -3280,7 +3290,17 @@ sal_uLong ScTable::GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, double fS
return nHeight;
}
else
- return static_cast<sal_uLong>((nEndRow - nStartRow + 1) * ScGlobal::nStdRowHeight * fScale);
+ {
+ const sal_uLong nOneHeight = static_cast<sal_uLong>(ScGlobal::nStdRowHeight * fScale);
+ SCROW nRowsInSegment = nEndRow - nStartRow + 1;
+ if (pnMaxHeight)
+ {
+ nRowsInSegment = std::min(nRowsInSegment, static_cast<SCROW>(*pnMaxHeight / nOneHeight + 1));
+ return nOneHeight * nRowsInSegment;
+ }
+ else
+ return static_cast<sal_uLong>(nRowsInSegment * nOneHeight);
+ }
}
sal_uInt16 ScTable::GetOriginalHeight( SCROW nRow ) const // non-0 even if hidden
diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx
index 0ea25ebce6de..7c4b719f2e33 100644
--- a/sc/source/ui/view/viewdata.cxx
+++ b/sc/source/ui/view/viewdata.cxx
@@ -2100,7 +2100,7 @@ Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScSplitPos eWhich,
const_cast<ScViewData*>(this)->aScrSize.setHeight( pView->GetGridHeight(eWhichY) );
}
- sal_uInt16 nTSize;
+ sal_uLong nTSize;
bool bIsTiledRendering = comphelper::LibreOfficeKit::isActive();
@@ -2168,27 +2168,20 @@ 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 || nScrPosY <= aScrSize.Height())
{
- if ( nY > pDoc->MaxRow() )
+ if ( nWhereY-1 > pDoc->MaxRow() )
nScrPosY = 0x7FFFFFFF;
+ else if (bAllowNeg || bIsTiledRendering)
+ {
+ sal_uLong nSizeYPix = pDoc->GetScaledRowHeight( nStartPosY, nWhereY-1, nTabNo, nPPTY );
+ nScrPosY += nSizeYPix;
+ }
else
{
- nTSize = pDoc->GetRowHeight( nY, nTabNo );
- if (nTSize)
- {
- long nSizeYPix = ToPixel( nTSize, nPPTY );
- nScrPosY += nSizeYPix;
- }
- else if ( nY < pDoc->MaxRow() )
- {
- // skip multiple hidden rows (forward only for now)
- SCROW nNext = pDoc->FirstVisibleRow(nY + 1, pDoc->MaxRow(), nTabNo);
- if ( nNext > pDoc->MaxRow() )
- nY = pDoc->MaxRow();
- else
- nY = nNext - 1; // +=nDir advances to next visible row
- }
+ sal_uLong nMaxHeight = aScrSize.getHeight() - nScrPosY;
+ sal_uLong nSizeYPix = pDoc->GetScaledRowHeight( nStartPosY, nWhereY-1, nTabNo, nPPTY, &nMaxHeight );
+ nScrPosY += nSizeYPix;
}
}
}