[Tizen] Remove already applied dynamicProperties 83/316083/1 accepted/tizen/7.0/unified/20241211.061015
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:20:07 +0000 (14:20 +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 eee47b811755c4343acdcdee2a5857db5cffae11..87ce93b1b467c6933f31c129f272cf8cdf1025ca 100644 (file)
@@ -18,6 +18,8 @@
 #include <dali/devel-api/adaptor-framework/pixel-buffer.h>
 #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>
@@ -26,6 +28,7 @@
 #include <chrono>
 #include <memory>
 #include <thread>
+#include <utility>
 
 namespace Dali
 {
@@ -130,9 +133,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)
@@ -198,7 +204,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));
   }
 
   Dali::VectorAnimationRenderer::UploadCompletedSignalType& UploadCompletedSignal()
@@ -227,10 +233,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 59559e3f2a6baed9870c83a6139b4802e0bc1206..0b234c1bd30a642e828fcf3832f62bd78482ee16 100644 (file)
@@ -17,6 +17,7 @@
 #include <stdlib.h>
 #include <chrono>
 #include <iostream>
+#include <map>
 #include <thread>
 
 #include <dali-toolkit-test-suite-utils.h>
@@ -2082,11 +2083,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)
   {
@@ -2097,12 +2098,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(
@@ -2118,7 +2146,7 @@ int UtcDaliAnimatedVectorImageVisualDynamicProperty(void)
 
   application.GetScene().Add(actor);
 
-  gDynamicPropertyCallbackFired = false;
+  gDynamicPropertyCallbackFiredMap.clear();
 
   // Set dynamic property
   DevelAnimatedVectorImageVisual::DynamicPropertyInfo info;
@@ -2139,7 +2167,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 a8d8dab4e4bbd1b9ec4654e1dd46bc057ef750d6..93577fb4c0e3064fe8135cfd02c4e8670309a06b 100644 (file)
@@ -705,6 +705,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)))