diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-11-12 16:00:55 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-11-15 07:19:01 +0100 |
commit | feec8e3c34e08b621098a17f1011dccd0b4f7f4c (patch) | |
tree | a8d2de8e92b6fb223cf86689f283c157175bedfc /sc | |
parent | 8c85782bbe46963e2be32c3cb406982f1790fc2f (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')
-rw-r--r-- | sc/inc/document.hxx | 2 | ||||
-rw-r--r-- | sc/inc/table.hxx | 2 | ||||
-rw-r--r-- | sc/source/core/data/document.cxx | 4 | ||||
-rw-r--r-- | sc/source/core/data/table2.cxx | 28 | ||||
-rw-r--r-- | sc/source/ui/view/viewdata.cxx | 29 |
5 files changed, 39 insertions, 26 deletions
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 6b3f8f6ecbb3..66ed8fefc000 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -1858,7 +1858,7 @@ public: * specified height. */ SCROW GetRowForHeight( SCTAB nTab, sal_uLong nHeight ) const; - sal_uLong GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, double fScale ) const; + sal_uLong GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, double fScale, const sal_uLong* pnMaxHeight = nullptr ) const; SC_DLLPUBLIC sal_uLong GetColOffset( SCCOL nCol, SCTAB nTab, bool bHiddenAsZero = true ) const; SC_DLLPUBLIC sal_uLong GetRowOffset( SCROW nRow, SCTAB nTab, bool bHiddenAsZero = true ) const; diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index 91063a82481e..6da491aba9cc 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -805,7 +805,7 @@ public: sal_uLong GetColWidth( SCCOL nStartCol, SCCOL nEndCol ) const; sal_uInt16 GetRowHeight( SCROW nRow, SCROW* pStartRow, SCROW* pEndRow, bool bHiddenAsZero = true ) const; sal_uLong GetRowHeight( SCROW nStartRow, SCROW nEndRow, bool bHiddenAsZero = true ) const; - sal_uLong GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, double fScale ) const; + sal_uLong GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow, double fScale, const sal_uLong* pnMaxHeight = nullptr ) const; sal_uLong GetColOffset( SCCOL nCol, bool bHiddenAsZero = true ) const; sal_uLong GetRowOffset( SCROW nRow, bool bHiddenAsZero = true ) const; 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; } } } |