[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.2' - sc/inc sc/source

Noel Grandin (via logerrit) logerrit at kemper.freedesktop.org
Fri Nov 15 08:08:58 UTC 2019


 sc/inc/document.hxx              |    2 +-
 sc/inc/table.hxx                 |    2 +-
 sc/source/core/data/document.cxx |    4 ++--
 sc/source/core/data/table2.cxx   |   28 ++++++++++++++++++++++++----
 sc/source/ui/view/viewdata.cxx   |   29 +++++++++++------------------
 5 files changed, 39 insertions(+), 26 deletions(-)

New commits:
commit 4f1fe43b077c8bbbd6ceca7cf564c0168039f9fa
Author:     Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Tue Nov 12 16:00:55 2019 +0200
Commit:     Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Fri Nov 15 09:07:51 2019 +0100

    reduce iteration in ScViewData::GetScrPos
    
    we already have a ScTable::GetRowHeightScaled method that uses spans, so use
    that.
    
    Reviewed-on: https://gerrit.libreoffice.org/82520
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
    (cherry picked from commit feec8e3c34e08b621098a17f1011dccd0b4f7f4c)
    
    Change-Id: I126292b4a8b37ebf2d4f737dcbfdadc31226531e
    Reviewed-on: https://gerrit.libreoffice.org/82747
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 3fbe9cd899d5..1e33e444c849 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -1820,7 +1820,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 e804a1ca9cc2..353a5a1b1978 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -809,7 +809,7 @@ public:
     sal_uLong GetColWidth( SCCOL nStartCol, SCCOL nEndCol ) const;
     SC_DLLPUBLIC 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 2d36b6e46f36..ed10538b00ac 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -4197,7 +4197,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)
@@ -4208,7 +4208,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 524dfe220190..e86f3d215778 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -3151,7 +3151,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");
 
@@ -3177,8 +3177,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;
                 }
@@ -3188,7 +3198,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 05e6fc024e16..d6b7c041cecd 100644
--- a/sc/source/ui/view/viewdata.cxx
+++ b/sc/source/ui/view/viewdata.cxx
@@ -2069,7 +2069,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();
 
 
@@ -2137,27 +2137,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 > MAXROW )
+                if ( nWhereY-1 > 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 < MAXROW )
-                    {
-                        // skip multiple hidden rows (forward only for now)
-                        SCROW nNext = pDoc->FirstVisibleRow(nY + 1, MAXROW, nTabNo);
-                        if ( nNext > MAXROW )
-                            nY = 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;
                 }
             }
         }


More information about the Libreoffice-commits mailing list