summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2024-07-19 13:23:41 +0200
committerMiklos Vajna <vmiklos@collabora.com>2024-08-02 15:25:42 +0200
commit6475f4de73807f44ee1a32aa22447ed7ee1971c8 (patch)
tree72abac302636e9609edec655b898ffdfca161bc4
parent183078c3a4314f88c858cf0825ffa7bfcd384dd6 (diff)
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.grandin@collabora.co.uk> Tested-by: Jenkins (cherry picked from commit 0ee4b0339c3f3fd2f39f7193e2cf54df63a071b6) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170730 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
-rw-r--r--include/svx/svdobj.hxx4
-rw-r--r--include/svx/svdoole2.hxx2
-rw-r--r--svx/source/svdraw/svdmrkv.cxx2
-rw-r--r--svx/source/svdraw/svdobj.cxx9
4 files changed, 16 insertions, 1 deletions
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 };