Author: hdu
Date: Wed Aug 28 15:14:14 2013
New Revision: 1518259

URL: http://svn.apache.org/r1518259
Log:
#i122827# fix the performance regression in xls saving introduced by #i119707#

by correcting the calculation of the last row with visible attributes

Patch by: Yan Peng Guo
Debugged by: Herbert Duerr
Found by: k.wehr...@hotmail.com

Modified:
    openoffice/branches/AOO401/   (props changed)
    openoffice/branches/AOO401/main/sc/inc/patattr.hxx
    openoffice/branches/AOO401/main/sc/source/core/data/attarray.cxx
    openoffice/branches/AOO401/main/sc/source/core/data/patattr.cxx

Propchange: openoffice/branches/AOO401/
------------------------------------------------------------------------------
  Merged /openoffice/trunk:r1518253

Modified: openoffice/branches/AOO401/main/sc/inc/patattr.hxx
URL: 
http://svn.apache.org/viewvc/openoffice/branches/AOO401/main/sc/inc/patattr.hxx?rev=1518259&r1=1518258&r2=1518259&view=diff
==============================================================================
--- openoffice/branches/AOO401/main/sc/inc/patattr.hxx (original)
+++ openoffice/branches/AOO401/main/sc/inc/patattr.hxx Wed Aug 28 15:14:14 2013
@@ -19,8 +19,6 @@
  * 
  *************************************************************/
 
-
-
 #ifndef SC_SCPATATR_HXX
 #define SC_SCPATATR_HXX
 
@@ -38,7 +36,6 @@ class ScStyleSheet;
 class SvNumberFormatter;
 class ScDocument;
 
-
 //     how to treat COL_AUTO in GetFont:
 
 enum ScAutoFontColorMode
@@ -125,6 +122,7 @@ public:
 
        sal_Bool                                        IsVisible() const;
        sal_Bool                                        IsVisibleEqual( const 
ScPatternAttr& rOther ) const;
+       sal_Bool                                        IsEqual( const 
ScPatternAttr& rOther ) const;
 
                             /** If font is an old symbol font StarBats/StarMath
                                 with text encoding RTL_TEXTENC_SYMBOL */

Modified: openoffice/branches/AOO401/main/sc/source/core/data/attarray.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/branches/AOO401/main/sc/source/core/data/attarray.cxx?rev=1518259&r1=1518258&r2=1518259&view=diff
==============================================================================
--- openoffice/branches/AOO401/main/sc/source/core/data/attarray.cxx (original)
+++ openoffice/branches/AOO401/main/sc/source/core/data/attarray.cxx Wed Aug 28 
15:14:14 2013
@@ -1927,21 +1927,38 @@ sal_Bool ScAttrArray::GetLastAttr( SCROW
         rLastRow = MAXROW;
         return sal_True;
     }
-       sal_Bool bFound = sal_False;
-    SCSIZE nEndPos = nCount - 1;
-    SCSIZE nStartPos = nEndPos;
-    while ( nStartPos > 0 && pData[nStartPos-1].nRow > nLastData &&
-            !pData[nStartPos].pPattern->IsVisible() )
-        --nStartPos;
-       if(nStartPos == 0 && !pData[nStartPos].pPattern->IsVisible()) // add 
this condition for handle only default pattern in one colume
-               rLastRow = nLastData;
-       else if(nStartPos >= 0 && pData[nStartPos].nRow > nLastData)
-       {
-               bFound = sal_True;
-               rLastRow = pData[nStartPos].nRow;
-       }
-       else
-               rLastRow = nLastData;
+
+    sal_Bool bFound = sal_False;
+
+    // Loop backwards from the end instead of using Search, assuming that
+    // there usually aren't many attributes below the last cell.
+    SCSIZE nPos = nCount;
+    while ( nPos > 0 && pData[nPos - 1].nRow > nLastData )
+    {
+        SCSIZE nEndPos = nPos - 1;
+        SCSIZE nStartPos = nEndPos;
+        while ( nStartPos > 0 && pData[nStartPos - 1].nRow > nLastData &&
+                pData[nStartPos - 1].pPattern->IsEqual( 
*pData[nStartPos].pPattern ) )
+            --nStartPos;
+
+        SCROW nAttrStartRow = ( nStartPos > 0 ) ? ( pData[nStartPos - 1].nRow 
+ 1 ) : 0;
+        if ( nAttrStartRow <= nLastData )
+            nAttrStartRow = nLastData + 1;
+        SCROW nAttrSize = pData[nEndPos].nRow + 1 - nAttrStartRow;
+        if ( nAttrSize >= SC_VISATTR_STOP )
+        {
+            bFound = sal_False;
+        }
+        else if ( !bFound )
+        {
+            rLastRow = pData[nEndPos].nRow;
+            bFound = sal_True;
+        }
+
+        // look further from the top of the range.
+        nPos = nStartPos;
+    }
+
     return bFound;
 }
 

Modified: openoffice/branches/AOO401/main/sc/source/core/data/patattr.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/branches/AOO401/main/sc/source/core/data/patattr.cxx?rev=1518259&r1=1518258&r2=1518259&view=diff
==============================================================================
--- openoffice/branches/AOO401/main/sc/source/core/data/patattr.cxx (original)
+++ openoffice/branches/AOO401/main/sc/source/core/data/patattr.cxx Wed Aug 28 
15:14:14 2013
@@ -1144,6 +1144,19 @@ sal_Bool ScPatternAttr::IsVisibleEqual( 
        //!             auch hier nur wirklich sichtbare Werte testen !!!
 }
 
+sal_Bool ScPatternAttr::IsEqual( const ScPatternAttr& rOther ) const
+{
+       const SfxItemSet& rThisSet = GetItemSet();
+       const SfxItemSet& rOtherSet = rOther.GetItemSet();
+
+       return OneEqual( rThisSet, rOtherSet, ATTR_BACKGROUND ) &&
+                       OneEqual( rThisSet, rOtherSet, ATTR_BORDER ) &&
+                       OneEqual( rThisSet, rOtherSet, ATTR_BORDER_TLBR ) &&
+                       OneEqual( rThisSet, rOtherSet, ATTR_BORDER_BLTR ) &&
+                       OneEqual( rThisSet, rOtherSet, ATTR_VALUE_FORMAT ) &&
+                       OneEqual( rThisSet, rOtherSet, ATTR_SHADOW );
+}
+
 const String* ScPatternAttr::GetStyleName() const
 {
        return pName ? pName : ( pStyle ? &pStyle->GetName() : NULL );


Reply via email to