From: Heeyong Song Date: Tue, 29 Jan 2019 07:38:50 +0000 (+0000) Subject: Merge "(AnimatedVectorImageVisual) Change renderer on stage again" into devel/master X-Git-Tag: dali_1.4.5~1 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=7c1ca2d9ab3bc63f3dc164c4f5d4ea0d8bf5ba3e;hp=fedd5ae8da46cd798f730fd07c942df853e055dd Merge "(AnimatedVectorImageVisual) Change renderer on stage again" into devel/master --- diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-vector-animation-renderer.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-vector-animation-renderer.cpp index 003b8ea..6a42d9c 100755 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-vector-animation-renderer.cpp +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-vector-animation-renderer.cpp @@ -32,14 +32,19 @@ class VectorAnimationRenderer: public Dali::BaseObject { public: - VectorAnimationRenderer( const std::string& url, Dali::Renderer renderer, uint32_t width, uint32_t height ) + VectorAnimationRenderer( const std::string& url ) : mUrl( url ), - mRenderer( renderer ), - mWidth( width ), - mHeight( height ) + mRenderer(), + mWidth( 0 ), + mHeight( 0 ) { } + void SetRenderer( Dali::Renderer renderer ) + { + mRenderer = renderer; + } + void SetSize( uint32_t width, uint32_t height ) { mWidth = width; @@ -96,9 +101,9 @@ inline const VectorAnimationRenderer& GetImplementation( const Dali::VectorAnima /********************************* PUBLIC CLASS *******************************/ /********************************************************************************/ -VectorAnimationRenderer VectorAnimationRenderer::New( const std::string& url, Renderer renderer, uint32_t width, uint32_t height ) +VectorAnimationRenderer VectorAnimationRenderer::New( const std::string& url ) { - Internal::Adaptor::VectorAnimationRenderer* animationRenderer = new Internal::Adaptor::VectorAnimationRenderer( url, renderer, width, height ); + Internal::Adaptor::VectorAnimationRenderer* animationRenderer = new Internal::Adaptor::VectorAnimationRenderer( url ); return VectorAnimationRenderer( animationRenderer ); } @@ -127,6 +132,11 @@ VectorAnimationRenderer& VectorAnimationRenderer::operator=( const VectorAnimati return *this; } +void VectorAnimationRenderer::SetRenderer( Renderer renderer ) +{ + Internal::Adaptor::GetImplementation( *this ).SetRenderer( renderer ); +} + void VectorAnimationRenderer::SetSize( uint32_t width, uint32_t height ) { Internal::Adaptor::GetImplementation( *this ).SetSize( width, height ); diff --git a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp index 4c80bf2..d57d6b7 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp @@ -338,6 +338,36 @@ int UtcDaliAnimatedVectorImageVisualPlayback(void) value = map.Find( DevelImageVisual::Property::PLAY_STATE ); DALI_TEST_CHECK( value->Get< int >() == static_cast< int >( DevelImageVisual::PlayState::PLAYING ) ); + tet_infoline( "Off stage" ); + dummyControl.Unparent(); + + application.SendNotification(); + application.Render(16); + + map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); + value = map.Find( DevelImageVisual::Property::PLAY_STATE ); + DALI_TEST_CHECK( value->Get< int >() == static_cast< int >( DevelImageVisual::PlayState::PAUSED ) ); + + tet_infoline( "On stage again" ); + Stage::GetCurrent().Add( dummyControl ); + + application.SendNotification(); + application.Render(16); + + map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); + value = map.Find( DevelImageVisual::Property::PLAY_STATE ); + DALI_TEST_CHECK( value->Get< int >() == static_cast< int >( DevelImageVisual::PlayState::PAUSED ) ); + + tet_infoline( "Test Play action" ); + DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes ); + + application.SendNotification(); + application.Render(16); + + map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); + value = map.Find( DevelImageVisual::Property::PLAY_STATE ); + DALI_TEST_CHECK( value->Get< int >() == static_cast< int >( DevelImageVisual::PlayState::PLAYING ) ); + // Change Size Vector3 newSize( 100.0f, 100.0f, 0.0f ); dummyControl.SetSize( newSize ); diff --git a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp index f4a733b..dbbb619 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp @@ -20,7 +20,7 @@ // EXTERNAL INCLUDES #include -#include +#include #include // INTERNAL INCLUDES @@ -32,7 +32,6 @@ #include #include #include -#include namespace Dali { @@ -47,7 +46,6 @@ namespace { const Dali::Vector4 FULL_TEXTURE_RECT( 0.f, 0.f, 1.f, 1.f ); -constexpr auto LOOP_FOREVER = -1; } // unnamed namespace @@ -70,15 +68,18 @@ AnimatedVectorImageVisual::AnimatedVectorImageVisual( VisualFactoryCache& factor : Visual::Base( factoryCache, Visual::FittingMode::FILL ), mImageVisualShaderFactory( shaderFactory ), mUrl( imageUrl ), + mVectorRasterizeThread( imageUrl.GetUrl() ), mVisualSize(), - mPlayRange( 0.0f, 1.0f ), mPlacementActor(), - mVectorRasterizeThread(), - mLoopCount( LOOP_FOREVER ), mActionStatus( DevelAnimatedVectorImageVisual::Action::STOP ) { // the rasterized image is with pre-multiplied alpha format mImpl->mFlags |= Impl::IS_PREMULTIPLIED_ALPHA; + + mVectorRasterizeThread.SetResourceReadyCallback( new EventThreadCallback( MakeCallback( this, &AnimatedVectorImageVisual::OnResourceReady ) ) ); + mVectorRasterizeThread.SetAnimationFinishedCallback( new EventThreadCallback( MakeCallback( this, &AnimatedVectorImageVisual::OnAnimationFinished ) ) ); + + mVectorRasterizeThread.Start(); } AnimatedVectorImageVisual::~AnimatedVectorImageVisual() @@ -98,17 +99,9 @@ void AnimatedVectorImageVisual::DoCreatePropertyMap( Property::Map& map ) const { map.Insert( Toolkit::ImageVisual::Property::URL, mUrl.GetUrl() ); } - map.Insert( Toolkit::DevelImageVisual::Property::LOOP_COUNT, static_cast< int >( mLoopCount ) ); - map.Insert( Toolkit::DevelImageVisual::Property::PLAY_RANGE, static_cast< Vector2 >( mPlayRange ) ); - - if( mVectorRasterizeThread ) - { - map.Insert( Toolkit::DevelImageVisual::Property::PLAY_STATE, static_cast< int >( mVectorRasterizeThread->GetPlayState() ) ); - } - else - { - map.Insert( Toolkit::DevelImageVisual::Property::PLAY_STATE, static_cast< int >( DevelImageVisual::PlayState::STOPPED ) ); - } + map.Insert( Toolkit::DevelImageVisual::Property::LOOP_COUNT, static_cast< int >( mVectorRasterizeThread.GetLoopCount() ) ); + map.Insert( Toolkit::DevelImageVisual::Property::PLAY_RANGE, static_cast< Vector2 >( mVectorRasterizeThread.GetPlayRange() ) ); + map.Insert( Toolkit::DevelImageVisual::Property::PLAY_STATE, static_cast< int >( mVectorRasterizeThread.GetPlayState() ) ); } void AnimatedVectorImageVisual::DoCreateInstancePropertyMap( Property::Map& map ) const @@ -149,11 +142,7 @@ void AnimatedVectorImageVisual::DoSetProperty( Property::Index index, const Prop int32_t loopCount; if( value.Get( loopCount ) ) { - mLoopCount = loopCount; - if( mVectorRasterizeThread ) - { - mVectorRasterizeThread->SetLoopCount( loopCount ); - } + mVectorRasterizeThread.SetLoopCount( loopCount ); } break; } @@ -162,23 +151,7 @@ void AnimatedVectorImageVisual::DoSetProperty( Property::Index index, const Prop Vector2 range; if( value.Get( range ) ) { - // Make sure the range specified is between 0.0 and 1.0 - if( range.x >= 0.0f && range.x <= 1.0f && range.y >= 0.0f && range.y <= 1.0f ) - { - Vector2 orderedRange( range ); - // If the range is not in order swap values - if( range.x > range.y ) - { - orderedRange = Vector2( range.y, range.x ); - } - - mPlayRange = orderedRange; - - if( mVectorRasterizeThread ) - { - mVectorRasterizeThread->SetPlayRange( mPlayRange ); - } - } + mVectorRasterizeThread.SetPlayRange( range ); } break; } @@ -217,21 +190,19 @@ void AnimatedVectorImageVisual::DoSetOnStage( Actor& actor ) // Hold the weak handle of the placement actor and delay the adding of renderer until the rasterization is finished. mPlacementActor = actor; - // This visual needs it's size set before it can be rasterized hence set ResourceReady once on stage - ResourceReady( Toolkit::Visual::ResourceStatus::READY ); + mVectorRasterizeThread.SetRenderer( mImpl->mRenderer ); } void AnimatedVectorImageVisual::DoSetOffStage( Actor& actor ) { - if( mVectorRasterizeThread ) - { - mVectorRasterizeThread->PauseAnimation(); - DevelStage::SetRenderingBehavior( Stage::GetCurrent(), DevelStage::Rendering::IF_REQUIRED ); - mActionStatus = DevelAnimatedVectorImageVisual::Action::PAUSE; - } + mVectorRasterizeThread.PauseAnimation(); + + mActionStatus = DevelAnimatedVectorImageVisual::Action::PAUSE; if( mImpl->mRenderer ) { + mImpl->mRenderer.SetProperty( DevelRenderer::Property::RENDERING_BEHAVIOR, DevelRenderer::Rendering::IF_REQUIRED ); + actor.RemoveRenderer( mImpl->mRenderer ); mImpl->mRenderer.Reset(); } @@ -252,38 +223,34 @@ void AnimatedVectorImageVisual::OnSetTransform() { mVisualSize = visualSize; - if( !mVectorRasterizeThread ) + uint32_t width = static_cast< uint32_t >( visualSize.width ); + uint32_t height = static_cast< uint32_t >( visualSize.height ); + + mVectorRasterizeThread.SetSize( width, height ); + } + + if( mActionStatus == DevelAnimatedVectorImageVisual::Action::PLAY ) + { + mVectorRasterizeThread.PlayAnimation(); + + mImpl->mRenderer.SetProperty( DevelRenderer::Property::RENDERING_BEHAVIOR, DevelRenderer::Rendering::CONTINUOUSLY ); + } + else + { + // Render one frame + mVectorRasterizeThread.RenderFrame(); + } + + if( mVectorRasterizeThread.IsResourceReady() ) + { + Actor actor = mPlacementActor.GetHandle(); + if( actor ) { - uint32_t width = static_cast< uint32_t >( visualSize.width ); - uint32_t height = static_cast< uint32_t >( visualSize.height ); - - mVectorRasterizeThread = std::unique_ptr< VectorRasterizeThread >( new VectorRasterizeThread( mUrl.GetUrl(), mImpl->mRenderer, width, height ) ); - - mVectorRasterizeThread->SetResourceReadyCallback( new EventThreadCallback( MakeCallback( this, &AnimatedVectorImageVisual::OnResourceReady ) ) ); - mVectorRasterizeThread->SetAnimationFinishedCallback( new EventThreadCallback( MakeCallback( this, &AnimatedVectorImageVisual::OnAnimationFinished ) ) ); - mVectorRasterizeThread->SetLoopCount( mLoopCount ); - mVectorRasterizeThread->SetPlayRange( mPlayRange ); - - mVectorRasterizeThread->Start(); - - if( mActionStatus == DevelAnimatedVectorImageVisual::Action::PLAY ) - { - mVectorRasterizeThread->StartAnimation(); - DevelStage::SetRenderingBehavior( Stage::GetCurrent(), DevelStage::Rendering::CONTINUOUSLY ); - } - else - { - // Render one frame - mVectorRasterizeThread->RenderFrame(); - } + actor.AddRenderer( mImpl->mRenderer ); + mPlacementActor.Reset(); } - else - { - uint32_t width = static_cast< uint32_t >( visualSize.width ); - uint32_t height = static_cast< uint32_t >( visualSize.height ); - mVectorRasterizeThread->SetSize( width, height ); - } + ResourceReady( Toolkit::Visual::ResourceStatus::READY ); } } } @@ -295,44 +262,34 @@ void AnimatedVectorImageVisual::OnDoAction( const Property::Index actionId, cons { case DevelAnimatedVectorImageVisual::Action::PLAY: { - if( IsOnStage()) + if( IsOnStage() ) { - if( mVectorRasterizeThread ) - { - mVectorRasterizeThread->StartAnimation(); - DevelStage::SetRenderingBehavior( Stage::GetCurrent(), DevelStage::Rendering::CONTINUOUSLY ); //TODO: Should manage this globally - } + mVectorRasterizeThread.PlayAnimation(); + + mImpl->mRenderer.SetProperty( DevelRenderer::Property::RENDERING_BEHAVIOR, DevelRenderer::Rendering::CONTINUOUSLY ); } mActionStatus = DevelAnimatedVectorImageVisual::Action::PLAY; break; } case DevelAnimatedVectorImageVisual::Action::PAUSE: { - if( mVectorRasterizeThread ) + mVectorRasterizeThread.PauseAnimation(); + + if( mImpl->mRenderer ) { - mVectorRasterizeThread->PauseAnimation(); - DevelStage::SetRenderingBehavior( Stage::GetCurrent(), DevelStage::Rendering::IF_REQUIRED ); + mImpl->mRenderer.SetProperty( DevelRenderer::Property::RENDERING_BEHAVIOR, DevelRenderer::Rendering::IF_REQUIRED ); } + mActionStatus = DevelAnimatedVectorImageVisual::Action::PAUSE; break; } case DevelAnimatedVectorImageVisual::Action::STOP: { - if( mVectorRasterizeThread ) + if( mVectorRasterizeThread.GetPlayState() != DevelImageVisual::PlayState::STOPPED ) { - bool emitSignal = false; - if( mVectorRasterizeThread->GetPlayState() != DevelImageVisual::PlayState::STOPPED ) - { - emitSignal = true; - } - - mVectorRasterizeThread->StopAnimation(); - DevelStage::SetRenderingBehavior( Stage::GetCurrent(), DevelStage::Rendering::IF_REQUIRED ); - - if( emitSignal ) - { - OnAnimationFinished(); - } + mVectorRasterizeThread.StopAnimation(); + + OnAnimationFinished(); } mActionStatus = DevelAnimatedVectorImageVisual::Action::STOP; break; @@ -349,9 +306,9 @@ void AnimatedVectorImageVisual::OnResourceReady() actor.AddRenderer( mImpl->mRenderer ); // reset the weak handle so that the renderer only get added to actor once mPlacementActor.Reset(); - - Stage::GetCurrent().KeepRendering( 0.0f ); } + + ResourceReady( Toolkit::Visual::ResourceStatus::READY ); } void AnimatedVectorImageVisual::OnAnimationFinished() @@ -360,6 +317,13 @@ void AnimatedVectorImageVisual::OnAnimationFinished() { mImpl->mEventObserver->NotifyVisualEvent( *this, DevelAnimatedVectorImageVisual::Signal::ANIMATION_FINISHED ); } + + mActionStatus = DevelAnimatedVectorImageVisual::Action::STOP; + + if( mImpl->mRenderer ) + { + mImpl->mRenderer.SetProperty( DevelRenderer::Property::RENDERING_BEHAVIOR, DevelRenderer::Rendering::IF_REQUIRED ); + } } } // namespace Internal diff --git a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h index 7aaff56..5d871f0 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h +++ b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h @@ -27,6 +27,7 @@ #include #include #include +#include namespace Dali { @@ -164,12 +165,9 @@ private: private: ImageVisualShaderFactory& mImageVisualShaderFactory; VisualUrl mUrl; + VectorRasterizeThread mVectorRasterizeThread; Vector2 mVisualSize; - Vector2 mPlayRange; WeakHandle< Actor > mPlacementActor; - std::unique_ptr< VectorRasterizeThread > mVectorRasterizeThread; - - int32_t mLoopCount; DevelAnimatedVectorImageVisual::Action::Type mActionStatus; }; diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp b/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp index 536c208..35f485f 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp @@ -45,7 +45,7 @@ Debug::Filter* gVectorAnimationLogFilter = Debug::Filter::New( Debug::NoLogging, } // unnamed namespace -VectorRasterizeThread::VectorRasterizeThread( const std::string& url, Renderer renderer, uint32_t width, uint32_t height ) +VectorRasterizeThread::VectorRasterizeThread( const std::string& url ) : mUrl( url ), mVectorRenderer(), mConditionalWait(), @@ -54,12 +54,13 @@ VectorRasterizeThread::VectorRasterizeThread( const std::string& url, Renderer r mAnimationFinishedTrigger(), mPlayRange( 0.0f, 1.0f ), mPlayState( DevelImageVisual::PlayState::STOPPED ), + mProgress( 0.0f ), mCurrentFrame( 0 ), mTotalFrame( 0 ), mStartFrame( 0 ), mEndFrame( 0 ), - mWidth( width ), - mHeight( height ), + mWidth( 0 ), + mHeight( 0 ), mLoopCount( LOOP_FOREVER ), mCurrentLoop( 0 ), mNeedRender( false ), @@ -67,7 +68,7 @@ VectorRasterizeThread::VectorRasterizeThread( const std::string& url, Renderer r mResourceReady( false ), mLogFactory( Dali::Adaptor::Get().GetLogFactory() ) { - mVectorRenderer = VectorAnimationRenderer::New( mUrl, renderer, width, height ); + mVectorRenderer = VectorAnimationRenderer::New( mUrl ); } VectorRasterizeThread::~VectorRasterizeThread() @@ -101,15 +102,32 @@ void VectorRasterizeThread::Run() } } -void VectorRasterizeThread::SetSize( uint32_t width, uint32_t height ) +void VectorRasterizeThread::SetRenderer( Renderer renderer ) { ConditionalWait::ScopedLock lock( mConditionalWait ); - mVectorRenderer.SetSize( width, height ); - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::SetSize: width = %d, height = %d\n", width, height ); + mVectorRenderer.SetRenderer( renderer ); + + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::SetRenderer\n" ); +} + +void VectorRasterizeThread::SetSize( uint32_t width, uint32_t height ) +{ + if( mWidth != width || mHeight != height ) + { + ConditionalWait::ScopedLock lock( mConditionalWait ); + mVectorRenderer.SetSize( width, height ); + + mWidth = width; + mHeight = height; + + mResourceReady = false; + + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::SetSize: width = %d, height = %d\n", width, height ); + } } -void VectorRasterizeThread::StartAnimation() +void VectorRasterizeThread::PlayAnimation() { ConditionalWait::ScopedLock lock( mConditionalWait ); if( mPlayState != DevelImageVisual::PlayState::PLAYING ) @@ -124,7 +142,7 @@ void VectorRasterizeThread::StartAnimation() mPlayState = DevelImageVisual::PlayState::PLAYING; mConditionalWait.Notify( lock ); - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::StartAnimation: Start\n" ); + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::PlayAnimation: Start\n" ); } } @@ -171,7 +189,7 @@ void VectorRasterizeThread::SetAnimationFinishedCallback( EventThreadCallback* c mAnimationFinishedTrigger = std::unique_ptr< EventThreadCallback >( callback ); } -void VectorRasterizeThread::SetLoopCount( int16_t count ) +void VectorRasterizeThread::SetLoopCount( int32_t count ) { ConditionalWait::ScopedLock lock( mConditionalWait ); @@ -182,24 +200,50 @@ void VectorRasterizeThread::SetLoopCount( int16_t count ) mCurrentFrame = mStartFrame; } +int32_t VectorRasterizeThread::GetLoopCount() const +{ + return mLoopCount; +} + void VectorRasterizeThread::SetPlayRange( Vector2 range ) { ConditionalWait::ScopedLock lock( mConditionalWait ); - mPlayRange = range; - - if( mTotalFrame != 0 ) + // Make sure the range specified is between 0.0 and 1.0 + if( range.x >= 0.0f && range.x <= 1.0f && range.y >= 0.0f && range.y <= 1.0f ) { - mStartFrame = static_cast< uint32_t >( mPlayRange.x * mTotalFrame + 0.5f ); - mEndFrame = static_cast< uint32_t >( mPlayRange.y * mTotalFrame + 0.5f ); + Vector2 orderedRange( range ); + // If the range is not in order swap values + if( range.x > range.y ) + { + orderedRange = Vector2( range.y, range.x ); + } + + mPlayRange = orderedRange; + + if( mTotalFrame != 0 ) + { + mStartFrame = static_cast< uint32_t >( mPlayRange.x * mTotalFrame + 0.5f ); + mEndFrame = static_cast< uint32_t >( mPlayRange.y * mTotalFrame + 0.5f ); + } } } -DevelImageVisual::PlayState VectorRasterizeThread::GetPlayState() +Vector2 VectorRasterizeThread::GetPlayRange() const +{ + return mPlayRange; +} + +DevelImageVisual::PlayState VectorRasterizeThread::GetPlayState() const { return mPlayState; } +bool VectorRasterizeThread::IsResourceReady() const +{ + return mResourceReady; +} + bool VectorRasterizeThread::IsThreadReady() { ConditionalWait::ScopedLock lock( mConditionalWait ); diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h b/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h index 8ee52be..f8d409b 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h @@ -50,11 +50,8 @@ public: * @brief Constructor. * * @param[in] url The url of the vector animation file - * @param[in] renderer The renderer used to render the image - * @param[in] width The width of the content - * @param[in] height The height of the content */ - VectorRasterizeThread( const std::string& url, Renderer renderer, uint32_t width, uint32_t height ); + VectorRasterizeThread( const std::string& url ); /** * @brief Destructor. @@ -62,6 +59,13 @@ public: virtual ~VectorRasterizeThread(); /** + * @brief Sets the renderer used to display the result image. + * + * @param[in] renderer The renderer used to display the result image + */ + void SetRenderer( Renderer renderer ); + + /** * @brief Sets the target image size. * * @param[in] width The target image width @@ -72,7 +76,7 @@ public: /** * @brief Play the vector animation. */ - void StartAnimation(); + void PlayAnimation(); /** * @brief Stop the vector animation. @@ -105,7 +109,13 @@ public: * @brief Enable looping for 'count' repeats. -1 means to repeat forever. * @param[in] count The number of times to loop */ - void SetLoopCount( int16_t count ); + void SetLoopCount( int32_t count ); + + /** + * @brief Gets the loop count. -1 means to repeat forever. + * @return The number of times to loop + */ + int32_t GetLoopCount() const; /** * @brief Set the playing range. @@ -115,10 +125,22 @@ public: void SetPlayRange( Vector2 range ); /** + * @brief Gets the playing range. + * @return The play range defined for the animation + */ + Vector2 GetPlayRange() const; + + /** * @brief Get the play state * @return The play state */ - DevelImageVisual::PlayState GetPlayState(); + DevelImageVisual::PlayState GetPlayState() const; + + /** + * @brief Queries whether the resource is ready. + * @return true if ready, false otherwise + */ + bool IsResourceReady() const; protected: @@ -162,14 +184,15 @@ private: std::unique_ptr< EventThreadCallback > mAnimationFinishedTrigger; Vector2 mPlayRange; DevelImageVisual::PlayState mPlayState; + float mProgress; uint32_t mCurrentFrame; uint32_t mTotalFrame; uint32_t mStartFrame; uint32_t mEndFrame; uint32_t mWidth; uint32_t mHeight; - int16_t mLoopCount; - int16_t mCurrentLoop; + int32_t mLoopCount; + int32_t mCurrentLoop; bool mNeedRender; bool mDestroyThread; ///< Whether the thread be destroyed bool mResourceReady;