[Tizen] Remove already applied dynamicProperties 81/316081/1 accepted/tizen/8.0/unified/20250102.165451
authorEunki, Hong <eunkiki.hong@samsung.com>
Mon, 9 Dec 2024 08:01:29 +0000 (17:01 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Tue, 10 Dec 2024 05:12:56 +0000 (14:12 +0900)
Let we remove the list of dynamic properties info what we already send to task

Change-Id: Ib3a8024288cbcfae52a47ec2fd22d456a9a5b155
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-vector-animation-renderer.cpp
automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp
dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp

index aec90add5f888dd23d3db7061d7ba12006325f3b..adfe853c86e02e06bdf125eaad6dbdae575055b4 100644 (file)
@@ -19,6 +19,7 @@
 #include <dali/devel-api/adaptor-framework/vector-animation-renderer.h>
 #include <dali/devel-api/threading/mutex.h>
 #include <dali/public-api/adaptor-framework/native-image-source.h>
+#include <dali/public-api/common/vector-wrapper.h>
 #include <dali/public-api/object/base-object.h>
 #include <dali/public-api/object/property-array.h>
 #include <toolkit-application.h>
@@ -27,6 +28,7 @@
 #include <chrono>
 #include <memory>
 #include <thread>
+#include <utility>
 
 namespace Dali
 {
@@ -142,9 +144,12 @@ public:
       mNeedDroppedFrames = false;
     }
 
-    if(mDynamicPropertyCallback)
+    if(!mDynamicPropertyCallbacks.empty())
     {
-      CallbackBase::ExecuteReturn<Property::Value>(*mDynamicPropertyCallback, 0, 0, frameNumber);
+      for(auto&& dynamicPropertyCallbackPair : mDynamicPropertyCallbacks)
+      {
+        CallbackBase::ExecuteReturn<Property::Value>(*dynamicPropertyCallbackPair.second, dynamicPropertyCallbackPair.first, 0, frameNumber);
+      }
     }
 
     if(mNeedTrigger)
@@ -210,7 +215,7 @@ public:
 
   void AddPropertyValueCallback(const std::string& keyPath, Dali::VectorAnimationRenderer::VectorProperty property, CallbackBase* callback, int32_t id)
   {
-    mDynamicPropertyCallback = std::unique_ptr<CallbackBase>(callback);
+    mDynamicPropertyCallbacks.emplace_back(id, std::unique_ptr<CallbackBase>(callback));
   }
 
   void KeepRasterizedBuffer()
@@ -255,10 +260,10 @@ public:
 public:
   static uint32_t mCount;
 
-  std::string                   mUrl;
-  Dali::Renderer                mRenderer;
-  Dali::Mutex                   mMutex;
-  std::unique_ptr<CallbackBase> mDynamicPropertyCallback{nullptr};
+  std::string                                                    mUrl;
+  Dali::Renderer                                                 mRenderer;
+  Dali::Mutex                                                    mMutex;
+  std::vector<std::pair<int32_t, std::unique_ptr<CallbackBase>>> mDynamicPropertyCallbacks;
 
   uint32_t mWidth;
   uint32_t mHeight;
index d1267af9a27497b0b1149a750c064ed42aa05312..686e3af133ff5f9c31a164e17a70916100b18574 100644 (file)
@@ -17,6 +17,7 @@
 #include <stdlib.h>
 #include <chrono>
 #include <iostream>
+#include <map>
 #include <thread>
 
 #include <dali-toolkit-test-suite-utils.h>
@@ -2322,11 +2323,11 @@ int UtcDaliAnimatedVectorImageVisualSize(void)
 
 namespace
 {
-bool gDynamicPropertyCallbackFired = false;
+std::map<int32_t, bool> gDynamicPropertyCallbackFiredMap;
 
 Property::Value FillColorCallback(int32_t id, VectorAnimationRenderer::VectorProperty property, uint32_t frameNumber)
 {
-  gDynamicPropertyCallbackFired = true;
+  gDynamicPropertyCallbackFiredMap[id] = true;
 
   if(frameNumber < 3)
   {
@@ -2337,12 +2338,39 @@ Property::Value FillColorCallback(int32_t id, VectorAnimationRenderer::VectorPro
     return Vector3(1, 0, 0);
   }
 }
+
+Property::Value FillOpacityCallback(int32_t id, VectorAnimationRenderer::VectorProperty property, uint32_t frameNumber)
+{
+  gDynamicPropertyCallbackFiredMap[id] = true;
+
+  if(frameNumber < 3)
+  {
+    return 1.0f;
+  }
+  else
+  {
+    return 0.5f;
+  }
+}
+Property::Value TransformScaleCallback(int32_t id, VectorAnimationRenderer::VectorProperty property, uint32_t frameNumber)
+{
+  gDynamicPropertyCallbackFiredMap[id] = true;
+
+  if(frameNumber < 3)
+  {
+    return Vector2(0.5f, 1.5f);
+  }
+  else
+  {
+    return Vector2(1.5f, 0.5f);
+  }
+}
 } // namespace
 
-int UtcDaliAnimatedVectorImageVisualDynamicProperty(void)
+int UtcDaliAnimatedVectorImageVisualDynamicProperty01(void)
 {
   ToolkitTestApplication application;
-  tet_infoline("UtcDaliAnimatedVectorImageVisualDynamicProperty");
+  tet_infoline("UtcDaliAnimatedVectorImageVisualDynamicProperty01");
 
   VisualFactory factory = VisualFactory::Get();
   Visual::Base  visual  = factory.CreateVisual(
@@ -2361,7 +2389,7 @@ int UtcDaliAnimatedVectorImageVisualDynamicProperty(void)
 
   application.GetScene().Add(actor);
 
-  gDynamicPropertyCallbackFired = false;
+  gDynamicPropertyCallbackFiredMap.clear();
 
   // Set dynamic property
   DevelAnimatedVectorImageVisual::DynamicPropertyInfo info;
@@ -2382,7 +2410,77 @@ int UtcDaliAnimatedVectorImageVisualDynamicProperty(void)
   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
 
   // Test whether the property callback is called
-  DALI_TEST_EQUALS(gDynamicPropertyCallbackFired, true, TEST_LOCATION);
+  DALI_TEST_EQUALS(gDynamicPropertyCallbackFiredMap[1], true, TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliAnimatedVectorImageVisualDynamicProperty02(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("UtcDaliAnimatedVectorImageVisualDynamicProperty02 Add dynamic property callback multiple times.");
+
+  VisualFactory factory = VisualFactory::Get();
+  Visual::Base  visual  = factory.CreateVisual(
+    Property::Map()
+      .Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE)
+      .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME)
+      .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false));
+  DALI_TEST_CHECK(visual);
+
+  DummyControl      actor     = DummyControl::New(true);
+  DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
+  dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
+
+  Vector2 controlSize(20.f, 30.f);
+  actor.SetProperty(Actor::Property::SIZE, controlSize);
+
+  application.GetScene().Add(actor);
+
+  gDynamicPropertyCallbackFiredMap.clear();
+
+  // Set dynamic property
+  DevelAnimatedVectorImageVisual::DynamicPropertyInfo info1;
+  info1.id       = 1;
+  info1.keyPath  = "Test.Path";
+  info1.property = static_cast<int>(VectorAnimationRenderer::VectorProperty::FILL_COLOR);
+  info1.callback = MakeCallback(FillColorCallback);
+
+  DevelControl::DoActionExtension(actor, DummyControl::Property::TEST_VISUAL, DevelAnimatedVectorImageVisual::Action::SET_DYNAMIC_PROPERTY, Any(info1));
+
+  DevelAnimatedVectorImageVisual::DynamicPropertyInfo info2;
+  info2.id       = 2;
+  info2.keyPath  = "Test.Path";
+  info2.property = static_cast<int>(VectorAnimationRenderer::VectorProperty::FILL_OPACITY);
+  info2.callback = MakeCallback(FillOpacityCallback);
+
+  DevelControl::DoActionExtension(actor, DummyControl::Property::TEST_VISUAL, DevelAnimatedVectorImageVisual::Action::SET_DYNAMIC_PROPERTY, Any(info2));
+
+  application.SendNotification();
+  application.Render();
+
+  DevelAnimatedVectorImageVisual::DynamicPropertyInfo info3;
+  info3.id       = 3;
+  info3.keyPath  = "Test.Path";
+  info3.property = static_cast<int>(VectorAnimationRenderer::VectorProperty::TRANSFORM_SCALE);
+  info3.callback = MakeCallback(TransformScaleCallback);
+
+  // Add third property after Notification.
+  DevelControl::DoActionExtension(actor, DummyControl::Property::TEST_VISUAL, DevelAnimatedVectorImageVisual::Action::SET_DYNAMIC_PROPERTY, Any(info3));
+
+  Property::Map attributes;
+  DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes);
+
+  application.SendNotification();
+  application.Render();
+
+  // Trigger count is 2 - load & render a frame
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
+
+  // Test whether the property callback is called
+  DALI_TEST_EQUALS(gDynamicPropertyCallbackFiredMap[1], true, TEST_LOCATION);
+  DALI_TEST_EQUALS(gDynamicPropertyCallbackFiredMap[2], true, TEST_LOCATION);
+  DALI_TEST_EQUALS(gDynamicPropertyCallbackFiredMap[3], true, TEST_LOCATION);
 
   END_TEST;
 }
index d0d6afd5f7783c5893f203ef97d23d85f56c9bcc..5544df790295570f401621a827d68c890b0c3db1 100644 (file)
@@ -772,6 +772,12 @@ void AnimatedVectorImageVisual::SendAnimationData()
     }
     mVectorAnimationTask->SetAnimationData(mAnimationData);
 
+    if(mAnimationData.resendFlag & VectorAnimationTask::RESEND_DYNAMIC_PROPERTY)
+    {
+      // Remove applied dynamic properties
+      mAnimationData.dynamicProperties.clear();
+    }
+
     if(mImpl->mRenderer &&
        ((mAnimationData.resendFlag & VectorAnimationTask::RESEND_PLAY_STATE) ||
         (mAnimationData.resendFlag & VectorAnimationTask::RESEND_NOTIFY_AFTER_RASTERIZATION)))