chart2/source/view/main/DrawModelWrapper.cxx | 1 + include/ucbhelper/resultsethelper.hxx | 2 +- svx/source/sdr/contact/viewcontact.cxx | 15 +++++++++++++++ toolkit/source/hatchwindow/documentcloser.cxx | 13 ++++--------- ucbhelper/source/provider/resultset.cxx | 16 +++++----------- ucbhelper/source/provider/resultsethelper.cxx | 12 ++++-------- 6 files changed, 30 insertions(+), 29 deletions(-)
New commits: commit 2e162bb1e8521ad8cd8148e0a18adc3eebadd710 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Thu Jan 13 13:13:57 2022 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Fri Jan 14 09:45:43 2022 +0100 use cache value in ViewContact Rely on the cached primitives without always rebuilding. But only enable it for calc and draw right now, by adding a flag at the SdrModel level. Change-Id: I295e5a366b1b21d0f1561e6736bac919082afb5a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128380 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/chart2/source/view/main/DrawModelWrapper.cxx b/chart2/source/view/main/DrawModelWrapper.cxx index aa7a002c967a..ff2171f596a1 100644 --- a/chart2/source/view/main/DrawModelWrapper.cxx +++ b/chart2/source/view/main/DrawModelWrapper.cxx @@ -45,6 +45,7 @@ namespace chart DrawModelWrapper::DrawModelWrapper() : SdrModel(&ChartItemPool::GetGlobalChartItemPool()) { + SetVOCInvalidationIsReliable(true); SetScaleUnit(MapUnit::Map100thMM); SetScaleFraction(Fraction(1, 1)); SetDefaultFontHeight(423); // 12pt diff --git a/svx/source/sdr/contact/viewcontact.cxx b/svx/source/sdr/contact/viewcontact.cxx index bd79bc5ed4ac..55af6ab6cd4f 100644 --- a/svx/source/sdr/contact/viewcontact.cxx +++ b/svx/source/sdr/contact/viewcontact.cxx @@ -26,6 +26,8 @@ #include <drawinglayer/primitive2d/PolygonHairlinePrimitive2D.hxx> #include <osl/diagnose.h> #include <tools/debug.hxx> +#include <svx/svdobj.hxx> +#include <svx/svdmodel.hxx> namespace sdr::contact { @@ -184,6 +186,8 @@ void ViewContact::ActionChildInserted(ViewContact& rChild) // React on changes of the object of this ViewContact void ViewContact::ActionChanged() { + mxViewIndependentPrimitive2DSequence.clear(); // clear cache + // propagate change to all existing VOCs. This will invalidate // all drawn visualisations in all known views const sal_uInt32 nCount(maViewObjectContactVector.size()); @@ -229,6 +233,17 @@ void ViewContact::createViewIndependentPrimitive2DSequence( void ViewContact::getViewIndependentPrimitive2DContainer( drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) const { + // only some of the top-level apps are any good at reliably invalidating us (e.g. writer is not) + if (SdrObject* pSdrObj = TryToGetSdrObject()) + if (pSdrObj->getSdrModelFromSdrObject().IsVOCInvalidationIsReliable()) + { + if (!mxViewIndependentPrimitive2DSequence.empty()) + { + rVisitor.visit(mxViewIndependentPrimitive2DSequence); + return; + } + } + /* Local up-to-date checks. Create new list and compare. We cannot just always use the new data because the old data has cached bitmaps in it e.g. see the document in tdf#146108. */ commit 8960dae3a24f5dd2712f1fe74de0c3b22552b12b Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Fri Jan 14 09:41:29 2022 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Fri Jan 14 09:45:31 2022 +0100 no need to hold OInterfaceContainerHelper4 by unique_ptr when empty, it is only a single pointer big anyway Change-Id: I3e45dd705c4bef3799435617db1a4192d62860e4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128403 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/include/ucbhelper/resultsethelper.hxx b/include/ucbhelper/resultsethelper.hxx index e929531aa586..486d07fe5f89 100644 --- a/include/ucbhelper/resultsethelper.hxx +++ b/include/ucbhelper/resultsethelper.hxx @@ -55,7 +55,7 @@ class UCBHELPER_DLLPUBLIC ResultSetImplHelper : css::lang::XServiceInfo, css::ucb::XDynamicResultSet> { - std::unique_ptr<comphelper::OInterfaceContainerHelper4<css::lang::XEventListener>> m_pDisposeEventListeners; + comphelper::OInterfaceContainerHelper4<css::lang::XEventListener> m_aDisposeEventListeners; bool m_bStatic; bool m_bInitDone; diff --git a/toolkit/source/hatchwindow/documentcloser.cxx b/toolkit/source/hatchwindow/documentcloser.cxx index 10cb6b37ecd6..16df8536f5f1 100644 --- a/toolkit/source/hatchwindow/documentcloser.cxx +++ b/toolkit/source/hatchwindow/documentcloser.cxx @@ -46,7 +46,7 @@ class ODocumentCloser : public ::cppu::WeakImplHelper< css::lang::XComponent, { std::mutex m_aMutex; css::uno::Reference< css::frame::XFrame > m_xFrame; - std::unique_ptr<::comphelper::OInterfaceContainerHelper4<lang::XEventListener>> m_pListenersContainer; // list of listeners + ::comphelper::OInterfaceContainerHelper4<lang::XEventListener> m_aListenersContainer; // list of listeners bool m_bDisposed; @@ -170,8 +170,7 @@ void SAL_CALL ODocumentCloser::dispose() throw lang::DisposedException(); lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >(this) ); - if ( m_pListenersContainer ) - m_pListenersContainer->disposeAndClear( aGuard, aSource ); + m_aListenersContainer.disposeAndClear( aGuard, aSource ); // TODO: trigger a main thread execution to close the frame if ( m_xFrame.is() ) @@ -191,18 +190,14 @@ void SAL_CALL ODocumentCloser::addEventListener( const uno::Reference< lang::XEv if ( m_bDisposed ) throw lang::DisposedException(); // TODO - if ( !m_pListenersContainer ) - m_pListenersContainer.reset( new ::comphelper::OInterfaceContainerHelper4<lang::XEventListener>() ); - - m_pListenersContainer->addInterface( xListener ); + m_aListenersContainer.addInterface( xListener ); } void SAL_CALL ODocumentCloser::removeEventListener( const uno::Reference< lang::XEventListener >& xListener ) { std::unique_lock aGuard( m_aMutex ); - if ( m_pListenersContainer ) - m_pListenersContainer->removeInterface( xListener ); + m_aListenersContainer.removeInterface( xListener ); } // XServiceInfo diff --git a/ucbhelper/source/provider/resultset.cxx b/ucbhelper/source/provider/resultset.cxx index 0bc1398b724c..162f32cffabf 100644 --- a/ucbhelper/source/provider/resultset.cxx +++ b/ucbhelper/source/provider/resultset.cxx @@ -147,7 +147,7 @@ struct ResultSet_Impl uno::Sequence< beans::Property > m_aProperties; rtl::Reference< ResultSetDataSupplier > m_xDataSupplier; std::mutex m_aMutex; - std::unique_ptr<comphelper::OInterfaceContainerHelper4<lang::XEventListener>> m_pDisposeEventListeners; + comphelper::OInterfaceContainerHelper4<lang::XEventListener> m_aDisposeEventListeners; std::unique_ptr<PropertyChangeListeners> m_pPropertyChangeListeners; sal_Int32 m_nPos; bool m_bWasNull; @@ -236,12 +236,11 @@ void SAL_CALL ResultSet::dispose() { std::unique_lock aGuard( m_pImpl->m_aMutex ); - if ( m_pImpl->m_pDisposeEventListeners && - m_pImpl->m_pDisposeEventListeners->getLength() ) + if ( m_pImpl->m_aDisposeEventListeners.getLength() ) { lang::EventObject aEvt; aEvt.Source = static_cast< lang::XComponent * >( this ); - m_pImpl->m_pDisposeEventListeners->disposeAndClear( aGuard, aEvt ); + m_pImpl->m_aDisposeEventListeners.disposeAndClear( aGuard, aEvt ); aGuard.lock(); } @@ -263,11 +262,7 @@ void SAL_CALL ResultSet::addEventListener( { std::unique_lock aGuard( m_pImpl->m_aMutex ); - if ( !m_pImpl->m_pDisposeEventListeners ) - m_pImpl->m_pDisposeEventListeners.reset( - new comphelper::OInterfaceContainerHelper4<lang::XEventListener>()); - - m_pImpl->m_pDisposeEventListeners->addInterface( Listener ); + m_pImpl->m_aDisposeEventListeners.addInterface( Listener ); } @@ -277,8 +272,7 @@ void SAL_CALL ResultSet::removeEventListener( { std::unique_lock aGuard( m_pImpl->m_aMutex ); - if ( m_pImpl->m_pDisposeEventListeners ) - m_pImpl->m_pDisposeEventListeners->removeInterface( Listener ); + m_pImpl->m_aDisposeEventListeners.removeInterface( Listener ); } diff --git a/ucbhelper/source/provider/resultsethelper.cxx b/ucbhelper/source/provider/resultsethelper.cxx index 77c901d62ee7..25ead4bd8a22 100644 --- a/ucbhelper/source/provider/resultsethelper.cxx +++ b/ucbhelper/source/provider/resultsethelper.cxx @@ -90,11 +90,11 @@ void SAL_CALL ResultSetImplHelper::dispose() { std::unique_lock aGuard( m_aMutex ); - if ( m_pDisposeEventListeners && m_pDisposeEventListeners->getLength() ) + if ( m_aDisposeEventListeners.getLength() ) { lang::EventObject aEvt; aEvt.Source = static_cast< lang::XComponent * >( this ); - m_pDisposeEventListeners->disposeAndClear( aGuard, aEvt ); + m_aDisposeEventListeners.disposeAndClear( aGuard, aEvt ); } } @@ -105,10 +105,7 @@ void SAL_CALL ResultSetImplHelper::addEventListener( { std::unique_lock aGuard( m_aMutex ); - if ( !m_pDisposeEventListeners ) - m_pDisposeEventListeners.reset(new comphelper::OInterfaceContainerHelper4<css::lang::XEventListener>()); - - m_pDisposeEventListeners->addInterface( Listener ); + m_aDisposeEventListeners.addInterface( Listener ); } @@ -118,8 +115,7 @@ void SAL_CALL ResultSetImplHelper::removeEventListener( { std::unique_lock aGuard( m_aMutex ); - if ( m_pDisposeEventListeners ) - m_pDisposeEventListeners->removeInterface( Listener ); + m_aDisposeEventListeners.removeInterface( Listener ); }