Revert "Refactor RenderEffect" 09/321909/3
authorjmm <j0064423.lee@samsung.com>
Mon, 31 Mar 2025 10:11:28 +0000 (19:11 +0900)
committerjmm <j0064423.lee@samsung.com>
Wed, 2 Apr 2025 08:48:07 +0000 (17:48 +0900)
Change-Id: I8331628216d61ab0f17d2efa177181013c3b4fdd

18 files changed:
automated-tests/src/dali-scene3d/utc-Dali-Panel.cpp
automated-tests/src/dali-scene3d/utc-Dali-SceneView.cpp
automated-tests/src/dali-toolkit-internal/utc-Dali-RenderEffect-internal.cpp
automated-tests/src/dali-toolkit/utc-Dali-Control.cpp
automated-tests/src/dali-toolkit/utc-Dali-RenderEffect.cpp
dali-toolkit/dali-toolkit.h
dali-toolkit/internal/controls/render-effects/blur-effect-impl.cpp
dali-toolkit/internal/controls/render-effects/blur-effect-impl.h
dali-toolkit/internal/controls/render-effects/offscreen-rendering-impl.cpp
dali-toolkit/internal/controls/render-effects/offscreen-rendering-impl.h
dali-toolkit/internal/controls/render-effects/render-effect-impl.cpp
dali-toolkit/internal/controls/render-effects/render-effect-impl.h
dali-toolkit/public-api/controls/control-impl.cpp
dali-toolkit/public-api/controls/render-effects/background-blur-effect.cpp [new file with mode: 0644]
dali-toolkit/public-api/controls/render-effects/background-blur-effect.h [new file with mode: 0644]
dali-toolkit/public-api/controls/render-effects/render-effect.cpp
dali-toolkit/public-api/controls/render-effects/render-effect.h
dali-toolkit/public-api/file.list

index 17da66658efa33206c6e2a32724bd77bce0a74ae..3c4e638c666c4f2332f36fc4049b143af71e8e5b 100644 (file)
@@ -771,7 +771,7 @@ int UtcDaliPanelRenderTaskOrdering(void)
   Control control1 = Control::New();
   control1.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
   control1.SetProperty(Actor::Property::SIZE, Vector2(1.0f, 1.0f));
-  control1.SetRenderEffect(RenderEffect::CreateBackgroundBlurEffect());
+  control1.SetRenderEffect(BackgroundBlurEffect::New());
 
   panel.Add(control1);
 
index 5c51751acfc459d70c35767f2988b861f36effcf..61582f76e83f73f5bd8328dbfc99fa682caa1ddf 100644 (file)
@@ -1671,7 +1671,7 @@ int UtcDaliSceneViewRenderTaskOrdering(void)
   Control control1 = Control::New();
   control1.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
   control1.SetProperty(Actor::Property::SIZE, Vector2(1.0f, 1.0f));
-  control1.SetRenderEffect(RenderEffect::CreateBackgroundBlurEffect());
+  control1.SetRenderEffect(BackgroundBlurEffect::New());
 
   sceneView.Add(control1);
 
index 821572a6b4826426afdcbfb589722865ad5a1919..b9a986c7e9835f785702f810247a0faf8149714a 100644 (file)
@@ -62,11 +62,6 @@ public:
     return handle;
   }
 
-  RenderEffectImplPtr Clone() const override
-  {
-    return New();
-  }
-
   OffScreenRenderable::Type GetOffScreenRenderableType() override
   {
     return OffScreenRenderable::Type::NONE;
@@ -142,7 +137,7 @@ int UtcDaliInternalRenderEffectNewP(void)
   Toolkit::TestRenderEffect testEffect = Toolkit::TestRenderEffect::New();
   DALI_TEST_CHECK(testEffect);
 
-  // Check that effect is not activate yet.
+  // Check that effect is not activated yet.
   Toolkit::Internal::TestRenderEffectImpl& impl = Toolkit::Internal::GetImplementation(testEffect);
   DALI_TEST_EQUALS(impl.mOnActivated, false, TEST_LOCATION);
   DALI_TEST_EQUALS(impl.GetOwnerControl(), Toolkit::Control(), TEST_LOCATION);
@@ -152,16 +147,17 @@ int UtcDaliInternalRenderEffectNewP(void)
 
 int UtcDaliInternalRenderEffectGetOwnerControl01(void)
 {
-  tet_infoline("UtcDaliInternalRenderEffecGetOwnerControl01");
   ToolkitTestApplication application;
+  tet_infoline("UtcDaliInternalRenderEffecGetOwnerControl01");
 
   Toolkit::TestRenderEffect testEffect = Toolkit::TestRenderEffect::New();
   DALI_TEST_CHECK(testEffect);
 
-  // Check that effect prototype is not activated.
-  Toolkit::Internal::TestRenderEffectImpl& prototype = Toolkit::Internal::GetImplementation(testEffect);
-  DALI_TEST_EQUALS(prototype.mOnActivated, false, TEST_LOCATION);
-  DALI_TEST_EQUALS(prototype.GetOwnerControl(), Toolkit::Control(), TEST_LOCATION);
+  // Check that effect is not activated yet.
+  Toolkit::Internal::TestRenderEffectImpl& impl = Toolkit::Internal::GetImplementation(testEffect);
+
+  DALI_TEST_EQUALS(impl.mOnActivated, false, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.GetOwnerControl(), Toolkit::Control(), TEST_LOCATION);
 
   Integration::Scene scene = application.GetScene();
 
@@ -173,45 +169,29 @@ int UtcDaliInternalRenderEffectGetOwnerControl01(void)
   tet_printf("Test effect set, and activate due to control scene on.\n");
   control.SetRenderEffect(testEffect);
 
-  Toolkit::Internal::TestRenderEffectImplPtr impl =
-    dynamic_cast<Toolkit::Internal::TestRenderEffectImpl*>(control.GetRenderEffect().GetObjectPtr());
-
-  { // Check that effect prototype is not activated,
-    DALI_TEST_EQUALS(impl == &prototype, false, TEST_LOCATION);
-
-    DALI_TEST_EQUALS(prototype.mOnActivated, false, TEST_LOCATION);
-    DALI_TEST_EQUALS(prototype.GetOwnerControl(), Toolkit::Control(), TEST_LOCATION);
-
-    // but the effect is set and activated.
-    DALI_TEST_EQUALS(impl->mOnActivated, true, TEST_LOCATION);
-    DALI_TEST_EQUALS(impl->GetOwnerControl(), control, TEST_LOCATION);
-  }
+  DALI_TEST_EQUALS(impl.mOnActivated, true, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.GetOwnerControl(), control, TEST_LOCATION);
 
   control.Unparent();
 
-  {
-    DALI_TEST_EQUALS(impl->mOnActivated, false, TEST_LOCATION);
-    DALI_TEST_EQUALS(impl->GetOwnerControl(), control, TEST_LOCATION);
-  }
+  DALI_TEST_EQUALS(impl.mOnActivated, false, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.GetOwnerControl(), control, TEST_LOCATION);
 
   scene.Add(control);
 
-  {
-    DALI_TEST_EQUALS(impl->mOnActivated, true, TEST_LOCATION);
-    DALI_TEST_EQUALS(impl->GetOwnerControl(), control, TEST_LOCATION);
-  }
+  DALI_TEST_EQUALS(impl.mOnActivated, true, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.GetOwnerControl(), control, TEST_LOCATION);
 
   // Control released.
+
   control.Unparent();
   control.Reset();
 
   tet_printf("Test effect owner control is empty after control destructed.\n");
   DALI_TEST_CHECK(testEffect);
 
-  {
-    DALI_TEST_EQUALS(impl->mOnActivated, false, TEST_LOCATION);
-    DALI_TEST_EQUALS(impl->GetOwnerControl(), Toolkit::Control(), TEST_LOCATION);
-  }
+  DALI_TEST_EQUALS(impl.mOnActivated, false, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.GetOwnerControl(), Toolkit::Control(), TEST_LOCATION);
 
   control = Control::New();
   control.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
@@ -221,17 +201,8 @@ int UtcDaliInternalRenderEffectGetOwnerControl01(void)
   tet_printf("Test effect set again.\n");
   control.SetRenderEffect(testEffect);
 
-  Toolkit::Internal::TestRenderEffectImplPtr impl2 =
-    dynamic_cast<Toolkit::Internal::TestRenderEffectImpl*>(control.GetRenderEffect().GetObjectPtr());
-  {
-    DALI_TEST_EQUALS(impl == impl2, false, TEST_LOCATION);
-
-    DALI_TEST_EQUALS(impl->mOnActivated, false, TEST_LOCATION);
-    DALI_TEST_EQUALS(impl->GetOwnerControl(), Toolkit::Control(), TEST_LOCATION); // may be false?
-
-    DALI_TEST_EQUALS(impl2->mOnActivated, true, TEST_LOCATION);
-    DALI_TEST_EQUALS(impl2->GetOwnerControl(), control, TEST_LOCATION);
-  }
+  DALI_TEST_EQUALS(impl.mOnActivated, true, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.GetOwnerControl(), control, TEST_LOCATION);
 
   END_TEST;
 }
@@ -257,64 +228,45 @@ int UtcDaliInternalRenderEffectGetOwnerControl02(void)
   DALI_TEST_CHECK(testEffect);
 
   // Check that effect is not activate yet.
-  Toolkit::Internal::TestRenderEffectImpl& prototype = Toolkit::Internal::GetImplementation(testEffect);
-  DALI_TEST_EQUALS(prototype.mOnActivated, false, TEST_LOCATION);
-  DALI_TEST_EQUALS(prototype.GetOwnerControl(), Toolkit::Control(), TEST_LOCATION);
+  Toolkit::Internal::TestRenderEffectImpl& impl = Toolkit::Internal::GetImplementation(testEffect);
+  DALI_TEST_EQUALS(impl.mOnActivated, false, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.GetOwnerControl(), Toolkit::Control(), TEST_LOCATION);
 
   tet_printf("Test effect set, and activate due to control scene on.\n");
   control1.SetRenderEffect(testEffect);
 
-  Toolkit::Internal::TestRenderEffectImplPtr impl1 =
-    dynamic_cast<Toolkit::Internal::TestRenderEffectImpl*>(control1.GetRenderEffect().GetObjectPtr());
-
-  DALI_TEST_EQUALS(&prototype == impl1, false, TEST_LOCATION);
-  DALI_TEST_EQUALS(prototype.mOnActivated, false, TEST_LOCATION);
-  DALI_TEST_EQUALS(prototype.GetOwnerControl(), Toolkit::Control(), TEST_LOCATION);
-
-  DALI_TEST_EQUALS(impl1->mOnActivated, true, TEST_LOCATION);
-  DALI_TEST_EQUALS(impl1->GetOwnerControl(), control1, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.mOnActivated, true, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.GetOwnerControl(), control1, TEST_LOCATION);
 
   tet_printf("Test effect set to another control\n");
   control2.SetRenderEffect(testEffect);
 
-  Toolkit::Internal::TestRenderEffectImplPtr impl2 =
-    dynamic_cast<Toolkit::Internal::TestRenderEffectImpl*>(control2.GetRenderEffect().GetObjectPtr());
-  DALI_TEST_EQUALS(impl1 == impl2, false, TEST_LOCATION);
-
-  DALI_TEST_EQUALS(impl2->mOnActivated, true, TEST_LOCATION);
-  DALI_TEST_EQUALS(impl2->GetOwnerControl(), control2, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.mOnActivated, true, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.GetOwnerControl(), control2, TEST_LOCATION);
 
   tet_printf("Test control1 call ClearRenderEffect don't have any effort to control2's effect\n");
   control1.ClearRenderEffect();
 
-  DALI_TEST_EQUALS(impl1->mOnActivated, false, TEST_LOCATION);
-  DALI_TEST_EQUALS(impl1->GetOwnerControl(), Toolkit::Control(), TEST_LOCATION);
-
-  DALI_TEST_EQUALS(impl2->mOnActivated, true, TEST_LOCATION);
-  DALI_TEST_EQUALS(impl2->GetOwnerControl(), control2, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.mOnActivated, true, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.GetOwnerControl(), control2, TEST_LOCATION);
 
   tet_printf("Test control2 call ClearRenderEffect\n");
   control2.ClearRenderEffect();
 
-  DALI_TEST_EQUALS(impl2->mOnActivated, false, TEST_LOCATION);
-  DALI_TEST_EQUALS(impl2->GetOwnerControl(), Toolkit::Control(), TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.mOnActivated, false, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.GetOwnerControl(), Toolkit::Control(), TEST_LOCATION);
 
   tet_printf("Reset control1 effect\n");
   control1.SetRenderEffect(testEffect);
 
-  Toolkit::Internal::TestRenderEffectImplPtr impl3 =
-    dynamic_cast<Toolkit::Internal::TestRenderEffectImpl*>(control1.GetRenderEffect().GetObjectPtr());
-
-  DALI_TEST_EQUALS(impl1 == impl3, false, TEST_LOCATION);
-  DALI_TEST_EQUALS(impl1->mOnActivated, false, TEST_LOCATION);
-  DALI_TEST_EQUALS(impl1->GetOwnerControl(), Toolkit::Control(), TEST_LOCATION);
-
-  DALI_TEST_EQUALS(impl3->mOnActivated, true, TEST_LOCATION);
-  DALI_TEST_EQUALS(impl3->GetOwnerControl(), control1, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.mOnActivated, true, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.GetOwnerControl(), control1, TEST_LOCATION);
 
   tet_printf("Test control1 call SetRenderEffect with empty handle\n");
   control1.SetRenderEffect(Toolkit::RenderEffect());
-  DALI_TEST_CHECK(!control1.GetRenderEffect());
+
+  DALI_TEST_EQUALS(impl.mOnActivated, false, TEST_LOCATION);
+  DALI_TEST_EQUALS(impl.GetOwnerControl(), Toolkit::Control(), TEST_LOCATION);
 
   END_TEST;
 }
index 787b46d42865306cac6506bcf4191a6a81feee28..dc710c3c996da85a2dcc51e815294d117ca2faee 100644 (file)
@@ -1634,7 +1634,7 @@ int UtcDaliControlCornerRadius(void)
 
   application.GetScene().Add(control);
 
-  RenderEffect effect = RenderEffect::CreateBackgroundBlurEffect(0.25f, 50.0f);
+  RenderEffect effect = BackgroundBlurEffect::New(0.25f, 50.0f);
   control.SetRenderEffect(effect);
   control.SetProperty(DevelControl::Property::OFFSCREEN_RENDERING, DevelControl::OffScreenRenderingType::REFRESH_ALWAYS);
 
index 67d0187b6fd35a605887e6897fa9974950c407a0..486cb95405e49d330f8b4553e5e626e429090a3b 100644 (file)
@@ -18,7 +18,7 @@
 #include <dali-toolkit-test-suite-utils.h>
 #include <dali-toolkit/devel-api/controls/control-devel.h>
 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
-#include <dali-toolkit/public-api/controls/render-effects/render-effect.h>
+#include <dali-toolkit/public-api/controls/render-effects/background-blur-effect.h>
 #include <dali/devel-api/adaptor-framework/image-loading.h>
 
 using namespace Dali;
@@ -29,10 +29,10 @@ int UtcDaliRenderEffectNewP(void)
   ToolkitTestApplication application;
   tet_infoline("UtcDaliRenderEffectNewP");
 
-  RenderEffect blurEffect = RenderEffect::CreateBackgroundBlurEffect();
+  RenderEffect blurEffect = BackgroundBlurEffect::New();
   DALI_TEST_CHECK(blurEffect);
 
-  RenderEffect blurEffect2 = RenderEffect::CreateBackgroundBlurEffect(0.5f, 10);
+  RenderEffect blurEffect2 = BackgroundBlurEffect::New(0.5f, 10);
   DALI_TEST_CHECK(blurEffect2);
 
   END_TEST;
@@ -45,10 +45,10 @@ int UtcDaliRenderEffectNewN(void)
 
   tet_printf("Check some invalid parameters clamp internally\n");
 
-  RenderEffect blurEffect  = RenderEffect::CreateBackgroundBlurEffect(-0.5f, 10);
-  RenderEffect blurEffect2 = RenderEffect::CreateBackgroundBlurEffect(10.0f, 10);
-  RenderEffect blurEffect3 = RenderEffect::CreateBackgroundBlurEffect(0.5f, 0);
-  RenderEffect blurEffect4 = RenderEffect::CreateBackgroundBlurEffect(0.5f, 2147483647);
+  RenderEffect blurEffect  = BackgroundBlurEffect::New(-0.5f, 10);
+  RenderEffect blurEffect2 = BackgroundBlurEffect::New(10.0f, 10);
+  RenderEffect blurEffect3 = BackgroundBlurEffect::New(0.5f, 0);
+  RenderEffect blurEffect4 = BackgroundBlurEffect::New(0.5f, 2147483647);
 
   DALI_TEST_CHECK(blurEffect);
   DALI_TEST_CHECK(blurEffect2);
@@ -78,7 +78,7 @@ int UtcDaliRenderEffectActivateP01(void)
   RenderTaskList taskList = scene.GetRenderTaskList();
   DALI_TEST_EQUALS(1u, taskList.GetTaskCount(), TEST_LOCATION);
 
-  childControl.SetRenderEffect(RenderEffect::CreateBackgroundBlurEffect());
+  childControl.SetRenderEffect(BackgroundBlurEffect::New());
 
   taskList = scene.GetRenderTaskList();
   DALI_TEST_EQUALS(4u, taskList.GetTaskCount(), TEST_LOCATION);
@@ -98,7 +98,7 @@ int UtcDaliRenderEffectActivateP02(void)
   control.SetProperty(Actor::Property::SIZE, Vector2(1.0f, 1.0f));
   scene.Add(control);
 
-  RenderEffect blurEffect = RenderEffect::CreateBackgroundBlurEffect();
+  RenderEffect blurEffect = BackgroundBlurEffect::New();
   control.SetRenderEffect(blurEffect);
 
   RenderTaskList taskList = scene.GetRenderTaskList();
@@ -109,9 +109,9 @@ int UtcDaliRenderEffectActivateP02(void)
   control2.SetProperty(Actor::Property::SIZE, Vector2(1.0f, 1.0f));
   scene.Add(control2);
 
-  control2.SetRenderEffect(blurEffect); // Clone effect
+  control2.SetRenderEffect(blurEffect);
   taskList = scene.GetRenderTaskList();
-  DALI_TEST_EQUALS(7u, taskList.GetTaskCount(), TEST_LOCATION);
+  DALI_TEST_EQUALS(4u, taskList.GetTaskCount(), TEST_LOCATION);
 
   END_TEST;
 }
@@ -129,7 +129,7 @@ int UtcDaliRenderEffectDeactivateP(void)
   scene.Add(control);
 
   uint32_t count = control.GetRendererCount();
-  control.SetRenderEffect(RenderEffect::CreateBackgroundBlurEffect());
+  control.SetRenderEffect(BackgroundBlurEffect::New());
 
   RenderTaskList taskList = scene.GetRenderTaskList();
   DALI_TEST_EQUALS(4u, taskList.GetTaskCount(), TEST_LOCATION);
@@ -175,7 +175,7 @@ int UtcDaliRenderEffectActivateDeactivateInplace(void)
   control.SetProperty(Actor::Property::SIZE, Vector2(1.0f, 1.0f));
   scene.Add(control);
 
-  RenderEffect blurEffect = RenderEffect::CreateBackgroundBlurEffect();
+  RenderEffect blurEffect = BackgroundBlurEffect::New();
   control.SetRenderEffect(blurEffect);
 
   RenderTaskList taskList = scene.GetRenderTaskList();
@@ -202,8 +202,7 @@ int UtcDaliRenderEffectReassign(void)
   control.SetProperty(Actor::Property::SIZE, Vector2(1.0f, 1.0f));
   scene.Add(control);
 
-  RenderEffect blurEffect = RenderEffect::CreateBackgroundBlurEffect();
-  control.SetRenderEffect(blurEffect);
+  RenderEffect blurEffect = BackgroundBlurEffect::New();
   control.SetRenderEffect(blurEffect); // Duplicate actions will be ignored
   control.SetRenderEffect(blurEffect); // Duplicate actions will be ignored
   control.SetRenderEffect(blurEffect); // Duplicate actions will be ignored
@@ -222,7 +221,7 @@ int UtcDaliRenderEffectResize(void)
   Control            control = Control::New();
   control.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
   scene.Add(control);
-  control.SetRenderEffect(RenderEffect::CreateBackgroundBlurEffect());
+  control.SetRenderEffect(BackgroundBlurEffect::New());
 
   application.SendNotification();
   application.Render();
@@ -252,7 +251,7 @@ int UtcDaliRenderEffectSynchronizeControlCornerRadius(void)
   blackDimmerMap.Insert(Toolkit::DevelVisual::Property::CORNER_RADIUS, 0.20f);
   blackDimmerMap.Insert(Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::Type::RELATIVE);
   blackDimmerMap.Insert(Toolkit::DevelVisual::Property::CORNER_SQUARENESS, 0.3f);
-  RenderEffect effect = RenderEffect::CreateBackgroundBlurEffect();
+  RenderEffect effect = BackgroundBlurEffect::New(0.4f, 40);
 
   Control control = Control::New();
   DALI_TEST_CHECK(control.GetRendererCount() == 0u);
@@ -305,7 +304,7 @@ int UtcDaliRenderEffectInvalidTargetSize(void)
   control.SetProperty(Actor::Property::SIZE_WIDTH, maxTextureSize + 1000.0f);
   control.SetProperty(Actor::Property::SIZE_HEIGHT, maxTextureSize + 1000.0f);
   scene.Add(control);
-  control.SetRenderEffect(RenderEffect::CreateBackgroundBlurEffect(0.4f, 40));
+  control.SetRenderEffect(BackgroundBlurEffect::New(0.4f, 40));
 
   application.SendNotification();
   application.Render();
@@ -335,7 +334,7 @@ int UtcDaliRenderEffectControlSceneOnAndSceneOff01(void)
   uint32_t count = control.GetRendererCount();
 
   // Add render effect during scene off.
-  control.SetRenderEffect(RenderEffect::CreateBackgroundBlurEffect());
+  control.SetRenderEffect(BackgroundBlurEffect::New());
 
   RenderTaskList taskList = scene.GetRenderTaskList();
 
@@ -390,7 +389,7 @@ int UtcDaliRenderEffectControlSceneOnAndSceneOff02(void)
   scene.Add(control);
 
   // Add render effect during scene on.
-  control.SetRenderEffect(RenderEffect::CreateBackgroundBlurEffect());
+  control.SetRenderEffect(BackgroundBlurEffect::New());
 
   RenderTaskList taskList = scene.GetRenderTaskList();
 
@@ -441,7 +440,7 @@ int UtcDaliRenderEffectControlVisiblityChanged01(void)
 
   // Add render effect during invisible.
   control.SetProperty(Actor::Property::VISIBLE, false);
-  control.SetRenderEffect(RenderEffect::CreateBackgroundBlurEffect());
+  control.SetRenderEffect(BackgroundBlurEffect::New());
 
   RenderTaskList taskList = scene.GetRenderTaskList();
 
@@ -506,7 +505,7 @@ int UtcDaliRenderEffectControlVisiblityChanged02(void)
   scene.Add(control);
 
   // Add render effect during scene on.
-  control.SetRenderEffect(RenderEffect::CreateBackgroundBlurEffect());
+  control.SetRenderEffect(BackgroundBlurEffect::New());
 
   RenderTaskList taskList = scene.GetRenderTaskList();
 
@@ -556,7 +555,7 @@ int UtcDaliRenderEffectRenderTaskOrdering(void)
   tet_printf("render task cnt : %d\n", taskList.GetTaskCount());
 
   // Add render effect during scene on.
-  control1.SetRenderEffect(RenderEffect::CreateBackgroundBlurEffect());
+  control1.SetRenderEffect(BackgroundBlurEffect::New());
 
   tet_printf("render task cnt after set : %d\n", taskList.GetTaskCount());
   DALI_TEST_EQUALS(1, taskList.GetTaskCount(), TEST_LOCATION);
@@ -595,7 +594,7 @@ int UtcDaliRenderEffectRenderTaskOrdering(void)
   tet_printf("render task cnt : %d\n", taskList.GetTaskCount());
 
   // Add render effect during scene on.
-  control2.SetRenderEffect(RenderEffect::CreateBackgroundBlurEffect());
+  control2.SetRenderEffect(BackgroundBlurEffect::New());
 
   tet_printf("render task cnt after set : %d\n", taskList.GetTaskCount());
 
@@ -796,7 +795,7 @@ int UtcDaliRenderEffectReInitialize(void)
   scene.Add(control);
 
   // Add render effect during scene on.
-  control.SetRenderEffect(RenderEffect::CreateBackgroundBlurEffect());
+  control.SetRenderEffect(BackgroundBlurEffect::New());
 
   application.SendNotification();
 
@@ -807,7 +806,7 @@ int UtcDaliRenderEffectReInitialize(void)
   tet_printf("order : %d\n", taskList.GetTask(taskList.GetTaskCount() - 1).GetOrderIndex());
   DALI_TEST_EQUALS(INT32_MIN + 2, taskList.GetTask(taskList.GetTaskCount() - 1).GetOrderIndex(), TEST_LOCATION);
 
-  control.SetRenderEffect(RenderEffect::CreateBackgroundBlurEffect());
+  control.SetRenderEffect(BackgroundBlurEffect::New());
 
   application.SendNotification();
 
@@ -833,7 +832,7 @@ int UtcDaliRenderEffectBlurOnce(void)
   scene.Add(control);
 
   // Add render effect during scene on.
-  control.SetRenderEffect(RenderEffect::CreateBackgroundBlurEffect(0.5f, 20u, true));
+  control.SetRenderEffect(BackgroundBlurEffect::New(0.5f, 20u, true));
 
   application.SendNotification();
 
index d848256c177991efd0e8993d8f09272b87a85c1b..2410ccea658ea9c6eeb5090b9649f021271bd7ad 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_TOOLKIT_H
 
 /*
- * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 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.
@@ -61,6 +61,7 @@
 
 #include <dali-toolkit/public-api/styling/style-manager.h>
 
+#include <dali-toolkit/public-api/controls/render-effects/background-blur-effect.h>
 #include <dali-toolkit/public-api/controls/render-effects/render-effect.h>
 
 #include <dali-toolkit/public-api/text/text-enumerations.h>
index bae12308ff504e4a98f46faf7088034392f5d0ad..17f83bbfaa7ae5cf17aef9ea74dec968b074d087 100644 (file)
@@ -144,13 +144,6 @@ BlurEffectImplPtr BlurEffectImpl::New(float downscaleFactor, uint32_t blurRadius
   return handle;
 }
 
-RenderEffectImplPtr BlurEffectImpl::Clone() const
-{
-  BlurEffectImplPtr blurEffectImpl = new BlurEffectImpl(mDownscaleFactor, mPixelRadius, mBlurOnce, mIsBackground);
-  blurEffectImpl->Initialize();
-  return RenderEffectImplPtr(blurEffectImpl);
-}
-
 OffScreenRenderable::Type BlurEffectImpl::GetOffScreenRenderableType()
 {
   return mSkipBlur ? OffScreenRenderable::NONE : OffScreenRenderable::BACKWARD;
@@ -186,16 +179,6 @@ void BlurEffectImpl::OnInitialize()
     return;
   }
 
-  // Create CameraActors
-  {
-    mRenderDownsampledCamera = CameraActor::New();
-    mRenderDownsampledCamera.SetInvertYAxis(true);
-    mRenderDownsampledCamera.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
-    mRenderDownsampledCamera.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
-    mRenderDownsampledCamera.SetType(Dali::Camera::FREE_LOOK);
-    mInternalRoot.Add(mRenderDownsampledCamera);
-  }
-
   // Calculate bell curve width
   {
     const float epsilon     = 1e-2f / (mDownscaledPixelRadius * 2);
@@ -267,6 +250,15 @@ void BlurEffectImpl::OnActivate()
   uint32_t downsampledHeight = std::max(static_cast<uint32_t>(size.height * mDownscaleFactor), 1u);
 
   // Set size
+  if(!mRenderDownsampledCamera)
+  {
+    mRenderDownsampledCamera = CameraActor::New();
+    mRenderDownsampledCamera.SetInvertYAxis(true);
+    mRenderDownsampledCamera.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+    mRenderDownsampledCamera.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
+    mRenderDownsampledCamera.SetType(Dali::Camera::FREE_LOOK);
+    mInternalRoot.Add(mRenderDownsampledCamera);
+  }
   mRenderDownsampledCamera.SetPerspectiveProjection(Size(downsampledWidth, downsampledHeight));
 
   mHorizontalBlurActor.SetProperty(Actor::Property::SIZE, Vector2(downsampledWidth, downsampledHeight));
index 952f896bd88462f118098903f395abdda6d37ae4..5040805c0662f1fc228d1f9ecf86fc71ec7ffdac 100644 (file)
@@ -30,6 +30,7 @@
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/internal/controls/render-effects/render-effect-impl.h>
+#include <dali-toolkit/public-api/controls/render-effects/background-blur-effect.h>
 
 namespace Dali
 {
@@ -69,11 +70,6 @@ public:
    */
   static BlurEffectImplPtr New(float downscaleFactor, uint32_t blurRadius, bool blurOnce, bool isBackground);
 
-  /**
-   * @copydoc Toolkit::Intenral::RenderEffectImpl::Clone
-   */
-  RenderEffectImplPtr Clone() const override;
-
   /**
    * @copydoc Toolkit::Internal::RenderEffectImpl::GetOffScreenRenderableType
    */
@@ -212,6 +208,19 @@ private:
   bool mIsBackground : 1;
 };
 } // namespace Internal
+
+inline Toolkit::Internal::BlurEffectImpl& GetImplementation(Toolkit::BackgroundBlurEffect& obj)
+{
+  BaseObject& handle = obj.GetBaseObject();
+  return static_cast<Toolkit::Internal::BlurEffectImpl&>(handle);
+}
+
+inline const Toolkit::Internal::BlurEffectImpl& GetImplementation(const Toolkit::BackgroundBlurEffect& obj)
+{
+  const BaseObject& handle = obj.GetBaseObject();
+  return static_cast<const Toolkit::Internal::BlurEffectImpl&>(handle);
+}
+
 } // namespace Toolkit
 } // namespace Dali
 
index 23217b524ccf397fbb5452829fb06a02d1a406b6..1978fbd6b06a3fd921a0f092d8835843d1b00afb 100644 (file)
@@ -54,12 +54,6 @@ void OffScreenRenderingImpl::SetType(DevelControl::OffScreenRenderingType type)
   }
 }
 
-RenderEffectImplPtr OffScreenRenderingImpl::Clone() const
-{
-  DALI_LOG_ERROR("Cloning offscreen rendering is not allowed.\n");
-  return RenderEffectImplPtr();
-}
-
 OffScreenRenderable::Type OffScreenRenderingImpl::GetOffScreenRenderableType()
 {
   return OffScreenRenderable::Type::FORWARD;
index 3e986aa86903a08b82560717ced05fc41b1bccbb..29cd2c0de847489f393a2c3809e9aa06aca4efc9 100644 (file)
@@ -59,8 +59,6 @@ public:
    */
   void SetType(DevelControl::OffScreenRenderingType type);
 
-  // @copydoc Dali::Toolkit::Internal::RenderEffectImpl::Clone
-  RenderEffectImplPtr Clone() const override;
   // @copydoc Dali::Toolkit::Internal::RenderEffectImpl::GetOffScreenRenderableType
   OffScreenRenderable::Type GetOffScreenRenderableType() override;
   // @copydoc Dali::Toolkit::Internal::RenderEffectImpl::GetOffScreenRenderTasks
index 9c85cb1ee9a2c3570fc740691145e9fe6e05ef70..3c77f68f5695c22af9f29aaad7e37f5074b48e05 100644 (file)
@@ -125,15 +125,6 @@ bool RenderEffectImpl::IsActivated() const
 
 void RenderEffectImpl::Initialize()
 {
-  if(!mCamera)
-  {
-    mCamera = CameraActor::New();
-    mCamera.SetInvertYAxis(true);
-    mCamera.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
-    mCamera.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
-    mCamera.SetType(Dali::Camera::FREE_LOOK);
-  }
-
   if(!mRenderer)
   {
     mRenderer = CreateRenderer(SHADER_RENDER_EFFECT_VERT, SHADER_RENDER_EFFECT_FRAG);
@@ -191,8 +182,15 @@ void RenderEffectImpl::Activate()
     }
     mPlacementSceneHolder = sceneHolder;
 
-    Vector2 size = GetTargetSize();
-    mCamera.SetPerspectiveProjection(size);
+    if(!mCamera)
+    {
+      mCamera = CameraActor::New();
+      mCamera.SetInvertYAxis(true);
+      mCamera.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+      mCamera.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER);
+      mCamera.SetType(Dali::Camera::FREE_LOOK);
+    }
+    mCamera.SetPerspectiveProjection(GetTargetSize());
     ownerControl.Add(mCamera);
 
     // Activate logic for subclass.
@@ -225,7 +223,10 @@ void RenderEffectImpl::Deactivate()
     // Deactivate logic for subclass.
     OnDeactivate();
 
-    mCamera.Unparent();
+    if(mCamera)
+    {
+      mCamera.Unparent();
+    }
   }
 }
 
index acd1b946bd7596ee3ee632d40256b48308b17cb8..d352cbebf0e3303e7d19ad100a2e6163cd5161bd 100644 (file)
@@ -62,12 +62,6 @@ public:
    */
   void SetCornerConstants(Property::Map map);
 
-  /**
-   * @brief Clones current instance.
-   * @return Clone implementation
-   */
-  virtual RenderEffectImplPtr Clone() const = 0;
-
   /**
    * @brief Retrieves OffScreenRenderableType of this RenderEffect.
    *
index 003f0e501376876a67523b2fb02525ba15ed4c06..e4a8ab85e1b4318afcdf2ee7310695ac3986e823 100644 (file)
@@ -171,21 +171,19 @@ void Control::ClearBackground()
 
 void Control::SetRenderEffect(Toolkit::RenderEffect effect)
 {
+  ClearRenderEffect();
+
   if(effect)
   {
     Internal::RenderEffectImpl* object = dynamic_cast<Internal::RenderEffectImpl*>(effect.GetObjectPtr());
-    DALI_ASSERT_ALWAYS(object && "Not a valid RenderEffect set.");
-
-    ClearRenderEffect();
-
-    RenderEffectImplPtr clone = object->Clone();
+    DALI_ASSERT_ALWAYS(object && "Given render effect is not valid.");
 
-    SetOffScreenRenderableType(clone->GetOffScreenRenderableType());
+    SetOffScreenRenderableType(object->GetOffScreenRenderableType());
 
     Dali::Toolkit::Control ownerControl(GetOwner());
-    clone->SetOwnerControl(ownerControl);
+    object->SetOwnerControl(ownerControl);
 
-    mImpl->mRenderEffect = clone;
+    mImpl->mRenderEffect = object;
   }
   else
   {
diff --git a/dali-toolkit/public-api/controls/render-effects/background-blur-effect.cpp b/dali-toolkit/public-api/controls/render-effects/background-blur-effect.cpp
new file mode 100644 (file)
index 0000000..7fc9b52
--- /dev/null
@@ -0,0 +1,47 @@
+
+/*
+ * Copyright (c) 2025 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+// CLASS HEADER
+#include <dali-toolkit/public-api/controls/render-effects/background-blur-effect.h>
+// INTERNAL INCLUDES
+#include <dali-toolkit/internal/controls/render-effects/blur-effect-impl.h>
+namespace Dali
+{
+namespace Toolkit
+{
+BackgroundBlurEffect::BackgroundBlurEffect() = default;
+BackgroundBlurEffect::BackgroundBlurEffect(const BackgroundBlurEffect& handle)
+: RenderEffect(handle)
+{
+}
+BackgroundBlurEffect::BackgroundBlurEffect(Internal::BlurEffectImpl* blurEffectImpl)
+: RenderEffect(blurEffectImpl)
+{
+}
+BackgroundBlurEffect::~BackgroundBlurEffect() = default;
+BackgroundBlurEffect BackgroundBlurEffect::New()
+{
+  Internal::BlurEffectImplPtr internal = Internal::BlurEffectImpl::New(true);
+  return BackgroundBlurEffect(internal.Get());
+}
+BackgroundBlurEffect BackgroundBlurEffect::New(float downscaleFactor, uint32_t blurRadius, bool blurOnce)
+{
+  Internal::BlurEffectImplPtr internal = Internal::BlurEffectImpl::New(downscaleFactor, blurRadius, blurOnce, true);
+  return BackgroundBlurEffect(internal.Get());
+}
+} // namespace Toolkit
+} // namespace Dali
diff --git a/dali-toolkit/public-api/controls/render-effects/background-blur-effect.h b/dali-toolkit/public-api/controls/render-effects/background-blur-effect.h
new file mode 100644 (file)
index 0000000..6f675f3
--- /dev/null
@@ -0,0 +1,95 @@
+#ifndef DALI_TOOLKIT_BACKGROUND_BLUR_EFFECT_H
+#define DALI_TOOLKIT_BACKGROUND_BLUR_EFFECT_H
+/*
+ * Copyright (c) 2025 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+// INTERNAL INCLUDES
+#include <dali-toolkit/public-api/controls/render-effects/render-effect.h>
+namespace Dali
+{
+namespace Toolkit
+{
+namespace Internal DALI_INTERNAL
+{
+class BlurEffectImpl;
+} // namespace DALI_INTERNAL
+/**
+ * @brief BackgroundBlurEffect is a visual effect that blurs owner control's background.
+ * This class is a concrete class from RenderEffect interface.
+ * Add this effect to a control, clear manually to deactivate.
+ *
+ * Toolkit::Control control = Toolkit::Control::New();
+ * parent.Add(control);
+ * control.SetRenderEffect(BackgroundBlurEffect::New()); // Activate
+ * ...
+ * control.ClearRenderEffect(); // Deactivate
+ *
+ * Note that tree hierarchy matters for BackgroundBlurEffect. You should determine "what is the background".
+ * Add() should preceed SetRenderEffect(), and the effect cannot have multiple owner controls.
+ *
+ * @SINCE_2_3.28
+ */
+class DALI_TOOLKIT_API BackgroundBlurEffect : public RenderEffect
+{
+public:
+  /**
+   * @brief Creates an initialized BackgroundBlurEffect, using default settings. The default settings are:
+   *
+   * downscaleFactor = 0.4f
+   * pixelRadius = 5u
+   *
+   * @SINCE_2_3.28
+   * @return A handle to a newly allocated Dali resource
+   */
+  static BackgroundBlurEffect New();
+  /**
+   * @brief Creates an initialized BackgroundBlurEffect.
+   * @param[in] downscaleFactor This value should reside in the range [0.0, 1.0].
+   * @param[in] blurRadius The radius of Gaussian kernel.
+   * @param[in] blurOnce Whether to blur once or always. Default is false(always).
+   * @SINCE_2_3.28
+   * @return A handle to a newly allocated Dali resource
+   */
+  static BackgroundBlurEffect New(float downscaleFactor, uint32_t blurRadius, bool blurOnce = false);
+  /**
+   * @brief Creates an uninitialized blur effect.
+   * @SINCE_2_3.28
+   */
+  BackgroundBlurEffect();
+  /**
+   * @brief Copy constructor.
+   * @SINCE_2_3.28
+   */
+  BackgroundBlurEffect(const BackgroundBlurEffect& handle);
+  /**
+  * @brief Destructor
+  * @SINCE_2_3.28
+  */
+  ~BackgroundBlurEffect();
+
+public: // Not intended for use by Application developers
+  ///@cond internal
+  /**
+   * @brief Creates a handle using the Toolkit::Internal implementation.
+   * @SINCE_2_3.28
+   * @param[in]  blurEffectImpl The UI Control implementation.
+   */
+  explicit DALI_INTERNAL BackgroundBlurEffect(Internal::BlurEffectImpl* blurEffectImpl);
+  ///@endcond
+};
+} // namespace Toolkit
+} // namespace Dali
+#endif //DALI_TOOLKIT_BACKGROUND_BLUR_EFFECT_H
index 3dd0330f9272e520f847ff220670c2c421f1614b..2884ce274d1e24433e03bb439336cb718f008e3e 100644 (file)
@@ -19,7 +19,6 @@
 #include <dali-toolkit/public-api/controls/render-effects/render-effect.h>
 
 // INTERNAL INCLUDES
-#include <dali-toolkit/internal/controls/render-effects/blur-effect-impl.h>
 #include <dali-toolkit/internal/controls/render-effects/render-effect-impl.h>
 
 namespace Dali
@@ -36,16 +35,5 @@ RenderEffect::RenderEffect(Internal::RenderEffectImpl* renderEffectImpl)
 {
 }
 
-RenderEffect RenderEffect::CreateBackgroundBlurEffect()
-{
-  Internal::BlurEffectImplPtr internal = Internal::BlurEffectImpl::New(true);
-  return RenderEffect(internal.Get());
-}
-
-RenderEffect RenderEffect::CreateBackgroundBlurEffect(float downscaleFactor, uint32_t blurRadius, bool blurOnce)
-{
-  Internal::BlurEffectImplPtr internal = Internal::BlurEffectImpl::New(downscaleFactor, blurRadius, blurOnce, true);
-  return RenderEffect(internal.Get());
-}
 } // namespace Toolkit
 } // namespace Dali
index 57a11ccc8b302dd85d43fcf5018d3a172c1d67f3..f7194c10062d70b31588c2b27b6586533139147b 100644 (file)
@@ -70,21 +70,6 @@ public:
    */
   RenderEffect(const RenderEffect& handle);
 
-  /**
-   * @brief Creates background blur effect with default parameters.
-   * @SINCE_2_4.1
-   */
-  static RenderEffect CreateBackgroundBlurEffect();
-
-  /**
-   * @brief Creates background blur effect.
-   * @param[in] downscaleFactor Input texture downscaler for better performance.
-   * @param[in] blurRadius Gaussian kernel size.
-   * @param[in] blurOnce Whether to perform blur once or always. Default is false(always).
-   * @SINCE_2_4.1
-   */
-  static RenderEffect CreateBackgroundBlurEffect(float downscaleFactor, uint32_t blurRadius, bool blurOnce = false);
-
 public: // Not intended for Application developers
   ///@cond internal
   /**
index 4e0acdd53800da9ca9a8bd13acf92cc8ca631719..951ad525f5cc2f45dcb06ad162a8539912f967b2 100644 (file)
@@ -15,6 +15,7 @@ SET( public_api_src_files
   ${public_api_src_dir}/controls/model3d-view/model3d-view.cpp
   ${public_api_src_dir}/controls/progress-bar/progress-bar.cpp
   ${public_api_src_dir}/controls/render-effects/render-effect.cpp
+  ${public_api_src_dir}/controls/render-effects/background-blur-effect.cpp
   ${public_api_src_dir}/controls/scrollable/item-view/default-item-layout.cpp
   ${public_api_src_dir}/controls/scrollable/item-view/item-layout.cpp
   ${public_api_src_dir}/controls/scrollable/item-view/item-view.cpp
@@ -107,6 +108,7 @@ SET( public_api_progress_bar_header_files
 
 SET( public_api_render_effects_header_files
   ${public_api_src_dir}/controls/render-effects/render-effect.h
+  ${public_api_src_dir}/controls/render-effects/background-blur-effect.h
 )
 
 SET( public_api_scrollable_header_files