diff options
author | Sarper Akdemir <q.sarperakdemir@gmail.com> | 2020-08-06 10:32:55 +0300 |
---|---|---|
committer | Thorsten Behrens <Thorsten.Behrens@CIB.de> | 2020-08-21 16:31:52 +0200 |
commit | 76f3218b32acbc1b67bd291ac84067c83f6e3c2f (patch) | |
tree | 6dce8dbcb0615a180ac2eeaea5760842c0783288 /slideshow | |
parent | f3272cd389d66e249d189b1810dbf685b14a00ba (diff) |
make physics animation effects always processed last
Makes it possible to add activities that will be processed last in the queue.
Makes physics animation effects queued this way.
And fixes the bug that makes physics animation effects appear
out of sync for a frame with the shapes that other in parallel
animation effects control.
Change-Id: I92d436aced6ef3ee2c8b0bf0167c1f7e642ba3b5
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100713
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Tested-by: Jenkins
Diffstat (limited to 'slideshow')
6 files changed, 48 insertions, 4 deletions
diff --git a/slideshow/source/engine/activitiesqueue.cxx b/slideshow/source/engine/activitiesqueue.cxx index ba982385356e..2e3b29d9dbc7 100644 --- a/slideshow/source/engine/activitiesqueue.cxx +++ b/slideshow/source/engine/activitiesqueue.cxx @@ -50,6 +50,8 @@ namespace slideshow::internal { for( const auto& pActivity : maCurrentActivitiesWaiting ) pActivity->dispose(); + for( const auto& pActivity : maCurrentTailActivitiesWaiting ) + pActivity->dispose(); for( const auto& pActivity : maCurrentActivitiesReinsert ) pActivity->dispose(); } @@ -72,10 +74,31 @@ namespace slideshow::internal return true; } + bool ActivitiesQueue::addTailActivity(const ActivitySharedPtr &pActivity) + { + OSL_ENSURE( pActivity, "ActivitiesQueue::addTailActivity: activity ptr NULL" ); + + if( !pActivity ) + return false; + + // Activities that should be processed last are kept in a different + // ActivityQueue, and later appended to the end of the maCurrentActivitiesWaiting + // on the beginning of ActivitiesQueue::process() + maCurrentTailActivitiesWaiting.push_back( pActivity ); + + return true; + } + void ActivitiesQueue::process() { SAL_INFO("slideshow.verbose", "ActivitiesQueue: outer loop heartbeat" ); + // If there are activities to be processed last append them to the end of the ActivitiesQueue + maCurrentActivitiesWaiting.insert( maCurrentActivitiesWaiting.end(), + maCurrentTailActivitiesWaiting.begin(), + maCurrentTailActivitiesWaiting.end() ); + maCurrentTailActivitiesWaiting.clear(); + // accumulate time lag for all activities, and lag time // base if necessary: double fLag = 0.0; diff --git a/slideshow/source/engine/animationnodes/animationbasenode.cxx b/slideshow/source/engine/animationnodes/animationbasenode.cxx index 4dcb640795aa..1a15bf2de843 100644 --- a/slideshow/source/engine/animationnodes/animationbasenode.cxx +++ b/slideshow/source/engine/animationnodes/animationbasenode.cxx @@ -45,12 +45,12 @@ AnimationBaseNode::AnimationBaseNode( mxAnimateNode( xNode, uno::UNO_QUERY_THROW ), maAttributeLayerHolder(), maSlideSize( rContext.maSlideSize ), - mpActivity(), mpShape(), mpShapeSubset(), mpSubsetManager(rContext.maContext.mpSubsettableShapeManager), mbPreservedVisibility(true), - mbIsIndependentSubset( rContext.mbIsIndependentSubset ) + mbIsIndependentSubset( rContext.mbIsIndependentSubset ), + mpActivity() { // extract native node targets // =========================== @@ -294,7 +294,7 @@ void AnimationBaseNode::activate_st() mpActivity->setTargets( getShape(), maAttributeLayerHolder.get() ); // add to activities queue - getContext().mrActivitiesQueue.addActivity( mpActivity ); + enqueueActivity(); } else { // Actually, DO generate the event for empty activity, @@ -372,6 +372,11 @@ bool AnimationBaseNode::hasPendingAnimation() const return true; } +bool AnimationBaseNode::enqueueActivity() const +{ + return getContext().mrActivitiesQueue.addActivity( mpActivity ); +} + #if defined(DBG_UTIL) void AnimationBaseNode::showState() const { diff --git a/slideshow/source/engine/animationnodes/animationbasenode.hxx b/slideshow/source/engine/animationnodes/animationbasenode.hxx index d31a3a5a2fc9..6bb5cd1f2ff7 100644 --- a/slideshow/source/engine/animationnodes/animationbasenode.hxx +++ b/slideshow/source/engine/animationnodes/animationbasenode.hxx @@ -59,6 +59,7 @@ protected: private: virtual bool hasPendingAnimation() const override; + virtual bool enqueueActivity() const; private: // state transition callbacks virtual bool init_st() override; @@ -79,7 +80,6 @@ private: css::uno::Reference<css::animations::XAnimate> mxAnimateNode; ShapeAttributeLayerHolder maAttributeLayerHolder; ::basegfx::B2DVector maSlideSize; - AnimationActivitySharedPtr mpActivity; /// When valid, this node has a plain target shape AttributableShapeSharedPtr mpShape; @@ -88,6 +88,9 @@ private: SubsettableShapeManagerSharedPtr mpSubsetManager; bool mbPreservedVisibility; bool mbIsIndependentSubset; + +protected: + AnimationActivitySharedPtr mpActivity; }; } // namespace presentation::internal diff --git a/slideshow/source/engine/animationnodes/animationphysicsnode.cxx b/slideshow/source/engine/animationnodes/animationphysicsnode.cxx index 28e247c30d6c..8f531ea24ed7 100644 --- a/slideshow/source/engine/animationnodes/animationphysicsnode.cxx +++ b/slideshow/source/engine/animationnodes/animationphysicsnode.cxx @@ -43,6 +43,11 @@ AnimationActivitySharedPtr AnimationPhysicsNode::createActivity() const true); } +bool AnimationPhysicsNode::enqueueActivity() const +{ + return getContext().mrActivitiesQueue.addTailActivity(mpActivity); +} + } // namespace slideshow::internal /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/slideshow/source/engine/animationnodes/animationphysicsnode.hxx b/slideshow/source/engine/animationnodes/animationphysicsnode.hxx index 15ac8911e916..8517dbbb803b 100644 --- a/slideshow/source/engine/animationnodes/animationphysicsnode.hxx +++ b/slideshow/source/engine/animationnodes/animationphysicsnode.hxx @@ -44,6 +44,7 @@ protected: private: virtual AnimationActivitySharedPtr createActivity() const override; + virtual bool enqueueActivity() const override; css::uno::Reference<css::animations::XAnimateMotion> mxPhysicsMotionNode; }; diff --git a/slideshow/source/inc/activitiesqueue.hxx b/slideshow/source/inc/activitiesqueue.hxx index 7169c46f7cf3..9fd3df83a9bb 100644 --- a/slideshow/source/inc/activitiesqueue.hxx +++ b/slideshow/source/inc/activitiesqueue.hxx @@ -57,6 +57,10 @@ namespace slideshow::internal */ bool addActivity( const ActivitySharedPtr& pActivity ); + /** Add the given activity prioritized last in the queue. + */ + bool addTailActivity( const ActivitySharedPtr& pActivity ); + /** Process the activities queue. This method performs the smallest atomic processing @@ -94,6 +98,9 @@ namespace slideshow::internal // await processing for this // round + ActivityQueue maCurrentTailActivitiesWaiting; // activities that will be + // processed last in the queue + ActivityQueue maCurrentActivitiesReinsert; // currently running // activities, that are // already processed for |