From: Eunki, Hong Date: Tue, 16 Mar 2021 07:16:57 +0000 (+0900) Subject: Corner Radius become Vector4 X-Git-Tag: dali_2.0.22~3 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=be75977689673c6a0467c051984f1b482f9f00b8 Corner Radius become Vector4 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 --- diff --git a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedImageVisual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedImageVisual.cpp index c77b4ac..6d74b7c 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedImageVisual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedImageVisual.cpp @@ -90,9 +90,9 @@ int UtcDaliAnimatedImageVisualGetPropertyMap01(void) DALI_TEST_CHECK( value ); DALI_TEST_CHECK( value->Get() == 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(), 22.2f, TEST_LOCATION ); + DALI_TEST_EQUALS( value->Get(), 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(), 50.0f, TEST_LOCATION ); + DALI_TEST_EQUALS( value->Get(), 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(), 50.5f, TEST_LOCATION ); + DALI_TEST_EQUALS( value->Get(), 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 ); diff --git a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp index b692ebb..dfd0b72 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp @@ -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 ); diff --git a/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp index a9a2ed2..127a611 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp @@ -516,9 +516,9 @@ int UtcDaliVisualGetPropertyMap1(void) DALI_TEST_CHECK( colorValue ); DALI_TEST_CHECK( colorValue->Get() == 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 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(), 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("mixColor", targetColor), true, TEST_LOCATION); DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("offset", targetOffset), true, TEST_LOCATION); DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("size", targetSize), true, TEST_LOCATION); - DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("cornerRadius", targetCornerRadius), true, TEST_LOCATION); + DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("cornerRadius", targetCornerRadius), true, TEST_LOCATION); DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("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(), 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("mixColor", targetColor), true, TEST_LOCATION); DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("offset", targetOffset), true, TEST_LOCATION); DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("size", targetSize), true, TEST_LOCATION); - DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("cornerRadius", targetCornerRadius), true, TEST_LOCATION); + DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("cornerRadius", targetCornerRadius), true, TEST_LOCATION); DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("blurRadius", targetBlurRadius), true, TEST_LOCATION); -#else - tet_result(TET_PASS); #endif END_TEST; @@ -4348,7 +4347,7 @@ int UtcDaliVisualGetVisualProperty03(void) static std::vector 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(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("cornerRadius", targetCornerRadius), true, TEST_LOCATION); + DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("cornerRadius", targetCornerRadius), true, TEST_LOCATION); #else tet_result(TET_PASS); #endif @@ -4413,7 +4412,7 @@ int UtcDaliVisualGetVisualProperty04(void) static std::vector 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(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("cornerRadius", targetCornerRadius), true, TEST_LOCATION); + DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("cornerRadius", targetCornerRadius), true, TEST_LOCATION); #else tet_result(TET_PASS); #endif diff --git a/dali-toolkit/devel-api/visuals/visual-properties-devel.h b/dali-toolkit/devel-api/visuals/visual-properties-devel.h index 6a5f51d..1098b7d 100644 --- a/dali-toolkit/devel-api/visuals/visual-properties-devel.h +++ b/dali-toolkit/devel-api/visuals/visual-properties-devel.h @@ -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, diff --git a/dali-toolkit/internal/graphics/shaders/color-visual-blur-edge-shader.frag b/dali-toolkit/internal/graphics/shaders/color-visual-blur-edge-shader.frag index df817b2..a3bb80a 100644 --- a/dali-toolkit/internal/graphics/shaders/color-visual-blur-edge-shader.frag +++ b/dali-toolkit/internal/graphics/shaders/color-visual-blur-edge-shader.frag @@ -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); diff --git a/dali-toolkit/internal/graphics/shaders/color-visual-blur-edge-shader.vert b/dali-toolkit/internal/graphics/shaders/color-visual-blur-edge-shader.vert index e20110b..5306aef 100644 --- a/dali-toolkit/internal/graphics/shaders/color-visual-blur-edge-shader.vert +++ b/dali-toolkit/internal/graphics/shaders/color-visual-blur-edge-shader.vert @@ -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 ); } diff --git a/dali-toolkit/internal/graphics/shaders/color-visual-rounded-corner-shader.frag b/dali-toolkit/internal/graphics/shaders/color-visual-rounded-corner-shader.frag index 4654ab4..811dc1d 100644 --- a/dali-toolkit/internal/graphics/shaders/color-visual-rounded-corner-shader.frag +++ b/dali-toolkit/internal/graphics/shaders/color-visual-rounded-corner-shader.frag @@ -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); } } diff --git a/dali-toolkit/internal/graphics/shaders/color-visual-rounded-corner-shader.vert b/dali-toolkit/internal/graphics/shaders/color-visual-rounded-corner-shader.vert index 33216e5..0a6a257 100644 --- a/dali-toolkit/internal/graphics/shaders/color-visual-rounded-corner-shader.vert +++ b/dali-toolkit/internal/graphics/shaders/color-visual-rounded-corner-shader.vert @@ -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 ); } diff --git a/dali-toolkit/internal/graphics/shaders/gradient-visual-bounding-box-rounded-corner-shader.vert b/dali-toolkit/internal/graphics/shaders/gradient-visual-bounding-box-rounded-corner-shader.vert index 144fa81..bd08a63 100644 --- a/dali-toolkit/internal/graphics/shaders/gradient-visual-bounding-box-rounded-corner-shader.vert +++ b/dali-toolkit/internal/graphics/shaders/gradient-visual-bounding-box-rounded-corner-shader.vert @@ -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() diff --git a/dali-toolkit/internal/graphics/shaders/gradient-visual-linear-rounded-corner-shader.frag b/dali-toolkit/internal/graphics/shaders/gradient-visual-linear-rounded-corner-shader.frag index 548367c..1b29ae0 100644 --- a/dali-toolkit/internal/graphics/shaders/gradient-visual-linear-rounded-corner-shader.frag +++ b/dali-toolkit/internal/graphics/shaders/gradient-visual-linear-rounded-corner-shader.frag @@ -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); } } diff --git a/dali-toolkit/internal/graphics/shaders/gradient-visual-radial-rounded-corner-shader.frag b/dali-toolkit/internal/graphics/shaders/gradient-visual-radial-rounded-corner-shader.frag index 10bf0fe..68df0c5 100644 --- a/dali-toolkit/internal/graphics/shaders/gradient-visual-radial-rounded-corner-shader.frag +++ b/dali-toolkit/internal/graphics/shaders/gradient-visual-radial-rounded-corner-shader.frag @@ -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); } } diff --git a/dali-toolkit/internal/graphics/shaders/gradient-visual-user-space-rounded-corner-shader.vert b/dali-toolkit/internal/graphics/shaders/gradient-visual-user-space-rounded-corner-shader.vert index f383185..23ded26 100644 --- a/dali-toolkit/internal/graphics/shaders/gradient-visual-user-space-rounded-corner-shader.vert +++ b/dali-toolkit/internal/graphics/shaders/gradient-visual-user-space-rounded-corner-shader.vert @@ -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() diff --git a/dali-toolkit/internal/graphics/shaders/image-visual-rounded-corner-shader.frag b/dali-toolkit/internal/graphics/shaders/image-visual-rounded-corner-shader.frag index 0e2c1d8..6eacb93 100644 --- a/dali-toolkit/internal/graphics/shaders/image-visual-rounded-corner-shader.frag +++ b/dali-toolkit/internal/graphics/shaders/image-visual-rounded-corner-shader.frag @@ -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); } diff --git a/dali-toolkit/internal/graphics/shaders/image-visual-rounded-corner-shader.vert b/dali-toolkit/internal/graphics/shaders/image-visual-rounded-corner-shader.vert index 0bd3530..c35b1b6 100644 --- a/dali-toolkit/internal/graphics/shaders/image-visual-rounded-corner-shader.vert +++ b/dali-toolkit/internal/graphics/shaders/image-visual-rounded-corner-shader.vert @@ -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)); } diff --git a/dali-toolkit/internal/visuals/visual-base-data-impl.cpp b/dali-toolkit/internal/visuals/visual-base-data-impl.cpp index bb3f8d0..2d42f93 100644 --- a/dali-toolkit/internal/visuals/visual-base-data-impl.cpp +++ b/dali-toolkit/internal/visuals/visual-base-data-impl.cpp @@ -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), diff --git a/dali-toolkit/internal/visuals/visual-base-data-impl.h b/dali-toolkit/internal/visuals/visual-base-data-impl.h index 2967b1d..acb6805 100644 --- a/dali-toolkit/internal/visuals/visual-base-data-impl.h +++ b/dali-toolkit/internal/visuals/visual-base-data-impl.h @@ -123,7 +123,7 @@ struct Base::Impl Transform mTransform; Vector4 mMixColor; Size mControlSize; - float mCornerRadius; + Vector4 mCornerRadius; float mCornerRadiusPolicy; int mDepthIndex; Property::Index mMixColorIndex; diff --git a/dali-toolkit/internal/visuals/visual-base-impl.cpp b/dali-toolkit/internal/visuals/visual-base-impl.cpp index 331eaf5..528bc14 100644 --- a/dali-toolkit/internal/visuals/visual-base-impl.cpp +++ b/dali-toolkit/internal/visuals/visual-base-impl.cpp @@ -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(mImpl->mCornerRadiusIndex); + mImpl->mCornerRadius = mImpl->mRenderer.GetProperty(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(mImpl->mCornerRadiusIndex); + mImpl->mCornerRadius = mImpl->mRenderer.GetProperty(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)