sc/inc/fillinfo.hxx | 54 ++++++++++++++++++++--- sc/source/core/data/fillinfo.cxx | 89 +++++++++++++-------------------------- sc/source/ui/view/gridwin4.cxx | 2 3 files changed, 78 insertions(+), 67 deletions(-)
New commits: commit 4c338a328d6be0450bfdcb08876abfd149cb80ca Author: Ashod Nakashian <[email protected]> Date: Sat May 21 23:10:35 2016 -0400 sc lok bccu#1610 - Tiles not rendering in large spreadsheets Variable max info rows instead of hard-coded allows for collecting info on more rows. FillInfo, however, is extremely slow for large row count (a few thousand) and needs improving. Change-Id: Ib0e475513bc3ba98fff66a5b9d405aeba1057331 Reviewed-on: https://gerrit.libreoffice.org/25293 Reviewed-by: Ashod Nakashian <[email protected]> Tested-by: Ashod Nakashian <[email protected]> diff --git a/sc/inc/fillinfo.hxx b/sc/inc/fillinfo.hxx index d35bb8e..419f1c9 100644 --- a/sc/inc/fillinfo.hxx +++ b/sc/inc/fillinfo.hxx @@ -195,10 +195,11 @@ struct ScTableInfo { svx::frame::Array maArray; RowInfo* mpRowInfo; - sal_uInt16 mnArrCount; + sal_uInt16 mnArrCount; + sal_uInt16 mnArrCapacity; bool mbPageMode; - explicit ScTableInfo(); + explicit ScTableInfo(const sal_uInt16 capacity = 1024); ~ScTableInfo(); ScTableInfo(const ScTableInfo&) = delete; const ScTableInfo& operator=(const ScTableInfo&) = delete; diff --git a/sc/source/core/data/fillinfo.cxx b/sc/source/core/data/fillinfo.cxx index b167a82..8a543df 100644 --- a/sc/source/core/data/fillinfo.cxx +++ b/sc/source/core/data/fillinfo.cxx @@ -46,8 +46,6 @@ #include <memory> #include <o3tl/make_unique.hxx> -const sal_uInt16 ROWINFO_MAX = 1024; - enum FillInfoLinePos { FILP_TOP, @@ -209,7 +207,7 @@ bool isRotateItemUsed(ScDocumentPool *pPool) return false; } -void initRowInfo(ScDocument* pDoc, RowInfo* pRowInfo, +void initRowInfo(ScDocument* pDoc, RowInfo* pRowInfo, const SCSIZE nMaxRow, double fRowScale, SCROW nRow1, SCTAB nTab, SCROW& rYExtra, SCSIZE& rArrRow, SCROW& rRow2) { sal_uInt16 nDocHeight = ScGlobal::nStdRowHeight; @@ -249,7 +247,7 @@ void initRowInfo(ScDocument* pDoc, RowInfo* pRowInfo, pThisRowInfo->nRotMaxCol = SC_ROTMAX_NONE; ++rArrRow; - if (rArrRow >= ROWINFO_MAX) + if (rArrRow >= nMaxRow) { OSL_FAIL("FillInfo: Range too big" ); rYExtra = nSignedY; // End @@ -434,7 +432,7 @@ void ScDocument::FillInfo( nArrRow=0; SCROW nYExtra = nRow2+1; - initRowInfo(this, pRowInfo, fRowScale, nRow1, + initRowInfo(this, pRowInfo, rTabInfo.mnArrCapacity, fRowScale, nRow1, nTab, nYExtra, nArrRow, nRow2); nArrCount = nArrRow; // incl. Dummys @@ -1125,17 +1123,18 @@ void ScDocument::FillInfo( rArray.MirrorSelfX( true, false ); } -ScTableInfo::ScTableInfo() - : mpRowInfo(new RowInfo[ROWINFO_MAX]) +ScTableInfo::ScTableInfo(const sal_uInt16 capacity) + : mpRowInfo(new RowInfo[capacity]) , mnArrCount(0) + , mnArrCapacity(capacity) , mbPageMode(false) { - memset(mpRowInfo, 0, ROWINFO_MAX*sizeof(RowInfo)); + memset(mpRowInfo, 0, mnArrCapacity * sizeof(RowInfo)); } ScTableInfo::~ScTableInfo() { - for( sal_uInt16 nIdx = 0; nIdx < ROWINFO_MAX; ++nIdx ) + for( sal_uInt16 nIdx = 0; nIdx < mnArrCapacity; ++nIdx ) delete [] mpRowInfo[ nIdx ].pCellInfo; delete [] mpRowInfo; } diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx index c4d7da1..979af6b 100644 --- a/sc/source/ui/view/gridwin4.cxx +++ b/sc/source/ui/view/gridwin4.cxx @@ -975,7 +975,7 @@ void ScGridWindow::PaintTile( VirtualDevice& rDevice, double fPPTX = pViewData->GetPPTX(); double fPPTY = pViewData->GetPPTY(); - ScTableInfo aTabInfo; + ScTableInfo aTabInfo(nEndRow + 2); pDoc->FillInfo(aTabInfo, nStartCol, nStartRow, nEndCol, nEndRow, nTab, fPPTX, fPPTY, false, false, NULL); ScOutputData aOutputData(&rDevice, OUTTYPE_WINDOW, aTabInfo, pDoc, nTab, commit 4475acb6e52652890e5470c4cd1f4e1aaa84fbb5 Author: Caolán McNamara <[email protected]> Date: Sat Apr 9 20:39:48 2016 +0100 coverity#738785 reorg to silence Uninitialized pointer field (cherry picked from commit 3ac0778c0a2b2f693a1029b7b05c1be4f71944a9) Change-Id: If2225e77215e2a6fb6b9e9dfc6021a2c20babe50 Reviewed-on: https://gerrit.libreoffice.org/25292 Reviewed-by: Ashod Nakashian <[email protected]> Tested-by: Ashod Nakashian <[email protected]> diff --git a/sc/inc/fillinfo.hxx b/sc/inc/fillinfo.hxx index 94bd6b1..d35bb8e 100644 --- a/sc/inc/fillinfo.hxx +++ b/sc/inc/fillinfo.hxx @@ -29,8 +29,6 @@ #include "colorscale.hxx" #include "cellvalue.hxx" -#include <boost/noncopyable.hpp> - class SfxItemSet; class SvxBrushItem; class SvxBoxItem; @@ -96,8 +94,42 @@ struct ScIconSetInfo bool mbShowValue; }; -struct CellInfo : boost::noncopyable +struct CellInfo { + CellInfo() + : pPatternAttr(nullptr) + , pConditionSet(nullptr) + , pBackground(nullptr) // TODO: omit? + , pLinesAttr(nullptr) + , mpTLBRLine(nullptr) + , mpBLTRLine(nullptr) + , pShadowAttr(nullptr) + , pHShadowOrigin(nullptr) + , pVShadowOrigin(nullptr) + , eHShadowPart(SC_SHADOW_HSTART) + , eVShadowPart(SC_SHADOW_HSTART) + , nClipMark(SC_CLIPMARK_NONE) + , nWidth(0) + , nRotateDir(SC_ROTDIR_NONE) + , bMarked(false) + , bEmptyCellText(false) + , bMerged(false) + , bHOverlapped(false) + , bVOverlapped(false) + , bAutoFilter(false) + , bPivotButton(false) + , bPivotPopupButton(false) + , bFilterActive(false) + , bPrinted(false) // view-internal + , bHideGrid(false) // view-internal + , bEditEngine(false) // view-internal + { + } + + ~CellInfo() = default; + CellInfo(const CellInfo&) = delete; + const CellInfo& operator=(const CellInfo&) = delete; + ScRefCellValue maCell; const ScPatternAttr* pPatternAttr; @@ -139,8 +171,13 @@ struct CellInfo : boost::noncopyable const SCCOL SC_ROTMAX_NONE = SCCOL_MAX; -struct RowInfo : boost::noncopyable +struct RowInfo { + RowInfo() = default; + ~RowInfo() = default; + RowInfo(const RowInfo&) = delete; + const RowInfo& operator=(const RowInfo&) = delete; + CellInfo* pCellInfo; sal_uInt16 nHeight; @@ -154,7 +191,7 @@ struct RowInfo : boost::noncopyable bool bChanged:1; // TRUE, if not tested }; -struct ScTableInfo : boost::noncopyable +struct ScTableInfo { svx::frame::Array maArray; RowInfo* mpRowInfo; @@ -163,6 +200,8 @@ struct ScTableInfo : boost::noncopyable explicit ScTableInfo(); ~ScTableInfo(); + ScTableInfo(const ScTableInfo&) = delete; + const ScTableInfo& operator=(const ScTableInfo&) = delete; }; #endif diff --git a/sc/source/core/data/fillinfo.cxx b/sc/source/core/data/fillinfo.cxx index 5786216..b167a82 100644 --- a/sc/source/core/data/fillinfo.cxx +++ b/sc/source/core/data/fillinfo.cxx @@ -157,11 +157,11 @@ class RowInfoFiller { alignArray(nRow); - RowInfo* pThisRowInfo = &mpRowInfo[mnArrY]; - CellInfo* pInfo = &pThisRowInfo->pCellInfo[mnArrX]; - pInfo->maCell = rCell; - pThisRowInfo->bEmptyText = false; - pInfo->bEmptyCellText = false; + RowInfo& rThisRowInfo = mpRowInfo[mnArrY]; + CellInfo& rInfo = rThisRowInfo.pCellInfo[mnArrX]; + rInfo.maCell = rCell; + rThisRowInfo.bEmptyText = false; + rInfo.bEmptyCellText = false; ++mnArrY; } @@ -266,55 +266,27 @@ void initCellInfo(RowInfo* pRowInfo, SCSIZE nArrCount, SCCOL nRotMax, bool bPain const SvxShadowItem* pDefShadow, SCROW nBlockStartY, SCROW nBlockEndY, SCCOL nBlockStartX, SCCOL nBlockEndX) { - for (SCSIZE nArrRow = 0; nArrRow < nArrCount; nArrRow++) + for (SCSIZE nArrRow = 0; nArrRow < nArrCount; ++nArrRow) { - RowInfo* pThisRowInfo = &pRowInfo[nArrRow]; - SCROW nY = pThisRowInfo->nRowNo; - pThisRowInfo->pCellInfo = new CellInfo[ nRotMax+1+2 ]; // to delete the caller! + RowInfo& rThisRowInfo = pRowInfo[nArrRow]; + SCROW nY = rThisRowInfo.nRowNo; + rThisRowInfo.pCellInfo = new CellInfo[nRotMax + 1 + 2]; // to delete the caller! - for (SCCOL nArrCol = 0; nArrCol <= nRotMax+2; nArrCol++) // Preassign cell info + for (SCCOL nArrCol = 0; nArrCol <= nRotMax+2; ++nArrCol) // Preassign cell info { - SCCOL nX; - if (nArrCol>0) - nX = nArrCol-1; - else - nX = MAXCOL+1; // invalid - - CellInfo* pInfo = &pThisRowInfo->pCellInfo[nArrCol]; - pInfo->bEmptyCellText = true; - pInfo->maCell.clear(); + CellInfo& rInfo = rThisRowInfo.pCellInfo[nArrCol]; if (bPaintMarks) - pInfo->bMarked = ( nX >= nBlockStartX && nX <= nBlockEndX - && nY >= nBlockStartY && nY <= nBlockEndY ); - else - pInfo->bMarked = false; - pInfo->nWidth = 0; - - pInfo->nClipMark = SC_CLIPMARK_NONE; - pInfo->bMerged = false; - pInfo->bHOverlapped = false; - pInfo->bVOverlapped = false; - pInfo->bAutoFilter = false; - pInfo->bPivotButton = false; - pInfo->bPivotPopupButton = false; - pInfo->bFilterActive = false; - pInfo->nRotateDir = SC_ROTDIR_NONE; - - pInfo->bPrinted = false; // view-internal - pInfo->bHideGrid = false; // view-internal - pInfo->bEditEngine = false; // view-internal - - pInfo->pBackground = nullptr; //TODO: omit? - pInfo->pPatternAttr = nullptr; - pInfo->pConditionSet= nullptr; - - pInfo->pLinesAttr = nullptr; - pInfo->mpTLBRLine = nullptr; - pInfo->mpBLTRLine = nullptr; - - pInfo->pShadowAttr = pDefShadow; - pInfo->pHShadowOrigin = nullptr; - pInfo->pVShadowOrigin = nullptr; + { + SCCOL nX; + if (nArrCol>0) + nX = nArrCol-1; + else + nX = MAXCOL+1; // invalid + rInfo.bMarked = (nX >= nBlockStartX && nX <= nBlockEndX && + nY >= nBlockStartY && nY <= nBlockEndY); + } + rInfo.bEmptyCellText = true; + rInfo.pShadowAttr = pDefShadow; } } }
_______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
