From 954a8e25f7e32579a4a9276db09f43d45a19d2a0 Mon Sep 17 00:00:00 2001 From: Heeyong Song Date: Thu, 20 Feb 2020 10:19:31 +0900 Subject: [PATCH] Support the blur radius of the ColorVisual Change-Id: Iaee00d74e327372c040b5137e0ce1666b5a0b59b --- .../src/dali-toolkit/utc-Dali-Visual.cpp | 56 +++++++++++++++- .../visuals/color-visual-properties-devel.h | 12 +++- .../devel-api/visuals/visual-properties-devel.h | 4 +- .../internal/visuals/color/color-visual.cpp | 75 ++++++++++++++++++++-- dali-toolkit/internal/visuals/color/color-visual.h | 3 +- .../internal/visuals/visual-factory-cache.h | 3 +- .../internal/visuals/visual-string-constants.cpp | 3 +- .../internal/visuals/visual-string-constants.h | 3 +- 8 files changed, 145 insertions(+), 14 deletions(-) diff --git a/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp index d26b857..b6505e2 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp @@ -509,6 +509,7 @@ int UtcDaliVisualGetPropertyMap1(void) 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( DevelColorVisual::Property::BLUR_RADIUS, 20.0f ); Visual::Base colorVisual = factory.CreateVisual( propertyMap ); Property::Map resultMap; @@ -522,9 +523,13 @@ int UtcDaliVisualGetPropertyMap1(void) DALI_TEST_CHECK( colorValue ); DALI_TEST_CHECK( colorValue->Get() == Color::BLUE ); - Property::Value* radiusValue = resultMap.Find( DevelVisual::Property::CORNER_RADIUS, Property::FLOAT ); - DALI_TEST_CHECK( radiusValue ); - DALI_TEST_CHECK( radiusValue->Get< float >() == 10.0f ); + Property::Value* cornerRadiusValue = resultMap.Find( DevelVisual::Property::CORNER_RADIUS, Property::FLOAT ); + DALI_TEST_CHECK( cornerRadiusValue ); + DALI_TEST_CHECK( cornerRadiusValue->Get< float >() == 10.0f ); + + Property::Value* blurRadiusValue = resultMap.Find( DevelColorVisual::Property::BLUR_RADIUS, Property::FLOAT ); + DALI_TEST_CHECK( blurRadiusValue ); + DALI_TEST_CHECK( blurRadiusValue->Get< float >() == 20.0f ); // change the blend color propertyMap[ColorVisual::Property::MIX_COLOR] = Color::CYAN; @@ -535,6 +540,16 @@ int UtcDaliVisualGetPropertyMap1(void) DALI_TEST_CHECK( colorValue ); DALI_TEST_CHECK( colorValue->Get() == Color::CYAN ); + // Test wrong values + propertyMap[DevelColorVisual::Property::BLUR_RADIUS] = "3.0f"; + + colorVisual = factory.CreateVisual( propertyMap ); + colorVisual.CreatePropertyMap( resultMap ); + + blurRadiusValue = resultMap.Find( DevelColorVisual::Property::BLUR_RADIUS, Property::FLOAT ); + DALI_TEST_CHECK( blurRadiusValue ); + DALI_TEST_CHECK( blurRadiusValue->Get< float >() == 0.0f ); + END_TEST; } @@ -3652,3 +3667,38 @@ int UtcDaliVisualRoundedCorner(void) END_TEST; } + +int UtcDaliColorVisualBlurRadius(void) +{ + ToolkitTestApplication application; + tet_infoline( "UtcDaliColorVisualBlurRadius" ); + + VisualFactory factory = VisualFactory::Get(); + Property::Map properties; + float blurRadius = 20.0f; + + properties[Visual::Property::TYPE] = Visual::COLOR; + properties[ColorVisual::Property::MIX_COLOR] = Color::BLUE; + properties["blurRadius"] = blurRadius; + + Visual::Base visual = factory.CreateVisual( properties ); + + // trigger creation through setting on stage + DummyControl dummy = DummyControl::New( true ); + Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummy.GetImplementation() ); + dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); + + dummy.SetSize( 200.f, 200.f ); + dummy.SetParentOrigin( ParentOrigin::CENTER ); + Stage::GetCurrent().Add( dummy ); + + application.SendNotification(); + application.Render(); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "blurRadius", blurRadius ), true, TEST_LOCATION ); + + END_TEST; +} diff --git a/dali-toolkit/devel-api/visuals/color-visual-properties-devel.h b/dali-toolkit/devel-api/visuals/color-visual-properties-devel.h index 4eb8b3a..654b290 100644 --- a/dali-toolkit/devel-api/visuals/color-visual-properties-devel.h +++ b/dali-toolkit/devel-api/visuals/color-visual-properties-devel.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_COLOR_VISUAL_PROPERTIES_DEVEL_H /* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -51,6 +51,16 @@ enum * @note By default it's false, i.e. ColorVisual will not render if the MIX_COLOR is transparent. */ RENDER_IF_TRANSPARENT = MIX_COLOR + 1, + + /** + * @brief The blur radius of the visual. + * @details Name "blurRadius", type Property::FLOAT. + * If the value is 0, the edge is sharp. Otherwise, the larger the value, the more the edge is blurred. + * @note Optional. + * @note The default is 0. + * @note The visual size increases by the blur radius. + */ + BLUR_RADIUS = MIX_COLOR + 2, }; } // namespace Property diff --git a/dali-toolkit/devel-api/visuals/visual-properties-devel.h b/dali-toolkit/devel-api/visuals/visual-properties-devel.h index 5958037..8dfb3cc 100644 --- a/dali-toolkit/devel-api/visuals/visual-properties-devel.h +++ b/dali-toolkit/devel-api/visuals/visual-properties-devel.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_DEVEL_API_VISUALS_VISUAL_PROPERTIES_DEVEL_H /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -75,7 +75,7 @@ enum Type /** * @brief The radius for the rounded corners of the visual - * @details Name "cornerRadius", type Property::FLOAT or Property::VECTOR4. + * @details Name "cornerRadius", type Property::FLOAT. * @note Optional. */ CORNER_RADIUS = OPACITY + 2, diff --git a/dali-toolkit/internal/visuals/color/color-visual.cpp b/dali-toolkit/internal/visuals/color/color-visual.cpp index 25ea34b..804b612 100644 --- a/dali-toolkit/internal/visuals/color/color-visual.cpp +++ b/dali-toolkit/internal/visuals/color/color-visual.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -121,7 +121,52 @@ const char* FRAGMENT_SHADER_ROUNDED_CORNER = DALI_COMPOSE_SHADER( {\n mediump float dist = length( max( abs( vPosition ), vRectSize ) - vRectSize ) - cornerRadius;\n gl_FragColor = uColor * vec4( mixColor, 1.0 );\n - gl_FragColor.a *= smoothstep( 1.0, -1.0, dist );\n + gl_FragColor.a *= 1.0 - smoothstep( -1.0, 1.0, dist );\n + }\n +); + +const char* VERTEX_SHADER_BLUR_EDGE = DALI_COMPOSE_SHADER( + attribute mediump vec2 aPosition;\n + uniform highp mat4 uMvpMatrix;\n + uniform mediump vec3 uSize;\n + varying mediump vec2 vPosition;\n + varying mediump vec2 vRectSize;\n + \n + //Visual size and offset + uniform mediump vec2 offset;\n + uniform mediump vec2 size;\n + uniform mediump vec4 offsetSizeMode;\n + uniform mediump vec2 origin;\n + uniform mediump vec2 anchorPoint;\n + uniform mediump float blurRadius;\n + \n + vec4 ComputeVertexPosition()\n + {\n + vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw ) + blurRadius * 2.0;\n + vec2 visualOffset = mix( offset, offset/uSize.xy, offsetSizeMode.xy);\n + vRectSize = visualSize / 2.0;\n + vPosition = aPosition* visualSize;\n + return vec4( vPosition + anchorPoint*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );\n + }\n + \n + void main()\n + {\n + gl_Position = uMvpMatrix * ComputeVertexPosition();\n + }\n +); + +const char* FRAGMENT_SHADER_BLUR_EDGE = DALI_COMPOSE_SHADER( + varying mediump vec2 vPosition;\n + varying mediump vec2 vRectSize;\n + uniform lowp vec4 uColor;\n + uniform lowp vec3 mixColor;\n + uniform mediump float blurRadius;\n + \n + void main()\n + {\n + mediump vec2 blur = 1.0 - smoothstep( vRectSize - blurRadius * 2.0, vRectSize, abs( vPosition ) );\n + gl_FragColor = uColor * vec4( mixColor, 1.0 );\n + gl_FragColor.a *= blur.x * blur.y;\n }\n ); @@ -136,6 +181,7 @@ ColorVisualPtr ColorVisual::New( VisualFactoryCache& factoryCache, const Propert ColorVisual::ColorVisual( VisualFactoryCache& factoryCache ) : Visual::Base( factoryCache, Visual::FittingMode::FILL ), + mBlurRadius( 0.0f ), mRenderIfTransparent( false ) { } @@ -179,6 +225,15 @@ void ColorVisual::DoSetProperties( const Property::Map& propertyMap ) DALI_LOG_ERROR( "ColorVisual: renderIfTransparent property has incorrect type: %d\n", renderIfTransparentValue->GetType() ); } } + + Property::Value* blurRadiusValue = propertyMap.Find( Toolkit::DevelColorVisual::Property::BLUR_RADIUS, BLUR_RADIUS_NAME ); + if( blurRadiusValue ) + { + if( !blurRadiusValue->Get( mBlurRadius ) ) + { + DALI_LOG_ERROR( "ColorVisual:DoSetProperties:: BLUR_RADIUS property has incorrect type: %d\n", blurRadiusValue->GetType() ); + } + } } void ColorVisual::DoSetOnStage( Actor& actor ) @@ -202,6 +257,7 @@ void ColorVisual::DoCreatePropertyMap( Property::Map& map ) const map.Insert( Toolkit::Visual::Property::TYPE, Toolkit::Visual::COLOR ); map.Insert( Toolkit::ColorVisual::Property::MIX_COLOR, mImpl->mMixColor ); map.Insert( Toolkit::DevelColorVisual::Property::RENDER_IF_TRANSPARENT, mRenderIfTransparent ); + map.Insert( Toolkit::DevelColorVisual::Property::BLUR_RADIUS, mBlurRadius ); } void ColorVisual::DoCreateInstancePropertyMap( Property::Map& map ) const @@ -223,7 +279,16 @@ void ColorVisual::InitializeRenderer() Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY ); Shader shader; - if( !IsRoundedCornerRequired() ) + if( !EqualsZero( mBlurRadius ) ) + { + shader = mFactoryCache.GetShader( VisualFactoryCache::COLOR_SHADER_BLUR_EDGE ); + if( !shader ) + { + shader = Shader::New( VERTEX_SHADER_BLUR_EDGE, FRAGMENT_SHADER_BLUR_EDGE ); + mFactoryCache.SaveShader( VisualFactoryCache::COLOR_SHADER_BLUR_EDGE, shader ); + } + } + else if( !IsRoundedCornerRequired() ) { shader = mFactoryCache.GetShader( VisualFactoryCache::COLOR_SHADER ); if( !shader ) @@ -249,7 +314,9 @@ void ColorVisual::InitializeRenderer() // String keys will get to this property. mImpl->mMixColorIndex = DevelHandle::RegisterProperty( mImpl->mRenderer, Toolkit::ColorVisual::Property::MIX_COLOR, MIX_COLOR, Vector3(mImpl->mMixColor) ); - if( mImpl->mMixColor.a < 1.f ) + mImpl->mRenderer.RegisterProperty( BLUR_RADIUS_NAME, mBlurRadius ); + + if( mImpl->mMixColor.a < 1.f || !EqualsZero( mBlurRadius ) ) { mImpl->mRenderer.SetProperty( Renderer::Property::BLEND_MODE, BlendMode::ON ); } diff --git a/dali-toolkit/internal/visuals/color/color-visual.h b/dali-toolkit/internal/visuals/color/color-visual.h index 64ff0b2..05c8ba9 100644 --- a/dali-toolkit/internal/visuals/color/color-visual.h +++ b/dali-toolkit/internal/visuals/color/color-visual.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_INTERNAL_COLOR_VISUAL_H /* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -115,6 +115,7 @@ private: private: + float mBlurRadius; ///< The blur radius bool mRenderIfTransparent; ///< Whether we should render even if the mix-color is transparent. }; diff --git a/dali-toolkit/internal/visuals/visual-factory-cache.h b/dali-toolkit/internal/visuals/visual-factory-cache.h index f01260f..44b61f5 100644 --- a/dali-toolkit/internal/visuals/visual-factory-cache.h +++ b/dali-toolkit/internal/visuals/visual-factory-cache.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_VISUAL_FACTORY_CACHE_H /* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -59,6 +59,7 @@ public: { COLOR_SHADER, COLOR_SHADER_ROUNDED_CORNER, + COLOR_SHADER_BLUR_EDGE, BORDER_SHADER, BORDER_SHADER_ANTI_ALIASING, GRADIENT_SHADER_LINEAR_USER_SPACE, diff --git a/dali-toolkit/internal/visuals/visual-string-constants.cpp b/dali-toolkit/internal/visuals/visual-string-constants.cpp index 79f6163..ff07979 100644 --- a/dali-toolkit/internal/visuals/visual-string-constants.cpp +++ b/dali-toolkit/internal/visuals/visual-string-constants.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -81,6 +81,7 @@ const char * const CORNER_RADIUS( "cornerRadius" ); // Color visual const char * const RENDER_IF_TRANSPARENT_NAME( "renderIfTransparent" ); +const char * const BLUR_RADIUS_NAME( "blurRadius" ); // Image visual const char * const IMAGE_URL_NAME( "url" ); diff --git a/dali-toolkit/internal/visuals/visual-string-constants.h b/dali-toolkit/internal/visuals/visual-string-constants.h index 8415819..6959905 100644 --- a/dali-toolkit/internal/visuals/visual-string-constants.h +++ b/dali-toolkit/internal/visuals/visual-string-constants.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_INTERNAL_VISUAL_STRING_CONSTANTS_H /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -66,6 +66,7 @@ extern const char * const CORNER_RADIUS; // Color visual extern const char * const RENDER_IF_TRANSPARENT_NAME; +extern const char * const BLUR_RADIUS_NAME; // Image visual extern const char * const IMAGE_URL_NAME; -- 2.7.4