(Vector) Support SYNCHRONOUS_LOADING
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / animated-vector-image / animated-vector-image-visual.cpp
index 9636775..006554d 100644 (file)
@@ -102,13 +102,8 @@ AnimatedVectorImageVisual::AnimatedVectorImageVisual(VisualFactoryCache& factory
   // the rasterized image is with pre-multiplied alpha format
   mImpl->mFlags |= Visual::Base::Impl::IS_PREMULTIPLIED_ALPHA;
 
-  mVectorAnimationTask->RequestLoad(mUrl.GetUrl());
-
-  mVectorAnimationTask->ResourceReadySignal().Connect(this, &AnimatedVectorImageVisual::OnResourceReady);
-  mVectorAnimationTask->SetAnimationFinishedCallback(new EventThreadCallback(MakeCallback(this, &AnimatedVectorImageVisual::OnAnimationFinished)));
-
-  auto& vectorAnimationManager = mFactoryCache.GetVectorAnimationManager();
-  vectorAnimationManager.AddObserver(*this);
+  // By default, load a file synchronously
+  mImpl->mFlags |= Visual::Base::Impl::IS_SYNCHRONOUS_RESOURCE_LOADING;
 }
 
 AnimatedVectorImageVisual::~AnimatedVectorImageVisual()
@@ -247,6 +242,10 @@ void AnimatedVectorImageVisual::DoSetProperties(const Property::Map& propertyMap
       {
         DoSetProperty(Toolkit::DevelImageVisual::Property::REDRAW_IN_SCALING_DOWN, keyValue.second);
       }
+      else if(keyValue.first == SYNCHRONOUS_LOADING)
+      {
+        DoSetProperty(Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING, keyValue.second);
+      }
     }
   }
 
@@ -306,11 +305,35 @@ void AnimatedVectorImageVisual::DoSetProperty(Property::Index index, const Prope
       }
       break;
     }
+    case Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING:
+    {
+      bool sync = false;
+      if(value.Get(sync))
+      {
+        if(sync)
+        {
+          mImpl->mFlags |= Visual::Base::Impl::IS_SYNCHRONOUS_RESOURCE_LOADING;
+        }
+        else
+        {
+          mImpl->mFlags &= ~Visual::Base::Impl::IS_SYNCHRONOUS_RESOURCE_LOADING;
+        }
+      }
+      break;
+    }
   }
 }
 
 void AnimatedVectorImageVisual::OnInitialize(void)
 {
+  mVectorAnimationTask->ResourceReadySignal().Connect(this, &AnimatedVectorImageVisual::OnResourceReady);
+  mVectorAnimationTask->SetAnimationFinishedCallback(new EventThreadCallback(MakeCallback(this, &AnimatedVectorImageVisual::OnAnimationFinished)));
+
+  mVectorAnimationTask->RequestLoad(mUrl.GetUrl(), IsSynchronousLoadingRequired());
+
+  auto& vectorAnimationManager = mFactoryCache.GetVectorAnimationManager();
+  vectorAnimationManager.AddObserver(*this);
+
   Shader shader = GenerateShader();
 
   Geometry geometry = mFactoryCache.GetGeometry(VisualFactoryCache::QUAD_GEOMETRY);
@@ -337,7 +360,7 @@ void AnimatedVectorImageVisual::DoSetOnScene(Actor& actor)
   if(mLoadFailed)
   {
     Vector2 imageSize = actor.GetProperty(Actor::Property::SIZE).Get<Vector2>();
-    mFactoryCache.UpdateBrokenImageRenderer(mImpl->mRenderer, imageSize);
+    mFactoryCache.UpdateBrokenImageRenderer(mImpl->mRenderer, imageSize, false);
     actor.AddRenderer(mImpl->mRenderer);
     ResourceReady(Toolkit::Visual::ResourceStatus::FAILED);
   }
@@ -374,7 +397,7 @@ void AnimatedVectorImageVisual::DoSetOnScene(Actor& actor)
 void AnimatedVectorImageVisual::DoSetOffScene(Actor& actor)
 {
   StopAnimation();
-  SendAnimationData();
+  TriggerVectorRasterization();
 
   if(mImpl->mRenderer)
   {
@@ -423,7 +446,7 @@ void AnimatedVectorImageVisual::OnSetTransform()
       mAnimationData.resendFlag |= VectorAnimationTask::RESEND_PLAY_STATE;
     }
 
-    SendAnimationData();
+    TriggerVectorRasterization();
   }
 }
 
@@ -489,31 +512,57 @@ void AnimatedVectorImageVisual::OnDoAction(const Property::Index actionId, const
   TriggerVectorRasterization();
 }
 
-void AnimatedVectorImageVisual::OnResourceReady(bool success)
+void AnimatedVectorImageVisual::OnDoActionExtension(const Property::Index actionId, Dali::Any attributes)
 {
-  mLoadFailed = !success;
-
-  // If weak handle is holding a placement actor, it is the time to add the renderer to actor.
-  Actor actor = mPlacementActor.GetHandle();
-  if(actor && !mRendererAdded)
+  switch(actionId)
   {
-    if(success)
+    case DevelAnimatedVectorImageVisual::Action::SET_DYNAMIC_PROPERTY:
     {
-      actor.AddRenderer(mImpl->mRenderer);
-      ResourceReady(Toolkit::Visual::ResourceStatus::READY);
+      DevelAnimatedVectorImageVisual::DynamicPropertyInfo info = AnyCast<DevelAnimatedVectorImageVisual::DynamicPropertyInfo>(attributes);
+      mAnimationData.dynamicProperties.push_back(info);
+      mAnimationData.resendFlag |= VectorAnimationTask::RESEND_DYNAMIC_PROPERTY;
+      break;
     }
-    else
+  }
+
+  TriggerVectorRasterization();
+}
+
+void AnimatedVectorImageVisual::OnResourceReady(VectorAnimationTask::ResourceStatus status)
+{
+  if(status == VectorAnimationTask::ResourceStatus::LOADED)
+  {
+    if(mImpl->mEventObserver)
     {
-      Vector2 imageSize = actor.GetProperty(Actor::Property::SIZE).Get<Vector2>();
-      mFactoryCache.UpdateBrokenImageRenderer(mImpl->mRenderer, imageSize);
-      actor.AddRenderer(mImpl->mRenderer);
-      ResourceReady(Toolkit::Visual::ResourceStatus::FAILED);
+      mImpl->mEventObserver->RelayoutRequest(*this);
     }
+  }
+  else
+  {
+    mLoadFailed = status == VectorAnimationTask::ResourceStatus::FAILED ? true : false;
 
-    mRendererAdded = true;
+    // If weak handle is holding a placement actor, it is the time to add the renderer to actor.
+    Actor actor = mPlacementActor.GetHandle();
+    if(actor && !mRendererAdded)
+    {
+      if(!mLoadFailed)
+      {
+        actor.AddRenderer(mImpl->mRenderer);
+        ResourceReady(Toolkit::Visual::ResourceStatus::READY);
+      }
+      else
+      {
+        Vector2 imageSize = actor.GetProperty(Actor::Property::SIZE).Get<Vector2>();
+        mFactoryCache.UpdateBrokenImageRenderer(mImpl->mRenderer, imageSize, false);
+        actor.AddRenderer(mImpl->mRenderer);
+        ResourceReady(Toolkit::Visual::ResourceStatus::FAILED);
+      }
 
-    DALI_LOG_INFO(gVectorAnimationLogFilter, Debug::Verbose, "Renderer is added (success = %d) [%p]\n", success, this);
+      mRendererAdded = true;
+    }
   }
+
+  DALI_LOG_INFO(gVectorAnimationLogFilter, Debug::Verbose, "status = %d [%p]\n", status, this);
 }
 
 void AnimatedVectorImageVisual::OnAnimationFinished()