Merge "Fix gradient shader + Remove comment about BorderlineColor" into devel/master
authorEunki Hong <eunkiki.hong@samsung.com>
Fri, 10 Sep 2021 04:01:49 +0000 (04:01 +0000)
committerGerrit Code Review <gerrit@review>
Fri, 10 Sep 2021 04:01:49 +0000 (04:01 +0000)
24 files changed:
automated-tests/src/dali-toolkit/CMakeLists.txt
automated-tests/src/dali-toolkit/utc-Dali-ScaleTransition.cpp [new file with mode: 0755]
automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp
dali-toolkit/dali-toolkit.h
dali-toolkit/internal/file.list
dali-toolkit/internal/transition/scale-transition-impl.cpp [new file with mode: 0644]
dali-toolkit/internal/transition/scale-transition-impl.h [new file with mode: 0644]
dali-toolkit/internal/visuals/animated-image/animated-image-visual.cpp
dali-toolkit/internal/visuals/animated-image/animated-image-visual.h
dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp
dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h
dali-toolkit/internal/visuals/color/color-visual.cpp
dali-toolkit/internal/visuals/color/color-visual.h
dali-toolkit/internal/visuals/gradient/gradient-visual.cpp
dali-toolkit/internal/visuals/gradient/gradient-visual.h
dali-toolkit/internal/visuals/image/image-visual.cpp
dali-toolkit/internal/visuals/image/image-visual.h
dali-toolkit/internal/visuals/svg/svg-visual.cpp
dali-toolkit/internal/visuals/svg/svg-visual.h
dali-toolkit/internal/visuals/visual-base-impl.h
dali-toolkit/public-api/file.list
dali-toolkit/public-api/transition/scale-transition.cpp [new file with mode: 0644]
dali-toolkit/public-api/transition/scale-transition.h [new file with mode: 0644]
dali-toolkit/public-api/transition/slide-transition.h

index c3ad8c8..8990a0f 100755 (executable)
@@ -35,6 +35,7 @@ SET(TC_SOURCES
   utc-Dali-ScrollView.cpp
   utc-Dali-ShaderEffects.cpp
   utc-Dali-ShadowView.cpp
+  utc-Dali-ScaleTransition.cpp
   utc-Dali-SlideTransition.cpp
   utc-Dali-Slider.cpp
   utc-Dali-TableView.cpp
diff --git a/automated-tests/src/dali-toolkit/utc-Dali-ScaleTransition.cpp b/automated-tests/src/dali-toolkit/utc-Dali-ScaleTransition.cpp
new file mode 100755 (executable)
index 0000000..5d2b40e
--- /dev/null
@@ -0,0 +1,283 @@
+/*
+ * Copyright (c) 2021 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.
+ *
+ */
+
+#include <iostream>
+#include <stdlib.h>
+#include <dali-toolkit-test-suite-utils.h>
+#include <dali-toolkit/dali-toolkit.h>
+#include <dali/devel-api/actors/actor-devel.h>
+#include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
+#include <dali-toolkit/public-api/transition/transition-set.h>
+#include <dali-toolkit/public-api/transition/transition-base.h>
+#include <dali-toolkit/public-api/transition/scale-transition.h>
+
+using namespace Dali;
+using namespace Dali::Toolkit;
+
+// Functor to test whether a Finish signal is emitted
+struct TransitionFinishCheck
+{
+  TransitionFinishCheck(bool& signalReceived)
+  : mSignalReceived(signalReceived)
+  {
+  }
+
+  void operator()(TransitionSet& transitionSet)
+  {
+    mSignalReceived = true;
+  }
+
+  void Reset()
+  {
+    mSignalReceived = false;
+  }
+
+  void CheckSignalReceived()
+  {
+    if(!mSignalReceived)
+    {
+      tet_printf("Expected Finish signal was not received\n");
+      tet_result(TET_FAIL);
+    }
+    else
+    {
+      tet_result(TET_PASS);
+    }
+  }
+
+  void CheckSignalNotReceived()
+  {
+    if(mSignalReceived)
+    {
+      tet_printf("Unexpected Finish signal was received\n");
+      tet_result(TET_FAIL);
+    }
+    else
+    {
+      tet_result(TET_PASS);
+    }
+  }
+
+  bool& mSignalReceived; // owned by individual tests
+};
+
+int UtcDaliScaleTransitionSetGetProperty(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("UtcDaliScaleTransitionSetGetProperty");
+
+  Control control = Control::New();
+
+  ScaleTransition scale = ScaleTransition::New(control, 0.5f, TimePeriod(-0.5f, -0.5f));
+
+  Vector2 scaleFactor = scale.GetScaleFactor();
+  DALI_TEST_EQUALS(0.5f, scaleFactor.x, TEST_LOCATION);
+  DALI_TEST_EQUALS(0.5f, scaleFactor.y, TEST_LOCATION);
+
+
+  scale.SetScaleFactor(Vector2(1.5f, 1.2f));
+  scaleFactor = scale.GetScaleFactor();
+  DALI_TEST_EQUALS(1.5f, scaleFactor.x, TEST_LOCATION);
+  DALI_TEST_EQUALS(1.2f, scaleFactor.y, TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliScaleTransitionWithOffScene(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("UtcDaliScaleTransitionWithOffScene");
+
+  Control control = Control::New();
+  control.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  control.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+  control.SetProperty(Actor::Property::SIZE, Vector3(150, 150, 0));
+  Property::Map controlProperty;
+  controlProperty.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::COLOR);
+  controlProperty.Insert(Toolkit::ColorVisual::Property::MIX_COLOR, Vector4(1.0f, 0.0f, 0.0f, 1.0f));
+  control.SetProperty(Toolkit::Control::Property::BACKGROUND, controlProperty);
+
+  application.SendNotification();
+  application.Render(20);
+
+  Vector3 currentScale = control.GetCurrentProperty<Vector3>(Actor::Property::SCALE);
+  DALI_TEST_CHECK(currentScale.x == 1.0f);
+  DALI_TEST_CHECK(currentScale.y == 1.0f);
+
+  ScaleTransition scale = ScaleTransition::New(control, 0.5f, TimePeriod(0.5f));
+  scale.SetAppearingTransition(false);
+  TransitionSet transitionSet = TransitionSet::New();
+  transitionSet.AddTransition(scale);
+  transitionSet.Play();
+
+  bool signalReceived(false);
+  TransitionFinishCheck finishCheck(signalReceived);
+  transitionSet.FinishedSignal().Connect(&application, finishCheck);
+
+  application.SendNotification();
+  application.Render(400);
+
+  // We didn't expect the animation to finish yet
+  application.SendNotification();
+  finishCheck.CheckSignalNotReceived();
+
+  currentScale = control.GetCurrentProperty<Vector3>(Actor::Property::SCALE);
+  DALI_TEST_CHECK(currentScale.x == 1.0f);
+  DALI_TEST_CHECK(currentScale.y == 1.0f);
+
+  application.SendNotification();
+  application.Render(200);
+
+  // We did expect the animation to finish
+  application.SendNotification();
+  finishCheck.CheckSignalReceived();
+
+  application.SendNotification();
+  application.Render(20);
+
+  currentScale = control.GetCurrentProperty<Vector3>(Actor::Property::SCALE);
+  DALI_TEST_CHECK(currentScale.x == 1.0f);
+  DALI_TEST_CHECK(currentScale.y == 1.0f);
+
+  END_TEST;
+}
+
+int UtcDaliScaleTransitionDisappearing(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("UtcDaliScaleTransitionDisappearing");
+
+  Control control = Control::New();
+  control.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  control.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+  control.SetProperty(Actor::Property::SIZE, Vector3(100, 100, 0));
+  control.SetProperty(Actor::Property::OPACITY, 1.0f);
+  Property::Map controlProperty;
+  controlProperty.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::COLOR);
+  controlProperty.Insert(Toolkit::ColorVisual::Property::MIX_COLOR, Vector4(1.0f, 0.0f, 0.0f, 1.0f));
+  control.SetProperty(Toolkit::Control::Property::BACKGROUND, controlProperty);
+
+  application.GetScene().Add(control);
+
+  application.SendNotification();
+  application.Render(20);
+
+  Vector3 currentScale = control.GetCurrentProperty<Vector3>(Actor::Property::SCALE);
+  DALI_TEST_CHECK(currentScale.x == 1.0f);
+  DALI_TEST_CHECK(currentScale.y == 1.0f);
+
+  ScaleTransition scale = ScaleTransition::New(control, 0.5f, TimePeriod(0.5f));
+  scale.SetAppearingTransition(false);
+
+  TransitionSet transitionSet = TransitionSet::New();
+  transitionSet.AddTransition(scale);
+  transitionSet.Play();
+
+  bool signalReceived(false);
+  TransitionFinishCheck finishCheck(signalReceived);
+  transitionSet.FinishedSignal().Connect(&application, finishCheck);
+
+  application.SendNotification();
+  application.Render(400);
+
+  // We didn't expect the animation to finish yet
+  application.SendNotification();
+  finishCheck.CheckSignalNotReceived();
+
+  currentScale = control.GetCurrentProperty<Vector3>(Actor::Property::SCALE);
+  DALI_TEST_CHECK(currentScale.x > 0.55f && currentScale.x < 0.65f);
+  DALI_TEST_CHECK(currentScale.y > 0.55f && currentScale.y < 0.65f);
+
+  application.SendNotification();
+  application.Render(200);
+
+  // We did expect the animation to finish
+  application.SendNotification();
+  finishCheck.CheckSignalReceived();
+
+  application.SendNotification();
+  application.Render(20);
+
+  // Property is reset after animation.
+  currentScale = control.GetCurrentProperty<Vector3>(Actor::Property::SCALE);
+  DALI_TEST_CHECK(currentScale.x == 1.0f);
+  DALI_TEST_CHECK(currentScale.y == 1.0f);
+
+  END_TEST;
+}
+
+int UtcDaliScaleTransitionAppearing(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("UtcDaliScaleTransitionAppearing");
+
+  Control control = Control::New();
+  control.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+  control.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+  control.SetProperty(Actor::Property::SIZE, Vector3(100, 100, 0));
+  control.SetProperty(Actor::Property::OPACITY, 1.0f);
+  Property::Map controlProperty;
+  controlProperty.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::COLOR);
+  controlProperty.Insert(Toolkit::ColorVisual::Property::MIX_COLOR, Vector4(1.0f, 0.0f, 0.0f, 1.0f));
+  control.SetProperty(Toolkit::Control::Property::BACKGROUND, controlProperty);
+
+  application.GetScene().Add(control);
+
+  application.SendNotification();
+  application.Render(20);
+
+  Vector3 currentScale = control.GetCurrentProperty<Vector3>(Actor::Property::SCALE);
+  DALI_TEST_CHECK(currentScale.x == 1.0f);
+  DALI_TEST_CHECK(currentScale.y == 1.0f);
+
+  ScaleTransition scale = ScaleTransition::New(control, Vector2(2.0, 0.5), TimePeriod(0.5f));
+  scale.SetAppearingTransition(true);
+  TransitionSet transitionSet = TransitionSet::New();
+  transitionSet.AddTransition(scale);
+  transitionSet.Play();
+
+  bool signalReceived(false);
+  TransitionFinishCheck finishCheck(signalReceived);
+  transitionSet.FinishedSignal().Connect(&application, finishCheck);
+
+  application.SendNotification();
+  application.Render(400);
+
+  // We didn't expect the animation to finish yet
+  application.SendNotification();
+  finishCheck.CheckSignalNotReceived();
+
+  currentScale = control.GetCurrentProperty<Vector3>(Actor::Property::SCALE);
+  DALI_TEST_CHECK(currentScale.x > 1.1f && currentScale.x < 1.3f);
+  DALI_TEST_CHECK(currentScale.y > 0.85f && currentScale.y < 0.95f);
+
+  application.SendNotification();
+  application.Render(200);
+
+  // We did expect the animation to finish
+  application.SendNotification();
+  finishCheck.CheckSignalReceived();
+
+  application.SendNotification();
+  application.Render(20);
+
+  currentScale = control.GetCurrentProperty<Vector3>(Actor::Property::SCALE);
+  DALI_TEST_CHECK(currentScale.x == 1.0f);
+  DALI_TEST_CHECK(currentScale.y == 1.0f);
+
+  END_TEST;
+}
index 5864554..bd389ad 100644 (file)
@@ -3663,7 +3663,6 @@ int UtcDaliSvgVisualCustomShader(void)
 
 int UtcDaliVisualRoundedCorner(void)
 {
-#ifdef OLD_GRAPHICS_TEST
   ToolkitTestApplication application;
   tet_infoline( "UtcDaliVisualRoundedCorner" );
 
@@ -3738,8 +3737,11 @@ int UtcDaliVisualRoundedCorner(void)
     application.SendNotification();
     application.Render();
 
+#ifdef OLD_GRAPHICS_TEST
+    // Currently test with multiple program doesn't work well. will fix another day
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "cornerRadius", Vector4(cornerRadius, cornerRadius, cornerRadius, cornerRadius) ), true, TEST_LOCATION );
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadiusPolicy", Toolkit::Visual::Transform::Policy::ABSOLUTE ), true, TEST_LOCATION );
+#endif
   }
 
   // color visual 2
@@ -3770,8 +3772,11 @@ int UtcDaliVisualRoundedCorner(void)
     application.SendNotification();
     application.Render();
 
+#ifdef OLD_GRAPHICS_TEST
+    // Currently test with multiple program doesn't work well. will fix another day
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadiusPolicy", Toolkit::Visual::Transform::Policy::RELATIVE ), true, TEST_LOCATION );
+#endif
   }
 
   // color visual 3 - invalid value
@@ -3802,9 +3807,12 @@ int UtcDaliVisualRoundedCorner(void)
     application.SendNotification();
     application.Render();
 
+#ifdef OLD_GRAPHICS_TEST
+    // Currently test with multiple program doesn't work well. will fix another day
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
     // Default corner radius policy is absolute.
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadiusPolicy", Toolkit::Visual::Transform::Policy::ABSOLUTE ), true, TEST_LOCATION );
+#endif
   }
 
   // gradient visual
@@ -3849,9 +3857,12 @@ int UtcDaliVisualRoundedCorner(void)
     application.SendNotification();
     application.Render();
 
+#ifdef OLD_GRAPHICS_TEST
+    // Currently test with multiple program doesn't work well. will fix another day
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "cornerRadius", Vector4(cornerRadius, cornerRadius, cornerRadius, cornerRadius) ), true, TEST_LOCATION );
     // Default corner radius policy is absolute.
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadiusPolicy", Toolkit::Visual::Transform::Policy::ABSOLUTE ), true, TEST_LOCATION );
+#endif
   }
 
   // animated image visual
@@ -3885,8 +3896,11 @@ int UtcDaliVisualRoundedCorner(void)
     application.SendNotification();
     application.Render();
 
+#ifdef OLD_GRAPHICS_TEST
+    // Currently test with multiple program doesn't work well. will fix another day
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadiusPolicy", Toolkit::Visual::Transform::Policy::ABSOLUTE ), true, TEST_LOCATION );
+#endif
   }
 
   // vector image visual
@@ -3918,9 +3932,12 @@ int UtcDaliVisualRoundedCorner(void)
     application.SendNotification();
     application.Render();
 
+#ifdef OLD_GRAPHICS_TEST
+    // Currently test with multiple program doesn't work well. will fix another day
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
     // Default corner radius policy is absolute.
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadiusPolicy", Toolkit::Visual::Transform::Policy::ABSOLUTE ), true, TEST_LOCATION );
+#endif
   }
 
   // animated vector image visual
@@ -3954,19 +3971,18 @@ int UtcDaliVisualRoundedCorner(void)
     application.SendNotification();
     application.Render();
 
+#ifdef OLD_GRAPHICS_TEST
+    // Currently test with multiple program doesn't work well. will fix another day
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "cornerRadius", Vector4(cornerRadius, cornerRadius, cornerRadius, cornerRadius) ), true, TEST_LOCATION );
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadiusPolicy", Toolkit::Visual::Transform::Policy::RELATIVE ), true, TEST_LOCATION );
-  }
-#else
-  tet_result(TET_PASS);
 #endif
+  }
 
   END_TEST;
 }
 
 int UtcDaliVisualBorderline(void)
 {
-#ifdef OLD_GRAPHICS_TEST
   ToolkitTestApplication application;
   tet_infoline( "UtcDaliVisualBorderline" );
 
@@ -4058,10 +4074,13 @@ int UtcDaliVisualBorderline(void)
     application.SendNotification();
     application.Render();
 
+#ifdef OLD_GRAPHICS_TEST
+    // Currently test with multiple program doesn't work well. will fix another day
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "borderlineWidth", borderlineWidth ), true, TEST_LOCATION );
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "borderlineColor", borderlineColor ), true, TEST_LOCATION );
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "borderlineOffset", borderlineOffset ), true, TEST_LOCATION );
+#endif
   }
 
   // color visual 2, default color, default offset
@@ -4091,11 +4110,14 @@ int UtcDaliVisualBorderline(void)
     application.SendNotification();
     application.Render();
 
+#ifdef OLD_GRAPHICS_TEST
+    // Currently test with multiple program doesn't work well. will fix another day
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "borderlineWidth", borderlineWidth ), true, TEST_LOCATION );
     // Default borderline color is BLACK.
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "borderlineColor", Color::BLACK ), true, TEST_LOCATION );
     // Default borderline offset is 0.0f.
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "borderlineOffset", 0.0f ), true, TEST_LOCATION );
+#endif
   }
 
   // color visual 3, offset not [-1.0 ~ 1.0], but uniform value is same anyway
@@ -4129,10 +4151,13 @@ int UtcDaliVisualBorderline(void)
     application.SendNotification();
     application.Render();
 
+#ifdef OLD_GRAPHICS_TEST
+    // Currently test with multiple program doesn't work well. will fix another day
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "borderlineWidth", borderlineWidth ), true, TEST_LOCATION );
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "borderlineColor", borderlineColor ), true, TEST_LOCATION );
     // NOTE : borderlineOffset will clamp in fragment shader. not visual itself
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "borderlineOffset", borderlineOffset ), true, TEST_LOCATION );
+#endif
   }
 
   // gradient visual
@@ -4179,6 +4204,8 @@ int UtcDaliVisualBorderline(void)
     application.SendNotification();
     application.Render();
 
+#ifdef OLD_GRAPHICS_TEST
+    // Currently test with multiple program doesn't work well. will fix another day
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "cornerRadius", Vector4(cornerRadius, cornerRadius, cornerRadius, cornerRadius) ), true, TEST_LOCATION );
     // Default corner radius policy is absolute.
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadiusPolicy", Toolkit::Visual::Transform::Policy::ABSOLUTE ), true, TEST_LOCATION );
@@ -4187,6 +4214,7 @@ int UtcDaliVisualBorderline(void)
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "borderlineColor", Color::BLACK ), true, TEST_LOCATION );
     // Default borderline offset is 0.0f.
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "borderlineOffset", 0.0f ), true, TEST_LOCATION );
+#endif
   }
 
   // animated image visual
@@ -4221,10 +4249,13 @@ int UtcDaliVisualBorderline(void)
     application.SendNotification();
     application.Render();
 
+#ifdef OLD_GRAPHICS_TEST
+    // Currently test with multiple program doesn't work well. will fix another day
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "borderlineWidth", borderlineWidth ), true, TEST_LOCATION );
     // Default borderline color is BLACK.
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "borderlineColor", Color::BLACK ), true, TEST_LOCATION );
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "borderlineOffset", borderlineOffset ), true, TEST_LOCATION );
+#endif
   }
 
   // vector image visual
@@ -4260,6 +4291,8 @@ int UtcDaliVisualBorderline(void)
     application.SendNotification();
     application.Render();
 
+#ifdef OLD_GRAPHICS_TEST
+    // Currently test with multiple program doesn't work well. will fix another day
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
     // Default corner radius policy is absolute.
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadiusPolicy", Toolkit::Visual::Transform::Policy::ABSOLUTE ), true, TEST_LOCATION );
@@ -4267,6 +4300,7 @@ int UtcDaliVisualBorderline(void)
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "borderlineColor", borderlineColor ), true, TEST_LOCATION );
     // Default borderline offset is 0.0.
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "borderlineOffset", 0.0f ), true, TEST_LOCATION );
+#endif
   }
 
   // animated vector image visual
@@ -4305,15 +4339,15 @@ int UtcDaliVisualBorderline(void)
     application.SendNotification();
     application.Render();
 
+#ifdef OLD_GRAPHICS_TEST
+    // Currently test with multiple program doesn't work well. will fix another day
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadiusPolicy", Toolkit::Visual::Transform::Policy::RELATIVE ), true, TEST_LOCATION );
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "borderlineWidth", borderlineWidth ), true, TEST_LOCATION );
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "borderlineColor", borderlineColor ), true, TEST_LOCATION );
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "borderlineOffset", borderlineOffset ), true, TEST_LOCATION );
-  }
-#else
-  tet_result(TET_PASS);
 #endif
+  }
 
   END_TEST;
 }
@@ -4631,7 +4665,7 @@ int UtcDaliVisualGetVisualProperty01(void)
 int UtcDaliVisualGetVisualProperty02(void)
 {
   ToolkitTestApplication application;
-  tet_infoline( "UtcDaliVisualGetVisualProperty02: Test animatable property" );
+  tet_infoline( "UtcDaliVisualGetVisualProperty02: Test animatable property, ColorVisual" );
 
   static std::vector<UniformData> customUniforms =
   {
@@ -4730,6 +4764,7 @@ int UtcDaliVisualGetVisualProperty02(void)
   DALI_TEST_EQUALS(blurRadiusValue->Get< float >(), targetBlurRadius, TEST_LOCATION);
 
 #ifdef OLD_GRAPHICS_TEST
+  // Currently test with multiple program doesn't work well. will fix another day
   // Test uniform values
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector3>("mixColor", targetColor), true, TEST_LOCATION);
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector2>("offset", targetOffset), true, TEST_LOCATION);
@@ -4743,7 +4778,6 @@ int UtcDaliVisualGetVisualProperty02(void)
 
 int UtcDaliVisualGetVisualProperty03(void)
 {
-#ifdef OLD_GRAPHICS_TEST
   ToolkitTestApplication application;
   tet_infoline( "UtcDaliVisualGetVisualProperty03: Test animatable property, ImageVisual" );
 
@@ -4762,9 +4796,6 @@ int UtcDaliVisualGetVisualProperty03(void)
   Property::Map propertyMap;
   propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
   propertyMap.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME);
-  //We must set some value because application cannot notify shader changed
-  propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS, 1.0f);
-  propertyMap.Insert(DevelVisual::Property::BORDERLINE_WIDTH, 1.0f);
 
   Visual::Base imageVisual = factory.CreateVisual(propertyMap);
 
@@ -4822,13 +4853,13 @@ int UtcDaliVisualGetVisualProperty03(void)
   DALI_TEST_CHECK(borderlineOffsetValue);
   DALI_TEST_EQUALS(borderlineOffsetValue->Get< float >(), targetBorderlineOffset, TEST_LOCATION);
 
+#ifdef OLD_GRAPHICS_TEST
+  // Currently test with multiple program doesn't work well. will fix another day
   // Test uniform value
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerRadius", targetCornerRadius), true, TEST_LOCATION);
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<float>("borderlineWidth", targetBorderlineWidth), true, TEST_LOCATION);
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("borderlineColor", targetBorderlineColor), true, TEST_LOCATION);
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<float>("borderlineOffset", targetBorderlineOffset), true, TEST_LOCATION);
-#else
-  tet_result(TET_PASS);
 #endif
 
   END_TEST;
@@ -4836,9 +4867,8 @@ int UtcDaliVisualGetVisualProperty03(void)
 
 int UtcDaliVisualGetVisualProperty04(void)
 {
-#ifdef OLD_GRAPHICS_TEST
   ToolkitTestApplication application;
-  tet_infoline( "UtcDaliVisualGetVisualProperty01: Test animatable property, GradientVisual" );
+  tet_infoline( "UtcDaliVisualGetVisualProperty04: Test animatable property, GradientVisual" );
 
   static std::vector<UniformData> customUniforms =
   {
@@ -4897,11 +4927,287 @@ int UtcDaliVisualGetVisualProperty04(void)
   DALI_TEST_CHECK(cornerRadiusValue);
   DALI_TEST_EQUALS(cornerRadiusValue->Get< Vector4 >(), targetCornerRadius, TEST_LOCATION);
 
+#ifdef OLD_GRAPHICS_TEST
+  // Currently test with multiple program doesn't work well. will fix another day
+  // Test uniform value
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerRadius", targetCornerRadius), true, TEST_LOCATION);
+#endif
+
+  END_TEST;
+}
+
+int UtcDaliVisualGetVisualProperty05(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline( "UtcDaliVisualGetVisualProperty05: Test animatable property, SvgVisual" );
+
+  static std::vector<UniformData> customUniforms =
+  {
+    UniformData("cornerRadius", Property::Type::VECTOR4),
+    UniformData("borderlineWidth", Property::Type::FLOAT),
+    UniformData("borderlineColor", Property::Type::VECTOR4),
+    UniformData("borderlineOffset", Property::Type::FLOAT),
+  };
+
+  TestGraphicsController& graphics = application.GetGraphicsController();
+  graphics.AddCustomUniforms(customUniforms);
+
+  VisualFactory factory = VisualFactory::Get();
+  Property::Map propertyMap;
+  propertyMap.Insert(Visual::Property::TYPE, Visual::SVG);
+  propertyMap.Insert(ImageVisual::Property::URL, TEST_SVG_FILE_NAME);
+
+  Visual::Base svgVisual = factory.CreateVisual(propertyMap);
+
+  DummyControl dummyControl = DummyControl::New(true);
+  Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
+  dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, svgVisual);
+  dummyControl[Actor::Property::SIZE] = Vector2(200.f, 200.f);
+  application.GetScene().Add(dummyControl);
+
+  application.SendNotification();
+  application.Render();
+
+  // Wait for image loading
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+  application.SendNotification();
+  application.Render();
+
+  float targetOpacity = 0.5f;
+  Vector4 targetCornerRadius(20.0f, 20.0f, 0.0f, 0.0f);
+  float targetBorderlineWidth = 10.0f;
+  Vector4 targetBorderlineColor(1.0f, 0.0f, 1.0f, 0.5f);
+  float targetBorderlineOffset = -1.5f;
+
+  Animation animation = Animation::New(1.0f);
+  animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, Visual::Property::OPACITY), targetOpacity);
+  animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::CORNER_RADIUS), targetCornerRadius);
+  animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::BORDERLINE_WIDTH), targetBorderlineWidth);
+  animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::BORDERLINE_COLOR), targetBorderlineColor);
+  animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::BORDERLINE_OFFSET), targetBorderlineOffset);
+  animation.Play();
+
+  application.SendNotification();
+  application.Render();
+  application.Render(1001u); // End of animation
+
+  Property::Map resultMap;
+  svgVisual.CreatePropertyMap( resultMap );
+
+  // Test property values: they should be updated
+  Property::Value* colorValue = resultMap.Find(Visual::Property::MIX_COLOR, Property::VECTOR4);
+  DALI_TEST_CHECK(colorValue);
+  DALI_TEST_EQUALS(colorValue->Get<Vector4>(), Vector4(1.0f, 1.0f, 1.0f, targetOpacity), TEST_LOCATION);
+
+  Property::Value* cornerRadiusValue = resultMap.Find(DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerRadiusValue);
+  DALI_TEST_EQUALS(cornerRadiusValue->Get< Vector4 >(), targetCornerRadius, TEST_LOCATION);
+
+  Property::Value* borderlineWidthValue = resultMap.Find(DevelVisual::Property::BORDERLINE_WIDTH, Property::FLOAT);
+  DALI_TEST_CHECK(borderlineWidthValue);
+  DALI_TEST_EQUALS(borderlineWidthValue->Get< float >(), targetBorderlineWidth, TEST_LOCATION);
+
+  Property::Value* borderlineColorValue = resultMap.Find(DevelVisual::Property::BORDERLINE_COLOR, Property::VECTOR4);
+  DALI_TEST_CHECK(borderlineColorValue);
+  DALI_TEST_EQUALS(borderlineColorValue->Get< Vector4 >(), targetBorderlineColor, TEST_LOCATION);
+
+  Property::Value* borderlineOffsetValue = resultMap.Find(DevelVisual::Property::BORDERLINE_OFFSET, Property::FLOAT);
+  DALI_TEST_CHECK(borderlineOffsetValue);
+  DALI_TEST_EQUALS(borderlineOffsetValue->Get< float >(), targetBorderlineOffset, TEST_LOCATION);
+
+#ifdef OLD_GRAPHICS_TEST
+  // Currently test with multiple program doesn't work well. will fix another day
+  // Test uniform value
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerRadius", targetCornerRadius), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<float>("borderlineWidth", targetBorderlineWidth), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("borderlineColor", targetBorderlineColor), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<float>("borderlineOffset", targetBorderlineOffset), true, TEST_LOCATION);
+#endif
+
+  END_TEST;
+}
+
+int UtcDaliVisualGetVisualProperty06(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline( "UtcDaliVisualGetVisualProperty06: Test animatable property, AnimatedImageVisual" );
+
+  static std::vector<UniformData> customUniforms =
+  {
+    UniformData("cornerRadius", Property::Type::VECTOR4),
+    UniformData("borderlineWidth", Property::Type::FLOAT),
+    UniformData("borderlineColor", Property::Type::VECTOR4),
+    UniformData("borderlineOffset", Property::Type::FLOAT),
+  };
+
+  TestGraphicsController& graphics = application.GetGraphicsController();
+  graphics.AddCustomUniforms(customUniforms);
+
+  VisualFactory factory = VisualFactory::Get();
+  Property::Map propertyMap;
+  propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
+  propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
+
+  Visual::Base animatedImageVisual = factory.CreateVisual(propertyMap);
+
+  DummyControl dummyControl = DummyControl::New(true);
+  Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
+  dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual);
+  dummyControl[Actor::Property::SIZE] = Vector2(200.f, 200.f);
+  application.GetScene().Add(dummyControl);
+
+  application.SendNotification();
+  application.Render();
+
+  // Wait for image loading
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+  application.SendNotification();
+  application.Render();
+
+  float targetOpacity = 0.5f;
+  Vector4 targetCornerRadius(20.0f, 20.0f, 0.0f, 0.0f);
+  float targetBorderlineWidth = 10.0f;
+  Vector4 targetBorderlineColor(1.0f, 0.0f, 1.0f, 0.5f);
+  float targetBorderlineOffset = -1.5f;
+
+  Animation animation = Animation::New(1.0f);
+  animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, Visual::Property::OPACITY), targetOpacity);
+  animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::CORNER_RADIUS), targetCornerRadius);
+  animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::BORDERLINE_WIDTH), targetBorderlineWidth);
+  animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::BORDERLINE_COLOR), targetBorderlineColor);
+  animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::BORDERLINE_OFFSET), targetBorderlineOffset);
+  animation.Play();
+
+  application.SendNotification();
+  application.Render();
+  application.Render(1001u); // End of animation
+
+  Property::Map resultMap;
+  animatedImageVisual.CreatePropertyMap( resultMap );
+
+  // Test property values: they should be updated
+  Property::Value* colorValue = resultMap.Find(Visual::Property::MIX_COLOR, Property::VECTOR4);
+  DALI_TEST_CHECK(colorValue);
+  DALI_TEST_EQUALS(colorValue->Get<Vector4>(), Vector4(1.0f, 1.0f, 1.0f, targetOpacity), TEST_LOCATION);
+
+  Property::Value* cornerRadiusValue = resultMap.Find(DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerRadiusValue);
+  DALI_TEST_EQUALS(cornerRadiusValue->Get< Vector4 >(), targetCornerRadius, TEST_LOCATION);
+
+  Property::Value* borderlineWidthValue = resultMap.Find(DevelVisual::Property::BORDERLINE_WIDTH, Property::FLOAT);
+  DALI_TEST_CHECK(borderlineWidthValue);
+  DALI_TEST_EQUALS(borderlineWidthValue->Get< float >(), targetBorderlineWidth, TEST_LOCATION);
+
+  Property::Value* borderlineColorValue = resultMap.Find(DevelVisual::Property::BORDERLINE_COLOR, Property::VECTOR4);
+  DALI_TEST_CHECK(borderlineColorValue);
+  DALI_TEST_EQUALS(borderlineColorValue->Get< Vector4 >(), targetBorderlineColor, TEST_LOCATION);
+
+  Property::Value* borderlineOffsetValue = resultMap.Find(DevelVisual::Property::BORDERLINE_OFFSET, Property::FLOAT);
+  DALI_TEST_CHECK(borderlineOffsetValue);
+  DALI_TEST_EQUALS(borderlineOffsetValue->Get< float >(), targetBorderlineOffset, TEST_LOCATION);
+
+#ifdef OLD_GRAPHICS_TEST
+  // Currently test with multiple program doesn't work well. will fix another day
   // Test uniform value
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerRadius", targetCornerRadius), true, TEST_LOCATION);
-#else
-  tet_result(TET_PASS);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<float>("borderlineWidth", targetBorderlineWidth), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("borderlineColor", targetBorderlineColor), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<float>("borderlineOffset", targetBorderlineOffset), true, TEST_LOCATION);
 #endif
 
   END_TEST;
 }
+
+int UtcDaliVisualGetVisualProperty07(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline( "UtcDaliVisualGetVisualProperty07: Test animatable property, AnimatedVectorVisual" );
+
+  static std::vector<UniformData> customUniforms =
+  {
+    UniformData("cornerRadius", Property::Type::VECTOR4),
+    UniformData("borderlineWidth", Property::Type::FLOAT),
+    UniformData("borderlineColor", Property::Type::VECTOR4),
+    UniformData("borderlineOffset", Property::Type::FLOAT),
+  };
+
+  TestGraphicsController& graphics = application.GetGraphicsController();
+  graphics.AddCustomUniforms(customUniforms);
+
+  VisualFactory factory = VisualFactory::Get();
+  Property::Map propertyMap;
+  propertyMap.Insert(Visual::Property::TYPE, DevelVisual::Type::ANIMATED_VECTOR_IMAGE);
+  propertyMap.Insert(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME);
+
+  Visual::Base animatedVectorVisual = factory.CreateVisual(propertyMap);
+
+  DummyControl dummyControl = DummyControl::New(true);
+  Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
+  dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedVectorVisual);
+  dummyControl[Actor::Property::SIZE] = Vector2(200.f, 200.f);
+  application.GetScene().Add(dummyControl);
+
+  application.SendNotification();
+  application.Render();
+
+  // Wait for image loading
+  DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+  application.SendNotification();
+  application.Render();
+
+  float targetOpacity = 0.5f;
+  Vector4 targetCornerRadius(20.0f, 20.0f, 0.0f, 0.0f);
+  float targetBorderlineWidth = 10.0f;
+  Vector4 targetBorderlineColor(1.0f, 0.0f, 1.0f, 0.5f);
+  float targetBorderlineOffset = -1.5f;
+
+  Animation animation = Animation::New(1.0f);
+  animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, Visual::Property::OPACITY), targetOpacity);
+  animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::CORNER_RADIUS), targetCornerRadius);
+  animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::BORDERLINE_WIDTH), targetBorderlineWidth);
+  animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::BORDERLINE_COLOR), targetBorderlineColor);
+  animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::BORDERLINE_OFFSET), targetBorderlineOffset);
+  animation.Play();
+
+  application.SendNotification();
+  application.Render();
+  application.Render(1001u); // End of animation
+
+  Property::Map resultMap;
+  animatedVectorVisual.CreatePropertyMap( resultMap );
+
+  // Test property values: they should be updated
+  Property::Value* colorValue = resultMap.Find(Visual::Property::MIX_COLOR, Property::VECTOR4);
+  DALI_TEST_CHECK(colorValue);
+  DALI_TEST_EQUALS(colorValue->Get<Vector4>(), Vector4(1.0f, 1.0f, 1.0f, targetOpacity), TEST_LOCATION);
+
+  Property::Value* cornerRadiusValue = resultMap.Find(DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerRadiusValue);
+  DALI_TEST_EQUALS(cornerRadiusValue->Get< Vector4 >(), targetCornerRadius, TEST_LOCATION);
+
+  Property::Value* borderlineWidthValue = resultMap.Find(DevelVisual::Property::BORDERLINE_WIDTH, Property::FLOAT);
+  DALI_TEST_CHECK(borderlineWidthValue);
+  DALI_TEST_EQUALS(borderlineWidthValue->Get< float >(), targetBorderlineWidth, TEST_LOCATION);
+
+  Property::Value* borderlineColorValue = resultMap.Find(DevelVisual::Property::BORDERLINE_COLOR, Property::VECTOR4);
+  DALI_TEST_CHECK(borderlineColorValue);
+  DALI_TEST_EQUALS(borderlineColorValue->Get< Vector4 >(), targetBorderlineColor, TEST_LOCATION);
+
+  Property::Value* borderlineOffsetValue = resultMap.Find(DevelVisual::Property::BORDERLINE_OFFSET, Property::FLOAT);
+  DALI_TEST_CHECK(borderlineOffsetValue);
+  DALI_TEST_EQUALS(borderlineOffsetValue->Get< float >(), targetBorderlineOffset, TEST_LOCATION);
+
+#ifdef OLD_GRAPHICS_TEST
+  // Currently test with multiple program doesn't work well. will fix another day
+  // Test uniform value
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerRadius", targetCornerRadius), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<float>("borderlineWidth", targetBorderlineWidth), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("borderlineColor", targetBorderlineColor), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<float>("borderlineOffset", targetBorderlineOffset), true, TEST_LOCATION);
+#endif
+
+  END_TEST;
+}
\ No newline at end of file
index 418bf9d..1ec7fa3 100644 (file)
@@ -62,6 +62,7 @@
 
 #include <dali-toolkit/public-api/transition/fade-transition.h>
 #include <dali-toolkit/public-api/transition/slide-transition.h>
+#include <dali-toolkit/public-api/transition/scale-transition.h>
 #include <dali-toolkit/public-api/transition/transition.h>
 #include <dali-toolkit/public-api/transition/transition-set.h>
 
index 8deec87..7f02340 100644 (file)
@@ -184,6 +184,7 @@ SET( toolkit_src_files
    ${toolkit_src_dir}/text/rendering/view-model.cpp
    ${toolkit_src_dir}/transition/fade-transition-impl.cpp
    ${toolkit_src_dir}/transition/slide-transition-impl.cpp
+   ${toolkit_src_dir}/transition/scale-transition-impl.cpp
    ${toolkit_src_dir}/transition/transition-base-impl.cpp
    ${toolkit_src_dir}/transition/transition-impl.cpp
    ${toolkit_src_dir}/transition/transition-lifecycle-controller.cpp
diff --git a/dali-toolkit/internal/transition/scale-transition-impl.cpp b/dali-toolkit/internal/transition/scale-transition-impl.cpp
new file mode 100644 (file)
index 0000000..a374002
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2021 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/internal/transition/scale-transition-impl.h>
+
+// EXTERNAL INCLUDES
+#include <dali-toolkit/public-api/controls/control-impl.h>
+#include <dali/devel-api/actors/actor-devel.h>
+#include <dali/integration-api/debug.h>
+#include <dali/public-api/common/dali-common.h>
+#include <dali/public-api/object/type-registry.h>
+
+namespace Dali
+{
+namespace Toolkit
+{
+namespace Internal
+{
+
+ScaleTransitionPtr ScaleTransition::New(Dali::Toolkit::Control control, const Vector2& scaleFactor, TimePeriod timePeriod)
+{
+  float delaySeconds = timePeriod.delaySeconds;
+  if(delaySeconds < 0.0f)
+  {
+    DALI_LOG_WARNING("delay should be greater than 0.0f.\n");
+    delaySeconds = 0.0f;
+  }
+
+  float durationSeconds = timePeriod.durationSeconds;
+  if(durationSeconds < 0.0f)
+  {
+    DALI_LOG_WARNING("duration should be greater than 0.0f.\n");
+    durationSeconds = 0.0f;
+  }
+
+  ScaleTransitionPtr scaleTransition = new ScaleTransition(control, scaleFactor, TimePeriod(delaySeconds, durationSeconds));
+
+  // Second-phase construction
+  scaleTransition->Initialize();
+
+  return scaleTransition;
+}
+
+ScaleTransition::ScaleTransition(Dali::Toolkit::Control control, const Vector2& scaleFactor, TimePeriod timePeriod)
+: TransitionBase(),
+  mTargetControl(control),
+  mScaleFactor(scaleFactor)
+{
+  SetTarget(control);
+  SetTimePeriod(timePeriod);
+}
+
+ScaleTransition::~ScaleTransition()
+{
+}
+
+void ScaleTransition::SetScaleFactor(const Vector2& scaleFactor)
+{
+  mScaleFactor = scaleFactor;
+}
+
+Vector2 ScaleTransition::GetScaleFactor() const
+{
+  return mScaleFactor;
+}
+
+void ScaleTransition::OnPlay()
+{
+  Dali::Toolkit::Control targetControl = mTargetControl.GetHandle();
+  if(!targetControl || !targetControl[Dali::Actor::Property::CONNECTED_TO_SCENE])
+  {
+    DALI_LOG_ERROR("The Control is not added on the window\n");
+    return;
+  }
+
+  Property::Map startPropertyMap;
+  Property::Map finishPropertyMap;
+
+  Vector3 targetScale = targetControl[Dali::Actor::Property::SCALE];
+  Vector3 scaleFactor = Vector3(mScaleFactor.x, mScaleFactor.y, 1.0f);
+  if(IsAppearingTransition())
+  {
+    startPropertyMap.Insert(Dali::Actor::Property::SCALE, scaleFactor * targetScale);
+    finishPropertyMap.Insert(Dali::Actor::Property::SCALE, targetScale);
+  }
+  else
+  {
+    startPropertyMap.Insert(Dali::Actor::Property::SCALE, targetScale);
+    finishPropertyMap.Insert(Dali::Actor::Property::SCALE, scaleFactor * targetScale);
+  }
+
+  SetStartPropertyMap(startPropertyMap);
+  SetFinishPropertyMap(finishPropertyMap);
+}
+
+} // namespace Internal
+
+} // namespace Toolkit
+
+} // namespace Dali
diff --git a/dali-toolkit/internal/transition/scale-transition-impl.h b/dali-toolkit/internal/transition/scale-transition-impl.h
new file mode 100644 (file)
index 0000000..27e173d
--- /dev/null
@@ -0,0 +1,116 @@
+#ifndef DALI_TOOLKIT_INTERNAL_SCALE_TRANSITION_H
+#define DALI_TOOLKIT_INTERNAL_SCALE_TRANSITION_H
+
+/*
+ * Copyright (c) 2021 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.
+ *Fade
+ */
+
+// INTERNAL INCLUDES
+#include <dali-toolkit/internal/transition/transition-base-impl.h>
+#include <dali-toolkit/public-api/controls/control.h>
+#include <dali-toolkit/public-api/transition/scale-transition.h>
+
+// EXTERNAL INCLUDES
+#include <dali/public-api/object/weak-handle.h>
+
+namespace Dali
+{
+namespace Toolkit
+{
+namespace Internal
+{
+using ScaleTransitionPtr = IntrusivePtr<ScaleTransition>;
+
+class ScaleTransition : public TransitionBase
+{
+public:
+  /**
+   * @brief Create a new ScaleTransition object.
+   * @param[in] control A control of this transition.
+   * @param[in] scaleFactor A scale value to be applied on control during transition
+   * @param[in] timePeriod The duration of the animation.
+   * @return A smart-pointer to the newly allocated ScaleTransition.
+   */
+  static ScaleTransitionPtr New(Dali::Toolkit::Control control, const Vector2& scaleFactor, TimePeriod timePeriod);
+
+  /**
+   * @copydoc Dali::Toolkit::ScaleTransition::SetScaleFactor()
+   */
+  void SetScaleFactor(const Vector2& scaleFactor);
+
+  /**
+   * @copydoc Dali::Toolkit::ScaleTransition::GetDirection()
+   */
+  Vector2 GetScaleFactor() const;
+
+protected:
+  /**
+   * @copydoc Dali::Toolkit::ScaleTransition::OnPlay()
+   */
+  void OnPlay() override;
+
+protected:
+  /**
+   * @brief Construct a new ScaleTransition.
+   */
+  ScaleTransition(Dali::Toolkit::Control control,
+                  const Vector2&         scaleFactor,
+                  TimePeriod             timePeriod);
+
+  /**
+   * @brief A reference counted object may only be deleted by calling Unreference()
+   */
+  ~ScaleTransition() override;
+
+private:
+  // Undefined
+  ScaleTransition(const ScaleTransition&);
+
+  // Undefined
+  ScaleTransition& operator=(const ScaleTransition& rhs);
+
+private:
+  WeakHandle<Dali::Toolkit::Control> mTargetControl;
+  Vector2                            mScaleFactor;
+};
+
+} // namespace Internal
+
+// Helpers for public-api forwarding methods
+
+inline Internal::ScaleTransition& GetImplementation(Dali::Toolkit::ScaleTransition& scale)
+{
+  DALI_ASSERT_ALWAYS(scale && "ScaleTransition handle is empty");
+
+  BaseObject& handle = scale.GetBaseObject();
+
+  return static_cast<Internal::ScaleTransition&>(handle);
+}
+
+inline const Internal::ScaleTransition& GetImplementation(const Dali::Toolkit::ScaleTransition& scale)
+{
+  DALI_ASSERT_ALWAYS(scale && "ScaleTransition handle is empty");
+
+  const BaseObject& handle = scale.GetBaseObject();
+
+  return static_cast<const Internal::ScaleTransition&>(handle);
+}
+
+} // namespace Toolkit
+
+} // namespace Dali
+
+#endif // DALI_TOOLKIT_INTERNAL_FADE_H
index 58506fd..da54e1e 100644 (file)
@@ -535,15 +535,19 @@ void AnimatedImageVisual::OnSetTransform()
   }
 }
 
+void AnimatedImageVisual::UpdateShader()
+{
+  if(mImpl->mRenderer)
+  {
+    Shader shader = GenerateShader();
+    mImpl->mRenderer.SetShader(shader);
+  }
+}
+
 void AnimatedImageVisual::OnInitialize()
 {
   bool   defaultWrapMode = mWrapModeU <= WrapMode::CLAMP_TO_EDGE && mWrapModeV <= WrapMode::CLAMP_TO_EDGE;
-  Shader shader          = mImageVisualShaderFactory.GetShader(
-    mFactoryCache,
-    TextureAtlas::DISABLED,
-    defaultWrapMode ? DefaultTextureWrapMode::APPLY : DefaultTextureWrapMode::DO_NOT_APPLY,
-    IsRoundedCornerRequired() ? RoundedCorner::ENABLED : RoundedCorner::DISABLED,
-    IsBorderlineRequired() ? Borderline::ENABLED : Borderline::DISABLED);
+  Shader shader          = GenerateShader();
 
   Geometry geometry = mFactoryCache.GetGeometry(VisualFactoryCache::QUAD_GEOMETRY);
 
@@ -818,6 +822,19 @@ TextureSet AnimatedImageVisual::SetLoadingFailed()
   return textureSet;
 }
 
+Shader AnimatedImageVisual::GenerateShader() const
+{
+  bool   defaultWrapMode = mWrapModeU <= WrapMode::CLAMP_TO_EDGE && mWrapModeV <= WrapMode::CLAMP_TO_EDGE;
+  Shader shader;
+  shader = mImageVisualShaderFactory.GetShader(
+    mFactoryCache,
+    TextureAtlas::DISABLED,
+    defaultWrapMode ? DefaultTextureWrapMode::APPLY : DefaultTextureWrapMode::DO_NOT_APPLY,
+    IsRoundedCornerRequired() ? RoundedCorner::ENABLED : RoundedCorner::DISABLED,
+    IsBorderlineRequired() ? Borderline::ENABLED : Borderline::DISABLED);
+  return shader;
+}
+
 } // namespace Internal
 
 } // namespace Toolkit
index 608b43f..347e9d3 100644 (file)
@@ -181,6 +181,16 @@ protected:
    */
   void OnSetTransform() override;
 
+  /**
+   * @copydoc Visual::Base::UpdateShader
+   */
+  void UpdateShader() override;
+
+  /**
+   * @copydoc Visual::Base::GenerateShader
+   */
+  Shader GenerateShader() const override;
+
 private:
   /**
    * Creates the renderer for the animated image
index edd7b1b..35d7456 100644 (file)
@@ -283,26 +283,7 @@ void AnimatedVectorImageVisual::DoSetProperty(Property::Index index, const Prope
 
 void AnimatedVectorImageVisual::OnInitialize(void)
 {
-  Shader shader;
-
-  if(mImpl->mCustomShader)
-  {
-    shader = Shader::New(mImpl->mCustomShader->mVertexShader.empty() ? mImageVisualShaderFactory.GetVertexShaderSource().data() : mImpl->mCustomShader->mVertexShader,
-                         mImpl->mCustomShader->mFragmentShader.empty() ? mImageVisualShaderFactory.GetFragmentShaderSource().data() : mImpl->mCustomShader->mFragmentShader,
-                         mImpl->mCustomShader->mHints);
-
-    shader.RegisterProperty(PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT);
-  }
-  else
-  {
-    shader = mImageVisualShaderFactory.GetShader(
-      mFactoryCache,
-      TextureAtlas::DISABLED,
-      DefaultTextureWrapMode::APPLY,
-      IsRoundedCornerRequired() ? RoundedCorner::ENABLED : RoundedCorner::DISABLED,
-      IsBorderlineRequired() ? Borderline::ENABLED : Borderline::DISABLED
-    );
-  }
+  Shader shader = GenerateShader();
 
   Geometry geometry = mFactoryCache.GetGeometry(VisualFactoryCache::QUAD_GEOMETRY);
 
@@ -411,6 +392,15 @@ void AnimatedVectorImageVisual::OnSetTransform()
   }
 }
 
+void AnimatedVectorImageVisual::UpdateShader()
+{
+  if(mImpl->mRenderer)
+  {
+    Shader shader = GenerateShader();
+    mImpl->mRenderer.SetShader(shader);
+  }
+}
+
 void AnimatedVectorImageVisual::OnDoAction(const Property::Index actionId, const Property::Value& attributes)
 {
   // Check if action is valid for this visual type and perform action if possible
@@ -633,6 +623,31 @@ void AnimatedVectorImageVisual::OnProcessEvents()
   mEventCallback = nullptr; // The callback will be deleted in the VectorAnimationManager
 }
 
+Shader AnimatedVectorImageVisual::GenerateShader() const
+{
+  Shader shader;
+  if(mImpl->mCustomShader)
+  {
+    shader = Shader::New(mImpl->mCustomShader->mVertexShader.empty() ? mImageVisualShaderFactory.GetVertexShaderSource().data() : mImpl->mCustomShader->mVertexShader,
+                         mImpl->mCustomShader->mFragmentShader.empty() ? mImageVisualShaderFactory.GetFragmentShaderSource().data() : mImpl->mCustomShader->mFragmentShader,
+                         mImpl->mCustomShader->mHints);
+
+    shader.RegisterProperty(PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT);
+  }
+  else
+  {
+    shader = mImageVisualShaderFactory.GetShader(
+      mFactoryCache,
+      TextureAtlas::DISABLED,
+      DefaultTextureWrapMode::APPLY,
+      IsRoundedCornerRequired() ? RoundedCorner::ENABLED : RoundedCorner::DISABLED,
+      IsBorderlineRequired() ? Borderline::ENABLED : Borderline::DISABLED
+    );
+  }
+  return shader;
+}
+
+
 } // namespace Internal
 
 } // namespace Toolkit
index c809634..4f1a859 100644 (file)
@@ -140,6 +140,16 @@ protected:
   void OnSetTransform() override;
 
   /**
+   * @copydoc Visual::Base::UpdateShader
+   */
+  void UpdateShader() override;
+
+  /**
+   * @copydoc Visual::Base::GenerateShader
+   */
+  Shader GenerateShader() const override;
+
+  /**
    * @copydoc Visual::Base::OnDoAction
    */
   void OnDoAction(const Property::Index actionId, const Property::Value& attributes) override;
index 8f748cf..9863364 100644 (file)
@@ -182,7 +182,7 @@ void ColorVisual::UpdateShader()
 {
   if(mImpl->mRenderer)
   {
-    Shader shader = GetShader();
+    Shader shader = GenerateShader();
     mImpl->mRenderer.SetShader(shader);
   }
 }
@@ -191,7 +191,7 @@ void ColorVisual::OnInitialize()
 {
   Geometry geometry = mFactoryCache.GetGeometry(VisualFactoryCache::QUAD_GEOMETRY);
 
-  Shader shader = GetShader();
+  Shader shader = GenerateShader();
 
   mImpl->mRenderer = Renderer::New(geometry, shader);
 
@@ -210,7 +210,7 @@ void ColorVisual::OnInitialize()
   mImpl->mTransform.RegisterUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
 }
 
-Shader ColorVisual::GetShader()
+Shader ColorVisual::GenerateShader() const
 {
   Shader shader;
   VisualFactoryCache::ShaderType shaderType;
index 6fe1f43..1f2af5c 100644 (file)
@@ -114,16 +114,14 @@ protected:
   void UpdateShader() override;
 
   /**
-   * @copydoc Visual::Base::OnGetPropertyObject
+   * @copydoc Visual::Base::GenerateShader
    */
-  Dali::Property OnGetPropertyObject(Dali::Property::Key key) override;
+  Shader GenerateShader() const override;
 
-private:
   /**
-   * @brief Get a shader for the current properties.
-   * @return The shader for the current properties.
+   * @copydoc Visual::Base::OnGetPropertyObject
    */
-  Shader GetShader();
+  Dali::Property OnGetPropertyObject(Dali::Property::Key key) override;
 
 private:
   // Undefined
index 896b095..18e4767 100644 (file)
@@ -183,7 +183,7 @@ void GradientVisual::UpdateShader()
 {
   if(mImpl->mRenderer)
   {
-    Shader shader = GetShader();
+    Shader shader = GenerateShader();
     mImpl->mRenderer.SetShader(shader);
   }
 }
@@ -239,7 +239,7 @@ void GradientVisual::DoCreateInstancePropertyMap(Property::Map& map) const
 void GradientVisual::OnInitialize()
 {
   Geometry geometry = mFactoryCache.GetGeometry(VisualFactoryCache::QUAD_GEOMETRY);
-  Shader   shader   = GetShader();
+  Shader   shader   = GenerateShader();
 
   //Set up the texture set
   TextureSet    textureSet    = TextureSet::New();
@@ -345,7 +345,7 @@ bool GradientVisual::NewGradient(Type gradientType, const Property::Map& propert
   return true;
 }
 
-Shader GradientVisual::GetShader()
+Shader GradientVisual::GenerateShader() const
 {
   bool userspaceUnit  = (mGradient->GetGradientUnits() == Toolkit::GradientVisual::Units::USER_SPACE);
   bool roundedCorner  = IsRoundedCornerRequired();
index 0dde8b4..40223b8 100644 (file)
@@ -139,6 +139,11 @@ protected:
    */
   void UpdateShader() override;
 
+  /**
+   * @copydoc Visual::Base::GenerateShader
+   */
+  Shader GenerateShader() const override;
+
 private:
   /**
    * New a gradient object with the given property map.
@@ -148,12 +153,6 @@ private:
   bool NewGradient(Type gradientType, const Property::Map& propertyMap);
 
   /**
-   * @brief Get a shader for the current properties.
-   * @return The shader for the current properties.
-   */
-  Shader GetShader();
-
-  /**
    * Get the stop-offsets from the property.
    * The valid property type are ARRAY, VECTOR2, VECTOR3, VECTOR4.
    *
index 4ae09f6..0251a1d 100644 (file)
@@ -556,7 +556,7 @@ void ImageVisual::OnInitialize()
     textureManager.UseExternalResource(mImageUrl.GetUrl());
   }
 
-  Shader shader = GetShader();
+  Shader shader = GenerateShader();
 
   // Create the renderer
   mImpl->mRenderer = Renderer::New(geometry, shader);
@@ -822,7 +822,7 @@ void ImageVisual::UpdateShader()
 {
   if(mImpl->mRenderer)
   {
-    Shader shader = GetShader();
+    Shader shader = GenerateShader();
     mImpl->mRenderer.SetShader(shader);
   }
 }
@@ -960,7 +960,7 @@ void ImageVisual::RemoveTexture()
   }
 }
 
-Shader ImageVisual::GetShader()
+Shader ImageVisual::GenerateShader() const
 {
   Shader shader;
 
index 598660f..c0a3f75 100644 (file)
@@ -233,6 +233,11 @@ protected:
    */
   void UpdateShader() override;
 
+  /**
+   * @copydoc Visual::Base::GenerateShader
+   */
+  Shader GenerateShader() const override;
+
 public:
   /**
    * @copydoc AtlasUploadObserver::UploadCompleted
@@ -315,12 +320,6 @@ private:
    */
   void DoSetProperty(Property::Index index, const Property::Value& value);
 
-  /**
-   * @brief Get a shader for the current properties.
-   * @return The shader for the current properties.
-   */
-  Shader GetShader();
-
 private:
   Vector4                            mPixelArea;
   WeakHandle<Actor>                  mPlacementActor;
index b6f9520..67fd435 100644 (file)
@@ -84,26 +84,7 @@ SvgVisual::~SvgVisual()
 
 void SvgVisual::OnInitialize()
 {
-  Shader shader;
-  if(!mImpl->mCustomShader)
-  {
-    shader = mImageVisualShaderFactory.GetShader(
-      mFactoryCache,
-      mAttemptAtlasing ? TextureAtlas::ENABLED : TextureAtlas::DISABLED,
-      DefaultTextureWrapMode::APPLY,
-      IsRoundedCornerRequired() ? RoundedCorner::ENABLED : RoundedCorner::DISABLED,
-      IsBorderlineRequired() ? Borderline::ENABLED : Borderline::DISABLED
-    );
-  }
-  else
-  {
-    shader = Shader::New(mImpl->mCustomShader->mVertexShader.empty() ? mImageVisualShaderFactory.GetVertexShaderSource().data() : mImpl->mCustomShader->mVertexShader,
-                         mImpl->mCustomShader->mFragmentShader.empty() ? mImageVisualShaderFactory.GetFragmentShaderSource().data() : mImpl->mCustomShader->mFragmentShader,
-                         mImpl->mCustomShader->mHints);
-
-    shader.RegisterProperty(PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT);
-  }
-
+  Shader shader = GenerateShader();
   Geometry geometry = mFactoryCache.GetGeometry(VisualFactoryCache::QUAD_GEOMETRY);
   mImpl->mRenderer  = Renderer::New(geometry, shader);
 }
@@ -383,6 +364,39 @@ bool SvgVisual::IsResourceReady() const
           mImpl->mResourceStatus == Toolkit::Visual::ResourceStatus::FAILED);
 }
 
+void SvgVisual::UpdateShader()
+{
+  if(mImpl->mRenderer)
+  {
+    Shader shader = GenerateShader();
+    mImpl->mRenderer.SetShader(shader);
+  }
+}
+
+Shader SvgVisual::GenerateShader() const
+{
+  Shader shader;
+  if(!mImpl->mCustomShader)
+  {
+    shader = mImageVisualShaderFactory.GetShader(
+      mFactoryCache,
+      mAttemptAtlasing ? TextureAtlas::ENABLED : TextureAtlas::DISABLED,
+      DefaultTextureWrapMode::APPLY,
+      IsRoundedCornerRequired() ? RoundedCorner::ENABLED : RoundedCorner::DISABLED,
+      IsBorderlineRequired() ? Borderline::ENABLED : Borderline::DISABLED
+    );
+  }
+  else
+  {
+    shader = Shader::New(mImpl->mCustomShader->mVertexShader.empty() ? mImageVisualShaderFactory.GetVertexShaderSource().data() : mImpl->mCustomShader->mVertexShader,
+                         mImpl->mCustomShader->mFragmentShader.empty() ? mImageVisualShaderFactory.GetFragmentShaderSource().data() : mImpl->mCustomShader->mFragmentShader,
+                         mImpl->mCustomShader->mHints);
+
+    shader.RegisterProperty(PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT);
+  }
+  return shader;
+}
+
 } // namespace Internal
 
 } // namespace Toolkit
index 2ccd337..66de43c 100644 (file)
@@ -137,6 +137,16 @@ protected:
    */
   bool IsResourceReady() const override;
 
+  /**
+   * @copydoc Visual::Base::UpdateShader
+   */
+  void UpdateShader() override;
+
+  /**
+   * @copydoc Visual::Base::GenerateShader
+   */
+  Shader GenerateShader() const override;
+
 public:
   /**
    * @bried Apply the rasterized image to the visual.
index 8800ad8..d04d3df 100644 (file)
@@ -363,6 +363,16 @@ protected:
   }
 
   /**
+   * @brief Generate a shader by the current properties from each sub classes's own shader-generate logic.
+   * @param[in] factoryCache The visual factory cache to store the generated shader.
+   * @return If the function defined, Generated shader by the current properties. Else, empty shader.
+   */
+  virtual Dali::Shader GenerateShader() const
+  {
+    return Dali::Shader();
+  }
+
+  /**
    * @brief Called by GetPropertyObject() allowing sub classes to respond to the GetPropertyObject event
    * @note The derived class is required to register the given property.
    * @param[in] key The key of the visual's property.
index 726285c..7b72745 100644 (file)
@@ -34,6 +34,7 @@ SET( public_api_src_files
   ${public_api_src_dir}/styling/style-manager.cpp
   ${public_api_src_dir}/transition/fade-transition.cpp
   ${public_api_src_dir}/transition/slide-transition.cpp
+  ${public_api_src_dir}/transition/scale-transition.cpp
   ${public_api_src_dir}/transition/transition-base.cpp
   ${public_api_src_dir}/transition/transition-set.cpp
   ${public_api_src_dir}/transition/transition.cpp
@@ -154,6 +155,7 @@ SET( public_api_visuals_header_files
 SET( public_api_transition_header_files
   ${public_api_src_dir}/transition/fade-transition.h
   ${public_api_src_dir}/transition/slide-transition.h
+  ${public_api_src_dir}/transition/scale-transition.h
   ${public_api_src_dir}/transition/transition-base.h
   ${public_api_src_dir}/transition/transition-set.h
   ${public_api_src_dir}/transition/transition.h
diff --git a/dali-toolkit/public-api/transition/scale-transition.cpp b/dali-toolkit/public-api/transition/scale-transition.cpp
new file mode 100644 (file)
index 0000000..676cc63
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2021 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/transition/scale-transition.h>
+
+// INTERNAL INCLUDES
+#include <dali-toolkit/internal/transition/scale-transition-impl.h>
+
+namespace Dali
+{
+namespace Toolkit
+{
+ScaleTransition::ScaleTransition() = default;
+
+ScaleTransition::ScaleTransition(Internal::ScaleTransition* scaleTransition)
+: TransitionBase(scaleTransition)
+{
+}
+
+ScaleTransition ScaleTransition::New(Dali::Toolkit::Control control, float scaleFactor, TimePeriod timePeriod)
+{
+  Internal::ScaleTransitionPtr internal = Dali::Toolkit::Internal::ScaleTransition::New(control, Vector2(scaleFactor, scaleFactor), timePeriod);
+
+  return ScaleTransition(internal.Get());
+}
+
+ScaleTransition ScaleTransition::New(Dali::Toolkit::Control control, const Vector2& scaleFactor, TimePeriod timePeriod)
+{
+  Internal::ScaleTransitionPtr internal = Dali::Toolkit::Internal::ScaleTransition::New(control, scaleFactor, timePeriod);
+
+  return ScaleTransition(internal.Get());
+}
+
+ScaleTransition ScaleTransition::DownCast(BaseHandle handle)
+{
+  return ScaleTransition(dynamic_cast<Dali::Toolkit::Internal::ScaleTransition*>(handle.GetObjectPtr()));
+}
+
+ScaleTransition::~ScaleTransition() = default;
+
+ScaleTransition::ScaleTransition(const ScaleTransition& handle) = default;
+
+ScaleTransition& ScaleTransition::operator=(const ScaleTransition& rhs) = default;
+
+ScaleTransition::ScaleTransition(ScaleTransition&& rhs) = default;
+
+ScaleTransition& ScaleTransition::operator=(ScaleTransition&& rhs) = default;
+
+void ScaleTransition::SetScaleFactor(const Vector2& scaleFactor)
+{
+  GetImplementation(*this).SetScaleFactor(scaleFactor);
+}
+
+Vector2 ScaleTransition::GetScaleFactor() const
+{
+  return GetImplementation(*this).GetScaleFactor();
+}
+
+} // namespace Toolkit
+
+} // namespace Dali
diff --git a/dali-toolkit/public-api/transition/scale-transition.h b/dali-toolkit/public-api/transition/scale-transition.h
new file mode 100644 (file)
index 0000000..8ce96c4
--- /dev/null
@@ -0,0 +1,149 @@
+#ifndef DALI_TOOLKIT_SCALE_TRANSITION_H
+#define DALI_TOOLKIT_SCALE_TRANSITION_H
+
+/*
+ * Copyright (c) 2021 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/control.h>
+#include <dali-toolkit/public-api/transition/transition-base.h>
+
+namespace Dali
+{
+namespace Toolkit
+{
+namespace Internal DALI_INTERNAL
+{
+class ScaleTransition;
+}
+
+/**
+ * @brief ScaleTransition provides smoothly appearing/disappearing effects for target Control.
+ * User of this scale transition can set scale factor for this transiton.
+ * The scale factor can be a single float value or Vector2 value.
+ * If it is a single float value, the value is applied to both x and y direction.
+ *
+ * If this transition is for appearing, the Control comes out with the scale factor applied
+ * and will be animated at its original scale.
+ * If this transition is for disappearing, the Control starts at its original size
+ * but will become the scale of scale factor and vanished.
+ */
+class DALI_TOOLKIT_API ScaleTransition : public TransitionBase
+{
+public:
+  /**
+   * @brief Creates an uninitialized ScaleTransition; this can be initialized with ScaleTransition::New().
+   *
+   * Calling member functions with an uninitialized ScaleTransition handle is not allowed.
+   */
+  ScaleTransition();
+
+  /**
+   * @brief Creates an initialized ScaleTransition.
+   *
+   * @param[in] control A control of this transition.
+   * @param[in] scaleFactor A scala scale factor that will be applied on both of width and height of the control
+   * @param[in] timePeriod The duration of the animation.
+   * @return A handle to a newly allocated Dali resource
+   */
+  static ScaleTransition New(Dali::Toolkit::Control control, float scaleFactor, TimePeriod timePeriod);
+
+  /**
+   * @brief Creates an initialized ScaleTransition.
+   *
+   * @param[in] control A control of this transition.
+   * @param[in] scaleFactor A scale vector to be applied on control during transition
+   * @param[in] timePeriod The duration of the animation.
+   * @return A handle to a newly allocated Dali resource
+   */
+  static ScaleTransition New(Dali::Toolkit::Control control, const Vector2& scaleFactor, TimePeriod timePeriod);
+
+  /**
+   * @brief Downcasts a handle to ScaleTransition handle.
+   *
+   * If handle points to an ScaleTransition object, the downcast produces valid handle.
+   * If not, the returned handle is left uninitialized.
+   *
+   * @param[in] handle Handle to an object
+   * @return Handle to an ScaleTransition object or an uninitialized handle
+   */
+  static ScaleTransition DownCast(BaseHandle handle);
+
+  /**
+   * @brief Destructor.
+   *
+   * This is non-virtual since derived Handle types must not contain data or virtual methods.
+   */
+  ~ScaleTransition();
+
+  /**
+   * @brief This copy constructor is required for (smart) pointer semantics.
+   *
+   * @param[in] handle A reference to the copied handle
+   */
+  ScaleTransition(const ScaleTransition& handle);
+
+  /**
+   * @brief This assignment operator is required for (smart) pointer semantics.
+   *
+   * @param[in] rhs A reference to the copied handle
+   * @return A reference to this
+   */
+  ScaleTransition& operator=(const ScaleTransition& rhs);
+
+  /**
+   * @brief Move constructor.
+   *
+   * @param[in] rhs A reference to the moved handle
+   */
+  ScaleTransition(ScaleTransition&& rhs);
+
+  /**
+   * @brief Move assignment operator.
+   *
+   * @param[in] rhs A reference to the moved handle
+   * @return A reference to this handle
+   */
+  ScaleTransition& operator=(ScaleTransition&& rhs);
+
+  /**
+   * @brief Sets scaleFactor to be used to scale target Control
+   *
+   * @param[in] scaleFactor Relative scaleFactor that will be used when the Control is appearing or disappearing.
+   */
+  void SetScaleFactor(const Vector2& scaleFactor);
+
+  /**
+   * @brief Retrieves scaleFactor that will be used when the Control is appearing or disappearing.
+   */
+  Vector2 GetScaleFactor() const;
+
+public: // Not intended for use by Application developers
+  /// @cond internal
+  /**
+   * @brief This constructor is used by ScaleTransition::New() methods.
+   * @param[in] scale A pointer to a newly allocated Dali resource
+   */
+  explicit DALI_INTERNAL ScaleTransition(Internal::ScaleTransition* scale);
+  /// @endcond
+};
+
+} // namespace Toolkit
+
+} // namespace Dali
+
+#endif // DALI_TOOLKIT_SCALE_TRANSITION_H
index ee380e7..41af842 100644 (file)
@@ -125,7 +125,7 @@ public:
 
   /**
    * @brief Retrieves direction to be used to move target Control
-   * 
+   *
    * @note The direction is normalized Vector.
    */
   Vector2 GetDirection() const;