(VectorAnimationRenderer) Support size change 65/193765/3
authorHeeyong Song <heeyong.song@samsung.com>
Mon, 26 Nov 2018 07:23:32 +0000 (16:23 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Wed, 26 Dec 2018 05:29:55 +0000 (14:29 +0900)
Change-Id: I98606ad3f24c772e03990020414bfa2e63628f80

dali-extension/vector-animation-renderer/tizen-vector-animation-renderer.cpp
dali-extension/vector-animation-renderer/tizen-vector-animation-renderer.h

index dc5684a..a1c966e 100755 (executable)
@@ -50,6 +50,7 @@ const Vector4 FULL_TEXTURE_RECT( 0.f, 0.f, 1.f, 1.f );
 TizenVectorAnimationRenderer::TizenVectorAnimationRenderer()
 : mUrl(),
   mBuffers(),
+  mMutex(),
   mTargetSurface(),
   mRenderer(),
   mTbmQueue( NULL ),
@@ -61,6 +62,8 @@ TizenVectorAnimationRenderer::TizenVectorAnimationRenderer()
 
 TizenVectorAnimationRenderer::~TizenVectorAnimationRenderer()
 {
+  Dali::Mutex::ScopedLock lock( mMutex );
+
   for( auto&& iter : mBuffers )
   {
     tbm_surface_internal_unref( iter.first );
@@ -95,6 +98,25 @@ bool TizenVectorAnimationRenderer::CreateRenderer( const std::string& url, Rende
   return true;
 }
 
+void TizenVectorAnimationRenderer::SetSize( uint32_t width, uint32_t height )
+{
+  Dali::Mutex::ScopedLock lock( mMutex );
+
+  mTargetSurface->SetSize( width, height );
+
+  mWidth = width;
+  mHeight = height;
+
+  // Reset the buffer list
+  for( auto&& iter : mBuffers )
+  {
+    tbm_surface_internal_unref( iter.first );
+  }
+  mBuffers.clear();
+
+  DALI_LOG_RELEASE_INFO( "TizenVectorAnimationRenderer::SetSize: width = %d, height = %d\n", mWidth, mHeight );
+}
+
 bool TizenVectorAnimationRenderer::StartRender()
 {
   mRenderer = lottie::Animation::loadFromFile( mUrl );
@@ -113,6 +135,8 @@ bool TizenVectorAnimationRenderer::StartRender()
 
 void TizenVectorAnimationRenderer::StopRender()
 {
+  Dali::Mutex::ScopedLock lock( mMutex );
+
   if( mTbmQueue )
   {
     tbm_surface_queue_flush( mTbmQueue );
@@ -123,6 +147,8 @@ void TizenVectorAnimationRenderer::StopRender()
 
 void TizenVectorAnimationRenderer::Render( uint32_t frameNumber )
 {
+  Dali::Mutex::ScopedLock lock( mMutex );
+
   if( tbm_surface_queue_can_dequeue( mTbmQueue, 1 ) )
   {
     tbm_surface_h tbmSurface;
@@ -153,7 +179,7 @@ void TizenVectorAnimationRenderer::Render( uint32_t frameNumber )
       unsigned char* buffer = info.planes[0].ptr;
 
       // Create Surface object
-      lottie::Surface surface( reinterpret_cast< uint32_t* >( buffer ), static_cast< size_t >( info.width ), static_cast< size_t >( info.height ), static_cast< size_t >( info.planes[0].stride ) );
+      lottie::Surface surface( reinterpret_cast< uint32_t* >( buffer ), mWidth, mHeight, static_cast< size_t >( info.planes[0].stride ) );
 
       // Push the buffer
       mBuffers.push_back( SurfacePair( tbmSurface, surface ) );
index ae14b2e..2a98c19 100755 (executable)
@@ -21,6 +21,7 @@
 // EXTERNAL INCLUDES
 #include <dali/public-api/math/uint-16-pair.h>
 #include <dali/public-api/common/vector-wrapper.h>
+#include <dali/devel-api/threading/mutex.h>
 #include <dali/devel-api/adaptor-framework/native-image-source-queue.h>
 #include <dali/devel-api/adaptor-framework/vector-animation-renderer-plugin.h>
 #include <memory>
@@ -57,6 +58,11 @@ public:
   bool CreateRenderer( const std::string& url, Renderer renderer, uint32_t width, uint32_t height ) override;
 
   /**
+   * @copydoc Dali::VectorAnimationRendererPlugin::SetSize()
+   */
+  void SetSize( uint32_t width, uint32_t height ) override;
+
+  /**
    * @copydoc Dali::VectorAnimationRendererPlugin::StartRender()
    */
   bool StartRender() override;
@@ -89,6 +95,7 @@ private:
 
   std::string                          mUrl;               ///< The content file path
   std::vector< SurfacePair >           mBuffers;           ///< EGL Image vector
+  Dali::Mutex                          mMutex;             ///< Mutex
   NativeImageSourceQueuePtr            mTargetSurface;     ///< The target surface
   std::unique_ptr< lottie::Animation > mRenderer;          ///< The vector animation renderer
   tbm_surface_queue_h                  mTbmQueue;          ///< Tbm surface queue handle