include/svx/svdobj.hxx | 4 ++++ include/svx/svdoole2.hxx | 2 ++ svx/source/svdraw/svdmrkv.cxx | 2 +- svx/source/svdraw/svdobj.cxx | 9 +++++++++ 4 files changed, 16 insertions(+), 1 deletion(-)
New commits: commit 6475f4de73807f44ee1a32aa22447ed7ee1971c8 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Fri Jul 19 13:23:41 2024 +0200 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Fri Aug 2 15:25:42 2024 +0200 reduce cost of dynamic casting in SdrMarkView::CheckSingleSdrObjectHit which shows up when navigating large complex documents with lots of shapes Change-Id: I0631daf1365387f1192815402921ada191ab6046 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170760 Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> Tested-by: Jenkins (cherry picked from commit 0ee4b0339c3f3fd2f39f7193e2cf54df63a071b6) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170730 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Miklos Vajna <vmik...@collabora.com> diff --git a/include/svx/svdobj.hxx b/include/svx/svdobj.hxx index 431d851fced2..9fda19df539b 100644 --- a/include/svx/svdobj.hxx +++ b/include/svx/svdobj.hxx @@ -51,6 +51,7 @@ class SdrItemPool; class SdrModel; class SdrObjList; class SdrObject; +class SdrOle2Obj; class SdrPage; class SdrPageView; class SdrTextObj; @@ -768,6 +769,7 @@ public: void SetMarkProtect(bool bProt); bool IsMarkProtect() const { return m_bMarkProt;} virtual bool IsSdrTextObj() const { return false; } + virtual bool IsSdrOle2Obj() const { return false; } virtual bool IsTextPath() const { return false ; } /// Whether the aspect ratio should be kept by default when resizing. @@ -1007,6 +1009,8 @@ SVXCORE_DLLPUBLIC E3dObject* DynCastE3dObject(SdrObject*); inline const E3dObject* DynCastE3dObject(const SdrObject* p) { return DynCastE3dObject(const_cast<SdrObject*>(p)); } SVXCORE_DLLPUBLIC SdrTextObj* DynCastSdrTextObj(SdrObject*); inline const SdrTextObj* DynCastSdrTextObj(const SdrObject* p) { return DynCastSdrTextObj(const_cast<SdrObject*>(p)); } +SVXCORE_DLLPUBLIC SdrOle2Obj* DynCastSdrOle2Obj(SdrObject*); +inline const SdrOle2Obj* DynCastSdrOle2Obj(const SdrObject* p) { return DynCastSdrOle2Obj(const_cast<SdrObject*>(p)); } struct SdrObjCreatorParams diff --git a/include/svx/svdoole2.hxx b/include/svx/svdoole2.hxx index 444c12348226..f422f15434ba 100644 --- a/include/svx/svdoole2.hxx +++ b/include/svx/svdoole2.hxx @@ -183,6 +183,8 @@ public: // #i118485# missing converter added virtual rtl::Reference<SdrObject> DoConvertToPolyObj(bool bBezier, bool bAddText) const override; + + virtual bool IsSdrOle2Obj() const final { return true; } }; class SVXCORE_DLLPUBLIC SdrEmbedObjectLink final : public sfx2::SvBaseLink diff --git a/svx/source/svdraw/svdmrkv.cxx b/svx/source/svdraw/svdmrkv.cxx index fbbbfcac0cad..0d409f609f49 100644 --- a/svx/source/svdraw/svdmrkv.cxx +++ b/svx/source/svdraw/svdmrkv.cxx @@ -2426,7 +2426,7 @@ SdrObject* SdrMarkView::CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nT const bool bCheckIfMarkable(nOptions & SdrSearchOptions::TESTMARKABLE); const bool bDeep(nOptions & SdrSearchOptions::DEEP); - const bool bOLE(dynamic_cast< const SdrOle2Obj* >(pObj) != nullptr); + const bool bOLE(DynCastSdrOle2Obj(pObj) != nullptr); auto pTextObj = DynCastSdrTextObj( pObj); const bool bTXT(pTextObj && pTextObj->IsTextFrame()); SdrObject* pRet=nullptr; diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx index eadccae5b3a4..d956616d43a9 100644 --- a/svx/source/svdraw/svdobj.cxx +++ b/svx/source/svdraw/svdobj.cxx @@ -3269,6 +3269,15 @@ SdrTextObj* DynCastSdrTextObj(SdrObject* pObj) return nullptr; } +SdrOle2Obj* DynCastSdrOle2Obj(SdrObject* pObj) +{ + // SdrTextObj has subclasses, with lots of SdrObjKind identifiers, so use a virtual method + // to be safer. + if( pObj && pObj->IsSdrOle2Obj() ) + return static_cast<SdrOle2Obj*>(pObj); + return nullptr; +} + rtl::Reference<SdrObject> SdrObjFactory::CreateObjectFromFactory(SdrModel& rSdrModel, SdrInventor nInventor, SdrObjKind nObjIdentifier) { SdrObjCreatorParams aParams { nInventor, nObjIdentifier, rSdrModel };