[Libreoffice-commits] core.git: sw/source
Noel Grandin (via logerrit)
logerrit at kemper.freedesktop.org
Sat Aug 28 13:13:59 UTC 2021
sw/source/core/access/accmap.cxx | 6 +----
sw/source/core/access/accpara.cxx | 4 +--
sw/source/core/docnode/ndsect.cxx | 8 +++---
sw/source/core/docnode/ndtbl.cxx | 8 +++---
sw/source/core/docnode/node.cxx | 8 +++---
sw/source/core/frmedt/feshview.cxx | 3 --
sw/source/core/frmedt/fews.cxx | 2 -
sw/source/core/inc/frame.hxx | 3 ++
sw/source/core/layout/anchoreddrawobject.cxx | 2 -
sw/source/core/layout/calcmove.cxx | 2 -
sw/source/core/layout/findfrm.cxx | 10 ++++++++
sw/source/core/layout/flycnt.cxx | 2 -
sw/source/core/layout/frmtool.cxx | 14 ++++++------
sw/source/core/layout/sectfrm.cxx | 4 +--
sw/source/core/objectpositioning/anchoredobjectposition.cxx | 2 -
sw/source/core/text/frmform.cxx | 4 +--
16 files changed, 46 insertions(+), 36 deletions(-)
New commits:
commit 426930d0c4bd6f782a04a92e8a36e92cd65e186f
Author: Noel Grandin <noelgrandin at gmail.com>
AuthorDate: Sat Aug 28 08:35:29 2021 +0200
Commit: Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Sat Aug 28 15:13:20 2021 +0200
speedup dynamic_cast to SwTextFrame
which is a hotspot in loading some documents
Change-Id: I7f1c48305cd40bcd9bee4baf219228f10cc297b3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121184
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
diff --git a/sw/source/core/access/accmap.cxx b/sw/source/core/access/accmap.cxx
index a79863f65047..60ec8cf53996 100644
--- a/sw/source/core/access/accmap.cxx
+++ b/sw/source/core/access/accmap.cxx
@@ -3419,8 +3419,7 @@ void SwAccessibleMap::InvalidateTextSelectionOfAllParas()
static_cast<SwAccessibleContext*>( xAcc.get() ) );
if ( xAccImpl.is() && xAccImpl->GetFrame() )
{
- const SwTextFrame* pTextFrame(
- dynamic_cast<const SwTextFrame*>(xAccImpl->GetFrame()) );
+ const SwTextFrame* pTextFrame = xAccImpl->GetFrame()->DynCastTextFrame();
OSL_ENSURE( pTextFrame,
"<SwAccessibleMap::_SubmitTextSelectionChangedEvents()> - unexpected type of frame" );
if ( pTextFrame )
@@ -3448,8 +3447,7 @@ void SwAccessibleMap::InvalidateTextSelectionOfAllParas()
static_cast<SwAccessibleContext*>( xAcc.get() ) );
if ( xAccImpl.is() && xAccImpl->GetFrame() )
{
- const SwTextFrame* pTextFrame(
- dynamic_cast<const SwTextFrame*>(xAccImpl->GetFrame()) );
+ const SwTextFrame* pTextFrame = xAccImpl->GetFrame()->DynCastTextFrame();
OSL_ENSURE( pTextFrame,
"<SwAccessibleMap::_SubmitTextSelectionChangedEvents()> - unexpected type of frame" );
if ( pTextFrame )
diff --git a/sw/source/core/access/accpara.cxx b/sw/source/core/access/accpara.cxx
index 7d6ec354244b..3c471c702f30 100644
--- a/sw/source/core/access/accpara.cxx
+++ b/sw/source/core/access/accpara.cxx
@@ -718,7 +718,7 @@ lang::Locale SAL_CALL SwAccessibleParagraph::getLocale()
{
SolarMutexGuard aGuard;
- const SwTextFrame *pTextFrame = dynamic_cast<const SwTextFrame*>( GetFrame() );
+ const SwTextFrame *pTextFrame = GetFrame()->DynCastTextFrame();
if( !pTextFrame )
{
throw uno::RuntimeException("no SwTextFrame", static_cast<cppu::OWeakObject*>(this));
@@ -738,7 +738,7 @@ uno::Reference<XAccessibleRelationSet> SAL_CALL SwAccessibleParagraph::getAccess
rtl::Reference<utl::AccessibleRelationSetHelper> pHelper = new utl::AccessibleRelationSetHelper();
- const SwTextFrame* pTextFrame = dynamic_cast<const SwTextFrame*>(GetFrame());
+ const SwTextFrame* pTextFrame = GetFrame()->DynCastTextFrame();
OSL_ENSURE( pTextFrame,
"<SwAccessibleParagraph::getAccessibleRelationSet()> - missing text frame");
if ( pTextFrame )
diff --git a/sw/source/core/docnode/ndsect.cxx b/sw/source/core/docnode/ndsect.cxx
index 26647f2355cf..627475de7e89 100644
--- a/sw/source/core/docnode/ndsect.cxx
+++ b/sw/source/core/docnode/ndsect.cxx
@@ -1122,8 +1122,8 @@ void SwSectionNode::MakeFramesForAdjacentContentNode(const SwNodeIndex & rIdx)
pViewShell->GetLayout()->IsAnyShellAccessible() )
{
pViewShell->InvalidateAccessibleParaFlowRelation(
- dynamic_cast<SwTextFrame*>(pNew->FindNextCnt( true )),
- dynamic_cast<SwTextFrame*>(pNew->FindPrevCnt()) );
+ pNew->FindNextCnt( true )->DynCastTextFrame(),
+ pNew->FindPrevCnt()->DynCastTextFrame() );
}
}
pNew = pSct;
@@ -1148,8 +1148,8 @@ void SwSectionNode::MakeFramesForAdjacentContentNode(const SwNodeIndex & rIdx)
pViewShell->GetLayout()->IsAnyShellAccessible() )
{
pViewShell->InvalidateAccessibleParaFlowRelation(
- dynamic_cast<SwTextFrame*>(pNew->FindNextCnt( true )),
- dynamic_cast<SwTextFrame*>(pNew->FindPrevCnt()) );
+ pNew->FindNextCnt( true )->DynCastTextFrame(),
+ pNew->FindPrevCnt()->DynCastTextFrame() );
}
}
if ( bInitNewSect )
diff --git a/sw/source/core/docnode/ndtbl.cxx b/sw/source/core/docnode/ndtbl.cxx
index 6d833b9835fa..c39676570943 100644
--- a/sw/source/core/docnode/ndtbl.cxx
+++ b/sw/source/core/docnode/ndtbl.cxx
@@ -2433,8 +2433,8 @@ void SwTableNode::MakeOwnFrames(SwNodeIndex* pIdxBehind)
pViewShell->GetLayout()->IsAnyShellAccessible() )
{
pViewShell->InvalidateAccessibleParaFlowRelation(
- dynamic_cast<SwTextFrame*>(pNew->FindNextCnt( true )),
- dynamic_cast<SwTextFrame*>(pNew->FindPrevCnt()) );
+ pNew->FindNextCnt( true )->DynCastTextFrame(),
+ pNew->FindPrevCnt()->DynCastTextFrame() );
}
}
pNew->RegistFlys();
@@ -2468,8 +2468,8 @@ void SwTableNode::DelFrames(SwRootFrame const*const pLayout)
pViewShell->GetLayout()->IsAnyShellAccessible() )
{
pViewShell->InvalidateAccessibleParaFlowRelation(
- dynamic_cast<SwTextFrame*>(pFrame->FindNextCnt( true )),
- dynamic_cast<SwTextFrame*>(pFrame->FindPrevCnt()) );
+ pFrame->FindNextCnt( true )->DynCastTextFrame(),
+ pFrame->FindPrevCnt()->DynCastTextFrame() );
}
}
pFrame->Cut();
diff --git a/sw/source/core/docnode/node.cxx b/sw/source/core/docnode/node.cxx
index 5cc3a5487004..67bf030fa8d8 100644
--- a/sw/source/core/docnode/node.cxx
+++ b/sw/source/core/docnode/node.cxx
@@ -1393,8 +1393,8 @@ void SwContentNode::MakeFramesForAdjacentContentNode(SwContentNode& rNode)
pViewShell->GetLayout()->IsAnyShellAccessible() )
{
pViewShell->InvalidateAccessibleParaFlowRelation(
- dynamic_cast<SwTextFrame*>(pNew->FindNextCnt( true )),
- dynamic_cast<SwTextFrame*>(pNew->FindPrevCnt()) );
+ pNew->FindNextCnt( true )->DynCastTextFrame(),
+ pNew->FindPrevCnt()->DynCastTextFrame() );
}
}
}
@@ -1486,8 +1486,8 @@ void SwContentNode::DelFrames(SwRootFrame const*const pLayout)
pViewShell->GetLayout()->IsAnyShellAccessible() )
{
pViewShell->InvalidateAccessibleParaFlowRelation(
- dynamic_cast<SwTextFrame*>(pFrame->FindNextCnt( true )),
- dynamic_cast<SwTextFrame*>(pFrame->FindPrevCnt()) );
+ pFrame->FindNextCnt( true )->DynCastTextFrame(),
+ pFrame->FindPrevCnt()->DynCastTextFrame() );
}
}
diff --git a/sw/source/core/frmedt/feshview.cxx b/sw/source/core/frmedt/feshview.cxx
index d4e1f57d3ade..4939e856e888 100644
--- a/sw/source/core/frmedt/feshview.cxx
+++ b/sw/source/core/frmedt/feshview.cxx
@@ -1450,8 +1450,7 @@ bool SwFEShell::ShouldObjectBeSelected(const Point& rPt)
{
if ( pContentFrame->UnionFrame().IsInside( rPt ) )
{
- const SwTextFrame* pTextFrame =
- dynamic_cast<const SwTextFrame*>(pContentFrame);
+ const SwTextFrame* pTextFrame = pContentFrame->DynCastTextFrame();
if ( pTextFrame )
{
SwPosition aPos(GetDoc()->GetNodes());
diff --git a/sw/source/core/frmedt/fews.cxx b/sw/source/core/frmedt/fews.cxx
index 242cc123c431..ae04ee30efb7 100644
--- a/sw/source/core/frmedt/fews.cxx
+++ b/sw/source/core/frmedt/fews.cxx
@@ -982,7 +982,7 @@ void SwFEShell::CalcBoundRect( SwRect& _orRect,
// <pFrame>, which is the anchor frame or the proposed anchor frame,
// doesn't have to be a text frame (e.g. edit a to-page anchored
// fly frame). Thus, assure this.
- const SwTextFrame* pTextFrame( dynamic_cast<const SwTextFrame*>(pFrame) );
+ const SwTextFrame* pTextFrame = pFrame->DynCastTextFrame();
if ( pTextFrame &&
(_nAnchorId == RndStdIds::FLY_AT_CHAR) &&
( _eVertRelOrient == text::RelOrientation::CHAR ||
diff --git a/sw/source/core/inc/frame.hxx b/sw/source/core/inc/frame.hxx
index a6504b25cdc0..3b1414002140 100644
--- a/sw/source/core/inc/frame.hxx
+++ b/sw/source/core/inc/frame.hxx
@@ -65,6 +65,7 @@ class SwSortedObjs;
class SwAnchoredObject;
enum class SvxFrameDirection;
class IDocumentDrawModelAccess;
+class SwTextFrame;
// Each FrameType is represented here as a bit.
// The bits must be set in a way that it can be determined with masking of
@@ -866,6 +867,8 @@ public:
inline bool IsCellFrame() const;
inline bool IsContentFrame() const;
inline bool IsTextFrame() const;
+ SwTextFrame* DynCastTextFrame();
+ const SwTextFrame* DynCastTextFrame() const;
inline bool IsNoTextFrame() const;
// Frames where its PrtArea depends on their neighbors and that are
// positioned in the content flow
diff --git a/sw/source/core/layout/anchoreddrawobject.cxx b/sw/source/core/layout/anchoreddrawobject.cxx
index 4a7baf446cfd..9ee3bd01f098 100644
--- a/sw/source/core/layout/anchoreddrawobject.cxx
+++ b/sw/source/core/layout/anchoreddrawobject.cxx
@@ -571,7 +571,7 @@ void SwAnchoredDrawObject::InvalidateObjPos()
// anchored object, because its positioned by the format of its anchor frame.
// --> #i44559# - assure, that text hint is already
// existing in the text frame
- if ( dynamic_cast< const SwTextFrame* >(GetAnchorFrame()) != nullptr &&
+ if ( GetAnchorFrame()->DynCastTextFrame() != nullptr &&
(GetFrameFormat().GetAnchor().GetAnchorId() == RndStdIds::FLY_AS_CHAR) )
{
SwTextFrame* pAnchorTextFrame( static_cast<SwTextFrame*>(AnchorFrame()) );
diff --git a/sw/source/core/layout/calcmove.cxx b/sw/source/core/layout/calcmove.cxx
index 39a183f9e38c..31a9e2f80045 100644
--- a/sw/source/core/layout/calcmove.cxx
+++ b/sw/source/core/layout/calcmove.cxx
@@ -1304,7 +1304,7 @@ void SwContentFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/)
HasFollow() && !GetFollow()->IsDeleteForbidden() &&
&GetFollow()->GetFrame() == GetNext() )
{
- dynamic_cast<SwTextFrame&>(*this).JoinFrame();
+ static_cast<SwTextFrame&>(*this).JoinFrame();
}
// #i28701# - move master forward, if it has to move,
diff --git a/sw/source/core/layout/findfrm.cxx b/sw/source/core/layout/findfrm.cxx
index f079b142297d..48088fdb2d1c 100644
--- a/sw/source/core/layout/findfrm.cxx
+++ b/sw/source/core/layout/findfrm.cxx
@@ -1838,4 +1838,14 @@ const SwFrame* SwLayoutFrame::GetLastLower() const
return pRet;
}
+SwTextFrame* SwFrame::DynCastTextFrame()
+{
+ return IsTextFrame() ? static_cast<SwTextFrame*>(this) : nullptr;
+}
+
+const SwTextFrame* SwFrame::DynCastTextFrame() const
+{
+ return IsTextFrame() ? static_cast<const SwTextFrame*>(this) : nullptr;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/layout/flycnt.cxx b/sw/source/core/layout/flycnt.cxx
index 71b0d493879a..02c3d54bce4f 100644
--- a/sw/source/core/layout/flycnt.cxx
+++ b/sw/source/core/layout/flycnt.cxx
@@ -397,7 +397,7 @@ void SwFlyAtContentFrame::MakeAll(vcl::RenderContext* pRenderContext)
if ( bFormatAnchor )
{
SwTextFrame& rAnchPosAnchorFrame =
- dynamic_cast<SwTextFrame&>(*GetAnchorFrameContainingAnchPos());
+ *GetAnchorFrameContainingAnchPos()->DynCastTextFrame();
// #i58182# - For the usage of new method
// <SwObjectFormatterTextFrame::CheckMovedFwdCondition(..)>
// to check move forward of anchor frame due to the object
diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx
index 1602604f01c8..77293c14d270 100644
--- a/sw/source/core/layout/frmtool.cxx
+++ b/sw/source/core/layout/frmtool.cxx
@@ -1589,8 +1589,8 @@ void InsertCnt_( SwLayoutFrame *pLay, SwDoc *pDoc,
pFrame->FindPageFrame() != nullptr)
{
pViewShell->InvalidateAccessibleParaFlowRelation(
- dynamic_cast<SwTextFrame*>(pFrame->FindNextCnt( true )),
- dynamic_cast<SwTextFrame*>(pFrame->FindPrevCnt()) );
+ pFrame->FindNextCnt( true )->DynCastTextFrame(),
+ pFrame->FindPrevCnt()->DynCastTextFrame() );
// #i68958#
// The information flags of the text frame are validated
// in methods <FindNextCnt(..)> and <FindPrevCnt(..)>.
@@ -1675,8 +1675,8 @@ void InsertCnt_( SwLayoutFrame *pLay, SwDoc *pDoc,
pFrame->FindPageFrame() != nullptr)
{
pViewShell->InvalidateAccessibleParaFlowRelation(
- dynamic_cast<SwTextFrame*>(pFrame->FindNextCnt( true )),
- dynamic_cast<SwTextFrame*>(pFrame->FindPrevCnt()) );
+ pFrame->FindNextCnt( true )->DynCastTextFrame(),
+ pFrame->FindPrevCnt()->DynCastTextFrame() );
}
}
if ( bObjsDirect && !pTable->empty() )
@@ -1787,8 +1787,8 @@ void InsertCnt_( SwLayoutFrame *pLay, SwDoc *pDoc,
pFrame->FindPageFrame() != nullptr)
{
pViewShell->InvalidateAccessibleParaFlowRelation(
- dynamic_cast<SwTextFrame*>(pFrame->FindNextCnt( true )),
- dynamic_cast<SwTextFrame*>(pFrame->FindPrevCnt()) );
+ pFrame->FindNextCnt( true )->DynCastTextFrame(),
+ pFrame->FindPrevCnt()->DynCastTextFrame() );
}
}
pFrame->CheckDirChange();
@@ -2195,7 +2195,7 @@ SwBorderAttrs::SwBorderAttrs(const sw::BorderCacheOwner* pOwner, const SwFrame*
, m_nLineSpacing(0)
{
// #i96772#
- const SwTextFrame* pTextFrame = dynamic_cast<const SwTextFrame*>(pConstructor);
+ const SwTextFrame* pTextFrame = pConstructor->DynCastTextFrame();
if ( pTextFrame )
{
pTextFrame->GetTextNodeForParaProps()->ClearLRSpaceItemDueToListLevelIndents( m_rLR );
diff --git a/sw/source/core/layout/sectfrm.cxx b/sw/source/core/layout/sectfrm.cxx
index 2f3694e47145..c78007d8f3af 100644
--- a/sw/source/core/layout/sectfrm.cxx
+++ b/sw/source/core/layout/sectfrm.cxx
@@ -204,8 +204,8 @@ void SwSectionFrame::DelEmpty( bool bRemove )
pViewShell->GetLayout()->IsAnyShellAccessible() )
{
pViewShell->InvalidateAccessibleParaFlowRelation(
- dynamic_cast<SwTextFrame*>(FindNextCnt( true )),
- dynamic_cast<SwTextFrame*>(FindPrevCnt()) );
+ FindNextCnt( true )->DynCastTextFrame(),
+ FindPrevCnt()->DynCastTextFrame() );
}
}
Cut_( bRemove );
diff --git a/sw/source/core/objectpositioning/anchoredobjectposition.cxx b/sw/source/core/objectpositioning/anchoredobjectposition.cxx
index ee516c49eec5..c58d71d1f6f9 100644
--- a/sw/source/core/objectpositioning/anchoredobjectposition.cxx
+++ b/sw/source/core/objectpositioning/anchoredobjectposition.cxx
@@ -938,7 +938,7 @@ SwTwips SwAnchoredObjectPosition::AdjustHoriRelPosForDrawAside(
) const
{
// #i26791#
- if ( dynamic_cast<const SwTextFrame*>( &GetAnchorFrame() ) == nullptr ||
+ if ( GetAnchorFrame().DynCastTextFrame() == nullptr ||
dynamic_cast<const SwFlyAtContentFrame*>( &GetAnchoredObj() ) == nullptr )
{
OSL_FAIL( "<SwAnchoredObjectPosition::AdjustHoriRelPosForDrawAside(..) - usage for wrong anchor type" );
diff --git a/sw/source/core/text/frmform.cxx b/sw/source/core/text/frmform.cxx
index d0d9cc68fb54..b0ded2d75306 100644
--- a/sw/source/core/text/frmform.cxx
+++ b/sw/source/core/text/frmform.cxx
@@ -669,7 +669,7 @@ SwContentFrame *SwTextFrame::JoinFrame()
pViewShell->GetLayout()->IsAnyShellAccessible() )
{
pViewShell->InvalidateAccessibleParaFlowRelation(
- dynamic_cast<SwTextFrame*>(pFoll->FindNextCnt( true )),
+ pFoll->FindNextCnt( true )->DynCastTextFrame(),
this );
}
}
@@ -703,7 +703,7 @@ void SwTextFrame::SplitFrame(TextFrameIndex const nTextPos)
pViewShell->GetLayout()->IsAnyShellAccessible() )
{
pViewShell->InvalidateAccessibleParaFlowRelation(
- dynamic_cast<SwTextFrame*>(pNew->FindNextCnt( true )),
+ pNew->FindNextCnt( true )->DynCastTextFrame(),
this );
}
}
More information about the Libreoffice-commits
mailing list