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 0ee4b0339c3f3fd2f39f7193e2cf54df63a071b6
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Fri Jul 19 13:23:41 2024 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Fri Jul 19 20:47:20 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

diff --git a/include/svx/svdobj.hxx b/include/svx/svdobj.hxx
index 8ddad97135ef..4692c2d36d59 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;
@@ -749,6 +750,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.
@@ -988,6 +990,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 43ea27fd3752..ec9a0f6b4d0e 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 b94721c85e24..a39796d8081f 100644
--- a/svx/source/svdraw/svdmrkv.cxx
+++ b/svx/source/svdraw/svdmrkv.cxx
@@ -2433,7 +2433,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 f4c168522b6f..1db55afe2be6 100644
--- a/svx/source/svdraw/svdobj.cxx
+++ b/svx/source/svdraw/svdobj.cxx
@@ -3242,6 +3242,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 };

Reply via email to