(Vector) Support asynchronous file loading
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / dali-toolkit-test-utils / toolkit-vector-animation-renderer.cpp
old mode 100755 (executable)
new mode 100644 (file)
index 474706f..4b6c5c8
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  *
  */
 
+#include <dali/devel-api/adaptor-framework/pixel-buffer.h>
 #include <dali/devel-api/adaptor-framework/vector-animation-renderer.h>
 #include <dali/public-api/object/base-object.h>
 #include <toolkit-application.h>
-#include <toolkit-vector-animation-renderer.h>
 #include <toolkit-event-thread-callback.h>
+#include <toolkit-vector-animation-renderer.h>
+#include <chrono>
 #include <memory>
 #include <thread>
-#include <chrono>
 
 namespace Dali
 {
-
 namespace Internal
 {
-
 namespace Adaptor
 {
-
 namespace
 {
 Dali::Internal::Adaptor::VectorAnimationRenderer* gVectorAnimationRenderer = nullptr;
 }
 
-class VectorAnimationRenderer: public Dali::BaseObject
+class VectorAnimationRenderer : public Dali::BaseObject
 {
 public:
-
   VectorAnimationRenderer()
   : mUrl(),
     mRenderer(),
-    mWidth( 0 ),
-    mHeight( 0 ),
+    mWidth(0),
+    mHeight(0),
+    mDefaultWidth(0),
+    mDefaultHeight(0),
     mTotalFrameNumber(VECTOR_ANIMATION_TOTAL_FRAME_NUMBER),
-    mPreviousFrame( 0 ),
+    mPreviousFrame(0),
     mDelayTime(0),
     mDroppedFrames(0),
-    mFrameRate( 60.0f ),
+    mFrameRate(60.0f),
+    mTestFrameDrop(false),
     mNeedDroppedFrames(false),
-    mEventThreadCallback( new EventThreadCallback( MakeCallback( this, &VectorAnimationRenderer::OnTriggered ) ) )
+    mEventThreadCallback(new EventThreadCallback(MakeCallback(this, &VectorAnimationRenderer::OnTriggered)))
   {
     mCount++;
 
-    if( mCount == 2 )
+    if(mCount == 2)
     {
       mFrameRate = 0.1f;
     }
@@ -71,67 +71,68 @@ public:
   bool Load(const std::string& url)
   {
     mUrl = url;
-    if(mUrl == "invalid.json" || mUrl == "invalid.riv")
+    if(mUrl == "invalid.json")
     {
+      mLoadFailed = true;
       return false;
     }
     else if(mUrl == "framedrop.json")
     {
       // Change total frame number for test
       mTotalFrameNumber = 200;
+      mTestFrameDrop    = true;
     }
+
+    mDefaultWidth  = 100;
+    mDefaultHeight = 100;
+
     return true;
   }
 
-  void SetRenderer( Dali::Renderer renderer )
+  void SetRenderer(Dali::Renderer renderer)
   {
     mRenderer = renderer;
-
-    if( mWidth != 0 && mHeight != 0 )
-    {
-      Dali::TextureSet textureSet = mRenderer.GetTextures();
-      Dali::Texture texture = Dali::Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, mWidth, mHeight );
-      textureSet.SetTexture( 0, texture );
-      mUploadCompletedSignal.Emit();
-    }
   }
 
-  void SetSize( uint32_t width, uint32_t height )
+  void SetSize(uint32_t width, uint32_t height)
   {
-    mWidth = width;
+    mWidth  = width;
     mHeight = height;
 
-    if( mRenderer )
+    if(!mLoadFailed)
     {
-      Dali::TextureSet textureSet = mRenderer.GetTextures();
-      Dali::Texture texture = Dali::Texture::New( TextureType::TEXTURE_2D, Pixel::RGBA8888, mWidth, mHeight );
-      textureSet.SetTexture( 0, texture );
-      mUploadCompletedSignal.Emit();
+      mNeedTrigger   = true;
+      mResourceReady = false;
     }
   }
 
-  bool Render( uint32_t frameNumber )
+  bool Render(uint32_t frameNumber)
   {
-    if(mDelayTime != 0)
+    if(mWidth == 0 || mHeight == 0)
+    {
+      return false;
+    }
+
+    if(mTestFrameDrop)
     {
       std::this_thread::sleep_for(std::chrono::milliseconds(static_cast<int32_t>(mDelayTime)));
-      mDelayTime = 0;
+      mTestFrameDrop     = false;
       mNeedDroppedFrames = true;
     }
     else if(mNeedDroppedFrames)
     {
-      mDroppedFrames = (frameNumber > mPreviousFrame) ? frameNumber - mPreviousFrame - 1: frameNumber + (mTotalFrameNumber - mPreviousFrame) - 1;
-      mNeedTrigger = true;
+      mDroppedFrames     = (frameNumber > mPreviousFrame) ? frameNumber - mPreviousFrame - 1 : frameNumber + (mTotalFrameNumber - mPreviousFrame) - 1;
+      mNeedTrigger       = true;
       mNeedDroppedFrames = false;
     }
 
-    if( mNeedTrigger )
+    if(mNeedTrigger)
     {
       mEventThreadCallback->Trigger();
       mNeedTrigger = false;
     }
 
-    if( frameNumber == 1 && mPreviousFrame != frameNumber )
+    if(frameNumber == 1 && mPreviousFrame != frameNumber)
     {
       mPreviousFrame = frameNumber;
       // For test corverage
@@ -151,23 +152,23 @@ public:
     return mFrameRate;
   }
 
-  void GetDefaultSize( uint32_t& width, uint32_t& height ) const
+  void GetDefaultSize(uint32_t& width, uint32_t& height) const
   {
-    width = 100;
-    height = 100;
+    width  = mDefaultWidth;
+    height = mDefaultHeight;
   }
 
-  bool GetMarkerInfo( const std::string& marker, uint32_t& startFrame, uint32_t& endFrame ) const
+  bool GetMarkerInfo(const std::string& marker, uint32_t& startFrame, uint32_t& endFrame) const
   {
-    if( marker.compare( VECTOR_ANIMATION_MARKER_NAME_1 ) == 0 )
+    if(marker.compare(VECTOR_ANIMATION_MARKER_NAME_1) == 0)
     {
       startFrame = VECTOR_ANIMATION_MARKER_START_FRAME_1;
-      endFrame = VECTOR_ANIMATION_MARKER_END_FRAME_1;
+      endFrame   = VECTOR_ANIMATION_MARKER_END_FRAME_1;
     }
-    else if( marker.compare( VECTOR_ANIMATION_MARKER_NAME_2 ) == 0 )
+    else if(marker.compare(VECTOR_ANIMATION_MARKER_NAME_2) == 0)
     {
       startFrame = VECTOR_ANIMATION_MARKER_START_FRAME_2;
-      endFrame = VECTOR_ANIMATION_MARKER_END_FRAME_2;
+      endFrame   = VECTOR_ANIMATION_MARKER_END_FRAME_2;
     }
     else
     {
@@ -176,6 +177,12 @@ public:
     return true;
   }
 
+  void InvalidateBuffer()
+  {
+    mNeedTrigger   = true;
+    mResourceReady = false;
+  }
+
   Dali::VectorAnimationRenderer::UploadCompletedSignalType& UploadCompletedSignal()
   {
     return mUploadCompletedSignal;
@@ -183,49 +190,66 @@ public:
 
   void OnTriggered()
   {
+    if(!mResourceReady)
+    {
+      mResourceReady = true;
+
+      Dali::TextureSet textureSet = mRenderer.GetTextures();
+      Dali::Texture    texture    = Dali::Texture::New(TextureType::TEXTURE_2D, Pixel::RGBA8888, mWidth, mHeight);
+      textureSet.SetTexture(0, texture);
+
+      Devel::PixelBuffer pixelBuffer = Devel::PixelBuffer::New(mWidth, mHeight, Pixel::RGBA8888);
+      Dali::PixelData    pixelData   = Devel::PixelBuffer::Convert(pixelBuffer);
+      texture.Upload(pixelData);
+
+      mUploadCompletedSignal.Emit();
+    }
   }
 
 public:
-
   static uint32_t mCount;
-  static bool mNeedTrigger;
 
-  std::string mUrl;
+  std::string    mUrl;
   Dali::Renderer mRenderer;
-  uint32_t mWidth;
-  uint32_t mHeight;
-  uint32_t mTotalFrameNumber;
-  uint32_t mPreviousFrame;
-  uint32_t mDelayTime;
-  uint32_t mDroppedFrames;
-  float mFrameRate;
-  bool mNeedDroppedFrames;
+  uint32_t       mWidth;
+  uint32_t       mHeight;
+  uint32_t       mDefaultWidth;
+  uint32_t       mDefaultHeight;
+  uint32_t       mTotalFrameNumber;
+  uint32_t       mPreviousFrame;
+  uint32_t       mDelayTime;
+  uint32_t       mDroppedFrames;
+  float          mFrameRate;
+  bool           mTestFrameDrop;
+  bool           mNeedDroppedFrames;
+  bool           mLoadFailed{false};
+  bool           mResourceReady{false};
+  bool           mNeedTrigger{true};
+
   Dali::VectorAnimationRenderer::UploadCompletedSignalType mUploadCompletedSignal;
-  std::unique_ptr< EventThreadCallback > mEventThreadCallback;
+  std::unique_ptr<EventThreadCallback>                     mEventThreadCallback;
 };
 
 uint32_t VectorAnimationRenderer::mCount = 0;
-bool VectorAnimationRenderer::mNeedTrigger = true;
 
-inline VectorAnimationRenderer& GetImplementation( Dali::VectorAnimationRenderer& renderer )
+inline VectorAnimationRenderer& GetImplementation(Dali::VectorAnimationRenderer& renderer)
 {
-  DALI_ASSERT_ALWAYS( renderer && "VectorAnimationRenderer handle is empty." );
+  DALI_ASSERT_ALWAYS(renderer && "VectorAnimationRenderer handle is empty.");
   BaseObject& handle = renderer.GetBaseObject();
-  return static_cast< Internal::Adaptor::VectorAnimationRenderer& >( handle );
+  return static_cast<Internal::Adaptor::VectorAnimationRenderer&>(handle);
 }
 
-inline const VectorAnimationRenderer& GetImplementation( const Dali::VectorAnimationRenderer& renderer )
+inline const VectorAnimationRenderer& GetImplementation(const Dali::VectorAnimationRenderer& renderer)
 {
-  DALI_ASSERT_ALWAYS( renderer && "VectorAnimationRenderer handle is empty." );
+  DALI_ASSERT_ALWAYS(renderer && "VectorAnimationRenderer handle is empty.");
   const BaseObject& handle = renderer.GetBaseObject();
-  return static_cast< const Internal::Adaptor::VectorAnimationRenderer& >( handle );
+  return static_cast<const Internal::Adaptor::VectorAnimationRenderer&>(handle);
 }
 
 } // namespace Adaptor
 
 } // namespace Internal
 
-
 /********************************************************************************/
 /*********************************  PUBLIC CLASS  *******************************/
 /********************************************************************************/
@@ -236,7 +260,7 @@ VectorAnimationRenderer VectorAnimationRenderer::New()
 
   Internal::Adaptor::gVectorAnimationRenderer = animationRenderer;
 
-  return VectorAnimationRenderer( animationRenderer );
+  return VectorAnimationRenderer(animationRenderer);
 }
 
 VectorAnimationRenderer::VectorAnimationRenderer()
@@ -247,19 +271,19 @@ VectorAnimationRenderer::~VectorAnimationRenderer()
 {
 }
 
-VectorAnimationRenderer::VectorAnimationRenderer( Internal::Adaptor::VectorAnimationRenderer* internal )
-: BaseHandle( internal )
+VectorAnimationRenderer::VectorAnimationRenderer(Internal::Adaptor::VectorAnimationRenderer* internal)
+: BaseHandle(internal)
 {
 }
 
-VectorAnimationRenderer::VectorAnimationRenderer( const VectorAnimationRenderer& handle )
-: BaseHandle( handle )
+VectorAnimationRenderer::VectorAnimationRenderer(const VectorAnimationRenderer& handle)
+: BaseHandle(handle)
 {
 }
 
-VectorAnimationRenderer& VectorAnimationRenderer::operator=( const VectorAnimationRenderer& rhs )
+VectorAnimationRenderer& VectorAnimationRenderer::operator=(const VectorAnimationRenderer& rhs)
 {
-  BaseHandle::operator=( rhs );
+  BaseHandle::operator=(rhs);
   return *this;
 }
 
@@ -269,51 +293,56 @@ void VectorAnimationRenderer::Finalize()
 
 bool VectorAnimationRenderer::Load(const std::string& url)
 {
-  return Internal::Adaptor::GetImplementation( *this ).Load(url);
+  return Internal::Adaptor::GetImplementation(*this).Load(url);
 }
 
-void VectorAnimationRenderer::SetRenderer( Renderer renderer )
+void VectorAnimationRenderer::SetRenderer(Renderer renderer)
 {
-  Internal::Adaptor::GetImplementation( *this ).SetRenderer( renderer );
+  Internal::Adaptor::GetImplementation(*this).SetRenderer(renderer);
 }
 
-void VectorAnimationRenderer::SetSize( uint32_t width, uint32_t height )
+void VectorAnimationRenderer::SetSize(uint32_t width, uint32_t height)
 {
-  Internal::Adaptor::GetImplementation( *this ).SetSize( width, height );
+  Internal::Adaptor::GetImplementation(*this).SetSize(width, height);
 }
 
-bool VectorAnimationRenderer::Render( uint32_t frameNumber )
+bool VectorAnimationRenderer::Render(uint32_t frameNumber)
 {
-  return Internal::Adaptor::GetImplementation( *this ).Render( frameNumber );
+  return Internal::Adaptor::GetImplementation(*this).Render(frameNumber);
 }
 
 uint32_t VectorAnimationRenderer::GetTotalFrameNumber() const
 {
-  return Internal::Adaptor::GetImplementation( *this ).GetTotalFrameNumber();
+  return Internal::Adaptor::GetImplementation(*this).GetTotalFrameNumber();
 }
 
 float VectorAnimationRenderer::GetFrameRate() const
 {
-  return Internal::Adaptor::GetImplementation( *this ).GetFrameRate();
+  return Internal::Adaptor::GetImplementation(*this).GetFrameRate();
+}
+
+void VectorAnimationRenderer::GetDefaultSize(uint32_t& width, uint32_t& height) const
+{
+  Internal::Adaptor::GetImplementation(*this).GetDefaultSize(width, height);
 }
 
-void VectorAnimationRenderer::GetDefaultSize( uint32_t& width, uint32_t& height ) const
+void VectorAnimationRenderer::GetLayerInfo(Property::Map& map) const
 {
-  Internal::Adaptor::GetImplementation( *this ).GetDefaultSize( width, height );
 }
 
-void VectorAnimationRenderer::GetLayerInfo( Property::Map& map ) const
+bool VectorAnimationRenderer::GetMarkerInfo(const std::string& marker, uint32_t& startFrame, uint32_t& endFrame) const
 {
+  return Internal::Adaptor::GetImplementation(*this).GetMarkerInfo(marker, startFrame, endFrame);
 }
 
-bool VectorAnimationRenderer::GetMarkerInfo( const std::string& marker, uint32_t& startFrame, uint32_t& endFrame ) const
+void VectorAnimationRenderer::InvalidateBuffer()
 {
-  return Internal::Adaptor::GetImplementation( *this ).GetMarkerInfo( marker, startFrame, endFrame );
+  return Internal::Adaptor::GetImplementation(*this).InvalidateBuffer();
 }
 
 VectorAnimationRenderer::UploadCompletedSignalType& VectorAnimationRenderer::UploadCompletedSignal()
 {
-  return Internal::Adaptor::GetImplementation( *this ).UploadCompletedSignal();
+  return Internal::Adaptor::GetImplementation(*this).UploadCompletedSignal();
 }
 
 } // namespace Dali
@@ -322,12 +351,6 @@ namespace Test
 {
 namespace VectorAnimationRenderer
 {
-
-void RequestTrigger()
-{
-  Dali::Internal::Adaptor::VectorAnimationRenderer::mNeedTrigger = true;
-}
-
 void DelayRendering(uint32_t delay)
 {
   Dali::Internal::Adaptor::gVectorAnimationRenderer->mDelayTime = delay;
@@ -338,6 +361,5 @@ uint32_t GetDroppedFrames()
   return Dali::Internal::Adaptor::gVectorAnimationRenderer->mDroppedFrames;
 }
 
-} // VectorAnimationRenderer
-} // Test
-
+} // namespace VectorAnimationRenderer
+} // namespace Test