[Libreoffice-commits] core.git: Branch 'private/swe/libreoffice-5-2+backports' - include/svx svx/source sw/inc sw/source

Tor Lillqvist tml at collabora.com
Mon Dec 18 18:06:41 UTC 2017


 include/svx/svdobj.hxx                                      |    3 +
 svx/source/svdraw/svdobj.cxx                                |    5 ++
 sw/inc/textboxhelper.hxx                                    |    2 -
 sw/source/core/doc/textboxhelper.cxx                        |   21 ++++--------
 sw/source/core/draw/dflyobj.cxx                             |    6 +++
 sw/source/core/inc/dflyobj.hxx                              |    2 +
 sw/source/core/objectpositioning/anchoredobjectposition.cxx |    2 -
 7 files changed, 25 insertions(+), 16 deletions(-)

New commits:
commit e2b76eb07f03fdd6552cdbd8627fa88109f9c4d6
Author: Tor Lillqvist <tml at collabora.com>
Date:   Mon Dec 18 17:49:59 2017 +0200

    Get rid of a dynamic_cast
    
    Add a virtual member function instead. This improves performance. The
    time to load a specific pathological customer document dropped from
    1min 16s to 1min 8s on my machine. Not hugely, but clearly.
    
    Change-Id: I1e59d601e9d0e14b6a756c6e0ad29ce2a1fce66d
    Reviewed-on: https://gerrit.libreoffice.org/46735
    Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
    Tested-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>

diff --git a/include/svx/svdobj.hxx b/include/svx/svdobj.hxx
index 3e75235abc9d..304f403cdfd4 100644
--- a/include/svx/svdobj.hxx
+++ b/include/svx/svdobj.hxx
@@ -948,6 +948,9 @@ public:
 
     virtual void dumpAsXml(struct _xmlTextWriter* pWriter) const;
 
+    /// Is this a textbox of a drawinglayer shape?
+    virtual bool IsTextBox() const;
+
 protected:
     /// Sets a new UNO shape
     ///
diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx
index daaf8f0c37e6..09e0a3486fa7 100644
--- a/svx/source/svdraw/svdobj.cxx
+++ b/svx/source/svdraw/svdobj.cxx
@@ -3108,6 +3108,11 @@ bool SdrObject::HasText() const
     return false;
 }
 
+bool SdrObject::IsTextBox() const
+{
+    return false;
+}
+
 SdrObjFactory::SdrObjFactory(sal_uInt32 nInvent, sal_uInt16 nIdent, SdrPage* pNewPage, SdrModel* pNewModel)
 {
     nInventor=nInvent;
diff --git a/sw/inc/textboxhelper.hxx b/sw/inc/textboxhelper.hxx
index 32fc2167c72a..a9a35f35aa35 100644
--- a/sw/inc/textboxhelper.hxx
+++ b/sw/inc/textboxhelper.hxx
@@ -86,8 +86,6 @@ public:
      *              Valid types are RES_DRAWFRMFMT and RES_FLYFRMFMT.
      */
     static bool isTextBox(const SwFrameFormat* pFormat, sal_uInt16 nType);
-    /// Is pObject a textbox of a drawinglayer shape?
-    static bool isTextBox(const SdrObject* pObject);
 
     /// Count number of shapes in the document, excluding TextBoxes.
     static sal_Int32 getCount(const SwDoc* pDoc);
diff --git a/sw/source/core/doc/textboxhelper.cxx b/sw/source/core/doc/textboxhelper.cxx
index 23033eaeea38..a642de0c1299 100644
--- a/sw/source/core/doc/textboxhelper.cxx
+++ b/sw/source/core/doc/textboxhelper.cxx
@@ -148,20 +148,13 @@ bool SwTextBoxHelper::isTextBox(const SwFrameFormat* pShape, sal_uInt16 nType)
    return true;
 }
 
-bool SwTextBoxHelper::isTextBox(const SdrObject* pObject)
-{
-    const SwVirtFlyDrawObj* pVirtFlyDrawObj = dynamic_cast<const SwVirtFlyDrawObj*>(pObject);
-    if (!pVirtFlyDrawObj)
-        return false;
-    return isTextBox(pVirtFlyDrawObj->GetFormat(), RES_FLYFRMFMT);
-}
-
 sal_Int32 SwTextBoxHelper::getCount(SdrPage* pPage)
 {
     sal_Int32 nRet = 0;
     for (std::size_t i = 0; i < pPage->GetObjCount(); ++i)
     {
-        if (isTextBox(pPage->GetObj(i)))
+        SdrObject* p = pPage->GetObj(i);
+        if (p && p->IsTextBox())
             continue;
         ++nRet;
     }
@@ -189,11 +182,12 @@ uno::Any SwTextBoxHelper::getByIndex(SdrPage* pPage, sal_Int32 nIndex) throw(lan
     sal_Int32 nCount = 0; // Current logical index.
     for (std::size_t i = 0; i < pPage->GetObjCount(); ++i)
     {
-        if (isTextBox(pPage->GetObj(i)))
+        SdrObject* p = pPage->GetObj(i);
+        if (p && p->IsTextBox())
             continue;
         if (nCount == nIndex)
         {
-            pRet = pPage->GetObj(i);
+            pRet = p;
             break;
         }
         ++nCount;
@@ -212,9 +206,10 @@ sal_Int32 SwTextBoxHelper::getOrdNum(const SdrObject* pObject)
         sal_Int32 nOrder = 0; // Current logical order.
         for (std::size_t i = 0; i < pPage->GetObjCount(); ++i)
         {
-            if (isTextBox(pPage->GetObj(i)))
+            SdrObject* p = pPage->GetObj(i);
+            if (p && p->IsTextBox())
                 continue;
-            if (pPage->GetObj(i) == pObject)
+            if (p == pObject)
                 return nOrder;
             ++nOrder;
         }
diff --git a/sw/source/core/draw/dflyobj.cxx b/sw/source/core/draw/dflyobj.cxx
index 19d0372b92e2..dafd5b1bfdc3 100644
--- a/sw/source/core/draw/dflyobj.cxx
+++ b/sw/source/core/draw/dflyobj.cxx
@@ -47,6 +47,7 @@
 #include "grfatr.hxx"
 #include "pagefrm.hxx"
 #include "rootfrm.hxx"
+#include "textboxhelper.hxx"
 #include "wrtsh.hxx"
 #include <ndgrf.hxx>
 #include <frmmgr.hxx>
@@ -1135,4 +1136,9 @@ SdrObject* SwVirtFlyDrawObj::CheckMacroHit( const SdrObjMacroHitRec& rRec ) cons
     return SdrObject::CheckMacroHit( rRec );
 }
 
+bool SwVirtFlyDrawObj::IsTextBox() const
+{
+    return SwTextBoxHelper::isTextBox(GetFormat(), RES_FLYFRMFMT);
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/dflyobj.hxx b/sw/source/core/inc/dflyobj.hxx
index 77befafe37bf..80425ac03b15 100644
--- a/sw/source/core/inc/dflyobj.hxx
+++ b/sw/source/core/inc/dflyobj.hxx
@@ -132,6 +132,8 @@ public:
 
     // RotGrfFlyFrame: If true, this SdrObject supports only limited rotation.
     virtual bool HasLimitedRotation() const override;
+
+    virtual bool IsTextBox() const override;
 };
 
 #endif
diff --git a/sw/source/core/objectpositioning/anchoredobjectposition.cxx b/sw/source/core/objectpositioning/anchoredobjectposition.cxx
index 2f387808b11e..ef243c301aa7 100644
--- a/sw/source/core/objectpositioning/anchoredobjectposition.cxx
+++ b/sw/source/core/objectpositioning/anchoredobjectposition.cxx
@@ -494,7 +494,7 @@ SwTwips SwAnchoredObjectPosition::ImplAdjustVertRelPos( const SwTwips nTopOfAnch
              && nAdjustedRelPosY < nProposedRelPosY )
         {
             const SwFrameFormat* pFormat = &(GetFrameFormat());
-            if ( SwTextBoxHelper::isTextBox(&GetObject()) )
+            if ( GetObject().IsTextBox() )
             {
                 // shrink textboxes to extend beyond the page bottom
                 SwFrameFormat* pFrameFormat = ::FindFrameFormat(&GetObject());


More information about the Libreoffice-commits mailing list