[Libreoffice-commits] core.git: Branch 'feature/perfwork' - 2 commits - sc/inc sc/source
Kohei Yoshida
kohei.yoshida at collabora.com
Fri Sep 26 13:31:28 PDT 2014
sc/inc/column.hxx | 3 --
sc/inc/rowheightcontext.hxx | 6 ++++
sc/source/core/data/column.cxx | 19 +++++++++++---
sc/source/core/data/column2.cxx | 24 +++++++++---------
sc/source/core/data/rowheightcontext.cxx | 5 +++
sc/source/core/data/table1.cxx | 41 +++++++++++++++----------------
6 files changed, 60 insertions(+), 38 deletions(-)
New commits:
commit 452d65ff7ee1dc8be16b9262a13ce9be17243f68
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date: Fri Sep 26 16:21:12 2014 -0400
Annotate FindEditCellsHandler.
Change-Id: Ib49a7a3eccee62e5496f7f19824631866e072b6a
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index d6152dd..e49d765 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -2833,17 +2833,21 @@ class FindEditCellsHandler
sc::CellStoreType::iterator miCellPos;
public:
- FindEditCellsHandler(ScColumn& rColumn, sc::CellTextAttrStoreType& rAttrs,
- const sc::CellStoreType::iterator& rCellItr) :
- mrColumn(rColumn), miAttrPos(rAttrs.begin()), miCellPos(rCellItr) {}
+ FindEditCellsHandler(ScColumn& rCol) :
+ mrColumn(rCol),
+ miAttrPos(rCol.GetCellAttrStore().begin()),
+ miCellPos(rCol.GetCellStore().begin()) {}
bool operator() (size_t, const EditTextObject*)
{
+ // This is definitely an edit text cell.
return true;
}
bool operator() (size_t nRow, const ScFormulaCell* p)
{
+ // With a formula cell, it's considered an edit text cell when either
+ // the result is multi-line or it has more than one script types.
sal_uInt8 nScriptType = mrColumn.GetRangeScriptType(miAttrPos, nRow, nRow, miCellPos);
if (IsAmbiguousScriptNonZero(nScriptType))
return true;
@@ -2851,13 +2855,19 @@ public:
return const_cast<ScFormulaCell*>(p)->IsMultilineResult();
}
+ /**
+ * Callback for a block of other types.
+ */
std::pair<size_t,bool> operator() (const sc::CellStoreType::value_type& node, size_t nOffset, size_t nDataSize)
{
typedef std::pair<size_t,bool> RetType;
if (node.type == sc::element_type_empty)
+ // Ignore empty blocks.
return RetType(0, false);
+ // Check the script type of a non-empty element and see if it has
+ // multiple script types.
for (size_t i = 0; i < nDataSize; ++i)
{
SCROW nRow = node.position + i + nOffset;
@@ -2867,6 +2877,7 @@ public:
return RetType(i+nOffset, true);
}
+ // No edit text cell found.
return RetType(0, false);
}
};
@@ -3232,7 +3243,7 @@ bool ScColumn::HasEditCells(SCROW nStartRow, SCROW nEndRow, SCROW& rFirst)
{
// used in GetOptimalHeight - ambiguous script type counts as edit cell
- FindEditCellsHandler aFunc(*this, maCellTextAttrs, maCells.begin());
+ FindEditCellsHandler aFunc(*this);
std::pair<sc::CellStoreType::const_iterator,size_t> aPos =
sc::FindFormulaEditText(maCells, nStartRow, nEndRow, aFunc);
commit 3c23ec10b4b1a881b011d1ce16cc4012415c0f7a
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date: Fri Sep 26 15:39:50 2014 -0400
Store height array to RowHeightContext and reduce function arg counts.
Change-Id: I09b79bc76ffc55e25c24bbfa8f000f4a46df0a1c
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 893ef13..7b189e0 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -461,8 +461,7 @@ public:
bool bFormula, sal_uInt16 nOldWidth, const ScMarkData* pMarkData, const ScColWidthParam* pParam) const;
void GetOptimalHeight(
- sc::RowHeightContext& rCxt, SCROW nStartRow, SCROW nEndRow, sal_uInt16* pHeight,
- sal_uInt16 nMinHeight, SCROW nMinStart );
+ sc::RowHeightContext& rCxt, SCROW nStartRow, SCROW nEndRow, sal_uInt16 nMinHeight, SCROW nMinStart );
/// Including current, may return -1
SCsROW GetNextUnprotected( SCROW nRow, bool bUp ) const;
diff --git a/sc/inc/rowheightcontext.hxx b/sc/inc/rowheightcontext.hxx
index a334554..a077bd0 100644
--- a/sc/inc/rowheightcontext.hxx
+++ b/sc/inc/rowheightcontext.hxx
@@ -14,12 +14,16 @@
#include <tools/fract.hxx>
+#include <vector>
+
class OutputDevice;
namespace sc {
class SC_DLLPUBLIC RowHeightContext
{
+ std::vector<sal_uInt16> maHeights;
+
double mfPPTX;
double mfPPTY;
Fraction maZoomX;
@@ -48,6 +52,8 @@ public:
void setForceAutoSize( bool b );
bool isForceAutoSize() const { return mbForceAutoSize;}
+
+ std::vector<sal_uInt16>& getHeightArray();
};
}
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 13cdee8..e038da3b 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -772,9 +772,9 @@ static sal_uInt16 lcl_GetAttribHeight( const ScPatternAttr& rPattern, sal_uInt16
// (is only evaluated with bStdAllowed)
void ScColumn::GetOptimalHeight(
- sc::RowHeightContext& rCxt, SCROW nStartRow, SCROW nEndRow, sal_uInt16* pHeight,
- sal_uInt16 nMinHeight, SCROW nMinStart )
+ sc::RowHeightContext& rCxt, SCROW nStartRow, SCROW nEndRow, sal_uInt16 nMinHeight, SCROW nMinStart )
{
+ std::vector<sal_uInt16>& rHeights = rCxt.getHeightArray();
ScAttrIterator aIter( pAttrArray, nStartRow, nEndRow );
SCROW nStart = -1;
@@ -865,8 +865,8 @@ void ScColumn::GetOptimalHeight(
nStdEnd = (nMinStart>0) ? nMinStart-1 : 0;
for (SCROW nRow = nStart; nRow <= nStdEnd; ++nRow)
- if (nDefHeight > pHeight[nRow-nStartRow])
- pHeight[nRow-nStartRow] = nDefHeight;
+ if (nDefHeight > rHeights[nRow-nStartRow])
+ rHeights[nRow-nStartRow] = nDefHeight;
if ( bStdOnly )
{
@@ -887,22 +887,22 @@ void ScColumn::GetOptimalHeight(
{
if ( nCjkHeight == 0 )
nCjkHeight = lcl_GetAttribHeight( *pPattern, ATTR_CJK_FONT_HEIGHT );
- if (nCjkHeight > pHeight[nRow-nStartRow])
- pHeight[nRow-nStartRow] = nCjkHeight;
+ if (nCjkHeight > rHeights[nRow-nStartRow])
+ rHeights[nRow-nStartRow] = nCjkHeight;
}
else if ( nScript == SCRIPTTYPE_COMPLEX )
{
if ( nCtlHeight == 0 )
nCtlHeight = lcl_GetAttribHeight( *pPattern, ATTR_CTL_FONT_HEIGHT );
- if (nCtlHeight > pHeight[nRow-nStartRow])
- pHeight[nRow-nStartRow] = nCtlHeight;
+ if (nCtlHeight > rHeights[nRow-nStartRow])
+ rHeights[nRow-nStartRow] = nCtlHeight;
}
else
{
if ( nLatHeight == 0 )
nLatHeight = lcl_GetAttribHeight( *pPattern, ATTR_FONT_HEIGHT );
- if (nLatHeight > pHeight[nRow-nStartRow])
- pHeight[nRow-nStartRow] = nLatHeight;
+ if (nLatHeight > rHeights[nRow-nStartRow])
+ rHeights[nRow-nStartRow] = nLatHeight;
}
}
}
@@ -928,8 +928,8 @@ void ScColumn::GetOptimalHeight(
( GetNeededSize( nRow, rCxt.getOutputDevice(), rCxt.getPPTX(), rCxt.getPPTY(),
rCxt.getZoomX(), rCxt.getZoomY(), false, aOptions,
&pPattern) / rCxt.getPPTY() );
- if (nHeight > pHeight[nRow-nStartRow])
- pHeight[nRow-nStartRow] = nHeight;
+ if (nHeight > rHeights[nRow-nStartRow])
+ rHeights[nRow-nStartRow] = nHeight;
// Pattern changed due to calculation? => sync.
if (pPattern != pOldPattern)
{
diff --git a/sc/source/core/data/rowheightcontext.cxx b/sc/source/core/data/rowheightcontext.cxx
index 5f51dfa..46f3c6d 100644
--- a/sc/source/core/data/rowheightcontext.cxx
+++ b/sc/source/core/data/rowheightcontext.cxx
@@ -32,6 +32,11 @@ void RowHeightContext::setForceAutoSize( bool b )
mbForceAutoSize = b;
}
+std::vector<sal_uInt16>& RowHeightContext::getHeightArray()
+{
+ return maHeights;
+}
+
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index 88631d5..24fa77d 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -82,7 +82,7 @@ ScProgress* GetProgressBar(
void GetOptimalHeightsInColumn(
sc::RowHeightContext& rCxt, ScColumn* pCol, SCROW nStartRow, SCROW nEndRow,
- vector<sal_uInt16>& aHeights, ScProgress* pProgress, sal_uInt32 nProgressStart )
+ ScProgress* pProgress, sal_uInt32 nProgressStart )
{
SCSIZE nCount = static_cast<SCSIZE>(nEndRow-nStartRow+1);
@@ -90,20 +90,22 @@ void GetOptimalHeightsInColumn(
// (mit der letzten Spalte in der Hoffnung, dass die am ehesten noch auf
// Standard formatiert ist)
- pCol[MAXCOL].GetOptimalHeight(rCxt, nStartRow, nEndRow, &aHeights[0], 0, 0);
+ std::vector<sal_uInt16>& rHeights = rCxt.getHeightArray();
+
+ pCol[MAXCOL].GetOptimalHeight(rCxt, nStartRow, nEndRow, 0, 0);
// daraus Standardhoehe suchen, die im unteren Bereich gilt
- sal_uInt16 nMinHeight = aHeights[nCount-1];
+ sal_uInt16 nMinHeight = rHeights[nCount-1];
SCSIZE nPos = nCount-1;
- while ( nPos && aHeights[nPos-1] >= nMinHeight )
+ while ( nPos && rHeights[nPos-1] >= nMinHeight )
--nPos;
SCROW nMinStart = nStartRow + nPos;
sal_uLong nWeightedCount = 0;
for (SCCOL nCol=0; nCol<MAXCOL; nCol++) // MAXCOL schon oben
{
- pCol[nCol].GetOptimalHeight(rCxt, nStartRow, nEndRow, &aHeights[0], nMinHeight, nMinStart);
+ pCol[nCol].GetOptimalHeight(rCxt, nStartRow, nEndRow, nMinHeight, nMinStart);
if (pProgress)
{
@@ -155,9 +157,10 @@ struct SetRowHeightRangeFunc : public OptimalHeightsFuncObjBase
}
};
-bool SetOptimalHeightsToRows(OptimalHeightsFuncObjBase& rFuncObj,
- ScBitMaskCompressedArray<SCROW, sal_uInt8>* pRowFlags, SCROW nStartRow, SCROW nEndRow, sal_uInt16 nExtra,
- const vector<sal_uInt16>& aHeights, bool bForce)
+bool SetOptimalHeightsToRows(
+ sc::RowHeightContext& rCxt,
+ OptimalHeightsFuncObjBase& rFuncObj,
+ ScBitMaskCompressedArray<SCROW, sal_uInt8>* pRowFlags, SCROW nStartRow, SCROW nEndRow )
{
SCSIZE nCount = static_cast<SCSIZE>(nEndRow-nStartRow+1);
bool bChanged = false;
@@ -174,9 +177,9 @@ bool SetOptimalHeightsToRows(OptimalHeightsFuncObjBase& rFuncObj,
SCSIZE nMoreRows = nRegionEndRow - ( nStartRow+i ); // additional equal rows after first
bool bAutoSize = ((nRowFlag & CR_MANUALSIZE) == 0);
- if ( bAutoSize || bForce )
+ if (bAutoSize || rCxt.isForceAutoSize())
{
- if (nExtra)
+ if (rCxt.getExtraHeight())
{
if (bAutoSize)
pRowFlags->SetValue( nStartRow+i, nRegionEndRow, nRowFlag | CR_MANUALSIZE);
@@ -188,7 +191,7 @@ bool SetOptimalHeightsToRows(OptimalHeightsFuncObjBase& rFuncObj,
{
if (nLast)
{
- if (aHeights[nInner]+nExtra == nLast)
+ if (rCxt.getHeightArray()[nInner] + rCxt.getExtraHeight() == nLast)
nRngEnd = nStartRow+nInner;
else
{
@@ -198,7 +201,7 @@ bool SetOptimalHeightsToRows(OptimalHeightsFuncObjBase& rFuncObj,
}
if (!nLast)
{
- nLast = aHeights[nInner]+nExtra;
+ nLast = rCxt.getHeightArray()[nInner] + rCxt.getExtraHeight();
nRngStart = nStartRow+nInner;
nRngEnd = nStartRow+nInner;
}
@@ -465,13 +468,12 @@ bool ScTable::SetOptimalHeight(
ScProgress* pProgress = GetProgressBar(nCount, GetWeightedCount(), pOuterProgress, pDocument);
- vector<sal_uInt16> aHeights(nCount, 0);
+ rCxt.getHeightArray().resize(nCount, 0);
- GetOptimalHeightsInColumn(rCxt, aCol, nStartRow, nEndRow, aHeights, pProgress, nProgressStart);
+ GetOptimalHeightsInColumn(rCxt, aCol, nStartRow, nEndRow, pProgress, nProgressStart);
SetRowHeightRangeFunc aFunc(this, rCxt.getPPTX(), rCxt.getPPTY());
- bool bChanged = SetOptimalHeightsToRows(
- aFunc, pRowFlags, nStartRow, nEndRow, rCxt.getExtraHeight(), aHeights, rCxt.isForceAutoSize());
+ bool bChanged = SetOptimalHeightsToRows(rCxt, aFunc, pRowFlags, nStartRow, nEndRow);
if ( pProgress != pOuterProgress )
delete pProgress;
@@ -493,13 +495,12 @@ void ScTable::SetOptimalHeightOnly(
ScProgress* pProgress = GetProgressBar(nCount, GetWeightedCount(), pOuterProgress, pDocument);
- vector<sal_uInt16> aHeights(nCount, 0);
+ rCxt.getHeightArray().resize(nCount, 0);
- GetOptimalHeightsInColumn(rCxt, aCol, nStartRow, nEndRow, aHeights, pProgress, nProgressStart);
+ GetOptimalHeightsInColumn(rCxt, aCol, nStartRow, nEndRow, pProgress, nProgressStart);
SetRowHeightOnlyFunc aFunc(this);
- SetOptimalHeightsToRows(
- aFunc, pRowFlags, nStartRow, nEndRow, rCxt.getExtraHeight(), aHeights, rCxt.isForceAutoSize());
+ SetOptimalHeightsToRows(rCxt, aFunc, pRowFlags, nStartRow, nEndRow);
if ( pProgress != pOuterProgress )
delete pProgress;
More information about the Libreoffice-commits
mailing list