Corner Radius become Vector4 75/255275/14
authorEunki, Hong <eunkiki.hong@samsung.com>
Tue, 16 Mar 2021 07:16:57 +0000 (16:16 +0900)
committerseungho <sbsh.baek@samsung.com>
Tue, 13 Apr 2021 04:48:52 +0000 (13:48 +0900)
Now we can set corner radius to each corners

When radius is Vector4(x, y, z, w)
x    y
 +--+
 |  |
 +--+
w    z

NOTE) radius order reference : https://drafts.csswg.org/css-backgrounds-3/#border-radius

Change-Id: If0ee9427095d4aaad07d565256aa512ccd13f274
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
17 files changed:
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-Visual.cpp
dali-toolkit/devel-api/visuals/visual-properties-devel.h
dali-toolkit/internal/graphics/shaders/color-visual-blur-edge-shader.frag
dali-toolkit/internal/graphics/shaders/color-visual-blur-edge-shader.vert
dali-toolkit/internal/graphics/shaders/color-visual-rounded-corner-shader.frag
dali-toolkit/internal/graphics/shaders/color-visual-rounded-corner-shader.vert
dali-toolkit/internal/graphics/shaders/gradient-visual-bounding-box-rounded-corner-shader.vert
dali-toolkit/internal/graphics/shaders/gradient-visual-linear-rounded-corner-shader.frag
dali-toolkit/internal/graphics/shaders/gradient-visual-radial-rounded-corner-shader.frag
dali-toolkit/internal/graphics/shaders/gradient-visual-user-space-rounded-corner-shader.vert
dali-toolkit/internal/graphics/shaders/image-visual-rounded-corner-shader.frag
dali-toolkit/internal/graphics/shaders/image-visual-rounded-corner-shader.vert
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

index c77b4ac..6d74b7c 100644 (file)
@@ -90,9 +90,9 @@ int UtcDaliAnimatedImageVisualGetPropertyMap01(void)
   DALI_TEST_CHECK( value );
   DALI_TEST_CHECK( value->Get<std::string>() == TEST_GIF_FILE_NAME );
 
-  value = resultMap.Find( DevelVisual::Property::CORNER_RADIUS, Property::FLOAT );
+  value = resultMap.Find( DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4 );
   DALI_TEST_CHECK( value );
-  DALI_TEST_EQUALS( value->Get<float>(), 22.2f, TEST_LOCATION );
+  DALI_TEST_EQUALS( value->Get<Vector4>(), Vector4(22.2f, 22.2f, 22.2f, 22.2f), TEST_LOCATION );
 
   value = resultMap.Find( Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, Property::INTEGER );
   DALI_TEST_CHECK( value );
@@ -136,7 +136,7 @@ int UtcDaliAnimatedImageVisualGetPropertyMap02(void)
     .Add( "pixelArea", Vector4() )
     .Add( "wrapModeU", WrapMode::REPEAT )
     .Add( "wrapModeV", WrapMode::DEFAULT )
-    .Add( "cornerRadius", 50.0f )
+    .Add( "cornerRadius", Vector4(50.0f, 25.0f, 12.5f, 33.0f) )
     .Add( "cornerRadiusPolicy", Visual::Transform::Policy::RELATIVE ));
 
   Property::Map resultMap;
@@ -174,7 +174,7 @@ int UtcDaliAnimatedImageVisualGetPropertyMap02(void)
 
   value = resultMap.Find( Toolkit::DevelVisual::Property::CORNER_RADIUS, "cornerRadius" );
   DALI_TEST_CHECK( value );
-  DALI_TEST_EQUALS( value->Get<float>(), 50.0f, TEST_LOCATION );
+  DALI_TEST_EQUALS( value->Get<Vector4>(), Vector4(50.0f, 25.0f, 12.5f, 33.0f), TEST_LOCATION );
 
   value = resultMap.Find( Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, "cornerRadiusPolicy" );
   DALI_TEST_CHECK( value );
@@ -242,7 +242,7 @@ int UtcDaliAnimatedImageVisualGetPropertyMap03(void)
 
   value = resultMap.Find( Toolkit::DevelVisual::Property::CORNER_RADIUS, "cornerRadius" );
   DALI_TEST_CHECK( value );
-  DALI_TEST_EQUALS( value->Get<float>(), 50.5f, TEST_LOCATION );
+  DALI_TEST_EQUALS( value->Get<Vector4>(), Vector4(50.5f, 50.5f, 50.5f, 50.5f), TEST_LOCATION );
 
   value = resultMap.Find( Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, "cornerRadiusPolicy" );
   DALI_TEST_CHECK( value );
index b692ebb..dfd0b72 100644 (file)
@@ -172,7 +172,7 @@ int UtcDaliVisualFactoryGetAnimatedVectorImageVisual04(void)
   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual04: Request animated vector image visual with a Property::Map" );
 
   int startFrame = 1, endFrame = 3;
-  float cornerRadius = 50.0f;
+  float cornerRadius = 22.0f;
   Property::Array playRange;
   playRange.PushBack( startFrame );
   playRange.PushBack( endFrame );
@@ -241,9 +241,9 @@ int UtcDaliVisualFactoryGetAnimatedVectorImageVisual04(void)
   DALI_TEST_CHECK( value );
   DALI_TEST_CHECK( value->Get< bool >() == false );
 
-  value = resultMap.Find( DevelVisual::Property::CORNER_RADIUS, Property::FLOAT );
+  value = resultMap.Find( DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4 );
   DALI_TEST_CHECK( value );
-  DALI_TEST_EQUALS( value->Get< float >(), cornerRadius, TEST_LOCATION );
+  DALI_TEST_EQUALS( value->Get< Vector4 >(), Vector4(cornerRadius, cornerRadius, cornerRadius, cornerRadius), TEST_LOCATION );
 
   value = resultMap.Find( DevelVisual::Property::CORNER_RADIUS_POLICY, "cornerRadiusPolicy" );
   DALI_TEST_CHECK( value );
@@ -261,7 +261,7 @@ int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void)
   tet_infoline( "UtcDaliAnimatedVectorImageVisualGetPropertyMap01" );
 
   int startFrame = 1, endFrame = 3;
-  float cornerRadius = 50.0f;
+  Vector4 cornerRadius(50.0f, 22.0f, 0.0f, 3.0f);
   Property::Array playRange;
   playRange.PushBack( startFrame );
   playRange.PushBack( endFrame );
@@ -332,9 +332,9 @@ int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void)
   DALI_TEST_CHECK( value );
   DALI_TEST_CHECK( value->Get< bool >() == true );    // Check default value
 
-  value = resultMap.Find( DevelVisual::Property::CORNER_RADIUS, Property::FLOAT );
+  value = resultMap.Find( DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4 );
   DALI_TEST_CHECK( value );
-  DALI_TEST_EQUALS( value->Get< float >(), cornerRadius, TEST_LOCATION );
+  DALI_TEST_EQUALS( value->Get< Vector4 >(), cornerRadius, TEST_LOCATION );
 
   value = resultMap.Find( DevelVisual::Property::CORNER_RADIUS_POLICY, "cornerRadiusPolicy" );
   DALI_TEST_CHECK( value );
index a9a2ed2..127a611 100644 (file)
@@ -516,9 +516,9 @@ int UtcDaliVisualGetPropertyMap1(void)
   DALI_TEST_CHECK( colorValue );
   DALI_TEST_CHECK( colorValue->Get<Vector4>() == Color::BLUE );
 
-  Property::Value* cornerRadiusValue = resultMap.Find( DevelVisual::Property::CORNER_RADIUS, Property::FLOAT );
+  Property::Value* cornerRadiusValue = resultMap.Find( DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4 );
   DALI_TEST_CHECK( cornerRadiusValue );
-  DALI_TEST_CHECK( cornerRadiusValue->Get< float >() == 10.0f );
+  DALI_TEST_CHECK( cornerRadiusValue->Get< Vector4 >() == Vector4(10.0f, 10.0f, 10.0f, 10.0f) );
 
   Property::Value* cornerRadiusPolicyValue = resultMap.Find( DevelVisual::Property::CORNER_RADIUS_POLICY, Property::INTEGER );
   DALI_TEST_CHECK( cornerRadiusPolicyValue );
@@ -3665,7 +3665,7 @@ int UtcDaliVisualRoundedCorner(void)
 
   static std::vector<UniformData> customUniforms =
   {
-    UniformData("cornerRadius", Property::Type::FLOAT),
+    UniformData("cornerRadius", Property::Type::VECTOR4),
     UniformData("cornerRadiusPolicy", Property::Type::FLOAT),
   };
 
@@ -3701,7 +3701,7 @@ int UtcDaliVisualRoundedCorner(void)
     application.SendNotification();
     application.Render();
 
-    DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
+    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 );
   }
@@ -3734,7 +3734,7 @@ int UtcDaliVisualRoundedCorner(void)
     application.SendNotification();
     application.Render();
 
-    DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
+    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 );
   }
 
@@ -3742,7 +3742,7 @@ int UtcDaliVisualRoundedCorner(void)
   {
     VisualFactory factory = VisualFactory::Get();
     Property::Map properties;
-    float cornerRadius = 0.5f;
+    Vector4 cornerRadius(0.5f, 0.5f, 0.5f, 0.3f);
 
     properties[Visual::Property::TYPE] = Visual::COLOR;
     properties[ColorVisual::Property::MIX_COLOR] = Color::BLUE;
@@ -3766,7 +3766,7 @@ int UtcDaliVisualRoundedCorner(void)
     application.SendNotification();
     application.Render();
 
-    DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
+    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 );
   }
 
@@ -3774,7 +3774,7 @@ int UtcDaliVisualRoundedCorner(void)
   {
     VisualFactory factory = VisualFactory::Get();
     Property::Map properties;
-    float cornerRadius = 30.0f;
+    Vector4 cornerRadius(30.0f, 30.0f, 30.0f, 20.0f);
 
     properties[Visual::Property::TYPE] = Visual::COLOR;
     properties[ColorVisual::Property::MIX_COLOR] = Color::BLUE;
@@ -3798,7 +3798,7 @@ int UtcDaliVisualRoundedCorner(void)
     application.SendNotification();
     application.Render();
 
-    DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
+    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 );
   }
@@ -3845,7 +3845,7 @@ int UtcDaliVisualRoundedCorner(void)
     application.SendNotification();
     application.Render();
 
-    DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
+    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 );
   }
@@ -3854,11 +3854,11 @@ int UtcDaliVisualRoundedCorner(void)
   {
     VisualFactory factory = VisualFactory::Get();
     Property::Map properties;
-    float cornerRadius = 24.0f;
+    Vector4 cornerRadius(24.0f, 23.0f, 22.0f, 21.0f);
 
     properties[Visual::Property::TYPE] = Visual::ANIMATED_IMAGE;
     properties[ImageVisual::Property::URL] = TEST_GIF_FILE_NAME;
-    properties[DevelVisual::Property::CORNER_RADIUS] = cornerRadius + 10.0f; // Dummy Input
+    properties[DevelVisual::Property::CORNER_RADIUS] = cornerRadius.x + 10.0f; // Dummy Input
     properties[DevelVisual::Property::CORNER_RADIUS] = cornerRadius;
     properties["cornerRadiusPolicy"] = Toolkit::Visual::Transform::Policy::ABSOLUTE;
 
@@ -3881,7 +3881,7 @@ int UtcDaliVisualRoundedCorner(void)
     application.SendNotification();
     application.Render();
 
-    DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
+    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 );
   }
 
@@ -3889,7 +3889,7 @@ int UtcDaliVisualRoundedCorner(void)
   {
     VisualFactory factory = VisualFactory::Get();
     Property::Map properties;
-    float cornerRadius = 27.0f;
+    Vector4 cornerRadius(27.0f, 72.0f, 11.0f, 500.5f);
 
     properties[Visual::Property::TYPE] = Visual::SVG;
     properties[ImageVisual::Property::URL] = TEST_SVG_FILE_NAME;
@@ -3914,7 +3914,7 @@ int UtcDaliVisualRoundedCorner(void)
     application.SendNotification();
     application.Render();
 
-    DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
+    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 );
   }
@@ -3927,6 +3927,7 @@ int UtcDaliVisualRoundedCorner(void)
 
     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;
 
@@ -3949,7 +3950,7 @@ int UtcDaliVisualRoundedCorner(void)
     application.SendNotification();
     application.Render();
 
-    DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
+    DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< Vector4 >( "cornerRadius", Vector4(cornerRadius, cornerRadius, cornerRadius, cornerRadius) ), true, TEST_LOCATION );
     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadiusPolicy", Toolkit::Visual::Transform::Policy::RELATIVE ), true, TEST_LOCATION );
   }
 #else
@@ -4148,7 +4149,7 @@ int UtcDaliVisualGetVisualProperty01(void)
     UniformData("mixColor", Property::Type::VECTOR3),
     UniformData("offset", Property::Type::VECTOR2),
     UniformData("size", Property::Type::VECTOR2),
-    UniformData("cornerRadius", Property::Type::FLOAT),
+    UniformData("cornerRadius", Property::Type::VECTOR4),
     UniformData("blurRadius", Property::Type::FLOAT),
   };
 
@@ -4159,7 +4160,7 @@ int UtcDaliVisualGetVisualProperty01(void)
   Property::Map propertyMap;
   propertyMap.Insert(Visual::Property::TYPE, Visual::COLOR);
   propertyMap.Insert(Visual::Property::MIX_COLOR, Color::BLUE);
-  propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS, 10.0f);
+  propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS, Vector4(10.0f, 0.0f, 2.0f, 4.0f));
   propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS_POLICY, Toolkit::Visual::Transform::Policy::RELATIVE);
   propertyMap.Insert(DevelColorVisual::Property::BLUR_RADIUS, 20.0f);
   Visual::Base colorVisual = factory.CreateVisual(propertyMap);
@@ -4177,7 +4178,7 @@ int UtcDaliVisualGetVisualProperty01(void)
   Vector2 targetOffset(0.05f, 0.05f);
   Vector2 targetSize(1.1f, 1.1f);
   float targetOpacity = 0.5f;
-  float targetCornerRadius = 20.0f;
+  Vector4 targetCornerRadius(0.0f, 0.0f, 0.0f, 0.0f);
   float targetBlurRadius = 10.0f;
 
   Animation animation = Animation::New(1.0f);
@@ -4213,9 +4214,9 @@ int UtcDaliVisualGetVisualProperty01(void)
   DALI_TEST_CHECK(sizeValue);
   DALI_TEST_EQUALS(sizeValue->Get<Vector2>(), targetSize, TEST_LOCATION);
 
-  Property::Value* cornerRadiusValue = resultMap.Find(DevelVisual::Property::CORNER_RADIUS, Property::FLOAT);
+  Property::Value* cornerRadiusValue = resultMap.Find(DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4);
   DALI_TEST_CHECK(cornerRadiusValue);
-  DALI_TEST_EQUALS(cornerRadiusValue->Get< float >(), targetCornerRadius, TEST_LOCATION);
+  DALI_TEST_EQUALS(cornerRadiusValue->Get< Vector4 >(), targetCornerRadius, TEST_LOCATION);
 
   Property::Value* blurRadiusValue = resultMap.Find(DevelColorVisual::Property::BLUR_RADIUS, Property::FLOAT);
   DALI_TEST_CHECK(blurRadiusValue);
@@ -4225,7 +4226,7 @@ int UtcDaliVisualGetVisualProperty01(void)
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector3>("mixColor", targetColor), true, TEST_LOCATION);
   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<float>("cornerRadius", targetCornerRadius), 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);
 
   // Test not-supported property
@@ -4248,7 +4249,6 @@ int UtcDaliVisualGetVisualProperty01(void)
 
 int UtcDaliVisualGetVisualProperty02(void)
 {
-#ifdef OLD_GRAPHICS_TEST
   ToolkitTestApplication application;
   tet_infoline( "UtcDaliVisualGetVisualProperty02: Test animatable property" );
 
@@ -4257,7 +4257,7 @@ int UtcDaliVisualGetVisualProperty02(void)
     UniformData("mixColor", Property::Type::VECTOR3),
     UniformData("offset", Property::Type::VECTOR2),
     UniformData("size", Property::Type::VECTOR2),
-    UniformData("cornerRadius", Property::Type::FLOAT),
+    UniformData("cornerRadius", Property::Type::VECTOR4),
     UniformData("blurRadius", Property::Type::FLOAT),
   };
 
@@ -4282,7 +4282,7 @@ int UtcDaliVisualGetVisualProperty02(void)
   Vector2 targetOffset(0.05f, 0.05f);
   Vector2 targetSize(1.1f, 1.1f);
   float targetOpacity = 0.5f;
-  float targetCornerRadius = 20.0f;
+  Vector4 targetCornerRadius(20.0f, 0.0f, 20.0f, 0.0f);
   float targetBlurRadius = 10.0f;
 
   // Should work when the properties are not set before
@@ -4319,22 +4319,21 @@ int UtcDaliVisualGetVisualProperty02(void)
   DALI_TEST_CHECK(sizeValue);
   DALI_TEST_EQUALS(sizeValue->Get<Vector2>(), targetSize, TEST_LOCATION);
 
-  Property::Value* cornerRadiusValue = resultMap.Find(DevelVisual::Property::CORNER_RADIUS, Property::FLOAT);
+  Property::Value* cornerRadiusValue = resultMap.Find(DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4);
   DALI_TEST_CHECK(cornerRadiusValue);
-  DALI_TEST_EQUALS(cornerRadiusValue->Get< float >(), targetCornerRadius, TEST_LOCATION);
+  DALI_TEST_EQUALS(cornerRadiusValue->Get< Vector4 >(), targetCornerRadius, TEST_LOCATION);
 
   Property::Value* blurRadiusValue = resultMap.Find(DevelColorVisual::Property::BLUR_RADIUS, Property::FLOAT);
   DALI_TEST_CHECK(blurRadiusValue);
   DALI_TEST_EQUALS(blurRadiusValue->Get< float >(), targetBlurRadius, TEST_LOCATION);
 
+#ifdef OLD_GRAPHICS_TEST
   // Test uniform values
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector3>("mixColor", targetColor), true, TEST_LOCATION);
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector2>("offset", targetOffset), true, TEST_LOCATION);
   DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector2>("size", targetSize), true, TEST_LOCATION);
-  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<float>("cornerRadius", targetCornerRadius), 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);
-#else
-  tet_result(TET_PASS);
 #endif
 
   END_TEST;
@@ -4348,7 +4347,7 @@ int UtcDaliVisualGetVisualProperty03(void)
 
   static std::vector<UniformData> customUniforms =
   {
-    UniformData("cornerRadius", Property::Type::FLOAT),
+    UniformData("cornerRadius", Property::Type::VECTOR4),
   };
 
   TestGraphicsController& graphics = application.GetGraphicsController();
@@ -4373,7 +4372,7 @@ int UtcDaliVisualGetVisualProperty03(void)
   application.Render();
 
   float targetOpacity = 0.5f;
-  float targetCornerRadius = 20.0f;
+  Vector4 targetCornerRadius(20.0f, 20.0f, 0.0f, 0.0f);
 
   Animation animation = Animation::New(1.0f);
   animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, Visual::Property::OPACITY), targetOpacity);
@@ -4392,12 +4391,12 @@ int UtcDaliVisualGetVisualProperty03(void)
   DALI_TEST_CHECK(colorValue);
   DALI_TEST_EQUALS(colorValue->Get<Vector4>(), Vector4(1.0f, 1.0f, 1.0f, targetOpacity), TEST_LOCATION);
 
-  Property::Value* cornerRadiusValue = resultMap.Find(DevelVisual::Property::CORNER_RADIUS, Property::FLOAT);
+  Property::Value* cornerRadiusValue = resultMap.Find(DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4);
   DALI_TEST_CHECK(cornerRadiusValue);
-  DALI_TEST_EQUALS(cornerRadiusValue->Get< float >(), targetCornerRadius, TEST_LOCATION);
+  DALI_TEST_EQUALS(cornerRadiusValue->Get< Vector4 >(), targetCornerRadius, TEST_LOCATION);
 
   // Test uniform value
-  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<float>("cornerRadius", targetCornerRadius), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerRadius", targetCornerRadius), true, TEST_LOCATION);
 #else
   tet_result(TET_PASS);
 #endif
@@ -4413,7 +4412,7 @@ int UtcDaliVisualGetVisualProperty04(void)
 
   static std::vector<UniformData> customUniforms =
   {
-    UniformData("cornerRadius", Property::Type::FLOAT),
+    UniformData("cornerRadius", Property::Type::VECTOR4),
   };
 
   TestGraphicsController& graphics = application.GetGraphicsController();
@@ -4445,7 +4444,7 @@ int UtcDaliVisualGetVisualProperty04(void)
   application.Render();
 
   float targetOpacity = 0.5f;
-  float targetCornerRadius = 20.0f;
+  Vector4 targetCornerRadius(20.0f, 30.0f, 10.0f, 20.0f);
 
   Animation animation = Animation::New(1.0f);
   animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, Visual::Property::OPACITY), targetOpacity);
@@ -4464,12 +4463,12 @@ int UtcDaliVisualGetVisualProperty04(void)
   DALI_TEST_CHECK(colorValue);
   DALI_TEST_EQUALS(colorValue->Get<Vector4>(), Vector4(1.0f, 1.0f, 1.0f, targetOpacity), TEST_LOCATION);
 
-  Property::Value* cornerRadiusValue = resultMap.Find(DevelVisual::Property::CORNER_RADIUS, Property::FLOAT);
+  Property::Value* cornerRadiusValue = resultMap.Find(DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4);
   DALI_TEST_CHECK(cornerRadiusValue);
-  DALI_TEST_EQUALS(cornerRadiusValue->Get< float >(), targetCornerRadius, TEST_LOCATION);
+  DALI_TEST_EQUALS(cornerRadiusValue->Get< Vector4 >(), targetCornerRadius, TEST_LOCATION);
 
   // Test uniform value
-  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<float>("cornerRadius", targetCornerRadius), true, TEST_LOCATION);
+  DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue<Vector4>("cornerRadius", targetCornerRadius), true, TEST_LOCATION);
 #else
   tet_result(TET_PASS);
 #endif
index 6a5f51d..1098b7d 100644 (file)
@@ -73,8 +73,16 @@ enum Type
 
   /**
    * @brief The radius for the rounded corners of the visual
-   * @details Name "cornerRadius", type Property::FLOAT, animatable
-   * @note Optional.
+   * @details Name "cornerRadius", type Property::FLOAT or Prooperty::VECTOR4, animatable
+   * @note By default, it is Vector::ZERO.
+   * @note Only Property::Vector4 can be animated.
+   * @note Radius value are used in clockwise order from top-left-corner to bottom-left-corner.
+   *       When radius is Vector4(x, y, z, w)
+   *       x    y
+   *        +--+
+   *        |  |
+   *        +--+
+   *       w    z
    */
   CORNER_RADIUS = OPACITY + 2,
 
index df817b2..a3bb80a 100644 (file)
@@ -1,6 +1,7 @@
 INPUT mediump vec2 vPosition;
 INPUT mediump vec2 vRectSize;
-INPUT mediump float vCornerRadius;
+INPUT mediump vec2 vOptRectSize;
+INPUT mediump vec4 vCornerRadius;
 
 uniform lowp vec4 uColor;
 uniform lowp vec3 mixColor;
@@ -9,20 +10,31 @@ uniform mediump float blurRadius;
 void main()
 {
   OUT_COLOR = vec4(mixColor, 1.0) * uColor;
+  if(abs(vPosition.x) < vOptRectSize.x && abs(vPosition.y) < vOptRectSize.y)
+  {
+    return;
+  }
+
+  mediump float radius =
+  mix(
+    mix(vCornerRadius.x, vCornerRadius.y, sign(vPosition.x) * 0.5 + 0.5),
+    mix(vCornerRadius.w, vCornerRadius.z, sign(vPosition.x) * 0.5 + 0.5),
+    sign(vPosition.y) * 0.5 + 0.5
+  );
 
-  mediump vec2 v = abs(vPosition) - vRectSize;
-  mediump float cy = vCornerRadius + blurRadius;
-  mediump float cr = vCornerRadius + blurRadius;
+  mediump vec2 v = abs(vPosition) - vRectSize + radius;
+  mediump float cy = radius + blurRadius;
+  mediump float cr = radius + blurRadius;
 
-  cy = min(cy, min(vRectSize.x, vRectSize.y));
+  cy = min(cy, min(vRectSize.x, vRectSize.y) - radius);
   v = vec2(min(v.x, v.y), max(v.x, v.y));
   v = v + cy;
 
   mediump float blur = 1.0;
   mediump float potential = 0.0;
-  mediump float alias = min(vCornerRadius, 1.0);
-  mediump float potentialMin = cy + vCornerRadius - blurRadius - alias;
-  mediump float potentialMax = cy + vCornerRadius + blurRadius + alias;
+  mediump float alias = min(radius, 1.0);
+  mediump float potentialMin = cy + radius - blurRadius - alias;
+  mediump float potentialMax = cy + radius + blurRadius + alias;
 
   // move center of circles for reduce defact
   mediump float cyDiff = min(cy, 0.2 * blurRadius);
index e20110b..5306aef 100644 (file)
@@ -1,7 +1,8 @@
 INPUT mediump vec2 aPosition;
 OUTPUT mediump vec2 vPosition;
 OUTPUT mediump vec2 vRectSize;
-OUTPUT mediump float vCornerRadius;
+OUTPUT mediump vec2 vOptRectSize;
+OUTPUT mediump vec4 vCornerRadius;
 
 uniform highp mat4 uMvpMatrix;
 uniform highp vec3 uSize;
@@ -14,7 +15,7 @@ uniform mediump vec4 offsetSizeMode;
 uniform mediump vec2 origin;
 uniform mediump vec2 anchorPoint;
 uniform mediump float blurRadius;
-uniform mediump float cornerRadius;
+uniform mediump vec4 cornerRadius;
 uniform mediump float cornerRadiusPolicy;
 
 vec4 ComputeVertexPosition()
@@ -24,7 +25,11 @@ vec4 ComputeVertexPosition()
   mediump float minSize = min( visualSize.x, visualSize.y );
   vCornerRadius = mix( cornerRadius * minSize, cornerRadius, cornerRadiusPolicy );
   vCornerRadius = min( vCornerRadius, minSize * 0.5 );
-  vRectSize = visualSize / 2.0 - vec2( vCornerRadius );
+  vRectSize = visualSize / 2.0;
+  // optimize fragment shader
+  mediump float maxRadius = max(max(vCornerRadius.x, vCornerRadius.y), max(vCornerRadius.z, vCornerRadius.w));
+  vOptRectSize = vRectSize - 0.2929 * maxRadius - 1.0 - blurRadius;
+
   vPosition = aPosition * (visualSize + 2.0 * blurRadius);
   return vec4( vPosition + anchorPoint*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );
 }
index 4654ab4..811dc1d 100644 (file)
@@ -1,6 +1,7 @@
 INPUT mediump vec2 vPosition;
 INPUT mediump vec2 vRectSize;
-INPUT mediump float vCornerRadius;
+INPUT mediump vec2 vOptRectSize;
+INPUT mediump vec4 vCornerRadius;
 
 uniform lowp vec4 uColor;
 uniform lowp vec3 mixColor;
@@ -8,18 +9,29 @@ uniform lowp vec3 mixColor;
 void main()
 {
   OUT_COLOR = vec4(mixColor, 1.0) * uColor;
-  mediump vec2 diff = abs( vPosition ) - vRectSize;
-  mediump float dist = length( max( diff, vec2( 0.0 ) ) ) - vCornerRadius;
-  if( dist > 1.0 )
+  if(abs(vPosition.x) < vOptRectSize.x && abs(vPosition.y) < vOptRectSize.y)
+  {
+    return;
+  }
+  mediump float radius =
+  mix(
+    mix(vCornerRadius.x, vCornerRadius.y, sign(vPosition.x) * 0.5 + 0.5),
+    mix(vCornerRadius.w, vCornerRadius.z, sign(vPosition.x) * 0.5 + 0.5),
+    sign(vPosition.y) * 0.5 + 0.5
+  );
+
+  mediump vec2 diff = abs(vPosition) - vRectSize + radius;
+  mediump float dist = length(max(diff, vec2(0.0))) - radius;
+  if(dist > 1.0)
   {
     OUT_COLOR.a = 0.0;
   }
-  else if( dist > -1.0 )
+  else if(dist > -1.0)
   {
-    if( min( diff.x, diff.y ) < 0.0)
+    if(min(diff.x, diff.y) < 0.0)
     {
-      dist += min( diff.x, diff.y ) / vCornerRadius;
+      dist += min(diff.x, diff.y) / max(radius, 1.0);
     }
-    OUT_COLOR.a *= 1.0 - smoothstep( -1.0, 1.0, dist );
+    OUT_COLOR.a *= 1.0 - smoothstep(-1.0, 1.0, dist);
   }
 }
index 33216e5..0a6a257 100644 (file)
@@ -1,7 +1,8 @@
 INPUT mediump vec2 aPosition;
 OUTPUT mediump vec2 vPosition;
 OUTPUT mediump vec2 vRectSize;
-OUTPUT mediump float vCornerRadius;
+OUTPUT mediump vec2 vOptRectSize;
+OUTPUT mediump vec4 vCornerRadius;
 
 uniform highp mat4 uMvpMatrix;
 uniform highp vec3 uSize;
@@ -13,7 +14,7 @@ uniform mediump vec2 extraSize;
 uniform mediump vec4 offsetSizeMode;
 uniform mediump vec2 origin;
 uniform mediump vec2 anchorPoint;
-uniform mediump float cornerRadius;
+uniform mediump vec4 cornerRadius;
 uniform mediump float cornerRadiusPolicy;
 
 vec4 ComputeVertexPosition()
@@ -23,8 +24,10 @@ vec4 ComputeVertexPosition()
   mediump float minSize = min( visualSize.x, visualSize.y );
   vCornerRadius = mix( cornerRadius * minSize, cornerRadius, cornerRadiusPolicy);
   vCornerRadius = min( vCornerRadius, minSize * 0.5 );
-  vRectSize = visualSize / 2.0 - vCornerRadius;
-  vCornerRadius = max( vCornerRadius, 1.0 );
+  vRectSize = visualSize / 2.0;
+  // optimize fragment shader
+  mediump float maxRadius = max(max(vCornerRadius.x, vCornerRadius.y), max(vCornerRadius.z, vCornerRadius.w));
+  vOptRectSize = vRectSize - 0.2929 * maxRadius - 1.0;
   vPosition = aPosition* visualSize;
   return vec4( vPosition + anchorPoint*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );
 }
index 144fa81..bd08a63 100644 (file)
@@ -5,7 +5,8 @@ uniform mediump mat3 uAlignmentMatrix;
 varying mediump vec2 vTexCoord;
 varying mediump vec2 vPosition;
 varying mediump vec2 vRectSize;
-varying mediump float vCornerRadius;
+varying mediump vec2 vOptRectSize;
+varying mediump vec4 vCornerRadius;
 
 //Visual size and offset
 uniform mediump vec2 offset;
@@ -13,20 +14,22 @@ uniform highp vec2 size;
 uniform mediump vec4 offsetSizeMode;
 uniform mediump vec2 origin;
 uniform mediump vec2 anchorPoint;
-uniform mediump float cornerRadius;
+uniform mediump vec4 cornerRadius;
 uniform mediump float cornerRadiusPolicy;
 
 vec4 ComputeVertexPosition()
 {
-  vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw );
-  vec2 visualOffset = mix( offset, offset/uSize.xy, offsetSizeMode.xy);
-  mediump float minSize = min( visualSize.x, visualSize.y );
-  vCornerRadius = mix( cornerRadius * minSize, cornerRadius, cornerRadiusPolicy);
-  vCornerRadius = min( vCornerRadius, minSize * 0.5 );
-  vRectSize = visualSize * 0.5 - vCornerRadius;
-  vCornerRadius = max( vCornerRadius, 1.0 );
+  vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw);
+  vec2 visualOffset = mix(offset, offset/uSize.xy, offsetSizeMode.xy);
+  mediump float minSize = min(visualSize.x, visualSize.y);
+  vCornerRadius = mix(cornerRadius * minSize, cornerRadius, cornerRadiusPolicy);
+  vCornerRadius = min(vCornerRadius, minSize * 0.5);
+  vRectSize = visualSize * 0.5;
+  // Optimize fragment shader
+  mediump float maxRadius = max(max(vCornerRadius.x, vCornerRadius.y), max(vCornerRadius.z, vCornerRadius.w));
+  vOptRectSize = vRectSize - 0.2929 * maxRadius - 1.0;
   vPosition = aPosition * visualSize;
-  return vec4( (aPosition + anchorPoint)*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );
+  return vec4((aPosition + anchorPoint)*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0);
 }
 
 void main()
index 548367c..1b29ae0 100644 (file)
@@ -4,23 +4,35 @@ uniform lowp vec3 mixColor;
 varying mediump vec2 vTexCoord;
 varying mediump vec2 vPosition;
 varying mediump vec2 vRectSize;
-varying mediump float vCornerRadius;
+varying mediump vec2 vOptRectSize;
+varying mediump vec4 vCornerRadius;
 
 void main()
 {
   gl_FragColor = texture2D( sTexture, vec2( vTexCoord.y, 0.5 ) ) * vec4(mixColor, 1.0) * uColor;
-  mediump vec2 diff = abs( vPosition ) - vRectSize;
-  mediump float dist = length( max( diff, vec2( 0.0 ) ) ) - vCornerRadius;
-  if( dist > 1.0 )
+  if(abs(vPosition.x) < vOptRectSize.x && abs(vPosition.y) < vOptRectSize.y)
   {
-    gl_FragColor = vec4( 0.0 );
+    return;
   }
-  else if( dist > -1.0 )
+  mediump float radius =
+  mix(
+    mix(vCornerRadius.x, vCornerRadius.y, sign(vPosition.x) * 0.5 + 0.5),
+    mix(vCornerRadius.w, vCornerRadius.z, sign(vPosition.x) * 0.5 + 0.5),
+    sign(vPosition.y) * 0.5 + 0.5
+  );
+
+  mediump vec2 diff = abs(vPosition) - vRectSize + radius;
+  mediump float dist = length(max(diff, vec2(0.0))) - radius;
+  if(dist > 1.0)
+  {
+    gl_FragColor = vec4(0.0);
+  }
+  else if(dist > -1.0)
   {
-    if( min( diff.x, diff.y ) < 0.0 )
+    if(min(diff.x, diff.y) < 0.0)
     {
-      dist += min( diff.x, diff.y ) / vCornerRadius;
+      dist += min(diff.x, diff.y) / max(radius, 1.0);
     }
-    gl_FragColor *= 1.0 - smoothstep( -1.0, 1.0, dist );
+    gl_FragColor *= 1.0 - smoothstep(-1.0, 1.0, dist);
   }
 }
index 10bf0fe..68df0c5 100644 (file)
@@ -4,23 +4,35 @@ uniform lowp vec3 mixColor;
 varying mediump vec2 vTexCoord;
 varying mediump vec2 vPosition;
 varying mediump vec2 vRectSize;
-varying mediump float vCornerRadius;
+varying mediump vec2 vOptRectSize;
+varying mediump vec4 vCornerRadius;
 
 void main()
 {
   gl_FragColor = texture2D( sTexture, vec2( length(vTexCoord), 0.5 ) ) * vec4(mixColor, 1.0) * uColor;
-  mediump vec2 diff = abs( vPosition ) - vRectSize;
-  mediump float dist = length( max( diff, vec2( 0.0 ) ) ) - vCornerRadius;
-  if( dist > 1.0 )
+  if(abs(vPosition.x) < vOptRectSize.x && abs(vPosition.y) < vOptRectSize.y)
   {
-    gl_FragColor = vec4( 0.0 );
+    return;
   }
-  else if( dist > -1.0 )
+  mediump float radius =
+  mix(
+    mix(vCornerRadius.x, vCornerRadius.y, sign(vPosition.x) * 0.5 + 0.5),
+    mix(vCornerRadius.w, vCornerRadius.z, sign(vPosition.x) * 0.5 + 0.5),
+    sign(vPosition.y) * 0.5 + 0.5
+  );
+
+  mediump vec2 diff = abs(vPosition) - vRectSize + radius;
+  mediump float dist = length(max(diff, vec2(0.0))) - radius;
+  if(dist > 1.0)
+  {
+    gl_FragColor = vec4(0.0);
+  }
+  else if(dist > -1.0)
   {
-    if( min( diff.x, diff.y ) < 0.0)
+    if(min(diff.x, diff.y) < 0.0)
     {
-      dist += min( diff.x, diff.y ) / vCornerRadius;
+      dist += min(diff.x, diff.y) / max(radius, 1.0);
     }
-    gl_FragColor *= 1.0 - smoothstep( -1.0, 1.0, dist );
+    gl_FragColor *= 1.0 - smoothstep(-1.0, 1.0, dist);
   }
 }
index f383185..23ded26 100644 (file)
@@ -5,7 +5,8 @@ uniform mediump mat3 uAlignmentMatrix;
 varying mediump vec2 vTexCoord;
 varying mediump vec2 vPosition;
 varying mediump vec2 vRectSize;
-varying mediump float vCornerRadius;
+varying mediump vec2 vOptRectSize;
+varying mediump vec4 vCornerRadius;
 
 //Visual size and offset
 uniform mediump vec2 offset;
@@ -13,20 +14,23 @@ uniform highp vec2 size;
 uniform mediump vec4 offsetSizeMode;
 uniform mediump vec2 origin;
 uniform mediump vec2 anchorPoint;
-uniform mediump float cornerRadius;
+uniform mediump vec4 cornerRadius;
 uniform mediump float cornerRadiusPolicy;
 
 vec4 ComputeVertexPosition()
 {
-  vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw );
-  vec2 visualOffset = mix( offset, offset/uSize.xy, offsetSizeMode.xy);
-  mediump float minSize = min( visualSize.x, visualSize.y );
-  vCornerRadius = mix( cornerRadius * minSize, cornerRadius, cornerRadiusPolicy);
-  vCornerRadius = min( vCornerRadius, minSize * 0.5 );
-  vRectSize = visualSize * 0.5 - vCornerRadius;
-  vCornerRadius = max( vCornerRadius, 1.0 );
+  vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw);
+  vec2 visualOffset = mix(offset, offset/uSize.xy, offsetSizeMode.xy);
+  mediump float minSize = min(visualSize.x, visualSize.y);
+  vCornerRadius = mix(cornerRadius * minSize, cornerRadius, cornerRadiusPolicy);
+  vCornerRadius = min(vCornerRadius, minSize * 0.5);
+  vRectSize = visualSize * 0.5;
+  // Optimze fragment shader
+  mediump float maxRadius = max(max(vCornerRadius.x, vCornerRadius.y), max(vCornerRadius.z, vCornerRadius.w));
+  vOptRectSize = vRectSize - 0.2929 * maxRadius - 1.0;
+  vCornerRadius = max(vCornerRadius, 1.0);
   vPosition = aPosition * visualSize;
-  return vec4( (aPosition + anchorPoint)*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );
+  return vec4((aPosition + anchorPoint)*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0);
 }
 
 void main()
index 0e2c1d8..6eacb93 100644 (file)
@@ -1,7 +1,8 @@
 INPUT mediump vec2 vTexCoord;
 INPUT mediump vec2 vPosition;
 INPUT mediump vec2 vRectSize;
-INPUT mediump float vCornerRadius;
+INPUT mediump vec2 vOptRectSize;
+INPUT mediump vec4 vCornerRadius;
 
 uniform sampler2D sTexture;
 uniform lowp vec4 uColor;
@@ -10,23 +11,35 @@ uniform lowp float preMultipliedAlpha;
 
 void main()
 {
-  mediump vec2 diff = abs( vPosition ) - vRectSize;
-  mediump float dist = length( max( diff, vec2( 0.0 ) ) ) - vCornerRadius;
+  if(abs(vPosition.x) < vOptRectSize.x && abs(vPosition.y) < vOptRectSize.y)
+  {
+    OUT_COLOR = TEXTURE(sTexture, vTexCoord) * uColor * vec4(mixColor, 1.0);
+    return;
+  }
+  mediump float radius =
+  mix(
+    mix(vCornerRadius.x, vCornerRadius.y, sign(vPosition.x) * 0.5 + 0.5),
+    mix(vCornerRadius.w, vCornerRadius.z, sign(vPosition.x) * 0.5 + 0.5),
+    sign(vPosition.y) * 0.5 + 0.5
+  );
+
+  mediump vec2 diff = abs(vPosition) - vRectSize + radius;
+  mediump float dist = length(max(diff, vec2(0.0))) - radius;
   mediump float opacity = 1.0;
-  if( dist > 1.0 )
+  if(dist > 1.0)
   {
     opacity = 0.0;
   }
-  else if( dist > -1.0 )
+  else if(dist > -1.0)
   {
-    if( min( diff.x, diff.y ) < 0.0 )
+    if(min(diff.x, diff.y) < 0.0)
     {
-      dist += min( diff.x, diff.y ) / vCornerRadius;
+      dist += min(diff.x, diff.y) / max(radius, 1.0);
     }
-    opacity = 1.0 - smoothstep( -1.0, 1.0, dist );
+    opacity = 1.0 - smoothstep(-1.0, 1.0, dist);
   }
 
-  OUT_COLOR = TEXTURE( sTexture, vTexCoord ) * uColor * vec4( mixColor, 1.0 );
+  OUT_COLOR = TEXTURE(sTexture, vTexCoord) * uColor * vec4(mixColor, 1.0);
   OUT_COLOR.a *= opacity;
-  OUT_COLOR.rgb *= mix( 1.0, opacity, preMultipliedAlpha );
+  OUT_COLOR.rgb *= mix(1.0, opacity, preMultipliedAlpha);
 }
index 0bd3530..c35b1b6 100644 (file)
@@ -2,7 +2,8 @@ INPUT mediump vec2 aPosition;
 OUTPUT mediump vec2 vTexCoord;
 OUTPUT mediump vec2 vPosition;
 OUTPUT mediump vec2 vRectSize;
-OUTPUT mediump float vCornerRadius;
+OUTPUT mediump vec2 vOptRectSize;
+OUTPUT mediump vec4 vCornerRadius;
 
 uniform highp mat4 uMvpMatrix;
 uniform highp vec3 uSize;
@@ -14,25 +15,27 @@ uniform highp vec2 size;
 uniform mediump vec4 offsetSizeMode;
 uniform mediump vec2 origin;
 uniform mediump vec2 anchorPoint;
-uniform mediump float cornerRadius;
+uniform mediump vec4 cornerRadius;
 uniform mediump float cornerRadiusPolicy;
 uniform mediump vec2 extraSize;
 
 vec4 ComputeVertexPosition()
 {
-  vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw ) + extraSize;
-  vec2 visualOffset = mix( offset, offset/uSize.xy, offsetSizeMode.xy);
-  mediump float minSize = min( visualSize.x, visualSize.y );
-  vCornerRadius = mix( cornerRadius * minSize, cornerRadius, cornerRadiusPolicy);
-  vCornerRadius = min( vCornerRadius, minSize * 0.5 );
-  vRectSize = visualSize * 0.5 - vCornerRadius;
-  vCornerRadius = max( vCornerRadius, 1.0 );
+  vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw) + extraSize;
+  vec2 visualOffset = mix(offset, offset/uSize.xy, offsetSizeMode.xy);
+  mediump float minSize = min(visualSize.x, visualSize.y);
+  vCornerRadius = mix(cornerRadius * minSize, cornerRadius, cornerRadiusPolicy);
+  vCornerRadius = min(vCornerRadius, minSize * 0.5);
+  vRectSize = visualSize * 0.5;
+  // Optimize fragment shader
+  mediump float maxRadius = max(max(vCornerRadius.x, vCornerRadius.y), max(vCornerRadius.z, vCornerRadius.w));
+  vOptRectSize = vRectSize - 0.2929 * maxRadius - 1.0;
   vPosition = aPosition* visualSize;
-  return vec4( vPosition + anchorPoint*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );
+  return vec4(vPosition + anchorPoint*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0);
 }
 
 void main()
 {
   gl_Position = uMvpMatrix * ComputeVertexPosition();
-  vTexCoord = pixelArea.xy+pixelArea.zw*(aPosition + vec2(0.5) );
+  vTexCoord = pixelArea.xy+pixelArea.zw*(aPosition + vec2(0.5));
 }
index bb3f8d0..2d42f93 100644 (file)
@@ -119,7 +119,7 @@ Internal::Visual::Base::Impl::Impl(FittingMode fittingMode, Toolkit::Visual::Typ
   mTransform(),
   mMixColor(Color::WHITE),
   mControlSize(Vector2::ZERO),
-  mCornerRadius(0.0f),
+  mCornerRadius(Vector4::ZERO),
   mCornerRadiusPolicy(1.0f),
   mDepthIndex(0.0f),
   mMixColorIndex(Property::INVALID_INDEX),
index 2967b1d..acb6805 100644 (file)
@@ -123,7 +123,7 @@ struct Base::Impl
   Transform                       mTransform;
   Vector4                         mMixColor;
   Size                            mControlSize;
-  float                           mCornerRadius;
+  Vector4                         mCornerRadius;
   float                           mCornerRadiusPolicy;
   int                             mDepthIndex;
   Property::Index                 mMixColorIndex;
index 331eaf5..528bc14 100644 (file)
@@ -219,10 +219,26 @@ void Visual::Base::SetProperties(const Property::Map& propertyMap)
       }
       case Toolkit::DevelVisual::Property::CORNER_RADIUS:
       {
-        float radius;
-        if(value.Get(radius))
+        if(value.GetType() == Property::VECTOR4)
         {
-          mImpl->mCornerRadius = radius;
+          // If CORNER_RADIUS Property is Vector4,
+          // Each values mean the radius of
+          // (top-left, top-right, bottom-right, bottom-left)
+          Vector4 radius;
+          if(value.Get(radius))
+          {
+            mImpl->mCornerRadius = radius;
+          }
+        }
+        else
+        {
+          // If CORNER_RADIUS Property is float,
+          // Every corner radius have same value
+          float radius;
+          if(value.Get(radius))
+          {
+            mImpl->mCornerRadius = Vector4(radius, radius, radius, radius);
+          }
         }
         break;
       }
@@ -370,7 +386,7 @@ void Visual::Base::CreatePropertyMap(Property::Map& map) const
     }
     if(mImpl->mCornerRadiusIndex != Property::INVALID_INDEX)
     {
-      mImpl->mCornerRadius = mImpl->mRenderer.GetProperty<float>(mImpl->mCornerRadiusIndex);
+      mImpl->mCornerRadius = mImpl->mRenderer.GetProperty<Vector4>(mImpl->mCornerRadiusIndex);
     }
   }
 
@@ -449,9 +465,9 @@ bool Visual::Base::IsRoundedCornerRequired() const
   if(mImpl->mRenderer && mImpl->mCornerRadiusIndex != Property::INVALID_INDEX)
   {
     // Update values from Renderer
-    mImpl->mCornerRadius = mImpl->mRenderer.GetProperty<float>(mImpl->mCornerRadiusIndex);
+    mImpl->mCornerRadius = mImpl->mRenderer.GetProperty<Vector4>(mImpl->mCornerRadiusIndex);
   }
-  return !EqualsZero(mImpl->mCornerRadius) || mImpl->mNeedCornerRadius;
+  return !(mImpl->mCornerRadius == Vector4::ZERO) || mImpl->mNeedCornerRadius;
 }
 
 void Visual::Base::OnDoAction(const Property::Index actionId, const Property::Value& attributes)