Support Squircle factor for Visual property 92/319192/20
authorEunki Hong <eunkiki.hong@samsung.com>
Thu, 17 Oct 2024 05:02:35 +0000 (14:02 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Fri, 1 Nov 2024 05:37:08 +0000 (14:37 +0900)
Let we add Squareness factor as visual property.
So we can support squircle effects.

Also, let we support it to SceneView / WebView / BackgroundBlurEffect

Change-Id: I6edeb51ee9f917cbed05efe42af12b9b1eb6a21a
Signed-off-by: Eunki Hong <eunkiki.hong@samsung.com>
37 files changed:
automated-tests/src/dali-scene3d/utc-Dali-SceneView.cpp
automated-tests/src/dali-toolkit/utc-Dali-AnimatedImageVisual.cpp
automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp
automated-tests/src/dali-toolkit/utc-Dali-RenderEffect.cpp
automated-tests/src/dali-toolkit/utc-Dali-Transition.cpp
automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp
automated-tests/src/dali-toolkit/utc-Dali-VisualFactory.cpp
dali-scene3d/internal/controls/scene-view/scene-view-impl.cpp
dali-scene3d/internal/controls/scene-view/scene-view-impl.h
dali-scene3d/public-api/controls/scene-view/scene-view.h
dali-toolkit/devel-api/visual-factory/precompile-shader-option.cpp
dali-toolkit/devel-api/visual-factory/precompile-shader-option.h
dali-toolkit/devel-api/visuals/color-visual-properties-devel.h
dali-toolkit/devel-api/visuals/visual-properties-devel.h
dali-toolkit/internal/controls/render-effects/blur-effect-impl.cpp
dali-toolkit/internal/controls/web-view/web-view-impl.cpp
dali-toolkit/internal/controls/web-view/web-view-impl.h
dali-toolkit/internal/graphics/shaders/color-visual-shader.frag
dali-toolkit/internal/graphics/shaders/gradient-visual-shader.frag
dali-toolkit/internal/graphics/shaders/image-visual-shader.frag
dali-toolkit/internal/graphics/shaders/render-effect.frag
dali-toolkit/internal/visuals/color/color-visual-shader-factory.cpp
dali-toolkit/internal/visuals/color/color-visual-shader-factory.h
dali-toolkit/internal/visuals/color/color-visual.cpp
dali-toolkit/internal/visuals/gradient/gradient-visual.cpp
dali-toolkit/internal/visuals/image/image-visual-shader-factory.cpp
dali-toolkit/internal/visuals/image/image-visual-shader-feature-builder.cpp
dali-toolkit/internal/visuals/image/image-visual-shader-feature-builder.h
dali-toolkit/internal/visuals/image/image-visual.cpp
dali-toolkit/internal/visuals/visual-base-data-impl.cpp
dali-toolkit/internal/visuals/visual-base-data-impl.h
dali-toolkit/internal/visuals/visual-base-impl.cpp
dali-toolkit/internal/visuals/visual-base-impl.h
dali-toolkit/internal/visuals/visual-factory-cache.h
dali-toolkit/internal/visuals/visual-string-constants.cpp
dali-toolkit/internal/visuals/visual-string-constants.h
dali-toolkit/public-api/controls/control-impl.cpp

index dfb44addaa93c1b29536dce944a128c0cc16d622..37090fcd3d253f8fa979f90f935376428d4efa0f 100644 (file)
@@ -1249,6 +1249,33 @@ int UtcDaliSceneViewBorderline(void)
   END_TEST;
 }
 
+int UtcDaliSceneViewCornerSquareness(void)
+{
+  ToolkitTestApplication application;
+
+  Scene3D::SceneView view = Scene3D::SceneView::New();
+  application.GetScene().Add(view);
+
+  DALI_TEST_EQUALS(view.GetProperty<Vector4>(Dali::Scene3D::SceneView::Property::CORNER_RADIUS), Vector4::ZERO, TEST_LOCATION);
+  DALI_TEST_EQUALS(view.GetProperty<Vector4>(Dali::Scene3D::SceneView::Property::CORNER_SQUARENESS), Vector4::ZERO, TEST_LOCATION);
+  DALI_TEST_EQUALS(view.GetProperty<int>(Dali::Scene3D::SceneView::Property::CORNER_RADIUS_POLICY), static_cast<int>(Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
+
+  Vector4 expectCornerRadius       = Vector4(0.5f, 0.3f, 0.2f, 0.0f);
+  Vector4 expectCornerSquareness   = Vector4(0.1f, 0.2f, 0.3f, 0.4f);
+  int     expectCornerRadiusPolicy = static_cast<int>(Visual::Transform::Policy::RELATIVE);
+
+  view.UseFramebuffer(true);
+  view.SetProperty(Dali::Scene3D::SceneView::Property::CORNER_RADIUS, expectCornerRadius);
+  view.SetProperty(Dali::Scene3D::SceneView::Property::CORNER_SQUARENESS, expectCornerSquareness);
+  view.SetProperty(Dali::Scene3D::SceneView::Property::CORNER_RADIUS_POLICY, expectCornerRadiusPolicy);
+
+  DALI_TEST_EQUALS(view.GetProperty<Vector4>(Dali::Scene3D::SceneView::Property::CORNER_RADIUS), expectCornerRadius, TEST_LOCATION);
+  DALI_TEST_EQUALS(view.GetProperty<Vector4>(Dali::Scene3D::SceneView::Property::CORNER_SQUARENESS), expectCornerSquareness, TEST_LOCATION);
+  DALI_TEST_EQUALS(view.GetProperty<int>(Dali::Scene3D::SceneView::Property::CORNER_RADIUS_POLICY), expectCornerRadiusPolicy, TEST_LOCATION);
+
+  END_TEST;
+}
+
 namespace
 {
 static bool              gCaptureFinishedCalled{false};
index 26e4a94865deb7867526dd25bbf4f7567414d1ab..3cd9f34bc905765b6eeb0ed02ec0c1bf08b9b7ce 100644 (file)
@@ -99,6 +99,7 @@ int UtcDaliAnimatedImageVisualGetPropertyMap01(void)
       .Add(DevelVisual::Property::BORDERLINE_WIDTH, 33.3f)
       .Add(DevelVisual::Property::BORDERLINE_COLOR, Color::RED)
       .Add(DevelVisual::Property::BORDERLINE_OFFSET, 0.3f)
+      .Add(DevelVisual::Property::CORNER_SQUARENESS, 0.3f)
       .Add(DevelImageVisual::Property::FRAME_SPEED_FACTOR, 2.0f));
 
   Property::Map resultMap;
@@ -156,6 +157,10 @@ int UtcDaliAnimatedImageVisualGetPropertyMap01(void)
   DALI_TEST_CHECK(value);
   DALI_TEST_EQUALS(value->Get<float>(), 0.3f, TEST_LOCATION);
 
+  value = resultMap.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(value);
+  DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4(0.3f, 0.3f, 0.3f, 0.3f), TEST_LOCATION);
+
   // Check mask properties
   value = resultMap.Find(ImageVisual::Property::ALPHA_MASK_URL, Property::STRING);
   DALI_TEST_CHECK(value);
@@ -236,6 +241,7 @@ int UtcDaliAnimatedImageVisualGetPropertyMap02(void)
       .Add("borderlineWidth", 20.0f)
       .Add("borderlineColor", Vector4())
       .Add("borderlineOffset", -1.0f)
+      .Add("cornerSquareness", Vector4(1.0f, 0.5f, 0.25f, 0.0f))
       .Add("frameSpeedFactor", 0.5f));
 
   Property::Map resultMap;
@@ -315,6 +321,10 @@ int UtcDaliAnimatedImageVisualGetPropertyMap02(void)
   DALI_TEST_CHECK(value);
   DALI_TEST_EQUALS(value->Get<float>(), -1.0f, TEST_LOCATION);
 
+  value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_SQUARENESS, "cornerSquareness");
+  DALI_TEST_CHECK(value);
+  DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4(1.0f, 0.5f, 0.25f, 0.0f), TEST_LOCATION);
+
   // Check mask properties
   value = resultMap.Find(ImageVisual::Property::ALPHA_MASK_URL, "alphaMaskUrl");
   DALI_TEST_CHECK(value);
@@ -419,6 +429,10 @@ int UtcDaliAnimatedImageVisualGetPropertyMap03(void)
   DALI_TEST_CHECK(value);
   DALI_TEST_EQUALS(value->Get<float>(), 0.0f, TEST_LOCATION);
 
+  value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_SQUARENESS, "cornerSquareness");
+  DALI_TEST_CHECK(value);
+  DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4::ZERO, TEST_LOCATION);
+
   // Check mask properties
   value = resultMap.Find(ImageVisual::Property::ALPHA_MASK_URL, "alphaMaskUrl");
   DALI_TEST_CHECK(value);
@@ -510,6 +524,10 @@ int UtcDaliAnimatedImageVisualGetPropertyMap04(void)
   DALI_TEST_CHECK(value);
   DALI_TEST_EQUALS(value->Get<float>(), 0.0f, TEST_LOCATION);
 
+  value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_SQUARENESS, "cornerSquareness");
+  DALI_TEST_CHECK(value);
+  DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4::ZERO, TEST_LOCATION);
+
   END_TEST;
 }
 
index 9ee13ac60a48b5280832c3d9d21eb877b870996e..aad172f67afb06fc31a2a98352bbbf0fc4030d08 100644 (file)
@@ -300,6 +300,7 @@ int UtcDaliVisualFactoryGetAnimatedVectorImageVisual04(void)
   float           borderlineWidth  = 2.0f;
   Vector4         borderlineColor  = Vector4(1.0f, 1.0f, 1.0f, 1.0f);
   float           borderlineOffset = 0.1f;
+  float           cornerSquareness = 0.6f;
   Property::Array playRange;
   playRange.PushBack(startFrame);
   playRange.PushBack(endFrame);
@@ -319,6 +320,7 @@ int UtcDaliVisualFactoryGetAnimatedVectorImageVisual04(void)
     .Add("borderlineWidth", borderlineWidth)
     .Add("borderlineColor", borderlineColor)
     .Add("borderlineOffset", borderlineOffset)
+    .Add("cornerSquareness", cornerSquareness)
     .Add("desiredWidth", desiredWidth)
     .Add("desiredHeight", desiredHeight);
 
@@ -417,6 +419,10 @@ int UtcDaliVisualFactoryGetAnimatedVectorImageVisual04(void)
   DALI_TEST_CHECK(value);
   DALI_TEST_EQUALS(value->Get<float>(), borderlineOffset, TEST_LOCATION);
 
+  value = resultMap.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(value);
+  DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4(cornerSquareness, cornerSquareness, cornerSquareness, cornerSquareness), TEST_LOCATION);
+
   value = resultMap.Find(ImageVisual::Property::DESIRED_WIDTH, Property::INTEGER);
   DALI_TEST_CHECK(value);
   DALI_TEST_EQUALS(value->Get<int>(), desiredWidth, TEST_LOCATION);
@@ -442,6 +448,7 @@ int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void)
   float           borderlineWidth  = 2.3f;
   Vector4         borderlineColor  = Vector4(0.3f, 0.3f, 1.0f, 1.0f);
   float           borderlineOffset = 0.3f;
+  Vector4         cornerSquareness(0.1f, 0.4f, 0.2f, 0.3f);
   Property::Array playRange;
   playRange.PushBack(startFrame);
   playRange.PushBack(endFrame);
@@ -456,6 +463,7 @@ int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void)
     .Add(DevelVisual::Property::BORDERLINE_WIDTH, borderlineWidth)
     .Add(DevelVisual::Property::BORDERLINE_COLOR, borderlineColor)
     .Add(DevelVisual::Property::BORDERLINE_OFFSET, borderlineOffset)
+    .Add(DevelVisual::Property::CORNER_SQUARENESS, cornerSquareness)
     .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false)
     .Add(ImageVisual::Property::DESIRED_WIDTH, desiredWidth)
     .Add(ImageVisual::Property::DESIRED_HEIGHT, desiredHeight);
@@ -550,6 +558,10 @@ int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void)
   DALI_TEST_CHECK(value);
   DALI_TEST_EQUALS(value->Get<float>(), borderlineOffset, TEST_LOCATION);
 
+  value = resultMap.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(value);
+  DALI_TEST_EQUALS(value->Get<Vector4>(), cornerSquareness, TEST_LOCATION);
+
   value = resultMap.Find(ImageVisual::Property::DESIRED_WIDTH, Property::INTEGER);
   DALI_TEST_CHECK(value);
   DALI_TEST_EQUALS(value->Get<int>(), desiredWidth, TEST_LOCATION);
index e48f6f0e022e8614e2d4791eba8a36e25f63bee1..7c48745d3f1bdc8a16a03e2ba6433acfd8ce089a 100644 (file)
@@ -247,6 +247,7 @@ int UtcDaliRenderEffectSynchronizeBackgroundCornerRadius(void)
   blackDimmerMap.Insert(Toolkit::Visual::Property::MIX_COLOR, Color::BLACK);
   blackDimmerMap.Insert(Toolkit::Visual::Property::OPACITY, 0.2f);
   blackDimmerMap.Insert(Toolkit::DevelVisual::Property::CORNER_RADIUS, 30.0f);
+  blackDimmerMap.Insert(Toolkit::DevelVisual::Property::CORNER_SQUARENESS, 0.3f);
 
   RenderEffect effect = BackgroundBlurEffect::New(0.4f, 40);
 
@@ -265,6 +266,9 @@ int UtcDaliRenderEffectSynchronizeBackgroundCornerRadius(void)
   Vector4  radius   = Vector4::ZERO;
   renderer.GetProperty(renderer.GetPropertyIndex(std::string("uCornerRadius"))).Get(radius);
 
+  Vector4 squreness = Vector4::ZERO;
+  renderer.GetProperty(renderer.GetPropertyIndex(std::string("uCornerSquareness"))).Get(squreness);
+
   Toolkit::Visual::Transform::Policy::Type policy;
   renderer.GetProperty(renderer.GetPropertyIndex(std::string("uCornerRadiusPolicy"))).Get(policy);
   DALI_TEST_CHECK(policy == 1);
@@ -274,6 +278,11 @@ int UtcDaliRenderEffectSynchronizeBackgroundCornerRadius(void)
   DALI_TEST_CHECK(radius.z == 30.0f);
   DALI_TEST_CHECK(radius.w == 30.0f);
 
+  DALI_TEST_CHECK(squreness.x == 0.3f);
+  DALI_TEST_CHECK(squreness.y == 0.3f);
+  DALI_TEST_CHECK(squreness.z == 0.3f);
+  DALI_TEST_CHECK(squreness.w == 0.3f);
+
   END_TEST;
 }
 
index 784af73525169e5f1a86819f6f930278c0208b9b..0f35e9103735f89b633fb2bcbe337659625a9d23 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -99,6 +99,7 @@ int UtcDaliTransitionSetGetProperty01(void)
   controlProperty1.Insert(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, 50.f);
   controlProperty1.Insert(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, Vector4(1.0f, 0.0f, 0.0f, 1.0f));
   controlProperty1.Insert(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, 1.f);
+  controlProperty1.Insert(Toolkit::DevelVisual::Property::CORNER_SQUARENESS, 0.5f);
   control1.SetProperty(Toolkit::Control::Property::BACKGROUND, controlProperty1);
 
   Control control2 = Control::New();
@@ -112,6 +113,7 @@ int UtcDaliTransitionSetGetProperty01(void)
   controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, 30.f);
   controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, Vector4(1.0f, 1.0f, 0.0f, 0.5f));
   controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, -1.f);
+  controlProperty2.Insert(Toolkit::DevelVisual::Property::CORNER_SQUARENESS, 0.2f);
   control2.SetProperty(Toolkit::Control::Property::BACKGROUND, controlProperty2);
 
   application.GetScene().Add(control1);
@@ -159,6 +161,7 @@ int UtcDaliTransitionSetGetProperty02(void)
   controlProperty1.Insert(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, 50.f);
   controlProperty1.Insert(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, Vector4(1.0f, 0.0f, 0.0f, 1.0f));
   controlProperty1.Insert(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, -1.f);
+  controlProperty1.Insert(Toolkit::DevelVisual::Property::CORNER_SQUARENESS, Vector4(0.1f, 0.2f, 0.3f, 0.4f));
   control1.SetProperty(Toolkit::Control::Property::BACKGROUND, controlProperty1);
 
   Control control2 = Control::New();
@@ -172,6 +175,7 @@ int UtcDaliTransitionSetGetProperty02(void)
   controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, 30.f);
   controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, Vector4(1.0f, 1.0f, 0.0f, 0.5f));
   controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, -1.f);
+  controlProperty2.Insert(Toolkit::DevelVisual::Property::CORNER_SQUARENESS, Vector4(0.4f, 0.3f, 0.2f, 0.1f));
   control2.SetProperty(Toolkit::Control::Property::BACKGROUND, controlProperty2);
 
   application.GetScene().Add(control1);
@@ -217,7 +221,9 @@ int UtcDaliTransitionBetweenControlPair(void)
   float   destinationBorderlineWidth(80.0f);
   Vector4 destinationBorderlineColor(0.5f, 1.0f, 0.5f, 0.3f);
   float   destinationBorderlineOffset(-1.0f);
-  Vector4 destinationRadiusV4 = Vector4(destinationRadius, destinationRadius, destinationRadius, destinationRadius);
+  float   destinationSqureness(0.3f);
+  Vector4 destinationRadiusV4    = Vector4(destinationRadius, destinationRadius, destinationRadius, destinationRadius);
+  Vector4 destinationSqurenessV4 = Vector4(destinationSqureness, destinationSqureness, destinationSqureness, destinationSqureness);
 
   Control control1 = Control::New();
   control1.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
@@ -234,6 +240,7 @@ int UtcDaliTransitionBetweenControlPair(void)
   controlProperty1.Insert(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, 60.f);
   controlProperty1.Insert(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, Vector4(1.0f, 0.0f, 0.0f, 1.0f));
   controlProperty1.Insert(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, 1.f);
+  controlProperty1.Insert(Toolkit::DevelVisual::Property::CORNER_SQUARENESS, 0.1f);
   control1.SetProperty(Toolkit::Control::Property::BACKGROUND, controlProperty1);
 
   Control control2 = Control::New();
@@ -251,6 +258,7 @@ int UtcDaliTransitionBetweenControlPair(void)
   controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, destinationBorderlineWidth);
   controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, destinationBorderlineColor);
   controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, destinationBorderlineOffset);
+  controlProperty2.Insert(Toolkit::DevelVisual::Property::CORNER_SQUARENESS, destinationSqureness);
   control2.SetProperty(Toolkit::Control::Property::BACKGROUND, controlProperty2);
 
   DALI_TEST_EQUALS(destinationPosition, control2.GetProperty<Vector3>(Actor::Property::POSITION), TEST_LOCATION);
@@ -263,6 +271,8 @@ int UtcDaliTransitionBetweenControlPair(void)
   DALI_TEST_EQUALS(destinationBorderlineColor, borderlineColor, TEST_LOCATION);
   float borderlineOffset = backgroundMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET)->Get<float>();
   DALI_TEST_EQUALS(destinationBorderlineOffset, borderlineOffset, TEST_LOCATION);
+  Vector4 cornerSquareness = backgroundMap.Find(Toolkit::DevelVisual::Property::CORNER_SQUARENESS)->Get<Vector4>();
+  DALI_TEST_EQUALS(destinationSqurenessV4, cornerSquareness, TEST_LOCATION);
 
   application.GetScene().Add(control1);
   application.GetScene().Add(control2);
@@ -297,6 +307,8 @@ int UtcDaliTransitionBetweenControlPair(void)
   DALI_TEST_NOT_EQUALS(destinationBorderlineColor, borderlineColor, 0.00001f, TEST_LOCATION);
   borderlineOffset = renderer.GetCurrentProperty<float>(DecoratedVisualRenderer::Property::BORDERLINE_OFFSET);
   DALI_TEST_NOT_EQUALS(destinationBorderlineOffset, borderlineOffset, 0.00001f, TEST_LOCATION);
+  cornerSquareness = renderer.GetCurrentProperty<Vector4>(DecoratedVisualRenderer::Property::CORNER_SQUARENESS);
+  DALI_TEST_NOT_EQUALS(destinationSqurenessV4, cornerSquareness, 0.00001f, TEST_LOCATION);
 
   application.SendNotification();
   application.Render(700);
@@ -323,6 +335,8 @@ int UtcDaliTransitionBetweenControlPair(void)
   DALI_TEST_EQUALS(destinationBorderlineColor, borderlineColor, TEST_LOCATION);
   borderlineOffset = renderer.GetCurrentProperty<float>(DecoratedVisualRenderer::Property::BORDERLINE_OFFSET);
   DALI_TEST_EQUALS(destinationBorderlineOffset, borderlineOffset, TEST_LOCATION);
+  cornerSquareness = renderer.GetCurrentProperty<Vector4>(DecoratedVisualRenderer::Property::CORNER_SQUARENESS);
+  DALI_TEST_EQUALS(destinationSqurenessV4, cornerSquareness, TEST_LOCATION);
 
   END_TEST;
 }
@@ -341,7 +355,9 @@ int UtcDaliTransitionBetweenControlPair2(void)
   float   sourceBorderlineWidth(60.0f);
   Vector4 sourceBorderlineColor(1.0f, 0.0f, 0.0f, 1.0f);
   float   sourceBorderlineOffset(1.f);
-  Vector4 sourceRadiusV4 = Vector4(sourceRadius, sourceRadius, sourceRadius, sourceRadius);
+  float   sourceSqureness(0.3f);
+  Vector4 sourceRadiusV4    = Vector4(sourceRadius, sourceRadius, sourceRadius, sourceRadius);
+  Vector4 sourceSqurenessV4 = Vector4(sourceSqureness, sourceSqureness, sourceSqureness, sourceSqureness);
 
   Vector3 destinationPosition(50, 50, 0);
   Vector3 destinationSize(120, 120, 0);
@@ -352,7 +368,9 @@ int UtcDaliTransitionBetweenControlPair2(void)
   float   destinationBorderlineWidth(80.0f);
   Vector4 destinationBorderlineColor(0.5f, 1.0f, 0.5f, 0.3f);
   float   destinationBorderlineOffset(-1.0f);
-  Vector4 destinationRadiusV4 = Vector4(destinationRadius, destinationRadius, destinationRadius, destinationRadius);
+  float   destinationSqureness(0.5f);
+  Vector4 destinationRadiusV4    = Vector4(destinationRadius, destinationRadius, destinationRadius, destinationRadius);
+  Vector4 destinationSqurenessV4 = Vector4(destinationSqureness, destinationSqureness, destinationSqureness, destinationSqureness);
 
   Control control1 = Control::New();
   control1.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
@@ -369,6 +387,7 @@ int UtcDaliTransitionBetweenControlPair2(void)
   controlProperty1.Insert(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, sourceBorderlineWidth);
   controlProperty1.Insert(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, sourceBorderlineColor);
   controlProperty1.Insert(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, sourceBorderlineOffset);
+  controlProperty1.Insert(Toolkit::DevelVisual::Property::CORNER_SQUARENESS, sourceSqureness);
   control1.SetProperty(Toolkit::Control::Property::BACKGROUND, controlProperty1);
 
   Control control2 = Control::New();
@@ -386,6 +405,7 @@ int UtcDaliTransitionBetweenControlPair2(void)
   controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, destinationBorderlineWidth);
   controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, destinationBorderlineColor);
   controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, destinationBorderlineOffset);
+  controlProperty2.Insert(Toolkit::DevelVisual::Property::CORNER_SQUARENESS, destinationSqureness);
   control2.SetProperty(Toolkit::Control::Property::BACKGROUND, controlProperty2);
 
   DALI_TEST_EQUALS(destinationPosition, control2.GetProperty<Vector3>(Actor::Property::POSITION), TEST_LOCATION);
@@ -398,6 +418,8 @@ int UtcDaliTransitionBetweenControlPair2(void)
   DALI_TEST_EQUALS(destinationBorderlineColor, borderlineColor, TEST_LOCATION);
   float borderlineOffset = backgroundMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET)->Get<float>();
   DALI_TEST_EQUALS(destinationBorderlineOffset, borderlineOffset, TEST_LOCATION);
+  Vector4 cornerSquareness = backgroundMap.Find(Toolkit::DevelVisual::Property::CORNER_SQUARENESS)->Get<Vector4>();
+  DALI_TEST_EQUALS(destinationSqurenessV4, cornerSquareness, TEST_LOCATION);
 
   application.GetScene().Add(control1);
   application.GetScene().Add(control2);
@@ -437,6 +459,9 @@ int UtcDaliTransitionBetweenControlPair2(void)
   borderlineOffset = renderer.GetCurrentProperty<float>(DecoratedVisualRenderer::Property::BORDERLINE_OFFSET);
   DALI_TEST_NOT_EQUALS(destinationBorderlineOffset, borderlineOffset, 0.00001f, TEST_LOCATION);
 
+  cornerSquareness = renderer.GetCurrentProperty<Vector4>(DecoratedVisualRenderer::Property::CORNER_RADIUS);
+  DALI_TEST_NOT_EQUALS(destinationSqurenessV4, cornerSquareness, 0.00001f, TEST_LOCATION);
+
   application.SendNotification();
   application.Render(700);
 
@@ -466,6 +491,9 @@ int UtcDaliTransitionBetweenControlPair2(void)
   borderlineOffset = renderer.GetCurrentProperty<float>(DecoratedVisualRenderer::Property::BORDERLINE_OFFSET);
   DALI_TEST_EQUALS(destinationBorderlineOffset, borderlineOffset, TEST_LOCATION);
 
+  cornerSquareness = renderer.GetCurrentProperty<Vector4>(DecoratedVisualRenderer::Property::CORNER_SQUARENESS);
+  DALI_TEST_EQUALS(destinationSqurenessV4, cornerSquareness, TEST_LOCATION);
+
   // every actor properties of control1 are returned to the source properties.
   DALI_TEST_EQUALS(sourcePosition, control1.GetProperty<Vector3>(Actor::Property::POSITION), TEST_LOCATION);
   DALI_TEST_EQUALS(sourceSize, control1.GetProperty<Vector3>(Actor::Property::SIZE), TEST_LOCATION);
@@ -491,6 +519,9 @@ int UtcDaliTransitionBetweenControlPair2(void)
   borderlineOffset = renderer.GetCurrentProperty<float>(DecoratedVisualRenderer::Property::BORDERLINE_OFFSET);
   DALI_TEST_EQUALS(sourceBorderlineOffset, borderlineOffset, TEST_LOCATION);
 
+  cornerSquareness = renderer.GetCurrentProperty<Vector4>(DecoratedVisualRenderer::Property::CORNER_SQUARENESS);
+  DALI_TEST_EQUALS(sourceSqurenessV4, cornerSquareness, TEST_LOCATION);
+
   END_TEST;
 }
 
@@ -503,6 +534,7 @@ int UtcDaliTransitionBetweenControlPairWithoutEmptySourceBackground(void)
   float   destinationBorderlineWidth(40.f);
   Vector4 destinationBorderlineColor(1.0f, 0.5f, 0.2f, 0.8f);
   float   destinationBorderlineOffset(1.f);
+  Vector4 destinationSquareness(0.1f, 0.2f, 0.4f, 0.3f);
 
   Control control1 = Control::New();
   control1.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
@@ -520,6 +552,7 @@ int UtcDaliTransitionBetweenControlPairWithoutEmptySourceBackground(void)
   controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, destinationBorderlineWidth);
   controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, destinationBorderlineColor);
   controlProperty2.Insert(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, destinationBorderlineOffset);
+  controlProperty2.Insert(Toolkit::DevelVisual::Property::CORNER_SQUARENESS, destinationSquareness);
   control2.SetProperty(Toolkit::Control::Property::BACKGROUND, controlProperty2);
 
   Property::Map backgroundMap = control2.GetProperty<Property::Map>(Toolkit::Control::Property::BACKGROUND);
@@ -531,6 +564,8 @@ int UtcDaliTransitionBetweenControlPairWithoutEmptySourceBackground(void)
   DALI_TEST_EQUALS(destinationBorderlineColor, borderlineColor, TEST_LOCATION);
   float borderlineOffset = backgroundMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET)->Get<float>();
   DALI_TEST_EQUALS(destinationBorderlineOffset, borderlineOffset, TEST_LOCATION);
+  Vector4 cornerSquareness = backgroundMap.Find(Toolkit::DevelVisual::Property::CORNER_SQUARENESS)->Get<Vector4>();
+  DALI_TEST_EQUALS(destinationSquareness, cornerSquareness, TEST_LOCATION);
 
   application.GetScene().Add(control1);
   application.GetScene().Add(control2);
@@ -563,6 +598,8 @@ int UtcDaliTransitionBetweenControlPairWithoutEmptySourceBackground(void)
   DALI_TEST_EQUALS(destinationBorderlineColor, borderlineColor, TEST_LOCATION);
   borderlineOffset = backgroundMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET)->Get<float>();
   DALI_TEST_EQUALS(destinationBorderlineOffset, borderlineOffset, TEST_LOCATION);
+  cornerSquareness = backgroundMap.Find(Toolkit::DevelVisual::Property::CORNER_SQUARENESS)->Get<Vector4>();
+  DALI_TEST_EQUALS(destinationSquareness, cornerSquareness, TEST_LOCATION);
 
   application.SendNotification();
   application.Render(700);
@@ -583,6 +620,8 @@ int UtcDaliTransitionBetweenControlPairWithoutEmptySourceBackground(void)
   DALI_TEST_EQUALS(destinationBorderlineColor, borderlineColor, TEST_LOCATION);
   borderlineOffset = backgroundMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET)->Get<float>();
   DALI_TEST_EQUALS(destinationBorderlineOffset, borderlineOffset, TEST_LOCATION);
+  cornerSquareness = backgroundMap.Find(Toolkit::DevelVisual::Property::CORNER_SQUARENESS)->Get<Vector4>();
+  DALI_TEST_EQUALS(destinationSquareness, cornerSquareness, TEST_LOCATION);
 
   END_TEST;
 }
index 53d9dc6315e3071c416019ac0f1fe191072b2870..e8e7d8d7b03341d5e8e0b0c0c7c01d50ccaa4b5d 100644 (file)
@@ -142,39 +142,33 @@ bool DaliTestCheckMaps(const Property::Map& fontStyleMapGet, const Property::Map
   return true;
 }
 
-void TestShaderCodeContainSubstrings(Control control, std::vector<std::pair<std::string, bool>> substringCheckList, const char* location)
+struct ShaderCodeCheckResult
 {
-  Renderer        renderer = control.GetRendererAt(0);
-  Shader          shader   = renderer.GetShader();
-  Property::Value value    = shader.GetProperty(Shader::Property::PROGRAM);
-  Property::Map*  map      = value.GetMap();
-  DALI_TEST_CHECK(map);
-
-  Property::Value* vertex = map->Find("vertex"); // vertex key name from shader-impl.cpp
-  std::string      vertexShader;
-  DALI_TEST_CHECK(vertex->Get(vertexShader));
-  for(const auto& checkPair : substringCheckList)
+  ShaderCodeCheckResult(bool expect)
+  : expectVertexResult{expect},
+    expectFragmentResult{expect}
   {
-    const auto& keyword = checkPair.first;
-    const auto& expect  = checkPair.second;
-    tet_printf("check [%s] %s exist in vertex shader\n", keyword.c_str(), expect ? "is" : "is not");
-    DALI_TEST_EQUALS((vertexShader.find(keyword.c_str()) != std::string::npos), expect, location);
   }
-
-  Property::Value* fragment = map->Find("fragment"); // fragment key name from shader-impl.cpp
-  DALI_TEST_CHECK(fragment);
-  std::string fragmentShader;
-  DALI_TEST_CHECK(fragment->Get(fragmentShader));
-  for(const auto& checkPair : substringCheckList)
+  ShaderCodeCheckResult(std::initializer_list<bool> list)
+  : expectVertexResult{false},
+    expectFragmentResult{false}
   {
-    const auto& keyword = checkPair.first;
-    const auto& expect  = checkPair.second;
-    tet_printf("check [%s] %s exist in fragment shader\n", keyword.c_str(), expect ? "is" : "is not");
-    DALI_TEST_EQUALS((fragmentShader.find(keyword.c_str()) != std::string::npos), expect, location);
+    if(list.size() == 1)
+    {
+      expectVertexResult = expectFragmentResult = *list.begin();
+    }
+    else if(list.size() > 1)
+    {
+      expectVertexResult   = *list.begin();
+      expectFragmentResult = *(list.begin() + 1);
+    }
   }
-}
 
-void TestShaderCodeContainSubstringsForEachShader(Control control, std::vector<std::pair<std::string, std::pair<bool, bool>>> substringCheckList, const char* location)
+  bool expectVertexResult{false};
+  bool expectFragmentResult{false};
+};
+
+void TestShaderCodeContainSubstrings(Control control, std::vector<std::pair<std::string, ShaderCodeCheckResult>> substringCheckList, const char* location)
 {
   Renderer        renderer = control.GetRendererAt(0);
   Shader          shader   = renderer.GetShader();
@@ -188,7 +182,7 @@ void TestShaderCodeContainSubstringsForEachShader(Control control, std::vector<s
   for(const auto& checkPair : substringCheckList)
   {
     const auto& keyword = checkPair.first;
-    const auto& expect  = checkPair.second.first;
+    const auto& expect  = checkPair.second.expectVertexResult;
     tet_printf("check [%s] %s exist in vertex shader\n", keyword.c_str(), expect ? "is" : "is not");
     DALI_TEST_EQUALS((vertexShader.find(keyword.c_str()) != std::string::npos), expect, location);
   }
@@ -200,7 +194,7 @@ void TestShaderCodeContainSubstringsForEachShader(Control control, std::vector<s
   for(const auto& checkPair : substringCheckList)
   {
     const auto& keyword = checkPair.first;
-    const auto& expect  = checkPair.second.second;
+    const auto& expect  = checkPair.second.expectFragmentResult;
     tet_printf("check [%s] %s exist in fragment shader\n", keyword.c_str(), expect ? "is" : "is not");
     DALI_TEST_EQUALS((fragmentShader.find(keyword.c_str()) != std::string::npos), expect, location);
   }
@@ -560,6 +554,7 @@ int UtcDaliVisualGetPropertyMap1(void)
   propertyMap.Insert(DevelVisual::Property::BORDERLINE_WIDTH, 20.0f);
   propertyMap.Insert(DevelVisual::Property::BORDERLINE_COLOR, Color::RED);
   propertyMap.Insert(DevelVisual::Property::BORDERLINE_OFFSET, -1.0f);
+  propertyMap.Insert(DevelVisual::Property::CORNER_SQUARENESS, 1.0f);
   propertyMap.Insert(DevelColorVisual::Property::BLUR_RADIUS, 20.0f);
   propertyMap.Insert(DevelColorVisual::Property::CUTOUT_POLICY, DevelColorVisual::CutoutPolicy::CUTOUT_VIEW_WITH_CORNER_RADIUS);
   Visual::Base colorVisual = factory.CreateVisual(propertyMap);
@@ -595,6 +590,10 @@ int UtcDaliVisualGetPropertyMap1(void)
   DALI_TEST_CHECK(borderlineOffsetValue);
   DALI_TEST_CHECK(borderlineOffsetValue->Get<float>() == -1.0f);
 
+  Property::Value* cornerSqaurenessValue = resultMap.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerSqaurenessValue);
+  DALI_TEST_CHECK(cornerSqaurenessValue->Get<Vector4>() == Vector4::ONE);
+
   Property::Value* blurRadiusValue = resultMap.Find(DevelColorVisual::Property::BLUR_RADIUS, Property::FLOAT);
   DALI_TEST_CHECK(blurRadiusValue);
   DALI_TEST_CHECK(blurRadiusValue->Get<float>() == 20.0f);
@@ -3931,6 +3930,7 @@ int UtcDaliVisualRoundedCorner(void)
     {
       UniformData("cornerRadius", Property::Type::VECTOR4),
       UniformData("cornerRadiusPolicy", Property::Type::FLOAT),
+      UniformData("cornerSquareness", Property::Type::VECTOR4),
     };
 
   // image visual
@@ -3941,11 +3941,13 @@ int UtcDaliVisualRoundedCorner(void)
 
     VisualFactory factory = VisualFactory::Get();
     Property::Map properties;
-    float         cornerRadius = 30.0f;
+    float         cornerRadius     = 30.0f;
+    float         cornerSquareness = 0.5f;
 
-    properties[Visual::Property::TYPE]               = Visual::IMAGE;
-    properties[ImageVisual::Property::URL]           = TEST_IMAGE_FILE_NAME;
-    properties[DevelVisual::Property::CORNER_RADIUS] = cornerRadius;
+    properties[Visual::Property::TYPE]                   = Visual::IMAGE;
+    properties[ImageVisual::Property::URL]               = TEST_IMAGE_FILE_NAME;
+    properties[DevelVisual::Property::CORNER_RADIUS]     = cornerRadius;
+    properties[DevelVisual::Property::CORNER_SQUARENESS] = cornerSquareness;
 
     Visual::Base visual = factory.CreateVisual(properties);
 
@@ -3969,6 +3971,7 @@ int UtcDaliVisualRoundedCorner(void)
     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);
+    DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", Vector4(cornerSquareness, cornerSquareness, cornerSquareness, cornerSquareness)), true, TEST_LOCATION);
   }
 
   // color visual 1
@@ -3979,12 +3982,14 @@ int UtcDaliVisualRoundedCorner(void)
 
     VisualFactory factory = VisualFactory::Get();
     Property::Map properties;
-    float         cornerRadius = 30.0f;
+    float         cornerRadius     = 30.0f;
+    float         cornerSquareness = 0.5f;
 
     properties[Visual::Property::TYPE]           = Visual::COLOR;
     properties[ColorVisual::Property::MIX_COLOR] = Color::BLUE;
     properties["cornerRadius"]                   = cornerRadius;
     properties["cornerRadiusPolicy"]             = Toolkit::Visual::Transform::Policy::ABSOLUTE;
+    properties["cornerSquareness"]               = cornerSquareness;
 
     Visual::Base visual = factory.CreateVisual(properties);
 
@@ -4006,6 +4011,7 @@ int UtcDaliVisualRoundedCorner(void)
     // 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);
+    DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", Vector4(cornerSquareness, cornerSquareness, cornerSquareness, cornerSquareness)), true, TEST_LOCATION);
   }
 
   // color visual 2
@@ -4043,6 +4049,8 @@ int UtcDaliVisualRoundedCorner(void)
     // 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);
+    // Default corner squareness is Vector4::ZERO.
+    DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", Vector4::ZERO), true, TEST_LOCATION);
   }
 
   // color visual 3 - invalid value
@@ -4081,6 +4089,8 @@ int UtcDaliVisualRoundedCorner(void)
     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);
+    // Default corner squareness is Vector4::ZERO.
+    DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", Vector4::ZERO), true, TEST_LOCATION);
   }
 
   // gradient visual
@@ -4092,10 +4102,12 @@ int UtcDaliVisualRoundedCorner(void)
     VisualFactory factory = VisualFactory::Get();
     Property::Map properties;
     float         cornerRadius = 30.0f;
+    Vector4       cornerSquareness(0.5f, 0.5f, 0.5f, 0.5f);
 
     properties[Visual::Property::TYPE]                   = Visual::GRADIENT;
     properties[ColorVisual::Property::MIX_COLOR]         = Color::BLUE;
     properties[DevelVisual::Property::CORNER_RADIUS]     = cornerRadius;
+    properties[DevelVisual::Property::CORNER_SQUARENESS] = cornerSquareness;
     properties[GradientVisual::Property::START_POSITION] = Vector2(0.5f, 0.5f);
     properties[GradientVisual::Property::END_POSITION]   = Vector2(-0.5f, -0.5f);
     properties[GradientVisual::Property::UNITS]          = GradientVisual::Units::USER_SPACE;
@@ -4132,6 +4144,7 @@ int UtcDaliVisualRoundedCorner(void)
     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);
+    DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", cornerSquareness), true, TEST_LOCATION);
   }
 
   // animated image visual
@@ -4143,11 +4156,13 @@ int UtcDaliVisualRoundedCorner(void)
     VisualFactory factory = VisualFactory::Get();
     Property::Map properties;
     Vector4       cornerRadius(24.0f, 23.0f, 22.0f, 21.0f);
+    Vector4       cornerSquareness(0.3f, 0.2f, 0.5f, 0.6f);
 
     properties[Visual::Property::TYPE]               = Visual::ANIMATED_IMAGE;
     properties[ImageVisual::Property::URL]           = TEST_GIF_FILE_NAME;
     properties[DevelVisual::Property::CORNER_RADIUS] = cornerRadius.x + 10.0f; // Dummy Input
     properties[DevelVisual::Property::CORNER_RADIUS] = cornerRadius;
+    properties["cornerSquareness"]                   = cornerSquareness;
     properties["cornerRadiusPolicy"]                 = Toolkit::Visual::Transform::Policy::ABSOLUTE;
 
     Visual::Base visual = factory.CreateVisual(properties);
@@ -4171,6 +4186,7 @@ int UtcDaliVisualRoundedCorner(void)
 
     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);
+    DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", cornerSquareness), true, TEST_LOCATION);
   }
 
   // vector image visual
@@ -4210,6 +4226,8 @@ int UtcDaliVisualRoundedCorner(void)
     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);
+    // Default corner squareness is Vector4::ZERO.
+    DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", Vector4::ZERO), true, TEST_LOCATION);
   }
 
   // animated vector image visual
@@ -4220,13 +4238,15 @@ int UtcDaliVisualRoundedCorner(void)
 
     VisualFactory factory = VisualFactory::Get();
     Property::Map properties;
-    float         cornerRadius = 1.3f;
+    float         cornerRadius     = 1.3f;
+    float         cornerSquareness = 0.1f;
 
     properties[Visual::Property::TYPE]                      = DevelVisual::ANIMATED_VECTOR_IMAGE;
     properties[ImageVisual::Property::URL]                  = TEST_VECTOR_IMAGE_FILE_NAME;
     properties["cornerRadius"]                              = Vector4(1.0f, 100.0f, 10.0f, 0.1f); // Dummy Input
     properties["cornerRadius"]                              = cornerRadius;
     properties[DevelVisual::Property::CORNER_RADIUS_POLICY] = Toolkit::Visual::Transform::Policy::RELATIVE;
+    properties[DevelVisual::Property::CORNER_SQUARENESS]    = cornerSquareness;
     properties["synchronousLoading"]                        = false;
 
     Visual::Base visual = factory.CreateVisual(properties);
@@ -4251,6 +4271,7 @@ int UtcDaliVisualRoundedCorner(void)
 
     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);
+    DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", Vector4(cornerSquareness, cornerSquareness, cornerSquareness, cornerSquareness)), true, TEST_LOCATION);
   }
 
   END_TEST;
@@ -4267,6 +4288,7 @@ int UtcDaliVisualBorderline(void)
       UniformData("borderlineWidth", Property::Type::FLOAT),
       UniformData("borderlineColor", Property::Type::VECTOR4),
       UniformData("borderlineOffset", Property::Type::FLOAT),
+      UniformData("cornerSquareness", Property::Type::VECTOR4),
     };
 
   // image visual
@@ -4281,6 +4303,7 @@ int UtcDaliVisualBorderline(void)
     float         borderlineWidth = 30.0f;
     Vector4       borderlineColor(1.0f, 0.0f, 0.0f, 1.0f);
     float         borderlineOffset = 1.0f;
+    float         cornerSquareness = 0.5f;
 
     properties[Visual::Property::TYPE]                   = Visual::IMAGE;
     properties[ImageVisual::Property::URL]               = TEST_IMAGE_FILE_NAME;
@@ -4288,6 +4311,7 @@ int UtcDaliVisualBorderline(void)
     properties[DevelVisual::Property::BORDERLINE_WIDTH]  = borderlineWidth;
     properties[DevelVisual::Property::BORDERLINE_COLOR]  = borderlineColor;
     properties[DevelVisual::Property::BORDERLINE_OFFSET] = borderlineOffset;
+    properties[DevelVisual::Property::CORNER_SQUARENESS] = cornerSquareness;
 
     Visual::Base visual = factory.CreateVisual(properties);
 
@@ -4314,6 +4338,7 @@ int UtcDaliVisualBorderline(void)
     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);
+    DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", Vector4(cornerSquareness, cornerSquareness, cornerSquareness, cornerSquareness)), true, TEST_LOCATION);
   }
 
   // color visual 1
@@ -4328,6 +4353,7 @@ int UtcDaliVisualBorderline(void)
     float         borderlineWidth = 30.0f;
     Vector4       borderlineColor(0.5f, 0.4f, 0.3f, 0.2f);
     float         borderlineOffset = -0.4f;
+    Vector4       cornerSquareness(0.1f, 0.2f, 0.3f, 0.4f);
 
     properties[Visual::Property::TYPE]           = Visual::COLOR;
     properties[ColorVisual::Property::MIX_COLOR] = Color::BLUE;
@@ -4335,6 +4361,7 @@ int UtcDaliVisualBorderline(void)
     properties["borderlineWidth"]                = borderlineWidth;
     properties["borderlineColor"]                = borderlineColor;
     properties["borderlineOffset"]               = borderlineOffset;
+    properties["cornerSquareness"]               = cornerSquareness;
 
     Visual::Base visual = factory.CreateVisual(properties);
 
@@ -4357,6 +4384,7 @@ int UtcDaliVisualBorderline(void)
     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);
+    DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", cornerSquareness), true, TEST_LOCATION);
   }
 
   // color visual 2, default color, default offset
@@ -4446,13 +4474,15 @@ int UtcDaliVisualBorderline(void)
 
     VisualFactory factory = VisualFactory::Get();
     Property::Map properties;
-    float         borderlineWidth = 30.0f;
-    float         cornerRadius    = 70.0f;
+    float         borderlineWidth  = 30.0f;
+    float         cornerRadius     = 70.0f;
+    float         cornerSquareness = 0.5f;
 
     properties[Visual::Property::TYPE]                   = Visual::GRADIENT;
     properties[ColorVisual::Property::MIX_COLOR]         = Color::BLUE;
     properties[DevelVisual::Property::CORNER_RADIUS]     = cornerRadius;
     properties[DevelVisual::Property::BORDERLINE_WIDTH]  = borderlineWidth;
+    properties[DevelVisual::Property::CORNER_SQUARENESS] = cornerSquareness;
     properties[GradientVisual::Property::START_POSITION] = Vector2(0.5f, 0.5f);
     properties[GradientVisual::Property::END_POSITION]   = Vector2(-0.5f, -0.5f);
     properties[GradientVisual::Property::UNITS]          = GradientVisual::Units::USER_SPACE;
@@ -4494,6 +4524,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);
+    DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", Vector4(cornerSquareness, cornerSquareness, cornerSquareness, cornerSquareness)), true, TEST_LOCATION);
   }
 
   // animated image visual
@@ -4583,6 +4614,8 @@ 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);
+    // Default corner squareness is Vector4::ZERO.
+    DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", Vector4::ZERO), true, TEST_LOCATION);
   }
 
   // animated vector image visual
@@ -4597,6 +4630,7 @@ int UtcDaliVisualBorderline(void)
     float         borderlineWidth = 13.0f;
     Vector4       borderlineColor(0.3f, 0.3f, 0.3f, 1.0f);
     float         borderlineOffset = 13.0f;
+    Vector4       cornerSquareness(0.1f, 0.0f, 0.2f, 0.4f);
 
     properties[Visual::Property::TYPE]                      = DevelVisual::ANIMATED_VECTOR_IMAGE;
     properties[ImageVisual::Property::URL]                  = TEST_VECTOR_IMAGE_FILE_NAME;
@@ -4605,6 +4639,7 @@ int UtcDaliVisualBorderline(void)
     properties[DevelVisual::Property::BORDERLINE_WIDTH]     = borderlineWidth;
     properties["borderlineColor"]                           = borderlineColor;
     properties[DevelVisual::Property::BORDERLINE_OFFSET]    = borderlineOffset;
+    properties["cornerSquareness"]                          = cornerSquareness;
     properties[ImageVisual::Property::SYNCHRONOUS_LOADING]  = false;
 
     Visual::Base visual = factory.CreateVisual(properties);
@@ -4632,6 +4667,7 @@ int UtcDaliVisualBorderline(void)
     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);
+    DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", cornerSquareness), true, TEST_LOCATION);
   }
 
   END_TEST;
@@ -5059,7 +5095,9 @@ int UtcDaliVisualGetVisualProperty01(void)
       UniformData("blurRadius", Property::Type::FLOAT),
       UniformData("borderlineWidth", Property::Type::FLOAT),
       UniformData("borderlineColor", Property::Type::VECTOR4),
-      UniformData("borderlineOffset", Property::Type::FLOAT)};
+      UniformData("borderlineOffset", Property::Type::FLOAT),
+      UniformData("cornerSquareness", Property::Type::VECTOR4),
+    };
 
   TestGraphicsController& graphics = application.GetGraphicsController();
   graphics.AddCustomUniforms(customUniforms);
@@ -5074,6 +5112,7 @@ int UtcDaliVisualGetVisualProperty01(void)
   propertyMap.Insert(DevelVisual::Property::BORDERLINE_WIDTH, 20.0f);
   propertyMap.Insert(DevelVisual::Property::BORDERLINE_COLOR, Color::RED);
   propertyMap.Insert(DevelVisual::Property::BORDERLINE_OFFSET, 1.0f);
+  propertyMap.Insert(DevelVisual::Property::CORNER_SQUARENESS, Vector4(0.1f, 0.2f, 0.0f, 1.0f));
   Visual::Base colorVisual = factory.CreateVisual(propertyMap);
 
   DummyControl        dummyControl = DummyControl::New(true);
@@ -5093,6 +5132,7 @@ int UtcDaliVisualGetVisualProperty01(void)
   float   targetBorderlineWidth = 25.0f;
   Vector4 targetBorderlineColor(1.0f, 1.0f, 1.0f, 1.0f);
   float   targetBorderlineOffset = -1.0f;
+  Vector4 targetCornerSquareness(0.5f, 0.0f, 1.0f, 0.0f);
 
   Animation animation = Animation::New(1.0f);
   animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, Visual::Property::MIX_COLOR), targetColor);
@@ -5103,6 +5143,7 @@ int UtcDaliVisualGetVisualProperty01(void)
   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.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::CORNER_SQUARENESS), targetCornerSquareness);
   animation.Play();
 
   application.SendNotification();
@@ -5149,6 +5190,10 @@ int UtcDaliVisualGetVisualProperty01(void)
   DALI_TEST_CHECK(borderlineOffsetValue);
   DALI_TEST_EQUALS(borderlineOffsetValue->Get<float>(), targetBorderlineOffset, TEST_LOCATION);
 
+  Property::Value* cornerSqaurenessValue = resultMap.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerSqaurenessValue);
+  DALI_TEST_EQUALS(cornerSqaurenessValue->Get<Vector4>(), targetCornerSquareness, TEST_LOCATION);
+
   // Test uniform values
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector2>("offset", targetOffset), true, TEST_LOCATION);
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector2>("size", targetSize), true, TEST_LOCATION);
@@ -5157,6 +5202,7 @@ int UtcDaliVisualGetVisualProperty01(void)
   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);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", targetCornerSquareness), true, TEST_LOCATION);
 
   // Test unregistered visual
   Property property3 = DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL2, Visual::Property::MIX_COLOR);
@@ -5180,6 +5226,7 @@ int UtcDaliVisualGetVisualProperty02(void)
       UniformData("borderlineCOlor", Property::Type::VECTOR4),
       UniformData("borderlineOffset", Property::Type::FLOAT),
       UniformData("blurRadius", Property::Type::FLOAT),
+      UniformData("cornerSquareness", Property::Type::VECTOR4),
     };
 
   TestGraphicsController& graphics = application.GetGraphicsController();
@@ -5207,6 +5254,7 @@ int UtcDaliVisualGetVisualProperty02(void)
   Vector4 targetBorderlineColor(0.4f, 0.2f, 0.3f, 0.9f);
   float   targetBorderlineOffset = 1.0f;
   float   targetBlurRadius       = 10.0f;
+  Vector4 targetCornerSquareness(0.0f, 0.2f, 0.4f, 0.5f);
 
   // Should work when the properties are not set before
   Animation animation = Animation::New(1.0f);
@@ -5218,6 +5266,7 @@ int UtcDaliVisualGetVisualProperty02(void)
   animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, "borderlineColor"), targetBorderlineColor);
   animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, "borderlineOffset"), targetBorderlineOffset);
   animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, "blurRadius"), targetBlurRadius);
+  animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, "cornerSquareness"), targetCornerSquareness);
   animation.Play();
 
   application.SendNotification();
@@ -5264,11 +5313,16 @@ int UtcDaliVisualGetVisualProperty02(void)
   DALI_TEST_CHECK(blurRadiusValue);
   DALI_TEST_EQUALS(blurRadiusValue->Get<float>(), targetBlurRadius, TEST_LOCATION);
 
+  Property::Value* cornerSquarenessValue = resultMap.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerSquarenessValue);
+  DALI_TEST_EQUALS(cornerSquarenessValue->Get<Vector4>(), targetCornerSquareness, TEST_LOCATION);
+
   // Test uniform values
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector2>("offset", targetOffset), true, TEST_LOCATION);
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector2>("size", targetSize), true, TEST_LOCATION);
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerRadius", targetCornerRadius), true, TEST_LOCATION);
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<float>("blurRadius", targetBlurRadius), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", targetCornerSquareness), true, TEST_LOCATION);
 
   END_TEST;
 }
@@ -5285,6 +5339,7 @@ int UtcDaliVisualGetVisualProperty03(void)
       UniformData("borderlineWidth", Property::Type::FLOAT),
       UniformData("borderlineColor", Property::Type::VECTOR4),
       UniformData("borderlineOffset", Property::Type::FLOAT),
+      UniformData("cornerSquareness", Property::Type::VECTOR4),
     };
 
   TestGraphicsController& graphics = application.GetGraphicsController();
@@ -5315,6 +5370,7 @@ int UtcDaliVisualGetVisualProperty03(void)
   float   targetBorderlineWidth = 10.0f;
   Vector4 targetBorderlineColor(1.0f, 0.0f, 1.0f, 0.5f);
   float   targetBorderlineOffset = -1.5f;
+  Vector4 targetCornerSquareness(0.0f, 0.2f, 0.4f, 0.5f);
 
   Animation animation = Animation::New(1.0f);
   animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, Visual::Property::OPACITY), targetOpacity);
@@ -5323,6 +5379,7 @@ int UtcDaliVisualGetVisualProperty03(void)
   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.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::CORNER_SQUARENESS), targetCornerSquareness);
   animation.Play();
 
   application.SendNotification();
@@ -5357,12 +5414,17 @@ int UtcDaliVisualGetVisualProperty03(void)
   DALI_TEST_CHECK(borderlineOffsetValue);
   DALI_TEST_EQUALS(borderlineOffsetValue->Get<float>(), targetBorderlineOffset, TEST_LOCATION);
 
+  Property::Value* cornerSquarenessValue = resultMap.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerSquarenessValue);
+  DALI_TEST_EQUALS(cornerSquarenessValue->Get<Vector4>(), targetCornerSquareness, TEST_LOCATION);
+
   // Test uniform value
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("pixelArea", targetPixelArea), true, TEST_LOCATION);
   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);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", targetCornerSquareness), true, TEST_LOCATION);
 
   // Test non-animatable index, for coverage.
   DALI_TEST_EQUALS(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, ImageVisual::Property::URL).propertyIndex, Property::INVALID_INDEX, TEST_LOCATION);
@@ -5378,6 +5440,7 @@ int UtcDaliVisualGetVisualProperty04(void)
   static std::vector<UniformData> customUniforms =
     {
       UniformData("cornerRadius", Property::Type::VECTOR4),
+      UniformData("cornerSquareness", Property::Type::VECTOR4),
     };
 
   TestGraphicsController& graphics = application.GetGraphicsController();
@@ -5410,10 +5473,12 @@ int UtcDaliVisualGetVisualProperty04(void)
 
   float   targetOpacity = 0.5f;
   Vector4 targetCornerRadius(20.0f, 30.0f, 10.0f, 20.0f);
+  Vector4 targetCornerSquareness(0.2f, 0.3f, 0.1f, 0.2f);
 
   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::CORNER_SQUARENESS), targetCornerSquareness);
   animation.Play();
 
   application.SendNotification();
@@ -5432,8 +5497,13 @@ int UtcDaliVisualGetVisualProperty04(void)
   DALI_TEST_CHECK(cornerRadiusValue);
   DALI_TEST_EQUALS(cornerRadiusValue->Get<Vector4>(), targetCornerRadius, TEST_LOCATION);
 
+  Property::Value* cornerSquarenessValue = resultMap.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerSquarenessValue);
+  DALI_TEST_EQUALS(cornerSquarenessValue->Get<Vector4>(), targetCornerSquareness, TEST_LOCATION);
+
   // Test uniform value
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerRadius", targetCornerRadius), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", targetCornerSquareness), true, TEST_LOCATION);
 
   END_TEST;
 }
@@ -5449,6 +5519,7 @@ int UtcDaliVisualGetVisualProperty05(void)
       UniformData("borderlineWidth", Property::Type::FLOAT),
       UniformData("borderlineColor", Property::Type::VECTOR4),
       UniformData("borderlineOffset", Property::Type::FLOAT),
+      UniformData("cornerSquareness", Property::Type::VECTOR4),
     };
 
   TestGraphicsController& graphics = application.GetGraphicsController();
@@ -5481,6 +5552,7 @@ int UtcDaliVisualGetVisualProperty05(void)
   float   targetBorderlineWidth = 10.0f;
   Vector4 targetBorderlineColor(1.0f, 0.0f, 1.0f, 0.5f);
   float   targetBorderlineOffset = -1.5f;
+  Vector4 targetCornerSquareness(0.2f, 0.3f, 0.1f, 0.2f);
 
   Animation animation = Animation::New(1.0f);
   animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, Visual::Property::OPACITY), targetOpacity);
@@ -5488,6 +5560,7 @@ int UtcDaliVisualGetVisualProperty05(void)
   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.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::CORNER_SQUARENESS), targetCornerSquareness);
   animation.Play();
 
   application.SendNotification();
@@ -5518,12 +5591,17 @@ int UtcDaliVisualGetVisualProperty05(void)
   DALI_TEST_CHECK(borderlineOffsetValue);
   DALI_TEST_EQUALS(borderlineOffsetValue->Get<float>(), targetBorderlineOffset, TEST_LOCATION);
 
+  Property::Value* cornerSquarenessValue = resultMap.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerSquarenessValue);
+  DALI_TEST_EQUALS(cornerSquarenessValue->Get<Vector4>(), targetCornerSquareness, TEST_LOCATION);
+
   // 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);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", targetCornerSquareness), true, TEST_LOCATION);
 
   END_TEST;
 }
@@ -5539,6 +5617,7 @@ int UtcDaliVisualGetVisualProperty06(void)
       UniformData("borderlineWidth", Property::Type::FLOAT),
       UniformData("borderlineColor", Property::Type::VECTOR4),
       UniformData("borderlineOffset", Property::Type::FLOAT),
+      UniformData("cornerSquareness", Property::Type::VECTOR4),
     };
 
   TestGraphicsController& graphics = application.GetGraphicsController();
@@ -5571,6 +5650,7 @@ int UtcDaliVisualGetVisualProperty06(void)
   float   targetBorderlineWidth = 10.0f;
   Vector4 targetBorderlineColor(1.0f, 0.0f, 1.0f, 0.5f);
   float   targetBorderlineOffset = -1.5f;
+  Vector4 targetCornerSquareness(0.2f, 0.3f, 0.1f, 0.2f);
 
   Animation animation = Animation::New(1.0f);
   animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, Visual::Property::OPACITY), targetOpacity);
@@ -5578,6 +5658,7 @@ int UtcDaliVisualGetVisualProperty06(void)
   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.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::CORNER_SQUARENESS), targetCornerSquareness);
   animation.Play();
 
   application.SendNotification();
@@ -5608,12 +5689,17 @@ int UtcDaliVisualGetVisualProperty06(void)
   DALI_TEST_CHECK(borderlineOffsetValue);
   DALI_TEST_EQUALS(borderlineOffsetValue->Get<float>(), targetBorderlineOffset, TEST_LOCATION);
 
+  Property::Value* cornerSquarenessValue = resultMap.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerSquarenessValue);
+  DALI_TEST_EQUALS(cornerSquarenessValue->Get<Vector4>(), targetCornerSquareness, TEST_LOCATION);
+
   // 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);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", targetCornerSquareness), true, TEST_LOCATION);
 
   END_TEST;
 }
@@ -5629,6 +5715,7 @@ int UtcDaliVisualGetVisualProperty07(void)
       UniformData("borderlineWidth", Property::Type::FLOAT),
       UniformData("borderlineColor", Property::Type::VECTOR4),
       UniformData("borderlineOffset", Property::Type::FLOAT),
+      UniformData("cornerSquareness", Property::Type::VECTOR4),
     };
 
   TestGraphicsController& graphics = application.GetGraphicsController();
@@ -5662,6 +5749,7 @@ int UtcDaliVisualGetVisualProperty07(void)
   float   targetBorderlineWidth = 10.0f;
   Vector4 targetBorderlineColor(1.0f, 0.0f, 1.0f, 0.5f);
   float   targetBorderlineOffset = -1.5f;
+  Vector4 targetCornerSquareness(0.2f, 0.3f, 0.1f, 0.2f);
 
   Animation animation = Animation::New(1.0f);
   animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, Visual::Property::OPACITY), targetOpacity);
@@ -5669,6 +5757,7 @@ int UtcDaliVisualGetVisualProperty07(void)
   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.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::CORNER_SQUARENESS), targetCornerSquareness);
   animation.Play();
 
   application.SendNotification();
@@ -5699,12 +5788,17 @@ int UtcDaliVisualGetVisualProperty07(void)
   DALI_TEST_CHECK(borderlineOffsetValue);
   DALI_TEST_EQUALS(borderlineOffsetValue->Get<float>(), targetBorderlineOffset, TEST_LOCATION);
 
+  Property::Value* cornerSquarenessValue = resultMap.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerSquarenessValue);
+  DALI_TEST_EQUALS(cornerSquarenessValue->Get<Vector4>(), targetCornerSquareness, TEST_LOCATION);
+
   // 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);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerSquareness", targetCornerSquareness), true, TEST_LOCATION);
 
   END_TEST;
 }
@@ -5749,6 +5843,7 @@ int UtcDaliVisualUpdateProperty01(void)
   float                    targetBorderlineWidth    = 20.0f;
   Vector4                  targetBorderlineColor    = Color::RED;
   float                    targetBorderlineOffset   = 1.0f;
+  Vector4                  targetCornerSquareness   = Vector4(0.0f, 0.0f, 0.6f, 0.6f);
 
   Property::Map targetPropertyMap;
   targetPropertyMap[Visual::Property::OPACITY]                  = targetOpacity;
@@ -5760,6 +5855,7 @@ int UtcDaliVisualUpdateProperty01(void)
   targetPropertyMap[DevelVisual::Property::BORDERLINE_WIDTH]    = targetBorderlineWidth;
   targetPropertyMap[DevelVisual::Property::BORDERLINE_COLOR]    = targetBorderlineColor;
   targetPropertyMap[DevelVisual::Property::BORDERLINE_OFFSET]   = targetBorderlineOffset;
+  targetPropertyMap[DevelVisual::Property::CORNER_SQUARENESS]   = targetCornerSquareness;
 
   // Update Properties
   DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Action::UPDATE_PROPERTY, targetPropertyMap);
@@ -5801,6 +5897,10 @@ int UtcDaliVisualUpdateProperty01(void)
   DALI_TEST_CHECK(borderlineOffsetValue);
   DALI_TEST_EQUALS(borderlineOffsetValue->Get<float>(), targetBorderlineOffset, TEST_LOCATION);
 
+  Property::Value* cornerSquarenessValue = resultMap.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerSquarenessValue);
+  DALI_TEST_EQUALS(cornerSquarenessValue->Get<Vector4>(), targetCornerSquareness, TEST_LOCATION);
+
   END_TEST;
 }
 
@@ -5811,6 +5911,7 @@ int UtcDaliVisualUpdateProperty02(void)
 
   Vector4 borderlineColor  = Color::BLUE;
   float   borderlineOffset = 1.0f;
+  Vector4 cornerSquareness = Vector4::ZERO;
 
   VisualFactory factory = VisualFactory::Get();
   Property::Map propertyMap;
@@ -5823,6 +5924,7 @@ int UtcDaliVisualUpdateProperty02(void)
   propertyMap[DevelVisual::Property::BORDERLINE_WIDTH]     = 0.0f;
   propertyMap[DevelVisual::Property::BORDERLINE_COLOR]     = borderlineColor;
   propertyMap[DevelVisual::Property::BORDERLINE_OFFSET]    = borderlineOffset;
+  propertyMap[DevelVisual::Property::CORNER_SQUARENESS]    = cornerSquareness;
 
   Visual::Base imageVisual = factory.CreateVisual(propertyMap);
 
@@ -5877,6 +5979,10 @@ int UtcDaliVisualUpdateProperty02(void)
   DALI_TEST_CHECK(borderlineOffsetValue);
   DALI_TEST_EQUALS(borderlineOffsetValue->Get<float>(), borderlineOffset, TEST_LOCATION);
 
+  Property::Value* cornerSquarenessValue = resultMap.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerSquarenessValue);
+  DALI_TEST_EQUALS(cornerSquarenessValue->Get<Vector4>(), cornerSquareness, TEST_LOCATION);
+
   END_TEST;
 }
 
@@ -5918,6 +6024,7 @@ int UtcDaliVisualUpdatePropertyInvalidType(void)
   float                    targetBorderlineWidth    = 20.0f;
   Vector4                  targetBorderlineColor    = Color::RED;
   float                    targetBorderlineOffset   = 1.0f;
+  Vector4                  targetCornerSquareness   = Vector4(0.2f, 0.4f, 0.6f, 0.8f);
 
   Property::Map targetPropertyMap;
   targetPropertyMap[Visual::Property::OPACITY]                  = targetOpacity;
@@ -5931,6 +6038,7 @@ int UtcDaliVisualUpdatePropertyInvalidType(void)
   targetPropertyMap[DevelVisual::Property::BORDERLINE_WIDTH]  = targetBorderlineWidth;
   targetPropertyMap[DevelVisual::Property::BORDERLINE_COLOR]  = targetBorderlineColor;
   targetPropertyMap[DevelVisual::Property::BORDERLINE_OFFSET] = targetBorderlineOffset;
+  targetPropertyMap[DevelVisual::Property::CORNER_SQUARENESS] = targetCornerSquareness;
 
   // Update Properties
   DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Action::UPDATE_PROPERTY, targetPropertyMap);
@@ -5997,17 +6105,20 @@ int UtcDaliVisualUpdatePropertyChangeShader01(void)
     {
       {"#define IS_REQUIRED_BORDERLINE", false},
       {"#define IS_REQUIRED_ROUNDED_CORNER", false},
+      {"#define IS_REQUIRED_SQUIRCLE_CORNER", false},
     },
     TEST_LOCATION);
 
   callStack.Reset();
   callStack.Enable(true);
 
-  Vector4 targetCornerRadius = Vector4(1.0f, 12.0f, 2.0f, 21.0f);
+  Vector4 targetCornerRadius     = Vector4(1.0f, 12.0f, 2.0f, 21.0f);
+  Vector4 targetCornerSquareness = Vector4(0.2f, 0.4f, 0.6f, 0.8f);
 
   Property::Map targetPropertyMap;
   targetPropertyMap[DevelVisual::Property::CORNER_RADIUS]        = targetCornerRadius;
   targetPropertyMap[DevelVisual::Property::CORNER_RADIUS_POLICY] = Toolkit::Visual::Transform::Policy::RELATIVE;
+  targetPropertyMap[DevelVisual::Property::CORNER_SQUARENESS]    = targetCornerSquareness;
 
   // Update Properties with CornerRadius
   DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Action::UPDATE_PROPERTY, targetPropertyMap);
@@ -6024,11 +6135,16 @@ int UtcDaliVisualUpdatePropertyChangeShader01(void)
   DALI_TEST_CHECK(cornerRadiusPolicyValue);
   DALI_TEST_EQUALS(cornerRadiusPolicyValue->Get<int>(), static_cast<int>(Toolkit::Visual::Transform::Policy::RELATIVE), TEST_LOCATION);
 
+  Property::Value* cornerSquarenessValue = resultMap.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerSquarenessValue);
+  DALI_TEST_EQUALS(cornerSquarenessValue->Get<Vector4>(), targetCornerSquareness, TEST_LOCATION);
+
   TestShaderCodeContainSubstrings(
     dummyControl,
     {
       {"#define IS_REQUIRED_BORDERLINE", false},
       {"#define IS_REQUIRED_ROUNDED_CORNER", true},
+      {"#define IS_REQUIRED_SQUIRCLE_CORNER", {false, true}},
     },
     TEST_LOCATION);
 
@@ -6052,6 +6168,7 @@ int UtcDaliVisualUpdatePropertyChangeShader01(void)
   targetPropertyMap2[DevelVisual::Property::BORDERLINE_WIDTH]     = targetBorderlineWidth;
   targetPropertyMap2[DevelVisual::Property::BORDERLINE_COLOR]     = targetBorderlineColor;
   targetPropertyMap2[DevelVisual::Property::BORDERLINE_OFFSET]    = targetBorderlineOffset;
+  targetPropertyMap2[DevelVisual::Property::CORNER_SQUARENESS]    = Vector4::ZERO;
 
   // Update Properties with Borderline
   DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Action::UPDATE_PROPERTY, targetPropertyMap2);
@@ -6080,11 +6197,16 @@ int UtcDaliVisualUpdatePropertyChangeShader01(void)
   DALI_TEST_CHECK(borderlineOffsetValue);
   DALI_TEST_EQUALS(borderlineOffsetValue->Get<float>(), targetBorderlineOffset, TEST_LOCATION);
 
+  cornerSquarenessValue = resultMap2.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerSquarenessValue);
+  DALI_TEST_EQUALS(cornerSquarenessValue->Get<Vector4>(), Vector4::ZERO, TEST_LOCATION);
+
   TestShaderCodeContainSubstrings(
     dummyControl,
     {
       {"#define IS_REQUIRED_BORDERLINE", true},
-      {"#define IS_REQUIRED_ROUNDED_CORNER", true}, // Note : mAlwaysUsingCornerRadius is true.
+      {"#define IS_REQUIRED_ROUNDED_CORNER", true},           // Note : mAlwaysUsingCornerRadius is true.
+      {"#define IS_REQUIRED_SQUIRCLE_CORNER", {false, true}}, // Note : mAlwaysUsingCornerSquareness is true.
     },
     TEST_LOCATION);
 
@@ -6104,6 +6226,7 @@ int UtcDaliVisualUpdatePropertyChangeShader01(void)
   targetPropertyMap3[DevelVisual::Property::BORDERLINE_WIDTH]     = 0.0f;
   targetPropertyMap3[DevelVisual::Property::BORDERLINE_COLOR]     = Vector4::ZERO;
   targetPropertyMap3[DevelVisual::Property::BORDERLINE_OFFSET]    = 0.0f;
+  targetPropertyMap3[DevelVisual::Property::CORNER_SQUARENESS]    = Vector4::ZERO;
 
   // Update Properties into zero
   DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Action::UPDATE_PROPERTY, targetPropertyMap3);
@@ -6132,11 +6255,16 @@ int UtcDaliVisualUpdatePropertyChangeShader01(void)
   DALI_TEST_CHECK(borderlineOffsetValue);
   DALI_TEST_EQUALS(borderlineOffsetValue->Get<float>(), 0.0f, TEST_LOCATION);
 
+  cornerSquarenessValue = resultMap3.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerSquarenessValue);
+  DALI_TEST_EQUALS(cornerSquarenessValue->Get<Vector4>(), Vector4::ZERO, TEST_LOCATION);
+
   TestShaderCodeContainSubstrings(
     dummyControl,
     {
-      {"#define IS_REQUIRED_BORDERLINE", true},     // Note : mAlwaysUsingBorderline is true.
-      {"#define IS_REQUIRED_ROUNDED_CORNER", true}, // Note : mAlwaysUsingCornerRadius is true.
+      {"#define IS_REQUIRED_BORDERLINE", true},               // Note : mAlwaysUsingBorderline is true.
+      {"#define IS_REQUIRED_ROUNDED_CORNER", true},           // Note : mAlwaysUsingCornerRadius is true.
+      {"#define IS_REQUIRED_SQUIRCLE_CORNER", {false, true}}, // Note : mAlwaysUsingCornerSquareness is true.
     },
     TEST_LOCATION);
 
@@ -6186,13 +6314,16 @@ int UtcDaliVisualUpdatePropertyChangeShader02(void)
     {
       {"#define IS_REQUIRED_BORDERLINE", false},
       {"#define IS_REQUIRED_ROUNDED_CORNER", false},
+      {"#define IS_REQUIRED_SQUIRCLE_CORNER", false},
     },
     TEST_LOCATION);
 
-  Vector4 targetCornerRadius = Vector4(0.0f, 0.0f, 0.0f, 0.0f);
+  Vector4 targetCornerRadius     = Vector4(0.0f, 0.0f, 0.0f, 0.0f);
+  Vector4 targetCornerSquareness = Vector4(0.2f, 0.4f, 0.6f, 0.8f);
 
   Property::Map targetPropertyMap;
-  targetPropertyMap[DevelVisual::Property::CORNER_RADIUS] = targetCornerRadius;
+  targetPropertyMap[DevelVisual::Property::CORNER_RADIUS]     = targetCornerRadius;
+  targetPropertyMap[DevelVisual::Property::CORNER_SQUARENESS] = targetCornerSquareness;
 
   callStack.Reset();
   callStack.Enable(true);
@@ -6208,11 +6339,16 @@ int UtcDaliVisualUpdatePropertyChangeShader02(void)
   DALI_TEST_CHECK(cornerRadiusValue);
   DALI_TEST_EQUALS(cornerRadiusValue->Get<Vector4>(), targetCornerRadius, TEST_LOCATION);
 
+  Property::Value* cornerSquarenessValue = resultMap.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerSquarenessValue);
+  DALI_TEST_EQUALS(cornerSquarenessValue->Get<Vector4>(), targetCornerSquareness, TEST_LOCATION);
+
   TestShaderCodeContainSubstrings(
     dummyControl,
     {
       {"#define IS_REQUIRED_BORDERLINE", false},
-      {"#define IS_REQUIRED_ROUNDED_CORNER", false}, // Note : corner radius is zero. so we don't change shader!
+      {"#define IS_REQUIRED_ROUNDED_CORNER", false},  // Note : corner radius is zero. so we don't change shader!
+      {"#define IS_REQUIRED_SQUIRCLE_CORNER", false}, // Note : corner radius is zero. so we don't change shader!
     },
     TEST_LOCATION);
 
@@ -6260,6 +6396,7 @@ int UtcDaliVisualUpdatePropertyChangeShader02(void)
     {
       {"#define IS_REQUIRED_BORDERLINE", false}, // Note : borderline width is zero. so we don't change shader!
       {"#define IS_REQUIRED_ROUNDED_CORNER", false},
+      {"#define IS_REQUIRED_SQUIRCLE_CORNER", false},
     },
     TEST_LOCATION);
 
@@ -6308,6 +6445,7 @@ int UtcDaliVisualUpdatePropertyChangeShader03(void)
       {"#define IS_REQUIRED_BLUR", false},
       {"#define IS_REQUIRED_BORDERLINE", false},
       {"#define IS_REQUIRED_ROUNDED_CORNER", false},
+      {"#define IS_REQUIRED_SQUIRCLE_CORNER", false},
     },
     TEST_LOCATION);
 
@@ -6343,6 +6481,7 @@ int UtcDaliVisualUpdatePropertyChangeShader03(void)
       {"#define IS_REQUIRED_BLUR", true},
       {"#define IS_REQUIRED_BORDERLINE", false}, // Note : We ignore borderline when blur radius occured
       {"#define IS_REQUIRED_ROUNDED_CORNER", true},
+      {"#define IS_REQUIRED_SQUIRCLE_CORNER", false},
     },
     TEST_LOCATION);
 
@@ -6383,6 +6522,7 @@ int UtcDaliVisualUpdatePropertyChangeShader03(void)
       {"#define IS_REQUIRED_BLUR", true},           // Note : mAlwaysUsingBlurRadius is true.
       {"#define IS_REQUIRED_BORDERLINE", false},    // Note : We ignore borderline when blur radius occured
       {"#define IS_REQUIRED_ROUNDED_CORNER", true}, // Note : mAlwaysUsingCornerRadius is true.
+      {"#define IS_REQUIRED_SQUIRCLE_CORNER", false},
     },
     TEST_LOCATION);
 
@@ -6407,10 +6547,11 @@ int UtcDaliVisualUpdatePropertyChangeShader04(void)
 
   VisualFactory factory = VisualFactory::Get();
   Property::Map propertyMap;
+  Vector4       targetCornerSquareness = Vector4(1.0f, 1.0f, 1.0f, 1.0f);
   // Case ImageVisual
-  propertyMap[Visual::Property::TYPE]               = Visual::Type::IMAGE;
-  propertyMap[ImageVisual::Property::URL]           = TEST_IMAGE_FILE_NAME;
-  propertyMap[DevelVisual::Property::CORNER_RADIUS] = 10.0f;
+  propertyMap[Visual::Property::TYPE]                   = Visual::Type::IMAGE;
+  propertyMap[ImageVisual::Property::URL]               = TEST_IMAGE_FILE_NAME;
+  propertyMap[DevelVisual::Property::CORNER_SQUARENESS] = targetCornerSquareness;
 
   Visual::Base imageVisual = factory.CreateVisual(propertyMap);
 
@@ -6433,7 +6574,8 @@ int UtcDaliVisualUpdatePropertyChangeShader04(void)
     dummyControl,
     {
       {"#define IS_REQUIRED_BORDERLINE", false},
-      {"#define IS_REQUIRED_ROUNDED_CORNER", true},
+      {"#define IS_REQUIRED_ROUNDED_CORNER", false},
+      {"#define IS_REQUIRED_SQUIRCLE_CORNER", false}, // Note : corner radius is zero. so we don't change shader!
     },
     TEST_LOCATION);
 
@@ -6454,13 +6596,14 @@ int UtcDaliVisualUpdatePropertyChangeShader04(void)
     dummyControl,
     {
       {"#define IS_REQUIRED_BORDERLINE", false},
-      {"#define IS_REQUIRED_ROUNDED_CORNER", true}, // Note : mAlwaysUsingCornerRadius is true.
+      {"#define IS_REQUIRED_ROUNDED_CORNER", true},           // Note : mAlwaysUsingCornerRadius is true.
+      {"#define IS_REQUIRED_SQUIRCLE_CORNER", {false, true}}, // Note : CornerSqureness is non-zero.
     },
     TEST_LOCATION);
 
   callStack.Enable(false);
-  // Shader not changed
-  DALI_TEST_CHECK(!callStack.FindMethod("CreateShader"));
+  // Shader changed
+  DALI_TEST_CHECK(callStack.FindMethod("CreateShader"));
   callStack.Reset();
   callStack.Enable(true);
 
@@ -6479,6 +6622,10 @@ int UtcDaliVisualUpdatePropertyChangeShader04(void)
   DALI_TEST_CHECK(cornerRadiusValue);
   DALI_TEST_EQUALS(cornerRadiusValue->Get<Vector4>(), targetCornerRadius, TEST_LOCATION);
 
+  Property::Value* cornerSquarenessValue = resultMap.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerSquarenessValue);
+  DALI_TEST_EQUALS(cornerSquarenessValue->Get<Vector4>(), targetCornerSquareness, TEST_LOCATION);
+
   Property::Value* cornerRadiusPolicyValue = resultMap.Find(DevelVisual::Property::CORNER_RADIUS_POLICY, Property::INTEGER);
   DALI_TEST_CHECK(cornerRadiusPolicyValue);
   DALI_TEST_EQUALS(cornerRadiusPolicyValue->Get<int>(), static_cast<int>(Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
@@ -6491,7 +6638,8 @@ int UtcDaliVisualUpdatePropertyChangeShader04(void)
     dummyControl,
     {
       {"#define IS_REQUIRED_BORDERLINE", true},
-      {"#define IS_REQUIRED_ROUNDED_CORNER", true}, // Note : mAlwaysUsingCornerRadius is true.
+      {"#define IS_REQUIRED_ROUNDED_CORNER", true},           // Note : mAlwaysUsingCornerRadius is true.
+      {"#define IS_REQUIRED_SQUIRCLE_CORNER", {false, true}}, // Note : CornerSqureness is non-zero. mAlwaysUsingCornerSquareness become true.
     },
     TEST_LOCATION);
 
@@ -6502,6 +6650,53 @@ int UtcDaliVisualUpdatePropertyChangeShader04(void)
   callStack.Enable(false);
   // Shader changed
   DALI_TEST_CHECK(callStack.FindMethod("CreateShader"));
+  callStack.Reset();
+  callStack.Enable(true);
+
+  // Change CornerSquareness as Zero
+  targetCornerSquareness = Vector4::ZERO;
+  Property::Map targetPropertyMap2;
+  targetPropertyMap2[DevelVisual::Property::CORNER_SQUARENESS] = targetCornerSquareness;
+
+  // Update Properties with CornerRadius
+  DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Action::UPDATE_PROPERTY, targetPropertyMap2);
+
+  Property::Map resultMap2;
+  imageVisual.CreatePropertyMap(resultMap2);
+
+  // Test property values: they should be updated
+  cornerRadiusValue = resultMap2.Find(DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerRadiusValue);
+  DALI_TEST_EQUALS(cornerRadiusValue->Get<Vector4>(), targetCornerRadius, TEST_LOCATION);
+
+  cornerSquarenessValue = resultMap2.Find(DevelVisual::Property::CORNER_SQUARENESS, Property::VECTOR4);
+  DALI_TEST_CHECK(cornerSquarenessValue);
+  DALI_TEST_EQUALS(cornerSquarenessValue->Get<Vector4>(), targetCornerSquareness, TEST_LOCATION);
+
+  cornerRadiusPolicyValue = resultMap2.Find(DevelVisual::Property::CORNER_RADIUS_POLICY, Property::INTEGER);
+  DALI_TEST_CHECK(cornerRadiusPolicyValue);
+  DALI_TEST_EQUALS(cornerRadiusPolicyValue->Get<int>(), static_cast<int>(Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
+
+  borderlineWidthValue = resultMap2.Find(DevelVisual::Property::BORDERLINE_WIDTH, Property::FLOAT);
+  DALI_TEST_CHECK(borderlineWidthValue);
+  DALI_TEST_EQUALS(borderlineWidthValue->Get<float>(), targetBorderlineWidth, TEST_LOCATION);
+
+  TestShaderCodeContainSubstrings(
+    dummyControl,
+    {
+      {"#define IS_REQUIRED_BORDERLINE", true},
+      {"#define IS_REQUIRED_ROUNDED_CORNER", true},           // Note : mAlwaysUsingCornerRadius is true.
+      {"#define IS_REQUIRED_SQUIRCLE_CORNER", {false, true}}, // Note : mAlwaysUsingCornerSquareness is true.
+    },
+    TEST_LOCATION);
+
+  // Send shader compile signal
+  application.SendNotification();
+  application.Render();
+
+  callStack.Enable(false);
+  // Shader not changed
+  DALI_TEST_CHECK(!callStack.FindMethod("CreateShader"));
 
   END_TEST;
 }
@@ -6546,16 +6741,19 @@ int UtcDaliVisualUpdatePropertyChangeShader05(void)
         {"#define IS_REQUIRED_BLUR", false},
         {"#define IS_REQUIRED_BORDERLINE", false},
         {"#define IS_REQUIRED_ROUNDED_CORNER", false},
+        {"#define IS_REQUIRED_SQUIRCLE_CORNER", false},
       },
       TEST_LOCATION);
 
-    float   targetBlurRadius   = 15.0f;
-    Vector4 targetCornerRadius = Vector4(1.0f, 0.1f, 1.1f, 0.0f);
+    float   targetBlurRadius       = 15.0f;
+    Vector4 targetCornerRadius     = Vector4(1.0f, 0.1f, 1.1f, 0.0f);
+    Vector4 targetCornerSquareness = Vector4(0.0f, 0.1f, 0.1f, 0.0f);
 
     Property::Map targetPropertyMap;
-    targetPropertyMap[DevelColorVisual::Property::BLUR_RADIUS] = targetBlurRadius;
-    targetPropertyMap[DevelVisual::Property::CORNER_RADIUS]    = targetCornerRadius;
-    targetPropertyMap[DevelVisual::Property::BORDERLINE_WIDTH] = 10.0f; // Don't care. just dummy
+    targetPropertyMap[DevelColorVisual::Property::BLUR_RADIUS]  = targetBlurRadius;
+    targetPropertyMap[DevelVisual::Property::CORNER_RADIUS]     = targetCornerRadius;
+    targetPropertyMap[DevelVisual::Property::CORNER_SQUARENESS] = targetCornerSquareness;
+    targetPropertyMap[DevelVisual::Property::BORDERLINE_WIDTH]  = 10.0f; // Don't care. just dummy
 
     callStack.Reset();
     callStack.Enable(true);
@@ -6575,12 +6773,13 @@ int UtcDaliVisualUpdatePropertyChangeShader05(void)
     DALI_TEST_CHECK(cornerRadiusValue);
     DALI_TEST_EQUALS(cornerRadiusValue->Get<Vector4>(), targetCornerRadius, TEST_LOCATION);
 
-    TestShaderCodeContainSubstringsForEachShader(
+    TestShaderCodeContainSubstrings(
       dummyControl,
       {
-        {"#define IS_REQUIRED_BLUR", {true, true}},
-        {"#define IS_REQUIRED_BORDERLINE", {false, false}}, // Note : We ignore borderline when blur radius occured
-        {"#define IS_REQUIRED_ROUNDED_CORNER", {true, true}},
+        {"#define IS_REQUIRED_BLUR", true},
+        {"#define IS_REQUIRED_BORDERLINE", false}, // Note : We ignore borderline when blur radius occured
+        {"#define IS_REQUIRED_ROUNDED_CORNER", true},
+        {"#define IS_REQUIRED_SQUIRCLE_CORNER", {false, true}},
         {"#define SL_VERSION_LOW", {false, true}},
       },
       TEST_LOCATION);
@@ -6616,12 +6815,13 @@ int UtcDaliVisualUpdatePropertyChangeShader05(void)
     DALI_TEST_CHECK(cornerRadiusValue);
     DALI_TEST_EQUALS(cornerRadiusValue->Get<Vector4>(), Vector4::ZERO, TEST_LOCATION);
 
-    TestShaderCodeContainSubstringsForEachShader(
+    TestShaderCodeContainSubstrings(
       dummyControl,
       {
-        {"#define IS_REQUIRED_BLUR", {true, true}},           // Note : mAlwaysUsingBlurRadius is true.
-        {"#define IS_REQUIRED_BORDERLINE", {false, false}},   // Note : We ignore borderline when blur radius occured
-        {"#define IS_REQUIRED_ROUNDED_CORNER", {true, true}}, // Note : mAlwaysUsingCornerRadius is true.
+        {"#define IS_REQUIRED_BLUR", true},                     // Note : mAlwaysUsingBlurRadius is true.
+        {"#define IS_REQUIRED_BORDERLINE", false},              // Note : We ignore borderline when blur radius occured
+        {"#define IS_REQUIRED_ROUNDED_CORNER", true},           // Note : mAlwaysUsingCornerRadius is true.
+        {"#define IS_REQUIRED_SQUIRCLE_CORNER", {false, true}}, // Note : mAlwaysUsingCornerSquareness is true.
         {"#define SL_VERSION_LOW", {false, true}},
       },
       TEST_LOCATION);
@@ -6681,6 +6881,7 @@ int UtcDaliVisualCutoutPolicyChangeShader01(void)
     {
       propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS, 10.0f);
       propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS_POLICY, Toolkit::Visual::Transform::Policy::RELATIVE);
+      propertyMap.Insert(DevelVisual::Property::CORNER_SQUARENESS, 0.6f);
     }
     if(enableBorderline)
     {
index 75f2c109727e28392e4faef3e113899f9256e5f1..5fac9ca67333b6319e9c94a21601b244d0e7b0af 100644 (file)
@@ -2925,6 +2925,13 @@ int UtcDaliVisualFactoryUsePreCompiledShader(void)
   imageShader5["shaderType"]   = "image";
   imageShader5["shaderOption"] = Property::Map().Add("ATLAS_CUSTOM", true);
 
+  Property::Map imageShader6;
+  imageShader6["shaderType"]   = "image";
+  imageShader6["shaderOption"] = Property::Map()
+                                   .Add("SQUIRCLE_CORNER", true)
+                                   .Add("BORDERLINE", true)
+                                   .Add("MASKING", true);
+
   Property::Map textShader;
   textShader["shaderType"]   = "text";
   textShader["shaderOption"] = Property::Map()
@@ -2949,6 +2956,12 @@ int UtcDaliVisualFactoryUsePreCompiledShader(void)
                                    .Add("ROUNDED_CORNER,", true)
                                    .Add("BLUR_EDGE", true);
 
+  Property::Map colorShader3;
+  colorShader3["shaderType"]   = "color";
+  colorShader3["shaderOption"] = Property::Map()
+                                   .Add("SQUIRCLE_CORNER,", true)
+                                   .Add("BLUR_EDGE", true);
+
   Property::Map npatchShader;
   npatchShader["shaderType"] = "npatch";
 
@@ -2971,12 +2984,14 @@ int UtcDaliVisualFactoryUsePreCompiledShader(void)
   factory.AddPrecompileShader(imageShader4);
   factory.AddPrecompileShader(imageShader4); // use same shader, because check line coverage
   factory.AddPrecompileShader(imageShader5);
+  factory.AddPrecompileShader(imageShader6);
   factory.AddPrecompileShader(textShader);
   factory.AddPrecompileShader(textShader); // use same shader, because check line coverage
   factory.AddPrecompileShader(textShader2);
   factory.AddPrecompileShader(colorShader);
   factory.AddPrecompileShader(colorShader); // use same shader, because check line coverage
   factory.AddPrecompileShader(colorShader2);
+  factory.AddPrecompileShader(colorShader3);
   factory.AddPrecompileShader(npatchShader);
   factory.AddPrecompileShader(npatchShader2);
   factory.AddPrecompileShader(customShader);
index b142f9ff747d6783769065aed7342f5c73f67528..141b3b3c8f18f020718e2d6a188e8b88a6a8e11a 100644 (file)
@@ -69,6 +69,7 @@ DALI_PROPERTY_REGISTRATION(Scene3D, SceneView, "CornerRadiusPolicy", FLOAT, CORN
 DALI_PROPERTY_REGISTRATION(Scene3D, SceneView, "BorderlineWidth", FLOAT, BORDERLINE_WIDTH)
 DALI_PROPERTY_REGISTRATION(Scene3D, SceneView, "BorderlineColor", VECTOR4, BORDERLINE_COLOR)
 DALI_PROPERTY_REGISTRATION(Scene3D, SceneView, "BorderlineOffset", FLOAT, BORDERLINE_OFFSET)
+DALI_PROPERTY_REGISTRATION(Scene3D, SceneView, "CornerSquareness", VECTOR4, CORNER_SQUARENESS)
 DALI_TYPE_REGISTRATION_END()
 
 Property::Index           RENDERING_BUFFER        = Dali::Toolkit::Control::CONTROL_PROPERTY_END_INDEX + 1;
@@ -1123,6 +1124,24 @@ Vector4 SceneView::GetCornerRadius() const
   return mCornerRadius;
 }
 
+void SceneView::SetCornerSquareness(Vector4 cornerSquareness)
+{
+  if(mCornerSquareness != cornerSquareness)
+  {
+    mCornerSquareness = cornerSquareness;
+    if(mUseFrameBuffer)
+    {
+      mDecoratedVisualPropertyChanged = true;
+      UpdateRenderTask();
+    }
+  }
+}
+
+Vector4 SceneView::GetCornerSquareness() const
+{
+  return mCornerSquareness;
+}
+
 void SceneView::SetCornerRadiusPolicy(int cornerRadiusPolicy)
 {
   if(mCornerRadiusPolicy != cornerRadiusPolicy)
@@ -1251,6 +1270,11 @@ void SceneView::SetProperty(BaseObject* object, Property::Index index, const Pro
         sceneViewImpl.SetBorderlineOffset(value.Get<float>());
         break;
       }
+      case Scene3D::SceneView::Property::CORNER_SQUARENESS:
+      {
+        sceneViewImpl.SetCornerSquareness(value.Get<Vector4>());
+        break;
+      }
     }
   }
 }
@@ -1307,6 +1331,11 @@ Property::Value SceneView::GetProperty(BaseObject* object, Property::Index index
         value = sceneViewImpl.GetBorderlineOffset();
         break;
       }
+      case Scene3D::SceneView::Property::CORNER_SQUARENESS:
+      {
+        value = sceneViewImpl.GetCornerSquareness();
+        break;
+      }
     }
   }
   return value;
@@ -1596,6 +1625,10 @@ void SceneView::UpdateRenderTask()
         {
           imagePropertyMap.Insert(Toolkit::DevelVisual::Property::CORNER_RADIUS, mCornerRadius);
           imagePropertyMap.Insert(Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, mCornerRadiusPolicy);
+          if(mCornerSquareness != Vector4::ZERO)
+          {
+            imagePropertyMap.Insert(Toolkit::DevelVisual::Property::CORNER_SQUARENESS, mCornerSquareness);
+          }
         }
         if(!Dali::EqualsZero(mBorderlineWidth))
         {
index c436a252c203e13fdf218fd63b2a7f462b7accbb..3fe025791403739d2bc24faf852df8c9a8158479 100644 (file)
@@ -350,6 +350,18 @@ public:
    */
   Vector4 GetCornerRadius() const;
 
+  /**
+   * @brief Sets the squareness value of each corner.
+   * @param[in] cornerSquareness Squareness value of each corner.
+   */
+  void SetCornerSquareness(Vector4 cornerSquareness);
+
+  /**
+   * @brief Retrieves the squareness value of each corner.
+   * @return The squareness value of each corner.
+   */
+  Vector4 GetCornerSquareness() const;
+
   /**
    * @brief Sets the policy of corner radius value.
    * @param[in] cornerRadiusPolicy Policy of corner radius value.
@@ -679,6 +691,7 @@ private: // Implementation of Processor
 
   // Corner Radius
   Vector4 mCornerRadius{Vector4::ZERO};
+  Vector4 mCornerSquareness{Vector4::ZERO};
   int     mCornerRadiusPolicy; ///< Should be initialize at .cpp
 
   // Borderline
index d9ff7ff655d3113d44e3d3e1eeea933f9584f369..d57ea00e007541d55a5e74b3222f41ae942c3839 100644 (file)
@@ -152,7 +152,7 @@ public:
 
       /**
        * @brief The radius for the rounded corners of the scene view.
-       * @details Name "cornerRadius", type Prooperty::VECTOR4, The radius for the rounded corners of the scene view.
+       * @details Name "cornerRadius", type Property::VECTOR4.
        * @note By default, it is Vector::ZERO.
        * @note Corner radius is only available when framebuffer is used.
        * @note Each radius will clamp internally to the half of smaller of the SceneView width and height.
@@ -197,6 +197,23 @@ public:
        * @note This value will clamp internally to [-1.0f to 1.0f].
        */
       BORDERLINE_OFFSET,
+
+      /**
+       * @brief The squareness for the rounded corners of the scene view.
+       * @details Name "cornerSquareness", type Property::VECTOR4.
+       * @note By default, it is Vector::ZERO.
+       * @note Corner radius is only available when framebuffer is used.
+       * @note Each squareness will clamp internally as [0.0 1.0].
+       * @note If squareness is not zero, the width of borderline might not equal with it's real value.
+       * @note Squareness value are used in clockwise order from top-left-corner to bottom-left-corner.
+       *       When squareness is Vector4(x, y, z, w)
+       *       x    y
+       *        +--+
+       *        |  |
+       *        +--+
+       *       w    z
+       */
+      CORNER_SQUARENESS,
     };
   };
 
index b43fd0c594cffa3a25d29fcfb335302149d09fe8..97d7004fc09f61454a70b2a866010f9a35486ee1 100644 (file)
@@ -36,6 +36,7 @@ const char* TOKEN_TYPE_CUSTOM("custom");
 // OPTION
 const char* TOKEN_OPTION("shaderOption");
 const char* TOKEN_OPTION_ROUNDED_CORNER("ROUNDED_CORNER");
+const char* TOKEN_OPTION_SQUIRCLE_CORNER("SQUIRCLE_CORNER");
 const char* TOKEN_OPTION_BORDERLINE("BORDERLINE");
 const char* TOKEN_OPTION_BLUR_EDGE("BLUR_EDGE");
 const char* TOKEN_OPTION_CUTOUT("CUTOUT");
@@ -68,19 +69,20 @@ DALI_ENUM_TO_STRING_TABLE_BEGIN(SHADER_TYPE)
 DALI_ENUM_TO_STRING_TABLE_END(SHADER_TYPE);
 
 DALI_ENUM_TO_STRING_TABLE_BEGIN(SHADER_OPTION_FLAG)
-  {TOKEN_OPTION_ROUNDED_CORNER, static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::ROUNDED_CORNER)},
-  {TOKEN_OPTION_BORDERLINE,     static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::BORDERLINE)},
-  {TOKEN_OPTION_BLUR_EDGE,      static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::BLUR_EDGE)},
-  {TOKEN_OPTION_CUTOUT,         static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::CUTOUT)},
-  {TOKEN_OPTION_ATLAS_DEFAULT,  static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::ATLAS_DEFAULT)},
-  {TOKEN_OPTION_ATLAS_CUSTOM,   static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::ATLAS_CUSTOM)},
-  {TOKEN_OPTION_MASKING,        static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::MASKING)},
-  {TOKEN_OPTION_YUV_TO_RGB,     static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::YUV_TO_RGB)},
-  {TOKEN_OPTION_YUV_AND_RGB,    static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::YUV_AND_RGB)},
-  {TOKEN_OPTION_MULTI_COLOR,    static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::MULTI_COLOR)},
-  {TOKEN_OPTION_STYLES,         static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::STYLES)},
-  {TOKEN_OPTION_OVERLAY,        static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::OVERLAY)},
-  {TOKEN_OPTION_EMOJI,          static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::EMOJI)},
+  {TOKEN_OPTION_ROUNDED_CORNER,  static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::ROUNDED_CORNER)},
+  {TOKEN_OPTION_SQUIRCLE_CORNER, static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::SQUIRCLE_CORNER)},
+  {TOKEN_OPTION_BORDERLINE,      static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::BORDERLINE)},
+  {TOKEN_OPTION_BLUR_EDGE,       static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::BLUR_EDGE)},
+  {TOKEN_OPTION_CUTOUT,          static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::CUTOUT)},
+  {TOKEN_OPTION_ATLAS_DEFAULT,   static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::ATLAS_DEFAULT)},
+  {TOKEN_OPTION_ATLAS_CUSTOM,    static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::ATLAS_CUSTOM)},
+  {TOKEN_OPTION_MASKING,         static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::MASKING)},
+  {TOKEN_OPTION_YUV_TO_RGB,      static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::YUV_TO_RGB)},
+  {TOKEN_OPTION_YUV_AND_RGB,     static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::YUV_AND_RGB)},
+  {TOKEN_OPTION_MULTI_COLOR,     static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::MULTI_COLOR)},
+  {TOKEN_OPTION_STYLES,          static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::STYLES)},
+  {TOKEN_OPTION_OVERLAY,         static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::OVERLAY)},
+  {TOKEN_OPTION_EMOJI,           static_cast<int32_t>(Dali::Toolkit::PrecompileShaderOption::Flag::EMOJI)},
 DALI_ENUM_TO_STRING_TABLE_END(SHADER_OPTION_FLAG);
 // clang-format on
 } // namespace
index 2a1a65a63a23a87866cd15f4461bb163b7369798..76d2392e01abc67e804e38eca5d2751f2516f458 100644 (file)
@@ -114,6 +114,7 @@ public:
   {
     UNKNOWN = 0,
     ROUNDED_CORNER,
+    SQUIRCLE_CORNER,
     BORDERLINE,
     BLUR_EDGE,
     CUTOUT,
index 4d5ed48ef9b0e271543b53e1150972d349ef02f1..8b451d789c9559ae68be72a535b4aeab3fd6830e 100644 (file)
@@ -46,6 +46,7 @@ enum
    * @note Optional.
    * @note The default is 0.
    * @note The visual size increases by the blur radius.
+   * @note If squareness is not zero, the width of borderline might not equal with it's real value.
    * @note We cannot use blur radius and borderline properties at the same time.
    */
   BLUR_RADIUS = MIX_COLOR + 2,
index 12e2e2139c1822ce72aca1a4418855b615e1fe65..7d0c8158ecf9b738a09f3fbe18bc2c4876e19e03 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_TOOLKIT_DEVEL_API_VISUALS_VISUAL_PROPERTIES_DEVEL_H
 
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -73,7 +73,7 @@ enum Type
 
   /**
    * @brief The radius for the rounded corners of the visual.
-   * @details Name "cornerRadius", type Property::FLOAT or Prooperty::VECTOR4, animatable
+   * @details Name "cornerRadius", type Property::FLOAT or Property::VECTOR4, animatable
    * @note By default, it is Vector::ZERO.
    * @note Only Property::Vector4 can be animated.
    * @note Each radius will clamp internally to the half of smaller of the visual width and visual height.
@@ -118,6 +118,22 @@ enum Type
    * @note This value will clamp internally to [-1.0f to 1.0f].
    */
   BORDERLINE_OFFSET = OPACITY + 6,
+
+  /**
+   * @brief The squareness for the rounded corners of the visual.
+   * @details Name "cornerSquareness", type Property::FLOAT or Property::VECTOR4, animatable
+   * @note By default, it is Vector::ZERO.
+   * @note Each squareness will clamp internally as [0.0 1.0].
+   * @note If squareness is not zero, the width of borderline might not equal with it's real value.
+   * @note Squareness value are used in clockwise order from top-left-corner to bottom-left-corner.
+   *       When squareness is Vector4(x, y, z, w)
+   *       x    y
+   *        +--+
+   *        |  |
+   *        +--+
+   *       w    z
+   */
+  CORNER_SQUARENESS = OPACITY + 7,
 };
 
 } // namespace Property
index d006a35962514e382498a49489cadab506c5d3ba..d2a827e008c883fc09031215aa2e5bff0f836f0b 100644 (file)
@@ -535,15 +535,20 @@ void BlurEffectImpl::SynchronizeBackgroundCornerRadius()
 
   DALI_ASSERT_ALWAYS(GetOwnerControl() && "You should first SetRenderEffect(), then set its background property map");
 
-  Property::Map map    = GetOwnerControl().GetProperty<Property::Map>(Toolkit::Control::Property::BACKGROUND);
-  Vector4       radius = Vector4::ZERO;
+  Property::Map map = GetOwnerControl().GetProperty<Property::Map>(Toolkit::Control::Property::BACKGROUND);
+
+  Vector4 radius = Vector4::ZERO;
   map[Toolkit::DevelVisual::Property::CORNER_RADIUS].Get(radius);
 
+  Vector4 squareness = Vector4::ZERO;
+  map[Toolkit::DevelVisual::Property::CORNER_SQUARENESS].Get(squareness);
+
   Visual::Transform::Policy::Type policy{Visual::Transform::Policy::ABSOLUTE};
   map[Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY].Get(policy);
 
   Renderer renderer = GetTargetRenderer();
   renderer.RegisterProperty("uCornerRadius", radius);
+  renderer.RegisterProperty("uCornerSquareness", squareness);
   renderer.RegisterProperty("uCornerRadiusPolicy", static_cast<float>(policy));
 }
 
index 6457270424a010c28ee0fbea9f09214e7ce81214..5b3e98cf2f5ab9708f04998906c7022a323af03b 100644 (file)
@@ -46,7 +46,9 @@
 #include <dali-toolkit/devel-api/controls/control-devel.h>
 #include <dali-toolkit/devel-api/controls/web-view/web-back-forward-list.h>
 #include <dali-toolkit/devel-api/controls/web-view/web-settings.h>
+#include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
 #include <dali-toolkit/devel-api/visuals/visual-actions-devel.h>
+#include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
 #include <dali-toolkit/internal/visuals/visual-base-impl.h>
 #include <dali-toolkit/internal/visuals/visual-factory-impl.h>
 #include <dali-toolkit/public-api/image-loader/image-url.h>
@@ -135,6 +137,22 @@ Rect<int32_t> CalculateDisplayArea(Dali::Actor self, DisplayAreaCalculateOption
 
 constexpr Vector4 FULL_TEXTURE_RECT(0.f, 0.f, 1.f, 1.f);
 
+const Property::Map EMPTY_VISUAL_PROPERTIES{
+  {Dali::Toolkit::Visual::Property::TYPE, Dali::Toolkit::Visual::COLOR},
+  {Dali::Toolkit::Visual::Property::MIX_COLOR, Color::TRANSPARENT},
+};
+
+const Property::Map DEFAULT_WEB_IMAGE_VISUAL_PROPERTIES{
+  {Dali::Toolkit::Visual::Property::TYPE, Dali::Toolkit::Visual::IMAGE},
+  {Dali::Toolkit::ImageVisual::Property::URL, ""},
+  {Dali::Toolkit::ImageVisual::Property::PIXEL_AREA, FULL_TEXTURE_RECT},
+  {Dali::Toolkit::ImageVisual::Property::WRAP_MODE_U, Dali::WrapMode::CLAMP_TO_EDGE},
+  {Dali::Toolkit::ImageVisual::Property::WRAP_MODE_V, Dali::WrapMode::CLAMP_TO_EDGE},
+  {Dali::Toolkit::DevelVisual::Property::CORNER_RADIUS, Vector4::ZERO},
+  {Dali::Toolkit::DevelVisual::Property::CORNER_SQUARENESS, Vector4::ZERO},
+  {Dali::Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, Dali::Toolkit::Visual::Transform::Policy::ABSOLUTE},
+};
+
 /**
  * @brief Helper function to calculate exact pixel area value by view and texture size.
  * It will be useful when view size is not integer value, or view size is not matched with texture size.
@@ -167,8 +185,7 @@ WebView::WebView(const std::string& locale, const std::string& timezoneId)
   mVisualChangeRequired(false),
   mScreenshotCapturedCallback{nullptr},
   mFrameRenderedCallback{nullptr},
-  mCornerRadius(Vector4::ZERO),
-  mCornerRadiusPolicy(1.0f)
+  mVisualPropertyMap{EMPTY_VISUAL_PROPERTIES}
 {
   mWebEngine = Dali::WebEngine::New();
 
@@ -193,8 +210,7 @@ WebView::WebView(uint32_t argc, char** argv, int32_t type)
   mVisualChangeRequired(false),
   mScreenshotCapturedCallback{nullptr},
   mFrameRenderedCallback{nullptr},
-  mCornerRadius(Vector4::ZERO),
-  mCornerRadiusPolicy(1.0f)
+  mVisualPropertyMap{EMPTY_VISUAL_PROPERTIES}
 {
   mWebEngine = Dali::WebEngine::New(type);
 
@@ -297,10 +313,7 @@ void WebView::OnInitialize()
   mScaleUpdateNotification.NotifySignal().Connect(this, &WebView::OnDisplayAreaUpdated);
 
   // Create WebVisual for WebView
-  Property::Map propertyMap;
-  propertyMap.Insert(Dali::Toolkit::Visual::Property::TYPE, Dali::Toolkit::Visual::COLOR);
-  propertyMap.Insert(Dali::Toolkit::Visual::Property::MIX_COLOR, Color::TRANSPARENT);
-  Toolkit::Visual::Base webVisual = Toolkit::VisualFactory::Get().CreateVisual(propertyMap);
+  Toolkit::Visual::Base webVisual = Toolkit::VisualFactory::Get().CreateVisual(mVisualPropertyMap);
   if(webVisual)
   {
     Dali::Toolkit::DevelControl::RegisterVisual(*this, Toolkit::WebView::Property::URL, webVisual);
@@ -962,15 +975,23 @@ void WebView::OnFrameRendered()
   Toolkit::Visual::Base webVisual = Dali::Toolkit::DevelControl::GetVisual(*this, Toolkit::WebView::Property::URL);
   Property::Map         webMap;
   webVisual.CreatePropertyMap(webMap);
+
+  Property::Map newWebMap = DEFAULT_WEB_IMAGE_VISUAL_PROPERTIES;
+
   Property::Value* cornerRadiusValue = webMap.Find(Dali::Toolkit::DevelVisual::Property::CORNER_RADIUS);
   if(cornerRadiusValue)
   {
-    mCornerRadius = cornerRadiusValue->Get<Vector4>();
+    newWebMap[Dali::Toolkit::DevelVisual::Property::CORNER_RADIUS] = cornerRadiusValue->Get<Vector4>();
+  }
+  Property::Value* cornerSquarenessValue = webMap.Find(Dali::Toolkit::DevelVisual::Property::CORNER_SQUARENESS);
+  if(cornerSquarenessValue)
+  {
+    newWebMap[Dali::Toolkit::DevelVisual::Property::CORNER_SQUARENESS] = cornerSquarenessValue->Get<Vector4>();
   }
   Property::Value* cornerRadiusValuePolicy = webMap.Find(Dali::Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY);
   if(cornerRadiusValuePolicy)
   {
-    mCornerRadiusPolicy = cornerRadiusValuePolicy->Get<int>();
+    newWebMap[Dali::Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY] = cornerRadiusValuePolicy->Get<int>();
   }
 
   // Reset flag
@@ -983,14 +1004,12 @@ void WebView::OnFrameRendered()
 
   Dali::Toolkit::ImageUrl nativeImageUrl = Dali::Toolkit::Image::GenerateUrl(nativeImageSourcePtr);
 
-  mVisual = Toolkit::VisualFactory::Get().CreateVisual(
-    {{Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE},
-     {Toolkit::ImageVisual::Property::URL, nativeImageUrl.GetUrl()},
-     {Toolkit::ImageVisual::Property::PIXEL_AREA, FULL_TEXTURE_RECT},
-     {Toolkit::ImageVisual::Property::WRAP_MODE_U, Dali::WrapMode::CLAMP_TO_EDGE},
-     {Toolkit::ImageVisual::Property::WRAP_MODE_V, Dali::WrapMode::CLAMP_TO_EDGE},
-     {Toolkit::DevelVisual::Property::CORNER_RADIUS, mCornerRadius},
-     {Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, mCornerRadiusPolicy}});
+  newWebMap[Toolkit::ImageVisual::Property::URL] = nativeImageUrl.GetUrl();
+
+  // Store new visual property map now.
+  mVisualPropertyMap = std::move(newWebMap);
+
+  mVisual = Toolkit::VisualFactory::Get().CreateVisual(mVisualPropertyMap);
 
   if(mVisual)
   {
@@ -1042,6 +1061,8 @@ void WebView::SetDisplayArea(const Dali::Rect<int32_t>& displayArea)
     if(mVisual)
     {
       auto pixelArea = CalculatePixelArea(mWebViewSize, mLastRenderedNativeImageWidth, mLastRenderedNativeImageHeight);
+
+      mVisualPropertyMap[Toolkit::ImageVisual::Property::PIXEL_AREA] = pixelArea;
       Toolkit::GetImplementation(mVisual).DoAction(Toolkit::DevelVisual::Action::UPDATE_PROPERTY, {{Toolkit::ImageVisual::Property::PIXEL_AREA, pixelArea}});
     }
 
index ef66fd3db8f371257e25b5432f5dfbd70a2a17f8..21a4c766605ef02467430f2d7849b5fe68dcda9a 100644 (file)
@@ -802,8 +802,8 @@ private:
   Dali::Toolkit::WebView::WebViewScreenshotCapturedCallback mScreenshotCapturedCallback;
   Dali::WebEnginePlugin::WebEngineFrameRenderedCallback     mFrameRenderedCallback;
 
-  Vector4 mCornerRadius;                     /// < Corner radius
-  float   mCornerRadiusPolicy;               /// < Corner radius policy
+  Dali::Property::Map mVisualPropertyMap; ///< ImageVisual property map
+
   static std::unordered_map<Dali::WebEnginePlugin*, Dali::WeakHandle<Toolkit::WebView>> mPluginWebViewMap;
 };
 
index f58d03e53f65f7bf439f651102a55efd81cdd20e..8b5193de0b8f735322c159ffb8a85f1f674d0836 100644 (file)
@@ -24,6 +24,10 @@ uniform lowp vec4 borderlineColor;
 uniform lowp vec4 uActorColor;
 #endif
 
+#ifdef IS_REQUIRED_SQUIRCLE_CORNER
+uniform highp vec4 cornerSquareness;
+#endif
+
 #if defined(IS_REQUIRED_CUTOUT)
 uniform highp vec3 uSize;
 uniform lowp int uCutoutWithCornerRadius;
@@ -34,6 +38,7 @@ uniform lowp int uCutoutWithCornerRadius;
 
 // radius of rounded corner on this quadrant
 highp float gRadius = 0.0;
+highp float gSquareness = 0.0;
 
 // fragment coordinate. NOTE : vec2(0.0, 0.0) is vRectSize, the corner of visual
 highp vec2 gFragmentPosition = vec2(0.0, 0.0);
@@ -63,6 +68,14 @@ void calculateCornerRadius(highp vec4 cornerRadius, highp vec2 position)
     mix(cornerRadius.w, cornerRadius.z, sign(position.x) * 0.5 + 0.5),
     sign(position.y) * 0.5 + 0.5
   );
+#ifdef IS_REQUIRED_SQUIRCLE_CORNER
+  gSquareness = clamp(
+  mix(
+    mix(cornerSquareness.x, cornerSquareness.y, sign(vPosition.x) * 0.5 + 0.5),
+    mix(cornerSquareness.w, cornerSquareness.z, sign(vPosition.x) * 0.5 + 0.5),
+    sign(vPosition.y) * 0.5 + 0.5
+  ), 0.0, 1.0);
+#endif
 #endif
 }
 void calculateFragmentPosition(highp vec2 position, highp vec2 halfSizeOfRect)
@@ -82,7 +95,36 @@ void calculatePosition(highp float currentBorderlineWidth)
 
 void calculatePotential()
 {
+#ifdef IS_REQUIRED_SQUIRCLE_CORNER
+  // We need to found the r value s.t. x^2 + y^2 - s/r/r x^2y^2 = r^2
+  // and check this r is inside [gRadius - vAliasMargin, gRadius + vAliasMargin]
+
+  // If we make as A = x^2 + y^2, B = sx^2y^2
+  // r^2 = (A + sqrt(A^2 - 4B)) / 2
+  //     = ((x^2 + y^2) + sqrt(x^4 + (2 - 4s)x^2y^2 + y^4)) / 2
+
+  highp vec2 positiveDiff = max(gDiff, 0.0);
+
+  // If gSquareness is near 1.0, it make some numeric error. Let we avoid this situation by heuristic value.
+  if(gSquareness > 0.99)
+  {
+    gPotential = max(gDiff.x, gDiff.y);
+    return;
+  }
+
+  // make sqr to avoid duplicate codes.
+  positiveDiff *= positiveDiff;
+
+  // TODO : Could we remove this double-sqrt code?
+  gPotential = sqrt(((positiveDiff.x + positiveDiff.y)
+                     + sqrt(positiveDiff.x * positiveDiff.x
+                            + positiveDiff.y * positiveDiff.y
+                            + (2.0 - 4.0 * gSquareness) * positiveDiff.x * positiveDiff.y))
+                    * 0.5)
+               + min(0.0, max(gDiff.x, gDiff.y)); ///< Consider negative potential, to support borderline
+#else
   gPotential = length(max(gDiff, 0.0)) + min(0.0, max(gDiff.x, gDiff.y));
+#endif
 }
 
 void setupMinMaxPotential(highp float currentBorderlineWidth)
@@ -119,6 +161,8 @@ void PreprocessPotential(highp vec4 cornerRadius, highp vec2 position, highp vec
 #elif defined(IS_REQUIRED_BORDERLINE)
 lowp vec4 convertBorderlineColor(lowp vec4 textureColor)
 {
+  // TODO : Need to consider squareness
+
   highp float potential = gPotential;
 
   // default opacity of borderline is 0.0
@@ -204,7 +248,7 @@ mediump float calculateCornerOpacity()
 #endif
 
 #ifdef IS_REQUIRED_BLUR
-#ifdef SL_VERSION_LOW
+#if defined(SL_VERSION_LOW) || defined(IS_REQUIRED_SQUIRCLE_CORNER)
 // Legacy code for low version glsl
 mediump float calculateBlurOpacity()
 {
@@ -219,7 +263,9 @@ mediump float calculateBlurOpacity()
 #else
 mediump float calculateBlurOpacity()
 {
-// Don't use borderline!
+  // TODO : Need to consider squareness.
+
+  // Don't use borderline!
   highp vec2 v = gDiff;
   highp float cy = gRadius + blurRadius;
   highp float cr = gRadius + blurRadius;
index 0b1ea6b6e9756a5c646b64f827214644c64809fb..911b4af72943360501a0b12d05a22b3b62fc9bb0 100644 (file)
@@ -21,11 +21,18 @@ uniform lowp vec4 borderlineColor;
 uniform lowp vec4 uActorColor;
 #endif
 
+#ifdef IS_REQUIRED_SQUIRCLE_CORNER
+uniform highp vec4 cornerSquareness;
+#endif
+
 #if defined(IS_REQUIRED_ROUNDED_CORNER) || defined(IS_REQUIRED_BORDERLINE)
 // Global values both rounded corner and borderline use
 
 // radius of rounded corner on this quadrant
 highp float gRadius = 0.0;
+#ifdef IS_REQUIRED_SQUIRCLE_CORNER
+highp float gSquareness = 0.0;
+#endif
 
 // fragment coordinate. NOTE : vec2(0.0, 0.0) is vRectSize, the corner of visual
 highp vec2 gFragmentPosition = vec2(0.0, 0.0);
@@ -54,6 +61,14 @@ void calculateCornerRadius()
     mix(vCornerRadius.w, vCornerRadius.z, sign(vPosition.x) * 0.5 + 0.5),
     sign(vPosition.y) * 0.5 + 0.5
   );
+#ifdef IS_REQUIRED_SQUIRCLE_CORNER
+  gSquareness = clamp(
+  mix(
+    mix(cornerSquareness.x, cornerSquareness.y, sign(vPosition.x) * 0.5 + 0.5),
+    mix(cornerSquareness.w, cornerSquareness.z, sign(vPosition.x) * 0.5 + 0.5),
+    sign(vPosition.y) * 0.5 + 0.5
+  ), 0.0, 1.0);
+#endif
 #endif
 }
 
@@ -73,7 +88,36 @@ void calculatePosition()
 
 void calculatePotential()
 {
+#ifdef IS_REQUIRED_SQUIRCLE_CORNER
+  // We need to found the r value s.t. x^2 + y^2 - s/r/r x^2y^2 = r^2
+  // and check this r is inside [gRadius - vAliasMargin, gRadius + vAliasMargin]
+
+  // If we make as A = x^2 + y^2, B = sx^2y^2
+  // r^2 = (A + sqrt(A^2 - 4B)) / 2
+  //     = ((x^2 + y^2) + sqrt(x^4 + (2 - 4s)x^2y^2 + y^4)) / 2
+
+  highp vec2 positiveDiff = max(gDiff, 0.0);
+
+  // If gSquareness is near 1.0, it make some numeric error. Let we avoid this situation by heuristic value.
+  if(gSquareness > 0.99)
+  {
+    gPotential = max(gDiff.x, gDiff.y);
+    return;
+  }
+
+  // make sqr to avoid duplicate codes.
+  positiveDiff *= positiveDiff;
+
+  // TODO : Could we remove this double-sqrt code?
+  gPotential = sqrt(((positiveDiff.x + positiveDiff.y)
+                     + sqrt(positiveDiff.x * positiveDiff.x
+                            + positiveDiff.y * positiveDiff.y
+                            + (2.0 - 4.0 * gSquareness) * positiveDiff.x * positiveDiff.y))
+                    * 0.5)
+               + min(0.0, max(gDiff.x, gDiff.y)); ///< Consider negative potential, to support borderline
+#else
   gPotential = length(max(gDiff, 0.0)) + min(0.0, max(gDiff.x, gDiff.y));
+#endif
 }
 
 void setupMinMaxPotential()
@@ -108,6 +152,8 @@ void setupMinMaxPotential()
 #ifdef IS_REQUIRED_BORDERLINE
 lowp vec4 convertBorderlineColor(lowp vec4 textureColor)
 {
+  // TODO : Need to consider squareness
+
   highp float potential = gPotential;
 
   // default opacity of borderline is 0.0
index 2a3e2c7d0649aa3522ef9b9a740d90cd0cf3b5a8..f86c3fe7766a7d391ed27c05014abf0cfb645964 100644 (file)
@@ -46,6 +46,10 @@ uniform lowp vec4 borderlineColor;
 uniform lowp vec4 uActorColor;
 #endif
 
+#ifdef IS_REQUIRED_SQUIRCLE_CORNER
+uniform highp vec4 cornerSquareness;
+#endif
+
 #ifdef ATLAS_CUSTOM_WARP
 mediump float wrapCoordinate( mediump vec2 range, mediump float coordinate, lowp float wrap )
 {
@@ -63,6 +67,9 @@ mediump float wrapCoordinate( mediump vec2 range, mediump float coordinate, lowp
 
 // radius of rounded corner on this quadrant
 highp float gRadius = 0.0;
+#ifdef IS_REQUIRED_SQUIRCLE_CORNER
+highp float gSquareness = 0.0;
+#endif
 
 // fragment coordinate. NOTE : vec2(0.0, 0.0) is vRectSize, the corner of visual
 highp vec2 gFragmentPosition = vec2(0.0, 0.0);
@@ -91,6 +98,14 @@ void calculateCornerRadius()
     mix(vCornerRadius.w, vCornerRadius.z, sign(vPosition.x) * 0.5 + 0.5),
     sign(vPosition.y) * 0.5 + 0.5
   );
+#ifdef IS_REQUIRED_SQUIRCLE_CORNER
+  gSquareness = clamp(
+  mix(
+    mix(cornerSquareness.x, cornerSquareness.y, sign(vPosition.x) * 0.5 + 0.5),
+    mix(cornerSquareness.w, cornerSquareness.z, sign(vPosition.x) * 0.5 + 0.5),
+    sign(vPosition.y) * 0.5 + 0.5
+  ), 0.0, 1.0);
+#endif
 #endif
 }
 
@@ -110,7 +125,36 @@ void calculatePosition()
 
 void calculatePotential()
 {
+#ifdef IS_REQUIRED_SQUIRCLE_CORNER
+  // We need to found the r value s.t. x^2 + y^2 - s/r/r x^2y^2 = r^2
+  // and check this r is inside [gRadius - vAliasMargin, gRadius + vAliasMargin]
+
+  // If we make as A = x^2 + y^2, B = sx^2y^2
+  // r^2 = (A + sqrt(A^2 - 4B)) / 2
+  //     = ((x^2 + y^2) + sqrt(x^4 + (2 - 4s)x^2y^2 + y^4)) / 2
+
+  highp vec2 positiveDiff = max(gDiff, 0.0);
+
+  // If gSquareness is near 1.0, it make some numeric error. Let we avoid this situation by heuristic value.
+  if(gSquareness > 0.99)
+  {
+    gPotential = max(gDiff.x, gDiff.y);
+    return;
+  }
+
+  // make sqr to avoid duplicate codes.
+  positiveDiff *= positiveDiff;
+
+  // TODO : Could we remove this double-sqrt code?
+  gPotential = sqrt(((positiveDiff.x + positiveDiff.y)
+                     + sqrt(positiveDiff.x * positiveDiff.x
+                            + positiveDiff.y * positiveDiff.y
+                            + (2.0 - 4.0 * gSquareness) * positiveDiff.x * positiveDiff.y))
+                    * 0.5)
+               + min(0.0, max(gDiff.x, gDiff.y)); ///< Consider negative potential, to support borderline
+#else
   gPotential = length(max(gDiff, 0.0)) + min(0.0, max(gDiff.x, gDiff.y));
+#endif
 }
 
 void setupMinMaxPotential()
@@ -144,6 +188,8 @@ void setupMinMaxPotential()
 #ifdef IS_REQUIRED_BORDERLINE
 lowp vec4 convertBorderlineColor(lowp vec4 textureColor)
 {
+  // TODO : Need to consider squareness
+
   highp float potential = gPotential;
 
   // default opacity of borderline is 0.0
@@ -261,6 +307,11 @@ const bool IS_REQUIRED_ROUNDED_CORNER_BOOL = true;
 #else
 const bool IS_REQUIRED_ROUNDED_CORNER_BOOL = false;
 #endif
+#ifdef IS_REQUIRED_SQUIRCLE_CORNER
+const bool IS_REQUIRED_SQUIRCLE_CORNER_BOOL = true;
+#else
+const bool IS_REQUIRED_SQUIRCLE_CORNER_BOOL = false;
+#endif
 #ifdef IS_REQUIRED_BORDERLINE
 const bool IS_REQUIRED_BORDERLINE_BOOL = true;
 #else
index 077af761ac2030aecc09633f0e35bb33a7a4bb05..15fa6b7ab5b93a16e01ae444f4ee2837b77a6ff3 100644 (file)
@@ -5,6 +5,7 @@ varying highp vec4 vCornerRadius;
 
 uniform lowp vec4 uColor;
 uniform highp vec3 uSize;
+uniform highp vec4 uCornerSquareness;
 uniform sampler2D sTexture;
 
 highp float nrand(const in vec2 uv)
@@ -22,12 +23,19 @@ vec3 applyDithering( vec3 inColor )
 }
 
 // from https://iquilezles.org/articles/distfunctions
-float roundedBoxSDF(vec2 PixelPositionFromCenter, vec2 RectangleEdgePositionFromCenter, float Radius) {
-    return length(max(PixelPositionFromCenter
-                      - RectangleEdgePositionFromCenter
-                      + Radius
-                      , 0.0))
-           - Radius;
+float roundedBoxSDF(vec2 PixelPositionFromCenter, vec2 RectangleEdgePositionFromCenter, float Radius, float Squareness) {
+  highp vec2 positiveDiff = max(PixelPositionFromCenter
+                                - RectangleEdgePositionFromCenter
+                                + Radius
+                                , 0.0);
+
+  highp float squrenessFactor = Squareness / max(1.0, Radius * Radius);
+
+  // make sqr to avoid duplicate codes.
+  positiveDiff *= positiveDiff;
+
+  return sqrt(positiveDiff.x + positiveDiff.y - squrenessFactor * positiveDiff.x * positiveDiff.y)
+         - Radius;
 }
 
 void main()
@@ -49,6 +57,12 @@ void main()
         mix(vCornerRadius.w, vCornerRadius.z, sign(location.x) * 0.5 + 0.5),
         sign(location.y) * 0.5 + 0.5
       );
+    float squareness =
+      mix(
+        mix(uCornerSquareness.x, uCornerSquareness.y, sign(location.x) * 0.5 + 0.5),
+        mix(uCornerSquareness.w, uCornerSquareness.z, sign(location.x) * 0.5 + 0.5),
+        sign(location.y) * 0.5 + 0.5
+      );
 
     float edgeSoftness = min(1.0, radius);
 
@@ -62,7 +76,7 @@ void main()
     }
     else
     {
-      float distance = roundedBoxSDF(location, halfSize, radius);
+      float distance = roundedBoxSDF(location, halfSize, radius, squareness);
 
       float smoothedAlpha = 1.0 - smoothstep(-edgeSoftness, edgeSoftness, distance);
 
index 54dd9f62a2f07bb69c4561786ae1fcd367656e48..2d44c659d332f2780545584eeafaca0dff62ce75 100644 (file)
@@ -33,28 +33,36 @@ namespace
 constexpr VisualFactoryCache::ShaderType SHADER_TYPE_TABLE[] = {
   VisualFactoryCache::COLOR_SHADER,
   VisualFactoryCache::COLOR_SHADER_ROUNDED_CORNER,
+  VisualFactoryCache::COLOR_SHADER_SQUIRCLE_CORNER,
   VisualFactoryCache::COLOR_SHADER_BORDERLINE,
   VisualFactoryCache::COLOR_SHADER_ROUNDED_BORDERLINE,
+  VisualFactoryCache::COLOR_SHADER_SQUIRCLE_BORDERLINE,
   VisualFactoryCache::COLOR_SHADER_BLUR_EDGE,
   VisualFactoryCache::COLOR_SHADER_ROUNDED_CORNER_BLUR_EDGE,
-};
-
-constexpr VisualFactoryCache::ShaderType SHADER_TYPE_WITH_CUTOUT_TABLE[] = {
+  VisualFactoryCache::COLOR_SHADER_SQUIRCLE_CORNER_BLUR_EDGE,
   VisualFactoryCache::COLOR_SHADER_CUTOUT,
   VisualFactoryCache::COLOR_SHADER_CUTOUT_ROUNDED_CORNER,
+  VisualFactoryCache::COLOR_SHADER_CUTOUT_SQUIRCLE_CORNER,
   VisualFactoryCache::COLOR_SHADER_CUTOUT_BORDERLINE,
   VisualFactoryCache::COLOR_SHADER_CUTOUT_ROUNDED_BORDERLINE,
+  VisualFactoryCache::COLOR_SHADER_CUTOUT_SQUIRCLE_BORDERLINE,
   VisualFactoryCache::COLOR_SHADER_CUTOUT_BLUR_EDGE,
   VisualFactoryCache::COLOR_SHADER_CUTOUT_ROUNDED_CORNER_BLUR_EDGE,
+  VisualFactoryCache::COLOR_SHADER_CUTOUT_SQUIRCLE_CORNER_BLUR_EDGE,
 };
+constexpr uint32_t SHADER_TYPE_TABLE_COUNT = sizeof(SHADER_TYPE_TABLE) / sizeof(SHADER_TYPE_TABLE[0]);
 
 // enum of required list when we select shader
 enum ColorVisualRequireFlag
 {
-  DEFAULT        = 0,
-  ROUNDED_CORNER = 1 << 0,
-  BORDERLINE     = 1 << 1,
-  BLUR           = 1 << 2,
+  DEFAULT         = 0,
+  ROUNDED_CORNER  = 1,
+  SQUIRCLE_CORNER = 2,
+
+  BORDERLINE = (1) * 3,
+  BLUR       = (2) * 3,
+
+  CUTOUT = (1) * 3 * 3,
 };
 
 constexpr uint32_t MINIMUM_SHADER_VERSION_SUPPORT_ROUNDED_BLUR = 300;
@@ -85,9 +93,9 @@ FeatureBuilder::FeatureBuilder()
 {
 }
 
-FeatureBuilder& FeatureBuilder::EnableRoundCorner(bool enableRoundedCorner)
+FeatureBuilder& FeatureBuilder::EnableRoundCorner(bool enableRoundedCorner, bool enableSquircleCorner)
 {
-  mColorRoundCorner = (enableRoundedCorner ? RoundedCorner::ENABLED : RoundedCorner::DISABLED);
+  mColorRoundCorner = (enableRoundedCorner ? (enableSquircleCorner ? RoundedCorner::SQUIRCLE_CORNER : RoundedCorner::ROUNDED_CORNER) : RoundedCorner::DISABLED);
   return *this;
 }
 
@@ -113,27 +121,41 @@ VisualFactoryCache::ShaderType FeatureBuilder::GetShaderType() const
 {
   VisualFactoryCache::ShaderType shaderType     = VisualFactoryCache::COLOR_SHADER;
   uint32_t                       shaderTypeFlag = ColorVisualRequireFlag::DEFAULT;
-  if(mColorBlur)
+
+  if(mColorRoundCorner == RoundedCorner::SQUIRCLE_CORNER)
   {
-    shaderTypeFlag |= ColorVisualRequireFlag::BLUR;
+    shaderTypeFlag += ColorVisualRequireFlag::SQUIRCLE_CORNER;
   }
-  if(mColorRoundCorner)
+  else if(mColorRoundCorner == RoundedCorner::ROUNDED_CORNER)
   {
-    shaderTypeFlag |= ColorVisualRequireFlag::ROUNDED_CORNER;
+    shaderTypeFlag += ColorVisualRequireFlag::ROUNDED_CORNER;
   }
+
   if(mColorBorderline && !mColorBlur)
   {
-    shaderTypeFlag |= ColorVisualRequireFlag::BORDERLINE;
+    shaderTypeFlag += ColorVisualRequireFlag::BORDERLINE;
+  }
+
+  if(mColorBlur)
+  {
+    shaderTypeFlag += ColorVisualRequireFlag::BLUR;
   }
 
-  shaderType = mColorCutout ? SHADER_TYPE_WITH_CUTOUT_TABLE[shaderTypeFlag] : SHADER_TYPE_TABLE[shaderTypeFlag];
+  if(mColorCutout)
+  {
+    shaderTypeFlag += ColorVisualRequireFlag::CUTOUT;
+  }
+
+  DALI_ASSERT_DEBUG(shaderTypeFlag < SHADER_TYPE_TABLE_COUNT && "Invalid color shader type generated!");
+
+  shaderType = SHADER_TYPE_TABLE[shaderTypeFlag];
 
   return shaderType;
 }
 
 void FeatureBuilder::GetVertexShaderPrefixList(std::string& vertexShaderPrefixList) const
 {
-  if(mColorRoundCorner == RoundedCorner::ENABLED)
+  if(mColorRoundCorner != RoundedCorner::DISABLED)
   {
     vertexShaderPrefixList += "#define IS_REQUIRED_ROUNDED_CORNER\n";
   }
@@ -153,9 +175,13 @@ void FeatureBuilder::GetVertexShaderPrefixList(std::string& vertexShaderPrefixLi
 
 void FeatureBuilder::GetFragmentShaderPrefixList(std::string& fragmentShaderPrefixList) const
 {
-  if(mColorRoundCorner == RoundedCorner::ENABLED)
+  if(mColorRoundCorner != RoundedCorner::DISABLED)
   {
     fragmentShaderPrefixList += "#define IS_REQUIRED_ROUNDED_CORNER\n";
+    if(mColorRoundCorner == RoundedCorner::SQUIRCLE_CORNER)
+    {
+      fragmentShaderPrefixList += "#define IS_REQUIRED_SQUIRCLE_CORNER\n";
+    }
   }
   if(mColorBlur == Blur::ENABLED)
   {
@@ -269,7 +295,12 @@ void ColorVisualShaderFactory::CreatePrecompileShader(ColorVisualShaderFeature::
     {
       case PrecompileShaderOption::Flag::ROUNDED_CORNER:
       {
-        builder.EnableRoundCorner(true);
+        builder.EnableRoundCorner(true, false);
+        break;
+      }
+      case PrecompileShaderOption::Flag::SQUIRCLE_CORNER:
+      {
+        builder.EnableRoundCorner(true, true);
         break;
       }
       case PrecompileShaderOption::Flag::BORDERLINE:
index f3964bcc4d28ef111607c7f29d42e76e4c70fd57..55425c6a74d1e291ee0d2c96ef1c4725cc9248ba 100644 (file)
@@ -36,12 +36,13 @@ namespace ColorVisualShaderFeature
 namespace RoundedCorner
 {
 /**
- * @brief Whether use RoundedCorner, or not
+ * @brief Whether use rounded corner, or squircle corner, or not
  */
 enum Type
 {
-  DISABLED = 0, ///< Color visual doesn't use rounded corner
-  ENABLED       ///< Color visual uses rounded corner
+  DISABLED = 0,   ///< Color visual doesn't use rounded corner
+  ROUNDED_CORNER, ///< Color visual uses rounded corner
+  SQUIRCLE_CORNER ///< Color visual use squircle corner
 };
 } // namespace RoundedCorner
 
@@ -85,7 +86,7 @@ class FeatureBuilder
 {
 public:
   FeatureBuilder();
-  FeatureBuilder& EnableRoundCorner(bool enableRoundCorner);
+  FeatureBuilder& EnableRoundCorner(bool enableRoundCorner, bool enableSquircleCorner = false);
   FeatureBuilder& EnableBorderLine(bool enableBorderLine);
   FeatureBuilder& EnableBlur(bool enableBlur);
   FeatureBuilder& EnableCutout(bool enableCutout);
@@ -94,23 +95,6 @@ public:
   void                           GetVertexShaderPrefixList(std::string& vertexShaderPrefixList) const;
   void                           GetFragmentShaderPrefixList(std::string& fragmentShaderPrefixList) const;
 
-  bool IsEnabledRoundCorner() const
-  {
-    return mColorRoundCorner == ColorVisualShaderFeature::RoundedCorner::ENABLED;
-  }
-  bool IsEnabledBorderLine() const
-  {
-    return mColorBorderline == ColorVisualShaderFeature::Borderline::ENABLED;
-  }
-  bool IsEnabledBlur() const
-  {
-    return mColorBlur == ColorVisualShaderFeature::Blur::ENABLED;
-  }
-  bool IsEnabledCutout() const
-  {
-    return mColorCutout == ColorVisualShaderFeature::Cutout::ENABLED;
-  }
-
 private:
   RoundedCorner::Type mColorRoundCorner : 2; ///< Whether use rounded corner, or not. default as RoundedCorner::DISABLED
   Borderline::Type    mColorBorderline : 2;  ///< Whether use border line, or not. default as Borderline::DISABLED
index 9f25e81b42709e0d4e7fb3af73036bda3d843c80..b2bb68554fcfd512ca65467720cb700dac8aa9dd 100644 (file)
@@ -245,10 +245,10 @@ Shader ColorVisual::GenerateShader() const
   Shader shader = mColorVisualShaderFactory.GetShader(
     mFactoryCache,
     ColorVisualShaderFeature::FeatureBuilder()
-    .EnableBlur(IsBlurRequired())
-    .EnableBorderLine(IsBorderlineRequired())
-    .EnableRoundCorner(IsRoundedCornerRequired())
-    .EnableCutout(IsCutoutRequired()));
+      .EnableBlur(IsBlurRequired())
+      .EnableBorderLine(IsBorderlineRequired())
+      .EnableRoundCorner(IsRoundedCornerRequired(), IsSquircleCornerRequired())
+      .EnableCutout(IsCutoutRequired()));
 
   return shader;
 }
index 6884fbe1fe0e4b3fd7358c6fe88ed6249b5070fb..57c3c0848eb1db5c2e9579e6b66d838ab47d2f84 100644 (file)
@@ -68,34 +68,44 @@ static constexpr std::string_view UNIFORM_TEXTURE_COORDINATE_SCALE_FACTOR_NAME("
 static constexpr float DEFAULT_OFFSET_MINIMUM = 0.0f;
 static constexpr float DEFAULT_OFFSET_MAXIMUM = 1.0f;
 
-VisualFactoryCache::ShaderType SHADER_TYPE_TABLE[16] =
-  {
-    VisualFactoryCache::GRADIENT_SHADER_LINEAR_BOUNDING_BOX,
-    VisualFactoryCache::GRADIENT_SHADER_LINEAR_BOUNDING_BOX_ROUNDED_CORNER,
-    VisualFactoryCache::GRADIENT_SHADER_LINEAR_BOUNDING_BOX_BORDERLINE,
-    VisualFactoryCache::GRADIENT_SHADER_LINEAR_BOUNDING_BOX_ROUNDED_BORDERLINE,
-    VisualFactoryCache::GRADIENT_SHADER_LINEAR_USER_SPACE,
-    VisualFactoryCache::GRADIENT_SHADER_LINEAR_USER_SPACE_ROUNDED_CORNER,
-    VisualFactoryCache::GRADIENT_SHADER_LINEAR_USER_SPACE_BORDERLINE,
-    VisualFactoryCache::GRADIENT_SHADER_LINEAR_USER_SPACE_ROUNDED_BORDERLINE,
-    VisualFactoryCache::GRADIENT_SHADER_RADIAL_BOUNDING_BOX,
-    VisualFactoryCache::GRADIENT_SHADER_RADIAL_BOUNDING_BOX_ROUNDED_CORNER,
-    VisualFactoryCache::GRADIENT_SHADER_RADIAL_BOUNDING_BOX_BORDERLINE,
-    VisualFactoryCache::GRADIENT_SHADER_RADIAL_BOUNDING_BOX_ROUNDED_BORDERLINE,
-    VisualFactoryCache::GRADIENT_SHADER_RADIAL_USER_SPACE,
-    VisualFactoryCache::GRADIENT_SHADER_RADIAL_USER_SPACE_ROUNDED_CORNER,
-    VisualFactoryCache::GRADIENT_SHADER_RADIAL_USER_SPACE_BORDERLINE,
-    VisualFactoryCache::GRADIENT_SHADER_RADIAL_USER_SPACE_ROUNDED_BORDERLINE,
+VisualFactoryCache::ShaderType SHADER_TYPE_TABLE[] = {
+  VisualFactoryCache::GRADIENT_SHADER_LINEAR_BOUNDING_BOX,
+  VisualFactoryCache::GRADIENT_SHADER_LINEAR_BOUNDING_BOX_ROUNDED_CORNER,
+  VisualFactoryCache::GRADIENT_SHADER_LINEAR_BOUNDING_BOX_SQUIRCLE_CORNER,
+  VisualFactoryCache::GRADIENT_SHADER_LINEAR_BOUNDING_BOX_BORDERLINE,
+  VisualFactoryCache::GRADIENT_SHADER_LINEAR_BOUNDING_BOX_ROUNDED_BORDERLINE,
+  VisualFactoryCache::GRADIENT_SHADER_LINEAR_BOUNDING_BOX_SQUIRCLE_BORDERLINE,
+  VisualFactoryCache::GRADIENT_SHADER_LINEAR_USER_SPACE,
+  VisualFactoryCache::GRADIENT_SHADER_LINEAR_USER_SPACE_ROUNDED_CORNER,
+  VisualFactoryCache::GRADIENT_SHADER_LINEAR_USER_SPACE_SQUIRCLE_CORNER,
+  VisualFactoryCache::GRADIENT_SHADER_LINEAR_USER_SPACE_BORDERLINE,
+  VisualFactoryCache::GRADIENT_SHADER_LINEAR_USER_SPACE_ROUNDED_BORDERLINE,
+  VisualFactoryCache::GRADIENT_SHADER_LINEAR_USER_SPACE_SQUIRCLE_BORDERLINE,
+  VisualFactoryCache::GRADIENT_SHADER_RADIAL_BOUNDING_BOX,
+  VisualFactoryCache::GRADIENT_SHADER_RADIAL_BOUNDING_BOX_ROUNDED_CORNER,
+  VisualFactoryCache::GRADIENT_SHADER_RADIAL_BOUNDING_BOX_SQUIRCLE_CORNER,
+  VisualFactoryCache::GRADIENT_SHADER_RADIAL_BOUNDING_BOX_BORDERLINE,
+  VisualFactoryCache::GRADIENT_SHADER_RADIAL_BOUNDING_BOX_ROUNDED_BORDERLINE,
+  VisualFactoryCache::GRADIENT_SHADER_RADIAL_BOUNDING_BOX_SQUIRCLE_BORDERLINE,
+  VisualFactoryCache::GRADIENT_SHADER_RADIAL_USER_SPACE,
+  VisualFactoryCache::GRADIENT_SHADER_RADIAL_USER_SPACE_ROUNDED_CORNER,
+  VisualFactoryCache::GRADIENT_SHADER_RADIAL_USER_SPACE_SQUIRCLE_CORNER,
+  VisualFactoryCache::GRADIENT_SHADER_RADIAL_USER_SPACE_BORDERLINE,
+  VisualFactoryCache::GRADIENT_SHADER_RADIAL_USER_SPACE_ROUNDED_BORDERLINE,
+  VisualFactoryCache::GRADIENT_SHADER_RADIAL_USER_SPACE_SQUIRCLE_BORDERLINE,
 };
+constexpr uint32_t SHADER_TYPE_TABLE_COUNT = sizeof(SHADER_TYPE_TABLE) / sizeof(SHADER_TYPE_TABLE[0]);
 
 // enum of required list when we select shader
 enum GradientVisualRequireFlag
 {
-  DEFAULT        = 0,
-  ROUNDED_CORNER = 1 << 0,
-  BORDERLINE     = 1 << 1,
-  USER_SPACE     = 1 << 2,
-  RADIAL         = 1 << 3,
+  DEFAULT         = 0,
+  ROUNDED_CORNER  = 1,
+  SQUIRCLE_CORNER = 2,
+
+  BORDERLINE = (1 << 0) * 3,
+  USER_SPACE = (1 << 1) * 3,
+  RADIAL     = (1 << 2) * 3,
 };
 
 Dali::WrapMode::Type GetWrapMode(Toolkit::GradientVisual::SpreadMethod::Type spread)
@@ -369,27 +379,35 @@ Shader GradientVisual::GenerateShader() const
 {
   bool userspaceUnit  = (mGradient->GetGradientUnits() == Toolkit::GradientVisual::Units::USER_SPACE);
   bool roundedCorner  = IsRoundedCornerRequired();
+  bool squircleCorner = IsSquircleCornerRequired();
   bool borderline     = IsBorderlineRequired();
   bool radialGradient = (mGradientType == Type::RADIAL);
 
-  int shaderTypeFlag = GradientVisualRequireFlag::DEFAULT;
-  if(roundedCorner)
+  uint32_t shaderTypeFlag = GradientVisualRequireFlag::DEFAULT;
+  if(squircleCorner)
+  {
+    shaderTypeFlag += GradientVisualRequireFlag::SQUIRCLE_CORNER;
+  }
+  else if(roundedCorner)
   {
-    shaderTypeFlag |= GradientVisualRequireFlag::ROUNDED_CORNER;
+    shaderTypeFlag += GradientVisualRequireFlag::ROUNDED_CORNER;
   }
+
   if(borderline)
   {
-    shaderTypeFlag |= GradientVisualRequireFlag::BORDERLINE;
+    shaderTypeFlag += GradientVisualRequireFlag::BORDERLINE;
   }
   if(userspaceUnit)
   {
-    shaderTypeFlag |= GradientVisualRequireFlag::USER_SPACE;
+    shaderTypeFlag += GradientVisualRequireFlag::USER_SPACE;
   }
   if(radialGradient)
   {
-    shaderTypeFlag |= GradientVisualRequireFlag::RADIAL;
+    shaderTypeFlag += GradientVisualRequireFlag::RADIAL;
   }
 
+  DALI_ASSERT_DEBUG(shaderTypeFlag < SHADER_TYPE_TABLE_COUNT && "Invalid gradient shader type generated!");
+
   VisualFactoryCache::ShaderType shaderType = SHADER_TYPE_TABLE[shaderTypeFlag];
   Shader                         shader     = mFactoryCache.GetShader(shaderType);
   if(!shader)
@@ -401,6 +419,10 @@ Shader GradientVisual::GenerateShader() const
     {
       vertexShaderPrefixList += "#define IS_REQUIRED_ROUNDED_CORNER\n";
       fragmentShaderPrefixList += "#define IS_REQUIRED_ROUNDED_CORNER\n";
+      if(squircleCorner)
+      {
+        fragmentShaderPrefixList += "#define IS_REQUIRED_SQUIRCLE_CORNER\n";
+      }
     }
     if(borderline)
     {
index 23ceddf15c5662dd7c774680ea3360f6d9c61833..db8a20792eb4a19ab3542560877cb1613a8cb078 100644 (file)
@@ -148,7 +148,7 @@ Shader ImageVisualShaderFactory::GetShader(VisualFactoryCache& factoryCache, con
   shader = factoryCache.GenerateAndSaveShader(shaderType, vertexShader, fragmentShader);
 
   shader.ReserveCustomProperties(CUSTOM_PROPERTY_COUNT +
-                                 (featureBuilder.IsEnabledAlphaMaskingOnRendering() ? 1 : 0));
+                                 ((featureBuilder.IsEnabledAlphaMaskingOnRendering() ? 1 : 0)));
 
   shader.RegisterProperty(PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT);
 
@@ -261,7 +261,12 @@ void ImageVisualShaderFactory::CreatePrecompileShader(ImageVisualShaderFeature::
       }
       case PrecompileShaderOption::Flag::ROUNDED_CORNER:
       {
-        builder.EnableRoundedCorner(true);
+        builder.EnableRoundedCorner(true, false);
+        break;
+      }
+      case PrecompileShaderOption::Flag::SQUIRCLE_CORNER:
+      {
+        builder.EnableRoundedCorner(true, true);
         break;
       }
       case PrecompileShaderOption::Flag::BORDERLINE:
index de9b32d83b9181affb263d68971ce67b6c18d5e1..ff04c8ee01eda050b3188b2a7cd69efa7c992799 100644 (file)
@@ -28,34 +28,44 @@ namespace
 // enum of required list when we select shader
 enum class ImageVisualRequireFlag : uint32_t
 {
-  DEFAULT          = 0,
-  ROUNDED_CORNER   = 1 << 0,
-  BORDERLINE       = 1 << 1,
-  ALPHA_MASKING    = 1 << 2,
-  COLOR_CONVERSION = 1 << 3,
+  DEFAULT         = 0,
+  ROUNDED_CORNER  = 1,
+  SQUIRCLE_CORNER = 2,
 
-  UNIFIED_YUV_AND_RGB = 1 << 2, // Special enum to trick unified YUV and RGB.
+  BORDERLINE       = (1 << 0) * 3,
+  ALPHA_MASKING    = (1 << 1) * 3,
+  COLOR_CONVERSION = (1 << 2) * 3,
+
+  UNIFIED_YUV_AND_RGB = (1 << 1) * 3, // Special enum to trick unified YUV and RGB.
 };
 
-static constexpr auto          SHADER_TYPE_COUNT = 16u;
-VisualFactoryCache::ShaderType SHADER_TYPE_TABLE[SHADER_TYPE_COUNT] =
-  {
-    VisualFactoryCache::IMAGE_SHADER,
-    VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER,
-    VisualFactoryCache::IMAGE_SHADER_BORDERLINE,
-    VisualFactoryCache::IMAGE_SHADER_ROUNDED_BORDERLINE,
-    VisualFactoryCache::IMAGE_SHADER_MASKING,
-    VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER_MASKING,
-    VisualFactoryCache::IMAGE_SHADER_BORDERLINE_MASKING,
-    VisualFactoryCache::IMAGE_SHADER_ROUNDED_BORDERLINE_MASKING,
-    VisualFactoryCache::IMAGE_SHADER_YUV_TO_RGB,
-    VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER_YUV_TO_RGB,
-    VisualFactoryCache::IMAGE_SHADER_BORDERLINE_YUV_TO_RGB,
-    VisualFactoryCache::IMAGE_SHADER_ROUNDED_BORDERLINE_YUV_TO_RGB,
-    VisualFactoryCache::IMAGE_SHADER_YUV_AND_RGB,
-    VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER_YUV_AND_RGB,
-    VisualFactoryCache::IMAGE_SHADER_BORDERLINE_YUV_AND_RGB,
-    VisualFactoryCache::IMAGE_SHADER_ROUNDED_BORDERLINE_YUV_AND_RGB};
+VisualFactoryCache::ShaderType SHADER_TYPE_TABLE[] = {
+  VisualFactoryCache::IMAGE_SHADER,
+  VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER,
+  VisualFactoryCache::IMAGE_SHADER_SQUIRCLE_CORNER,
+  VisualFactoryCache::IMAGE_SHADER_BORDERLINE,
+  VisualFactoryCache::IMAGE_SHADER_ROUNDED_BORDERLINE,
+  VisualFactoryCache::IMAGE_SHADER_SQUIRCLE_BORDERLINE,
+  VisualFactoryCache::IMAGE_SHADER_MASKING,
+  VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER_MASKING,
+  VisualFactoryCache::IMAGE_SHADER_SQUIRCLE_CORNER_MASKING,
+  VisualFactoryCache::IMAGE_SHADER_BORDERLINE_MASKING,
+  VisualFactoryCache::IMAGE_SHADER_ROUNDED_BORDERLINE_MASKING,
+  VisualFactoryCache::IMAGE_SHADER_SQUIRCLE_BORDERLINE_MASKING,
+  VisualFactoryCache::IMAGE_SHADER_YUV_TO_RGB,
+  VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER_YUV_TO_RGB,
+  VisualFactoryCache::IMAGE_SHADER_SQUIRCLE_CORNER_YUV_TO_RGB,
+  VisualFactoryCache::IMAGE_SHADER_BORDERLINE_YUV_TO_RGB,
+  VisualFactoryCache::IMAGE_SHADER_ROUNDED_BORDERLINE_YUV_TO_RGB,
+  VisualFactoryCache::IMAGE_SHADER_SQUIRCLE_BORDERLINE_YUV_TO_RGB,
+  VisualFactoryCache::IMAGE_SHADER_YUV_AND_RGB,
+  VisualFactoryCache::IMAGE_SHADER_ROUNDED_CORNER_YUV_AND_RGB,
+  VisualFactoryCache::IMAGE_SHADER_SQUIRCLE_CORNER_YUV_AND_RGB,
+  VisualFactoryCache::IMAGE_SHADER_BORDERLINE_YUV_AND_RGB,
+  VisualFactoryCache::IMAGE_SHADER_ROUNDED_BORDERLINE_YUV_AND_RGB,
+  VisualFactoryCache::IMAGE_SHADER_SQUIRCLE_BORDERLINE_YUV_AND_RGB,
+};
+constexpr uint32_t SHADER_TYPE_TABLE_COUNT = sizeof(SHADER_TYPE_TABLE) / sizeof(SHADER_TYPE_TABLE[0]);
 } // unnamed namespace
 
 namespace ImageVisualShaderFeature
@@ -83,9 +93,9 @@ FeatureBuilder& FeatureBuilder::ApplyDefaultTextureWrapMode(bool applyDefaultTex
   return *this;
 }
 
-FeatureBuilder& FeatureBuilder::EnableRoundedCorner(bool enableRoundedCorner)
+FeatureBuilder& FeatureBuilder::EnableRoundedCorner(bool enableRoundedCorner, bool enableSquircleCorner)
 {
-  mRoundedCorner = (enableRoundedCorner ? RoundedCorner::ENABLED : RoundedCorner::DISABLED);
+  mRoundedCorner = (enableRoundedCorner ? (enableSquircleCorner ? RoundedCorner::SQUIRCLE_CORNER : RoundedCorner::ROUNDED_CORNER) : RoundedCorner::DISABLED);
   return *this;
 }
 
@@ -130,27 +140,36 @@ VisualFactoryCache::ShaderType FeatureBuilder::GetShaderType() const
   else
   {
     uint32_t shaderTypeFlag = static_cast<uint32_t>(ImageVisualRequireFlag::DEFAULT);
-    if(mRoundedCorner == RoundedCorner::ENABLED)
+    if(mRoundedCorner == RoundedCorner::SQUIRCLE_CORNER)
+    {
+      shaderTypeFlag += static_cast<uint32_t>(ImageVisualRequireFlag::SQUIRCLE_CORNER);
+    }
+    else if(mRoundedCorner == RoundedCorner::ROUNDED_CORNER)
     {
-      shaderTypeFlag |= static_cast<uint32_t>(ImageVisualRequireFlag::ROUNDED_CORNER);
+      shaderTypeFlag += static_cast<uint32_t>(ImageVisualRequireFlag::ROUNDED_CORNER);
     }
+
     if(mBorderline == Borderline::ENABLED)
     {
-      shaderTypeFlag |= static_cast<uint32_t>(ImageVisualRequireFlag::BORDERLINE);
+      shaderTypeFlag += static_cast<uint32_t>(ImageVisualRequireFlag::BORDERLINE);
     }
+
     if(mAlphaMaskingOnRendering == AlphaMaskingOnRendering::ENABLED)
     {
-      shaderTypeFlag |= static_cast<uint32_t>(ImageVisualRequireFlag::ALPHA_MASKING);
+      shaderTypeFlag += static_cast<uint32_t>(ImageVisualRequireFlag::ALPHA_MASKING);
     }
     else if(mColorConversion == ColorConversion::YUV_TO_RGB) // Not support gpu masking and color conversion at the same time now
     {
-      shaderTypeFlag |= static_cast<uint32_t>(ImageVisualRequireFlag::COLOR_CONVERSION);
+      shaderTypeFlag += static_cast<uint32_t>(ImageVisualRequireFlag::COLOR_CONVERSION);
     }
     else if(mColorConversion == ColorConversion::UNIFIED_YUV_AND_RGB)
     {
-      shaderTypeFlag |= static_cast<uint32_t>(ImageVisualRequireFlag::COLOR_CONVERSION);
-      shaderTypeFlag |= static_cast<uint32_t>(ImageVisualRequireFlag::UNIFIED_YUV_AND_RGB);
+      shaderTypeFlag += static_cast<uint32_t>(ImageVisualRequireFlag::COLOR_CONVERSION);
+      shaderTypeFlag += static_cast<uint32_t>(ImageVisualRequireFlag::UNIFIED_YUV_AND_RGB);
     }
+
+    DALI_ASSERT_DEBUG(shaderTypeFlag < SHADER_TYPE_TABLE_COUNT && "Invalid image shader type generated!");
+
     shaderType = SHADER_TYPE_TABLE[shaderTypeFlag];
   }
 
@@ -168,7 +187,7 @@ void FeatureBuilder::GetVertexShaderPrefixList(std::string& vertexShaderPrefixLi
 {
   if(mTextureAtlas != TextureAtlas::ENABLED)
   {
-    if(mRoundedCorner == RoundedCorner::ENABLED)
+    if(mRoundedCorner != RoundedCorner::DISABLED)
     {
       vertexShaderPrefixList += "#define IS_REQUIRED_ROUNDED_CORNER\n";
     }
@@ -198,9 +217,13 @@ void FeatureBuilder::GetFragmentShaderPrefixList(std::string& fragmentShaderPref
   }
   else
   {
-    if(mRoundedCorner == RoundedCorner::ENABLED)
+    if(mRoundedCorner != RoundedCorner::DISABLED)
     {
       fragmentShaderPrefixList += "#define IS_REQUIRED_ROUNDED_CORNER\n";
+      if(mRoundedCorner == RoundedCorner::SQUIRCLE_CORNER)
+      {
+        fragmentShaderPrefixList += "#define IS_REQUIRED_SQUIRCLE_CORNER\n";
+      }
     }
     if(mBorderline == Borderline::ENABLED)
     {
index d819cd32d5c40ac44860277634abceeb63e5f72b..97d493b9c3082833cf6fbf3eeb81a6ba7652b157 100644 (file)
@@ -62,12 +62,13 @@ enum Type
 namespace RoundedCorner
 {
 /**
- * @brief Whether use rounded corner, or not
+ * @brief Whether use rounded corner, or squircle corner, or not
  */
 enum Type
 {
-  DISABLED = 0, ///< Image visual doesn't use rounded corner
-  ENABLED       ///< Image visual uses rounded corner
+  DISABLED = 0,   ///< Image visual doesn't use rounded corner
+  ROUNDED_CORNER, ///< Image visual uses rounded corner
+  SQUIRCLE_CORNER ///< Image visual use squircle corner
 };
 } // namespace RoundedCorner
 
@@ -133,7 +134,7 @@ public:
 
   FeatureBuilder& ApplyDefaultTextureWrapMode(bool applyDefaultTextureWrapMode);
 
-  FeatureBuilder& EnableRoundedCorner(bool enableRoundedCorner);
+  FeatureBuilder& EnableRoundedCorner(bool enableRoundedCorner, bool enableSquircleCorner = false);
 
   FeatureBuilder& EnableBorderline(bool enableBorderline);
 
index ed3383cdcd61d9713030cf64e2eae223b452d587..10337668ef245e645b6d5c31bb61e15854f22829 100644 (file)
@@ -1342,7 +1342,7 @@ Shader ImageVisual::GenerateShader() const
       ImageVisualShaderFeature::FeatureBuilder()
         .EnableTextureAtlas(mImpl->mFlags & Visual::Base::Impl::IS_ATLASING_APPLIED && !useNativeImage)
         .ApplyDefaultTextureWrapMode(mWrapModeU <= WrapMode::CLAMP_TO_EDGE && mWrapModeV <= WrapMode::CLAMP_TO_EDGE)
-        .EnableRoundedCorner(IsRoundedCornerRequired())
+        .EnableRoundedCorner(IsRoundedCornerRequired(), IsSquircleCornerRequired())
         .EnableBorderline(IsBorderlineRequired())
         .SetTextureForFragmentShaderCheck(useNativeImage ? mTextures.GetTexture(0) : Dali::Texture())
         .EnableAlphaMaskingOnRendering(requiredAlphaMaskingOnRendering)
index 029a4ccc08712420cafb0b73845b8afd8aadcfa9..be5ce33b6ea588415cbd2bb4b0d2bb801bff8107 100644 (file)
@@ -129,6 +129,7 @@ Internal::Visual::Base::Impl::Impl(FittingMode fittingMode, Toolkit::Visual::Typ
   mType(type),
   mAlwaysUsingBorderline(false),
   mAlwaysUsingCornerRadius(false),
+  mAlwaysUsingCornerSquareness(false),
   mIgnoreFittingMode(false),
   mPixelAreaSetByFittingMode(false),
   mTransformMapSetForFittingMode(false)
index d8e7f34547a246366866b41967411360f88c1523..68f924bb2795f96721f9dfa7da43a8bef901bcca 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_TOOLKIT_INTERNAL_VISUAL_BASE_DATA_IMPL_H
 
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -53,10 +53,10 @@ struct Base::Impl
 
   enum Flags
   {
-    IS_ON_SCENE                        = 1,
-    IS_ATLASING_APPLIED                = 1 << 1,
-    IS_PREMULTIPLIED_ALPHA             = 1 << 2,
-    IS_SYNCHRONOUS_RESOURCE_LOADING    = 1 << 3,
+    IS_ON_SCENE                     = 1,
+    IS_ATLASING_APPLIED             = 1 << 1,
+    IS_PREMULTIPLIED_ALPHA          = 1 << 2,
+    IS_SYNCHRONOUS_RESOURCE_LOADING = 1 << 3,
   };
 
   struct CustomShader
@@ -120,6 +120,7 @@ struct Base::Impl
     DecorationData()
     : mBorderlineColor(Color::BLACK),
       mCornerRadius(Vector4::ZERO),
+      mCornerSquareness(Vector4::ZERO),
       mBorderlineWidth(0.0f),
       mBorderlineOffset(0.0f),
       mCornerRadiusPolicy(static_cast<int>(Toolkit::Visual::Transform::Policy::ABSOLUTE))
@@ -127,6 +128,7 @@ struct Base::Impl
     }
     Vector4 mBorderlineColor;
     Vector4 mCornerRadius;
+    Vector4 mCornerSquareness;
     float   mBorderlineWidth;
     float   mBorderlineOffset;
     int     mCornerRadiusPolicy;
@@ -241,6 +243,26 @@ struct Base::Impl
     EnsureDecorationData()->mCornerRadiusPolicy = value;
   }
 
+  /**
+   * @brief Get decoration data value : corner squareness
+   *
+   * Keep these API as inline function due to the performance.
+   */
+  Vector4 GetCornerSquareness()
+  {
+    return mDecorationData ? mDecorationData->mCornerSquareness : Vector4::ZERO;
+  }
+
+  /**
+   * @brief Set decoration data value : corner squareness
+   *
+   * Keep these API as inline function due to the performance.
+   */
+  void SetCornerSquareness(Vector4 value)
+  {
+    EnsureDecorationData()->mCornerSquareness = value;
+  }
+
   VisualRenderer                  mRenderer;
   CustomShader*                   mCustomShader;
   EventObserver*                  mEventObserver; ///< Allows controls to observe when the visual has events to notify
@@ -254,11 +276,12 @@ struct Base::Impl
   int                             mFlags;
   Toolkit::Visual::ResourceStatus mResourceStatus;
   const Toolkit::Visual::Type     mType;
-  bool                            mAlwaysUsingBorderline : 1;        ///< Whether we need the borderline in shader always.
-  bool                            mAlwaysUsingCornerRadius : 1;      ///< Whether we need the corner radius in shader always.
-  bool                            mIgnoreFittingMode : 1;            ///< Whether we need to ignore fitting mode.
-  bool                            mPixelAreaSetByFittingMode : 1;    ///< Whether the pixel area is set for fitting mode.
-  bool                            mTransformMapSetForFittingMode :1; ///< Whether the transformMap is set for fitting mode.
+  bool                            mAlwaysUsingBorderline : 1;         ///< Whether we need the borderline in shader always.
+  bool                            mAlwaysUsingCornerRadius : 1;       ///< Whether we need the corner radius in shader always.
+  bool                            mAlwaysUsingCornerSquareness : 1;   ///< Whether we need the corner squareness in shader always.
+  bool                            mIgnoreFittingMode : 1;             ///< Whether we need to ignore fitting mode.
+  bool                            mPixelAreaSetByFittingMode : 1;     ///< Whether the pixel area is set for fitting mode.
+  bool                            mTransformMapSetForFittingMode : 1; ///< Whether the transformMap is set for fitting mode.
 };
 
 } // namespace Visual
index e830fa9000bffa63fc6b562e6309053bdf1ba46f..149873ed27a58dd6b1f5bf47de1d7d0883bcfd46 100644 (file)
@@ -139,6 +139,7 @@ StringProperty PROPERTY_NAME_INDEX_TABLE[] =
     {BORDERLINE_OFFSET, Toolkit::DevelVisual::Property::BORDERLINE_OFFSET},
     {CORNER_RADIUS, Toolkit::DevelVisual::Property::CORNER_RADIUS},
     {CORNER_RADIUS_POLICY, Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY},
+    {CORNER_SQUARENESS, Toolkit::DevelVisual::Property::CORNER_SQUARENESS},
 };
 const uint16_t PROPERTY_NAME_INDEX_TABLE_COUNT = sizeof(PROPERTY_NAME_INDEX_TABLE) / sizeof(PROPERTY_NAME_INDEX_TABLE[0]);
 
@@ -442,6 +443,63 @@ void Visual::Base::SetProperties(const Property::Map& propertyMap)
         }
         break;
       }
+      case Toolkit::DevelVisual::Property::CORNER_SQUARENESS:
+      {
+        if(value.GetType() == Property::VECTOR4)
+        {
+          // If CORNER_SQUARENESS Property is Vector4,
+          // Each values mean the squareness of
+          // (top-left, top-right, bottom-right, bottom-left)
+          Vector4 squareness;
+          if(value.Get(squareness) && (mImpl->mDecorationData != nullptr || squareness != Vector4::ZERO))
+          {
+            mImpl->SetCornerSquareness(squareness);
+          }
+        }
+        else
+        {
+          // If CORNER_RADIUS Property is float,
+          // Every corner radius have same value
+          float squareness;
+          if(value.Get(squareness) && (mImpl->mDecorationData != nullptr || !Dali::EqualsZero(squareness)))
+          {
+            mImpl->SetCornerSquareness(Vector4(squareness, squareness, squareness, squareness));
+          }
+        }
+
+        if(DALI_UNLIKELY(mImpl->mRenderer && IsTypeAvailableForCornerRadius(mImpl->mType)))
+        {
+          // Unusual case. SetProperty called after OnInitialize().
+          // Assume that DoAction call UPDATE_PROPERTY.
+          DownCast<DecoratedVisualRenderer>(mImpl->mRenderer).RegisterCornerSquarenessUniform();
+          mImpl->mRenderer.SetProperty(DecoratedVisualRenderer::Property::CORNER_SQUARENESS, mImpl->GetCornerSquareness());
+
+          // Check whether we must update shader.
+          if(!mImpl->mAlwaysUsingCornerSquareness && IsSquircleCornerRequired())
+          {
+            // Required to change shader mean, we didn't setup CORNER_RADIUS_POLICY into mRenderer before. Set property now.
+            mImpl->mRenderer.SetProperty(DecoratedVisualRenderer::Property::CORNER_RADIUS, static_cast<Vector4>(mImpl->GetCornerRadius()));
+            mImpl->mRenderer.SetProperty(DecoratedVisualRenderer::Property::CORNER_RADIUS_POLICY, static_cast<float>(mImpl->GetCornerRadiusPolicy()));
+
+            // Change the shader must not be occured many times. we always have to use corner squreness feature.
+            mImpl->mAlwaysUsingCornerSquareness = true;
+
+            if(!IsBorderlineRequired())
+            {
+              // If IsBorderlineRequired is true, BLEND_MODE is already BlendMode::ON_WITHOUT_CULL. So we don't overwrite it.
+              mImpl->mRenderer.SetProperty(Renderer::Property::BLEND_MODE, BlendMode::ON);
+            }
+
+            // Change shader
+            if(!mImpl->mCustomShader)
+            {
+              needUpdateShader = true;
+            }
+          }
+        }
+
+        break;
+      }
     }
   }
 
@@ -598,6 +656,10 @@ void Visual::Base::CreatePropertyMap(Property::Map& map) const
     {
       mImpl->SetCornerRadius(mImpl->mRenderer.GetProperty<Vector4>(DecoratedVisualRenderer::Property::CORNER_RADIUS));
     }
+    if(IsSquircleCornerRequired())
+    {
+      mImpl->SetCornerSquareness(mImpl->mRenderer.GetProperty<Vector4>(DecoratedVisualRenderer::Property::CORNER_SQUARENESS));
+    }
     if(IsBorderlineRequired())
     {
       mImpl->SetBorderlineWidth(mImpl->mRenderer.GetProperty<float>(DecoratedVisualRenderer::Property::BORDERLINE_WIDTH));
@@ -640,6 +702,7 @@ void Visual::Base::CreatePropertyMap(Property::Map& map) const
   {
     map.Insert(Toolkit::DevelVisual::Property::CORNER_RADIUS, mImpl->GetCornerRadius());
     map.Insert(Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, mImpl->GetCornerRadiusPolicy());
+    map.Insert(Toolkit::DevelVisual::Property::CORNER_SQUARENESS, mImpl->GetCornerSquareness());
   }
 }
 
@@ -709,6 +772,30 @@ bool Visual::Base::IsRoundedCornerRequired() const
   return false;
 }
 
+bool Visual::Base::IsSquircleCornerRequired() const
+{
+  // If VisualType doesn't support rounded corner, always return false.
+  if(IsTypeAvailableForCornerRadius(mImpl->mType))
+  {
+    if(mImpl->mRenderer)
+    {
+      // Update values from Renderer
+      Property::Value value = mImpl->mRenderer.GetProperty(DecoratedVisualRenderer::Property::CORNER_SQUARENESS);
+
+      Vector4 retValue = Vector4::ZERO;
+      if(value.Get(retValue))
+      {
+        if(mImpl->mDecorationData != nullptr || retValue != Vector4::ZERO)
+        {
+          mImpl->SetCornerSquareness(retValue);
+        }
+      }
+    }
+    return IsRoundedCornerRequired() && (mImpl->mAlwaysUsingCornerSquareness || !(mImpl->GetCornerSquareness() == Vector4::ZERO));
+  }
+  return false;
+}
+
 bool Visual::Base::IsBorderlineRequired() const
 {
   // If VisualType doesn't support borderline, always return false.
@@ -766,6 +853,11 @@ void Visual::Base::RegisterDecoration()
         mImpl->mRenderer.SetProperty(DecoratedVisualRenderer::Property::CORNER_RADIUS, mImpl->GetCornerRadius());
         mImpl->mRenderer.SetProperty(DecoratedVisualRenderer::Property::CORNER_RADIUS_POLICY, static_cast<float>(mImpl->GetCornerRadiusPolicy()));
       }
+      if(mImpl->mAlwaysUsingCornerSquareness || !(mImpl->GetCornerSquareness() == Vector4::ZERO))
+      {
+        DownCast<DecoratedVisualRenderer>(mImpl->mRenderer).RegisterCornerSquarenessUniform();
+        mImpl->mRenderer.SetProperty(DecoratedVisualRenderer::Property::CORNER_SQUARENESS, mImpl->GetCornerSquareness());
+      }
     }
     if(IsTypeAvailableForBorderline(mImpl->mType))
     {
@@ -966,6 +1058,10 @@ Property::Index Visual::Base::GetIntKey(Property::Key key)
   {
     return Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY;
   }
+  else if(key.stringKey == CORNER_SQUARENESS)
+  {
+    return Toolkit::DevelVisual::Property::CORNER_SQUARENESS;
+  }
   else if(key.stringKey == BORDERLINE_WIDTH)
   {
     return Toolkit::DevelVisual::Property::BORDERLINE_WIDTH;
@@ -1018,6 +1114,10 @@ Property::Index Visual::Base::GetPropertyIndex(Property::Key key)
     {
       return DecoratedVisualRenderer::Property::CORNER_RADIUS;
     }
+    case Dali::Toolkit::DevelVisual::Property::CORNER_SQUARENESS:
+    {
+      return DecoratedVisualRenderer::Property::CORNER_SQUARENESS;
+    }
     case Dali::Toolkit::DevelVisual::Property::BORDERLINE_WIDTH:
     {
       return DecoratedVisualRenderer::Property::BORDERLINE_WIDTH;
@@ -1285,6 +1385,14 @@ Dali::Property Visual::Base::GetPropertyObject(Dali::Property::Key key)
           mImpl->mRenderer.SetProperty(DecoratedVisualRenderer::Property::CORNER_RADIUS, mImpl->GetCornerRadius());
           mImpl->mRenderer.SetProperty(DecoratedVisualRenderer::Property::CORNER_RADIUS_POLICY, static_cast<float>(mImpl->GetCornerRadiusPolicy()));
 
+          if(IsSquircleCornerRequired())
+          {
+            // Change the shader must not be occured many times. we always have to use corner squreness feature.
+            mImpl->mAlwaysUsingCornerSquareness = true;
+
+            mImpl->mRenderer.SetProperty(DecoratedVisualRenderer::Property::CORNER_SQUARENESS, mImpl->GetCornerSquareness());
+          }
+
           // Change shader
           UpdateShader();
         }
@@ -1297,6 +1405,35 @@ Dali::Property Visual::Base::GetPropertyObject(Dali::Property::Key key)
       }
       break;
     }
+    case Toolkit::DevelVisual::Property::CORNER_SQUARENESS:
+    {
+      if(IsTypeAvailableForCornerRadius(mImpl->mType))
+      {
+        const bool updateShader = !mImpl->mCustomShader && !IsSquircleCornerRequired();
+
+        // CornerSquareness is animated now. we always have to use corner squareness feature.
+        mImpl->mAlwaysUsingCornerSquareness = true;
+
+        if(updateShader)
+        {
+          // Update each values to renderer
+          DownCast<DecoratedVisualRenderer>(mImpl->mRenderer).RegisterCornerSquarenessUniform();
+          mImpl->mRenderer.SetProperty(DecoratedVisualRenderer::Property::CORNER_RADIUS, mImpl->GetCornerRadius());
+          mImpl->mRenderer.SetProperty(DecoratedVisualRenderer::Property::CORNER_RADIUS_POLICY, static_cast<float>(mImpl->GetCornerRadiusPolicy()));
+          mImpl->mRenderer.SetProperty(DecoratedVisualRenderer::Property::CORNER_SQUARENESS, mImpl->GetCornerSquareness());
+
+          // Change shader
+          UpdateShader();
+        }
+        if(!IsBorderlineRequired())
+        {
+          // If IsBorderlineRequired is true, BLEND_MODE is already BlendMode::ON_WITHOUT_CULL. So we don't overwrite it.
+          mImpl->mRenderer.SetProperty(Renderer::Property::BLEND_MODE, BlendMode::ON);
+        }
+        return Dali::Property(mImpl->mRenderer, DecoratedVisualRenderer::Property::CORNER_SQUARENESS);
+      }
+      break;
+    }
     case Toolkit::DevelVisual::Property::BORDERLINE_WIDTH:
     case Toolkit::DevelVisual::Property::BORDERLINE_COLOR:
     case Toolkit::DevelVisual::Property::BORDERLINE_OFFSET:
index b5c002e0f815f6ff168e24025f99b8e4309d3875..312923c9e2d74fb371513970866f5df1c1cb1543 100644 (file)
@@ -452,6 +452,13 @@ protected:
    */
   bool IsRoundedCornerRequired() const;
 
+  /**
+   * @brief Query whether the corners of the visual requires to be squircle.
+   *
+   * @return Returns true if the rounded corner is required, false otherwise.
+   */
+  bool IsSquircleCornerRequired() const;
+
   /**
    * @brief Query whether the borderline of the visual requires to be rendered.
    *
index cc59ea708185c32c06cd4e7adede710d10675660..8ef02100425193dacbb42c3fe3d29844f9820613 100644 (file)
@@ -58,60 +58,86 @@ public:
   {
     COLOR_SHADER,
     COLOR_SHADER_ROUNDED_CORNER,
+    COLOR_SHADER_SQUIRCLE_CORNER,
     COLOR_SHADER_BORDERLINE,
     COLOR_SHADER_ROUNDED_BORDERLINE,
+    COLOR_SHADER_SQUIRCLE_BORDERLINE,
     COLOR_SHADER_BLUR_EDGE,
     COLOR_SHADER_ROUNDED_CORNER_BLUR_EDGE,
+    COLOR_SHADER_SQUIRCLE_CORNER_BLUR_EDGE,
     COLOR_SHADER_CUTOUT,
     COLOR_SHADER_CUTOUT_ROUNDED_CORNER,
+    COLOR_SHADER_CUTOUT_SQUIRCLE_CORNER,
     COLOR_SHADER_CUTOUT_BORDERLINE,
     COLOR_SHADER_CUTOUT_ROUNDED_BORDERLINE,
+    COLOR_SHADER_CUTOUT_SQUIRCLE_BORDERLINE,
     COLOR_SHADER_CUTOUT_BLUR_EDGE,
     COLOR_SHADER_CUTOUT_ROUNDED_CORNER_BLUR_EDGE,
+    COLOR_SHADER_CUTOUT_SQUIRCLE_CORNER_BLUR_EDGE,
     BORDER_SHADER,
     BORDER_SHADER_ANTI_ALIASING,
     GRADIENT_SHADER_LINEAR_BOUNDING_BOX,
     GRADIENT_SHADER_LINEAR_BOUNDING_BOX_ROUNDED_CORNER,
+    GRADIENT_SHADER_LINEAR_BOUNDING_BOX_SQUIRCLE_CORNER,
     GRADIENT_SHADER_LINEAR_BOUNDING_BOX_BORDERLINE,
     GRADIENT_SHADER_LINEAR_BOUNDING_BOX_ROUNDED_BORDERLINE,
+    GRADIENT_SHADER_LINEAR_BOUNDING_BOX_SQUIRCLE_BORDERLINE,
     GRADIENT_SHADER_LINEAR_USER_SPACE,
     GRADIENT_SHADER_LINEAR_USER_SPACE_ROUNDED_CORNER,
+    GRADIENT_SHADER_LINEAR_USER_SPACE_SQUIRCLE_CORNER,
     GRADIENT_SHADER_LINEAR_USER_SPACE_BORDERLINE,
     GRADIENT_SHADER_LINEAR_USER_SPACE_ROUNDED_BORDERLINE,
+    GRADIENT_SHADER_LINEAR_USER_SPACE_SQUIRCLE_BORDERLINE,
     GRADIENT_SHADER_RADIAL_BOUNDING_BOX,
     GRADIENT_SHADER_RADIAL_BOUNDING_BOX_ROUNDED_CORNER,
+    GRADIENT_SHADER_RADIAL_BOUNDING_BOX_SQUIRCLE_CORNER,
     GRADIENT_SHADER_RADIAL_BOUNDING_BOX_BORDERLINE,
     GRADIENT_SHADER_RADIAL_BOUNDING_BOX_ROUNDED_BORDERLINE,
+    GRADIENT_SHADER_RADIAL_BOUNDING_BOX_SQUIRCLE_BORDERLINE,
     GRADIENT_SHADER_RADIAL_USER_SPACE,
     GRADIENT_SHADER_RADIAL_USER_SPACE_ROUNDED_CORNER,
+    GRADIENT_SHADER_RADIAL_USER_SPACE_SQUIRCLE_CORNER,
     GRADIENT_SHADER_RADIAL_USER_SPACE_BORDERLINE,
     GRADIENT_SHADER_RADIAL_USER_SPACE_ROUNDED_BORDERLINE,
+    GRADIENT_SHADER_RADIAL_USER_SPACE_SQUIRCLE_BORDERLINE,
     IMAGE_SHADER,
     IMAGE_SHADER_ROUNDED_CORNER,
+    IMAGE_SHADER_SQUIRCLE_CORNER,
     IMAGE_SHADER_BORDERLINE,
     IMAGE_SHADER_ROUNDED_BORDERLINE,
+    IMAGE_SHADER_SQUIRCLE_BORDERLINE,
     IMAGE_SHADER_MASKING,
     IMAGE_SHADER_ROUNDED_CORNER_MASKING,
+    IMAGE_SHADER_SQUIRCLE_CORNER_MASKING,
     IMAGE_SHADER_BORDERLINE_MASKING,
     IMAGE_SHADER_ROUNDED_BORDERLINE_MASKING,
+    IMAGE_SHADER_SQUIRCLE_BORDERLINE_MASKING,
     IMAGE_SHADER_ATLAS_DEFAULT_WRAP,
     IMAGE_SHADER_ATLAS_CUSTOM_WRAP,
     IMAGE_SHADER_YUV_TO_RGB,
     IMAGE_SHADER_ROUNDED_CORNER_YUV_TO_RGB,
+    IMAGE_SHADER_SQUIRCLE_CORNER_YUV_TO_RGB,
     IMAGE_SHADER_BORDERLINE_YUV_TO_RGB,
     IMAGE_SHADER_ROUNDED_BORDERLINE_YUV_TO_RGB,
+    IMAGE_SHADER_SQUIRCLE_BORDERLINE_YUV_TO_RGB,
     IMAGE_SHADER_YUV_AND_RGB,
     IMAGE_SHADER_ROUNDED_CORNER_YUV_AND_RGB,
+    IMAGE_SHADER_SQUIRCLE_CORNER_YUV_AND_RGB,
     IMAGE_SHADER_BORDERLINE_YUV_AND_RGB,
     IMAGE_SHADER_ROUNDED_BORDERLINE_YUV_AND_RGB,
+    IMAGE_SHADER_SQUIRCLE_BORDERLINE_YUV_AND_RGB,
     NATIVE_IMAGE_SHADER,
     NATIVE_IMAGE_SHADER_ROUNDED_CORNER,
+    NATIVE_IMAGE_SHADER_SQUIRCLE_CORNER,
     NATIVE_IMAGE_SHADER_BORDERLINE,
     NATIVE_IMAGE_SHADER_ROUNDED_BORDERLINE,
+    NATIVE_IMAGE_SHADER_SQUIRCLE_BORDERLINE,
     NATIVE_IMAGE_SHADER_MASKING,
     NATIVE_IMAGE_SHADER_ROUNDED_CORNER_MASKING,
+    NATIVE_IMAGE_SHADER_SQUIRCLE_CORNER_MASKING,
     NATIVE_IMAGE_SHADER_BORDERLINE_MASKING,
     NATIVE_IMAGE_SHADER_ROUNDED_BORDERLINE_MASKING,
+    NATIVE_IMAGE_SHADER_SQUIRCLE_BORDERLINE_MASKING,
     NATIVE_IMAGE_SHADER_ATLAS_DEFAULT_WRAP,
     NATIVE_IMAGE_SHADER_ATLAS_CUSTOM_WRAP,
     NINE_PATCH_SHADER,
index ad0c4067533ef1d75eb9a62a628fca24ab41344b..59185503b4fde43ac2f7f2a0ce38eb0709c960df 100644 (file)
@@ -49,60 +49,86 @@ DALI_ENUM_TO_STRING_TABLE_END(VISUAL_TYPE)
 DALI_ENUM_TO_STRING_TABLE_BEGIN(VISUAL_SHADER_TYPE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_ROUNDED_CORNER)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_SQUIRCLE_CORNER)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_BORDERLINE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_ROUNDED_BORDERLINE)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_SQUIRCLE_BORDERLINE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_BLUR_EDGE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_ROUNDED_CORNER_BLUR_EDGE)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_SQUIRCLE_CORNER_BLUR_EDGE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_CUTOUT)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_CUTOUT_ROUNDED_CORNER)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_CUTOUT_SQUIRCLE_CORNER)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_CUTOUT_BORDERLINE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_CUTOUT_ROUNDED_BORDERLINE)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_CUTOUT_SQUIRCLE_BORDERLINE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_CUTOUT_BLUR_EDGE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_CUTOUT_ROUNDED_CORNER_BLUR_EDGE)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, COLOR_SHADER_CUTOUT_SQUIRCLE_CORNER_BLUR_EDGE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, BORDER_SHADER)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, BORDER_SHADER_ANTI_ALIASING)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_LINEAR_BOUNDING_BOX)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_LINEAR_BOUNDING_BOX_ROUNDED_CORNER)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_LINEAR_BOUNDING_BOX_SQUIRCLE_CORNER)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_LINEAR_BOUNDING_BOX_BORDERLINE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_LINEAR_BOUNDING_BOX_ROUNDED_BORDERLINE)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_LINEAR_BOUNDING_BOX_SQUIRCLE_BORDERLINE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_LINEAR_USER_SPACE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_LINEAR_USER_SPACE_ROUNDED_CORNER)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_LINEAR_USER_SPACE_SQUIRCLE_CORNER)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_LINEAR_USER_SPACE_BORDERLINE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_LINEAR_USER_SPACE_ROUNDED_BORDERLINE)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_LINEAR_USER_SPACE_SQUIRCLE_BORDERLINE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_RADIAL_BOUNDING_BOX)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_RADIAL_BOUNDING_BOX_ROUNDED_CORNER)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_RADIAL_BOUNDING_BOX_SQUIRCLE_CORNER)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_RADIAL_BOUNDING_BOX_BORDERLINE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_RADIAL_BOUNDING_BOX_ROUNDED_BORDERLINE)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_RADIAL_BOUNDING_BOX_SQUIRCLE_BORDERLINE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_RADIAL_USER_SPACE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_RADIAL_USER_SPACE_ROUNDED_CORNER)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_RADIAL_USER_SPACE_SQUIRCLE_CORNER)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_RADIAL_USER_SPACE_BORDERLINE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_RADIAL_USER_SPACE_ROUNDED_BORDERLINE)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, GRADIENT_SHADER_RADIAL_USER_SPACE_SQUIRCLE_BORDERLINE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_ROUNDED_CORNER)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_SQUIRCLE_CORNER)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_BORDERLINE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_ROUNDED_BORDERLINE)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_SQUIRCLE_BORDERLINE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_MASKING)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_ROUNDED_CORNER_MASKING)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_SQUIRCLE_CORNER_MASKING)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_BORDERLINE_MASKING)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_ROUNDED_BORDERLINE_MASKING)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_SQUIRCLE_BORDERLINE_MASKING)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_ATLAS_DEFAULT_WRAP)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_ATLAS_CUSTOM_WRAP)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_YUV_TO_RGB)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_ROUNDED_CORNER_YUV_TO_RGB)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_SQUIRCLE_CORNER_YUV_TO_RGB)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_BORDERLINE_YUV_TO_RGB)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_ROUNDED_BORDERLINE_YUV_TO_RGB)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_SQUIRCLE_BORDERLINE_YUV_TO_RGB)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_YUV_AND_RGB)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_ROUNDED_CORNER_YUV_AND_RGB)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_SQUIRCLE_CORNER_YUV_AND_RGB)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_BORDERLINE_YUV_AND_RGB)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_ROUNDED_BORDERLINE_YUV_AND_RGB)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, IMAGE_SHADER_SQUIRCLE_BORDERLINE_YUV_AND_RGB)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, NATIVE_IMAGE_SHADER)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, NATIVE_IMAGE_SHADER_ROUNDED_CORNER)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, NATIVE_IMAGE_SHADER_SQUIRCLE_CORNER)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, NATIVE_IMAGE_SHADER_BORDERLINE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, NATIVE_IMAGE_SHADER_ROUNDED_BORDERLINE)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, NATIVE_IMAGE_SHADER_SQUIRCLE_BORDERLINE)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, NATIVE_IMAGE_SHADER_MASKING)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, NATIVE_IMAGE_SHADER_ROUNDED_CORNER_MASKING)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, NATIVE_IMAGE_SHADER_SQUIRCLE_CORNER_MASKING)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, NATIVE_IMAGE_SHADER_BORDERLINE_MASKING)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, NATIVE_IMAGE_SHADER_ROUNDED_BORDERLINE_MASKING)
+  DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, NATIVE_IMAGE_SHADER_SQUIRCLE_BORDERLINE_MASKING)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, NATIVE_IMAGE_SHADER_ATLAS_DEFAULT_WRAP)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, NATIVE_IMAGE_SHADER_ATLAS_CUSTOM_WRAP)
   DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::Internal::VisualFactoryCache::ShaderType, NINE_PATCH_SHADER)
@@ -175,6 +201,7 @@ const char* const BORDERLINE_OFFSET("borderlineOffset");
 // Corner radius
 const char* const CORNER_RADIUS("cornerRadius");
 const char* const CORNER_RADIUS_POLICY("cornerRadiusPolicy");
+const char* const CORNER_SQUARENESS("cornerSquareness");
 
 // Color visual
 const char* const BLUR_RADIUS_NAME("blurRadius");
index 6aa50b8d8eb871a8a802a0b1bccaacef47d25c5c..936f741f702114df85f9f1e72d90a8a2621ccb3b 100644 (file)
@@ -71,6 +71,7 @@ extern const char* const BORDERLINE_OFFSET;
 // Corner radius
 extern const char* const CORNER_RADIUS;
 extern const char* const CORNER_RADIUS_POLICY;
+extern const char* const CORNER_SQUARENESS;
 
 // Color visual
 extern const char* const BLUR_RADIUS_NAME;
index fcf65500225d271732ccb0f272566e68186c933c..8890f3bbdb0216a59719de9723106b8a80e9d92b 100644 (file)
@@ -817,18 +817,21 @@ void Control::MakeVisualTransition(Dali::Property::Map& sourcePropertyMap, Dali:
   float   defaultBorderlineWidth(0.0f);
   Vector4 defaultBorderlineColor(0.0f, 0.0f, 0.0f, 1.0f);
   float   defaultBorderlineOffset(0.0f);
+  Vector4 defaultCornerSquareness(0.0f, 0.0f, 0.0f, 0.0f);
 
   Vector4 sourceMixColor         = findValueVector4(sourceMap, Dali::Toolkit::Visual::Property::MIX_COLOR, defaultMixColor);
   Vector4 sourceCornerRadius     = findValueVector4(sourceMap, Toolkit::DevelVisual::Property::CORNER_RADIUS, defaultCornerRadius);
   float   sourceBorderlineWidth  = findValueFloat(sourceMap, Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, defaultBorderlineWidth);
   Vector4 sourceBorderlineColor  = findValueVector4(sourceMap, Toolkit::DevelVisual::Property::BORDERLINE_COLOR, defaultBorderlineColor);
   float   sourceBorderlineOffset = findValueFloat(sourceMap, Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, defaultBorderlineOffset);
+  Vector4 sourceCornerSquareness = findValueVector4(sourceMap, Toolkit::DevelVisual::Property::CORNER_SQUARENESS, defaultCornerSquareness);
 
   Vector4 destinationMixColor         = findValueVector4(destinationMap, Dali::Toolkit::Visual::Property::MIX_COLOR, defaultMixColor);
   Vector4 destinationCornerRadius     = findValueVector4(destinationMap, Toolkit::DevelVisual::Property::CORNER_RADIUS, defaultCornerRadius);
   float   destinationBorderlineWidth  = findValueFloat(destinationMap, Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, defaultBorderlineWidth);
   Vector4 destinationBorderlineColor  = findValueVector4(destinationMap, Toolkit::DevelVisual::Property::BORDERLINE_COLOR, defaultBorderlineColor);
   float   destinationBorderlineOffset = findValueFloat(destinationMap, Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, defaultBorderlineOffset);
+  Vector4 destinationCornerSquareness = findValueVector4(destinationMap, Toolkit::DevelVisual::Property::CORNER_SQUARENESS, defaultCornerSquareness);
 
   // If the value of the source Control and that of destination Control is different, the property should be transitioned.
   if(sourceMixColor != destinationMixColor)
@@ -860,6 +863,12 @@ void Control::MakeVisualTransition(Dali::Property::Map& sourcePropertyMap, Dali:
     sourcePropertyMap.Add(Dali::Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, sourceBorderlineOffset);
     destinationPropertyMap.Add(Dali::Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, destinationBorderlineOffset);
   }
+
+  if(sourceCornerSquareness != destinationCornerSquareness)
+  {
+    sourcePropertyMap.Add(Dali::Toolkit::DevelVisual::Property::CORNER_SQUARENESS, sourceCornerSquareness);
+    destinationPropertyMap.Add(Dali::Toolkit::DevelVisual::Property::CORNER_SQUARENESS, destinationCornerSquareness);
+  }
 }
 
 Control& GetImplementation(Dali::Toolkit::Control& handle)