diff options
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 |