[4.0] (AnimatedVectorImageVisual) Change renderer on stage again 18/196518/2
authorHeeyong Song <heeyong.song@samsung.com>
Wed, 2 Jan 2019 02:42:58 +0000 (11:42 +0900)
committerJiyun Yang <ji.yang@samsung.com>
Fri, 4 Jan 2019 09:40:09 +0000 (18:40 +0900)
Change-Id: I9a3d6815fddd6e6c6c6c9c4ccb1d63950b41c283

dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp
dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h
dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp
dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h

index 0a7b0c6..a650f2e 100644 (file)
@@ -76,7 +76,8 @@ AnimatedVectorImageVisual::AnimatedVectorImageVisual( VisualFactoryCache& factor
   mPlacementActor(),
   mVectorRasterizeThread(),
   mLoopCount( LOOP_FOREVER ),
-  mActionStatus( DevelAnimatedVectorImageVisual::Action::STOP )
+  mActionStatus( DevelAnimatedVectorImageVisual::Action::STOP ),
+  mNeedToSetRenderer( true )
 {
   // the rasterized image is with pre-multiplied alpha format
   mImpl->mFlags |= Impl::IS_PREMULTIPLIED_ALPHA;
@@ -205,6 +206,8 @@ void AnimatedVectorImageVisual::DoSetOnStage( Actor& actor )
 
   Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY );
 
+  mNeedToSetRenderer = true;
+
   mImpl->mRenderer = Renderer::New( geometry, shader );
 
   TextureSet textureSet = TextureSet::New();
@@ -258,33 +261,38 @@ void AnimatedVectorImageVisual::OnSetTransform()
         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 = std::unique_ptr< VectorRasterizeThread >( new VectorRasterizeThread( mUrl.GetUrl() ) );
 
+        mVectorRasterizeThread->SetRenderer( mImpl->mRenderer );
+        mVectorRasterizeThread->SetSize( 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();
-        }
       }
       else
       {
         uint32_t width = static_cast< uint32_t >( visualSize.width );
         uint32_t height = static_cast< uint32_t >( visualSize.height );
 
+        mVectorRasterizeThread->SetRenderer( mImpl->mRenderer );
         mVectorRasterizeThread->SetSize( width, height );
       }
+
+      mNeedToSetRenderer = false;
+
+      if( mActionStatus == DevelAnimatedVectorImageVisual::Action::PLAY )
+      {
+        mVectorRasterizeThread->StartAnimation();
+        DevelStage::SetRenderingBehavior( Stage::GetCurrent(), DevelStage::Rendering::CONTINUOUSLY );
+      }
+      else
+      {
+        // Render one frame
+        mVectorRasterizeThread->RenderFrame();
+      }
     }
   }
 }
@@ -298,7 +306,8 @@ void AnimatedVectorImageVisual::OnDoAction( const Property::Index actionId, cons
     {
       if( IsOnStage())
       {
-        if( mVectorRasterizeThread )
+        // When renderer has changed, do not StartAnimation before SetRenderer(newOne)
+        if( mVectorRasterizeThread && !mNeedToSetRenderer )
         {
           mVectorRasterizeThread->StartAnimation();
           DevelStage::SetRenderingBehavior( Stage::GetCurrent(), DevelStage::Rendering::CONTINUOUSLY );   //TODO: Should manage this globally
index 28d79a4..705cca1 100644 (file)
@@ -171,6 +171,8 @@ private:
 
   int32_t                                      mLoopCount;
   DevelAnimatedVectorImageVisual::Action::Type mActionStatus;
+
+  bool                                         mNeedToSetRenderer;
 };
 
 } // namespace Internal
index 6bbb264..9e0645b 100644 (file)
@@ -44,7 +44,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(),
@@ -57,8 +57,8 @@ VectorRasterizeThread::VectorRasterizeThread( const std::string& url, Renderer r
   mTotalFrame( 0 ),
   mStartFrame( 0 ),
   mEndFrame( 0 ),
-  mWidth( width ),
-  mHeight( height ),
+  mWidth( 0 ),
+  mHeight( 0 ),
   mLoopCount( LOOP_FOREVER ),
   mCurrentLoop( 0 ),
   mNeedRender( false ),
@@ -66,7 +66,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()
@@ -102,6 +102,18 @@ void VectorRasterizeThread::Run()
   }
 }
 
+void VectorRasterizeThread::SetRenderer( Renderer renderer )
+{
+  ConditionalWait::ScopedLock lock( mConditionalWait );
+
+  mVectorRenderer.SetRenderer( renderer );
+
+  // Need to trigger resource ready again
+  mResourceReady = false;
+
+  DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::SetRenderer\n" );
+}
+
 void VectorRasterizeThread::SetSize( uint32_t width, uint32_t height )
 {
   ConditionalWait::ScopedLock lock( mConditionalWait );
index daa8058..3ac638f 100644 (file)
@@ -49,11 +49,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.
@@ -61,6 +58,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