include/svx/svdpage.hxx | 3 ++ svx/source/svdraw/svdpage.cxx | 56 ++++++++++++++++++++++++++++++++++++++++ svx/source/unodraw/unoshape.cxx | 6 ---- vcl/win/app/salinst.cxx | 5 +++ 4 files changed, 65 insertions(+), 5 deletions(-)
New commits: commit a9cd44f8deeccbb8afc7209fdf86fbc26ea7a464 Author: Noel Grandin <n...@peralex.com> AuthorDate: Wed Sep 8 11:45:08 2021 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Thu Sep 9 13:01:23 2021 +0200 tdf#144052 speedup inserting large charts we don't need to immediately re-order objects when setting the Z-order, just set the dirty flag and we can calculate the proper order layout. This takes the time for the chart to appear from multiple minutes to 20sec for me. Change-Id: If80569da09469423f19f9fe82b40dfbdac14f161 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121806 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/include/svx/svdpage.hxx b/include/svx/svdpage.hxx index 40268b3248fb..d16a9dc3887e 100644 --- a/include/svx/svdpage.hxx +++ b/include/svx/svdpage.hxx @@ -125,6 +125,9 @@ public: /// Modify ZOrder of an SdrObject virtual SdrObject* SetObjectOrdNum(size_t nOldObjNum, size_t nNewObjNum); + /// Modify ZOrder of an SdrObject, object must already be in the list + virtual void SetExistingObjectOrdNum(SdrObject* pExistingObj, size_t nNewObjNum); + void SetSdrObjListRectsDirty(); const tools::Rectangle& GetAllObjSnapRect() const; diff --git a/svx/source/svdraw/svdpage.cxx b/svx/source/svdraw/svdpage.cxx index 40044d78aa4f..0c56086d1097 100644 --- a/svx/source/svdraw/svdpage.cxx +++ b/svx/source/svdraw/svdpage.cxx @@ -561,6 +561,62 @@ SdrObject* SdrObjList::SetObjectOrdNum(size_t nOldObjNum, size_t nNewObjNum) return pObj; } +void SdrObjList::SetExistingObjectOrdNum(SdrObject* pObj, size_t nNewObjNum) +{ + assert(std::find(maList.begin(), maList.end(), pObj) != maList.end() && "This method requires that the child object already be inserted"); + assert(pObj->IsInserted() && "SdrObjList::SetObjectOrdNum: the object does not have status Inserted."); + + // I am deliberately bypassing getOrdNum() because I dont want to unnecessarily + // trigger RecalcObjOrdNums() + const sal_uInt32 nOldOrdNum = pObj->m_nOrdNum; + if (!mbObjOrdNumsDirty && nOldOrdNum == nNewObjNum) + return; + + // Update the navigation positions. + if (HasObjectNavigationOrder()) + { + tools::WeakReference<SdrObject> aReference (pObj); + auto iObject = ::std::find( + mxNavigationOrder->begin(), + mxNavigationOrder->end(), + aReference); + mxNavigationOrder->erase(iObject); + mbIsNavigationOrderDirty = true; + // The new object does not have a user defined position so append it + // to the list. + pObj->SetNavigationPosition(mxNavigationOrder->size()); + mxNavigationOrder->push_back(pObj); + } + if (nOldOrdNum < maList.size() && maList[nOldOrdNum] == pObj) + maList.erase(maList.begin()+nOldOrdNum); + else + { + auto it = std::find(maList.begin(), maList.end(), pObj); + maList.erase(it); + } + // Insert object into object list. Because the insert() method requires + // a valid iterator as insertion position, we have to use push_back() to + // insert at the end of the list. + if (nNewObjNum >= maList.size()) + maList.push_back(pObj); + else + maList.insert(maList.begin()+nNewObjNum, pObj); + + mbObjOrdNumsDirty=true; + + // No need to delete visualisation data since same object + // gets inserted again. Also a single ActionChanged is enough + pObj->ActionChanged(); + + pObj->SetOrdNum(nNewObjNum); + mbObjOrdNumsDirty=true; + + // TODO: We need a different broadcast here. + if (pObj->getSdrPageFromSdrObject()!=nullptr) + pObj->getSdrModelFromSdrObject().Broadcast(SdrHint(SdrHintKind::ObjectChange, *pObj)); + pObj->getSdrModelFromSdrObject().SetChanged(); +} + void SdrObjList::sort( std::vector<sal_Int32>& sortOrder) { // no negative indexes and indexes larger than maList size are allowed diff --git a/svx/source/unodraw/unoshape.cxx b/svx/source/unodraw/unoshape.cxx index 6445b81e06db..759f61d107ac 100644 --- a/svx/source/unodraw/unoshape.cxx +++ b/svx/source/unodraw/unoshape.cxx @@ -2126,11 +2126,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertyMapEn { SdrObjList* pObjList = GetSdrObject()->getParentSdrObjListFromSdrObject(); if( pObjList ) - { - SdrObject* pCheck = - pObjList->SetObjectOrdNum( GetSdrObject()->GetOrdNum(), static_cast<size_t>(nNewOrdNum) ); - DBG_ASSERT( pCheck == GetSdrObject(), "GetOrdNum() failed!" ); - } + pObjList->SetExistingObjectOrdNum( GetSdrObject(), static_cast<size_t>(nNewOrdNum) ); return true; } break; commit 7b4b032daa2381e5c2f102d4e9619adf38968f94 Author: Noel Grandin <n...@peralex.com> AuthorDate: Thu Sep 9 09:08:34 2021 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Thu Sep 9 13:01:15 2021 +0200 reduce time in ResetEvent (tdf#144052) Change-Id: I3e9c906a026e7455fb775d110eca32f8533614e9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121836 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/vcl/win/app/salinst.cxx b/vcl/win/app/salinst.cxx index dd35317040d4..a34448884057 100644 --- a/vcl/win/app/salinst.cxx +++ b/vcl/win/app/salinst.cxx @@ -130,6 +130,11 @@ void SalYieldMutex::doAcquire( sal_uInt32 nLockCount ) // Window's create/destroy is called via SendMessage() from another thread. // Have a look at the osl_waitCondition implementation for more info. do { + // Calling Condition::reset frequently turns out to be a little expensive, + // and the vast majority of the time there is no contention, so first + // try just acquiring the mutex. + if (m_aMutex.tryToAcquire()) + break; // reset condition *before* acquiring! m_condition.reset(); if (m_aMutex.tryToAcquire())