Activate render effect regardless of its size 47/320847/2
authorjmm <j0064423.lee@samsung.com>
Mon, 10 Mar 2025 06:40:36 +0000 (15:40 +0900)
committerjmm <j0064423.lee@samsung.com>
Mon, 17 Mar 2025 06:52:00 +0000 (15:52 +0900)
Change-Id: Ice3b1dbf8e508c3cf5bce9f4d2a5a7af334d39cd
Signed-off-by: jmm <j0064423.lee@samsung.com>
automated-tests/src/dali-toolkit/utc-Dali-Control.cpp
dali-toolkit/internal/controls/render-effects/render-effect-impl.cpp

index 522898cf3040704fc0e45fe895e2616b6adae484..787b46d42865306cac6506bcf4191a6a81feee28 100644 (file)
@@ -1533,6 +1533,45 @@ int UtcDaliControlOffScreenRendering(void)
   END_TEST;
 }
 
+int UtcDaliControlOffScreenRenderingSizeSet(void)
+{
+  ToolkitTestApplication application;
+
+  Control control = Control::New();
+  control.SetProperty(Actor::Property::SIZE, Vector2::ZERO);
+  application.GetScene().Add(control);
+
+  control.SetBackgroundColor(Color::RED);
+  control.SetProperty(DevelControl::Property::OFFSCREEN_RENDERING, DevelControl::OffScreenRenderingType::REFRESH_ALWAYS);
+  DALI_TEST_EQUALS(control.GetProperty(Actor::Property::SIZE).Get<Vector2>(), Vector2::ZERO, TEST_LOCATION);
+
+  control.SetProperty(Actor::Property::SIZE, Vector2::ZERO);
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS(control.GetProperty(Actor::Property::SIZE).Get<Vector2>(), Vector2::ZERO, TEST_LOCATION);
+  tet_infoline("Size update: zero to zero");
+
+  control.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 100.0f));
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS(control.GetProperty(Actor::Property::SIZE).Get<Vector2>(), Vector2(100.0f, 100.0f), TEST_LOCATION);
+  tet_infoline("Size update: zero to a valid size");
+
+  control.SetProperty(Actor::Property::SIZE, Vector2(150.0f, 150.0f));
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS(control.GetProperty(Actor::Property::SIZE).Get<Vector2>(), Vector2(150.0f, 150.0f), TEST_LOCATION);
+  tet_infoline("Size update: size1 to size2");
+
+  control.SetProperty(Actor::Property::SIZE, Vector2::ZERO);
+  application.SendNotification();
+  application.Render();
+  DALI_TEST_EQUALS(control.GetProperty(Actor::Property::SIZE).Get<Vector2>(), Vector2::ZERO, TEST_LOCATION);
+  tet_infoline("Size update: a valid size to zero");
+
+  END_TEST;
+}
+
 int UtcDaliControlNewWithDisableVisuals(void)
 {
   ToolkitTestApplication application;
index 355f56b6b445f3200db9a1f07679aca9e5bef016..9c85cb1ee9a2c3570fc740691145e9fe6e05ef70 100644 (file)
@@ -192,26 +192,23 @@ void RenderEffectImpl::Activate()
     mPlacementSceneHolder = sceneHolder;
 
     Vector2 size = GetTargetSize();
-    if(size != Vector2::ZERO)
-    {
-      mCamera.SetPerspectiveProjection(size);
-      ownerControl.Add(mCamera);
+    mCamera.SetPerspectiveProjection(size);
+    ownerControl.Add(mCamera);
 
-      // Activate logic for subclass.
-      OnActivate();
+    // Activate logic for subclass.
+    OnActivate();
 
-      // Set round corner. Default is to sync to owner control's BACKGROUND.
-      Vector4 cornerRadius = ownerControl.GetProperty<Vector4>(Toolkit::DevelControl::Property::CORNER_RADIUS);
-      if(cornerRadius != Vector4::ZERO)
-      {
-        int32_t cornerRadiusPolicy = ownerControl.GetProperty<int32_t>(Toolkit::DevelControl::Property::CORNER_RADIUS_POLICY);
+    // Set round corner. Default is to sync to owner control's BACKGROUND.
+    Vector4 cornerRadius = ownerControl.GetProperty<Vector4>(Toolkit::DevelControl::Property::CORNER_RADIUS);
+    if(cornerRadius != Vector4::ZERO)
+    {
+      int32_t cornerRadiusPolicy = ownerControl.GetProperty<int32_t>(Toolkit::DevelControl::Property::CORNER_RADIUS_POLICY);
 
-        Property::Map map;
-        map[Toolkit::DevelVisual::Property::CORNER_RADIUS]        = cornerRadius;
-        map[Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY] = static_cast<Toolkit::Visual::Transform::Policy::Type>(cornerRadiusPolicy);
+      Property::Map map;
+      map[Toolkit::DevelVisual::Property::CORNER_RADIUS]        = cornerRadius;
+      map[Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY] = static_cast<Toolkit::Visual::Transform::Policy::Type>(cornerRadiusPolicy);
 
-        SetCornerConstants(map);
-      }
+      SetCornerConstants(map);
     }
   }
 }
@@ -239,33 +236,38 @@ bool RenderEffectImpl::IsActivateValid() const
   // - All actors of owner control are visible
   // - The SceneHolder is exist, and it is visible
   // TODO : Currently we don't check SceneHolder's visibility.
+
   bool ret = false;
 
-  Dali::Toolkit::Control ownerControl = mOwnerControl.GetHandle();
-  if(ownerControl && ownerControl.GetProperty<bool>(Actor::Property::CONNECTED_TO_SCENE))
+  Vector2 size = GetTargetSize();
+  if(size.x > Math::MACHINE_EPSILON_1000 && size.y > Math::MACHINE_EPSILON_1000)
   {
-    Integration::SceneHolder sceneHolder = Integration::SceneHolder::Get(ownerControl);
-    if(sceneHolder)
+    Dali::Toolkit::Control ownerControl = mOwnerControl.GetHandle();
+    if(ownerControl && ownerControl.GetProperty<bool>(Actor::Property::CONNECTED_TO_SCENE))
     {
-      ret = true;
-
-      // Check visibility of owner control's parents.
-      // TODO : We'd better check the control visibility at core side.
-      // TODO : Window visibility will be consider at dali-core actor side in future.
-      Dali::Actor self = ownerControl;
-      while(self)
+      Integration::SceneHolder sceneHolder = Integration::SceneHolder::Get(ownerControl);
+      if(sceneHolder)
       {
-        if(!self.GetProperty<bool>(Dali::Actor::Property::VISIBLE))
+        ret = true;
+
+        // Check visibility of owner control's parents.
+        // TODO : We'd better check the control visibility at core side.
+        // TODO : Window visibility will be consider at dali-core actor side in future.
+        Dali::Actor self = ownerControl;
+        while(self)
         {
-          ret = false;
-          break;
+          if(!self.GetProperty<bool>(Dali::Actor::Property::VISIBLE))
+          {
+            ret = false;
+            break;
+          }
+          self = self.GetParent();
         }
-        self = self.GetParent();
       }
     }
-  }
 
-  DALI_LOG_INFO(gRenderEffectLogFilter, Debug::Concise, "[RenderEffect:%p] IsActivateValid? [ID:%d][ret:%d]\n", this, ownerControl ? ownerControl.GetProperty<int>(Actor::Property::ID) : -1, ret);
+    DALI_LOG_INFO(gRenderEffectLogFilter, Debug::Concise, "[RenderEffect:%p] IsActivateValid? [ID:%d][ret:%d]\n", this, ownerControl ? ownerControl.GetProperty<int>(Actor::Property::ID) : -1, ret);
+  }
 
   return ret;
 }
@@ -298,12 +300,26 @@ void RenderEffectImpl::OnSizeSet(PropertyNotification& source)
   Dali::Toolkit::Control ownerControl = mOwnerControl.GetHandle();
   if(ownerControl)
   {
-    const auto targetSize = ownerControl.GetCurrentProperty<Vector2>(Actor::Property::SIZE);
-    if(mTargetSize != targetSize && IsActivated())
+    const Vector2 targetSize = mTargetSize;
+    UpdateTargetSize();
+    if(mTargetSize != targetSize)
     {
-      UpdateTargetSize();
-      mCamera.SetPerspectiveProjection(GetTargetSize());
-      OnRefresh();
+      if(IsActivateValid())
+      {
+        if(!IsActivated())
+        {
+          Activate();
+        }
+        else
+        {
+          mCamera.SetPerspectiveProjection(GetTargetSize());
+          OnRefresh();
+        }
+      }
+      else
+      {
+        Deactivate();
+      }
     }
   }
 }