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_POLICY, Toolkit::Visual::Transform::Policy::RELATIVE );
propertyMap.Insert( DevelColorVisual::Property::BLUR_RADIUS, 20.0f );
Visual::Base colorVisual = factory.CreateVisual( propertyMap );
DALI_TEST_CHECK( cornerRadiusValue );
DALI_TEST_CHECK( cornerRadiusValue->Get< float >() == 10.0f );
+ Property::Value* cornerRadiusPolicyValue = resultMap.Find( DevelVisual::Property::CORNER_RADIUS_POLICY, Property::INTEGER );
+ DALI_TEST_CHECK( cornerRadiusPolicyValue );
+ DALI_TEST_CHECK( cornerRadiusPolicyValue->Get< int >() == Toolkit::Visual::Transform::Policy::RELATIVE );
+
Property::Value* blurRadiusValue = resultMap.Find( DevelColorVisual::Property::BLUR_RADIUS, Property::FLOAT );
DALI_TEST_CHECK( blurRadiusValue );
DALI_TEST_CHECK( blurRadiusValue->Get< float >() == 20.0f );
DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
}
- // color visual
+ // color visual 1
{
VisualFactory factory = VisualFactory::Get();
Property::Map properties;
properties[Visual::Property::TYPE] = Visual::COLOR;
properties[ColorVisual::Property::MIX_COLOR] = Color::BLUE;
properties["cornerRadius"] = cornerRadius;
+ properties["cornerRadiusPolicy"] = Toolkit::Visual::Transform::Policy::ABSOLUTE;
+
+ 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.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
+ dummy.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
+ Stage::GetCurrent().Add( dummy );
+
+ application.SendNotification();
+ application.Render();
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
+ DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadiusPolicy", Toolkit::Visual::Transform::Policy::ABSOLUTE ), true, TEST_LOCATION );
+ }
+
+ // color visual 2
+ {
+ VisualFactory factory = VisualFactory::Get();
+ Property::Map properties;
+ float cornerRadius = 0.5f;
+
+ properties[Visual::Property::TYPE] = Visual::COLOR;
+ properties[ColorVisual::Property::MIX_COLOR] = Color::BLUE;
+ properties[DevelVisual::Property::CORNER_RADIUS] = cornerRadius;
+ properties[DevelVisual::Property::CORNER_RADIUS_POLICY] = Toolkit::Visual::Transform::Policy::RELATIVE;
+
+ 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.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
+ dummy.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
+ Stage::GetCurrent().Add( dummy );
+
+ application.SendNotification();
+ application.Render();
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadius", cornerRadius ), true, TEST_LOCATION );
+ DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "cornerRadiusPolicy", Toolkit::Visual::Transform::Policy::RELATIVE ), true, TEST_LOCATION );
+ }
+
+ // color visual 3 - invalid value
+ {
+ VisualFactory factory = VisualFactory::Get();
+ Property::Map properties;
+ float cornerRadius = 30.0f;
+
+ properties[Visual::Property::TYPE] = Visual::COLOR;
+ properties[ColorVisual::Property::MIX_COLOR] = Color::BLUE;
+ properties[DevelVisual::Property::CORNER_RADIUS] = cornerRadius;
+ properties[DevelVisual::Property::CORNER_RADIUS_POLICY] = -1; // Set an invalid value
Visual::Base visual = factory.CreateVisual( properties );
application.Render();
DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue< float >( "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 );
}
// gradient visual
* @note Optional.
*/
CORNER_RADIUS = OPACITY + 2,
+
+ /**
+ * @brief Whether the corner radius value is relative (percentage [0.0f to 1.0f] of the visual size) or absolute (in world units).
+ * @details Name "cornerRadiusPolicy", type Property::INTEGER.
+ * @see Policy::Type
+ * @note By default, it is ABSOLUTE to the visual's size.
+ * If it it RELATIVE, the corner radius value is relative to the smaller of the visual width and visual height.
+ */
+ CORNER_RADIUS_POLICY = OPACITY + 3,
};
} // namespace Property
uniform mediump vec3 uSize;\n
varying mediump vec2 vPosition;\n
varying mediump vec2 vRectSize;\n
+ varying mediump float vCornerRadius;\n
\n
//Visual size and offset
uniform mediump vec2 offset;\n
uniform mediump vec2 origin;\n
uniform mediump vec2 anchorPoint;\n
uniform mediump float cornerRadius;\n
+ uniform mediump float cornerRadiusPolicy;\n
\n
vec4 ComputeVertexPosition()\n
{\n
vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw ) + extraSize;\n
vec2 visualOffset = mix( offset, offset/uSize.xy, offsetSizeMode.xy);\n
- vRectSize = visualSize / 2.0 - cornerRadius;\n
+ mediump float minSize = min( visualSize.x, visualSize.y );\n
+ vCornerRadius = mix( cornerRadius * minSize, cornerRadius, cornerRadiusPolicy);\n
+ vCornerRadius = min( vCornerRadius, minSize * 0.5 );\n
+ vRectSize = visualSize / 2.0 - vCornerRadius;\n
vPosition = aPosition* visualSize;\n
return vec4( vPosition + anchorPoint*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );\n
}\n
const char* FRAGMENT_SHADER_ROUNDED_CORNER = DALI_COMPOSE_SHADER(
varying mediump vec2 vPosition;\n
varying mediump vec2 vRectSize;\n
+ varying mediump float vCornerRadius;\n
uniform lowp vec4 uColor;\n
uniform lowp vec3 mixColor;\n
- uniform mediump float cornerRadius;\n
\n
void main()\n
{\n
- mediump float dist = length( max( abs( vPosition ), vRectSize ) - vRectSize ) - cornerRadius;\n
+ mediump float dist = length( max( abs( vPosition ), vRectSize ) - vRectSize ) - vCornerRadius;\n
gl_FragColor = uColor * vec4( mixColor, 1.0 );\n
gl_FragColor.a *= 1.0 - smoothstep( -1.0, 1.0, dist );\n
}\n
varying mediump vec2 vTexCoord;\n
varying mediump vec2 vPosition;\n
varying mediump vec2 vRectSize;\n
+ varying mediump float vCornerRadius;\n
\n
//Visual size and offset
uniform mediump vec2 offset;\n
uniform mediump vec2 origin;\n
uniform mediump vec2 anchorPoint;\n
uniform mediump float cornerRadius;\n
+ uniform mediump float cornerRadiusPolicy;\n
vec4 ComputeVertexPosition()\n
{\n
vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw );\n
vec2 visualOffset = mix( offset, offset/uSize.xy, offsetSizeMode.xy);\n
- vRectSize = visualSize * 0.5 - cornerRadius;\n
+ mediump float minSize = min( visualSize.x, visualSize.y );\n
+ vCornerRadius = mix( cornerRadius * minSize, cornerRadius, cornerRadiusPolicy);\n
+ vCornerRadius = min( vCornerRadius, minSize * 0.5 );\n
+ vRectSize = visualSize * 0.5 - vCornerRadius;\n
vPosition = aPosition * visualSize;\n
return vec4( (aPosition + anchorPoint)*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );\n
}\n
varying mediump vec2 vTexCoord;\n
varying mediump vec2 vPosition;\n
varying mediump vec2 vRectSize;\n
+ varying mediump float vCornerRadius;\n
\n
//Visual size and offset
uniform mediump vec2 offset;\n
uniform mediump vec2 origin;\n
uniform mediump vec2 anchorPoint;\n
uniform mediump float cornerRadius;\n
+ uniform mediump float cornerRadiusPolicy;\n
vec4 ComputeVertexPosition()\n
{\n
vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw );\n
vec2 visualOffset = mix( offset, offset/uSize.xy, offsetSizeMode.xy);\n
- vRectSize = visualSize * 0.5 - cornerRadius;\n
+ mediump float minSize = min( visualSize.x, visualSize.y );\n
+ vCornerRadius = mix( cornerRadius * minSize, cornerRadius, cornerRadiusPolicy);\n
+ vCornerRadius = min( vCornerRadius, minSize * 0.5 );\n
+ vRectSize = visualSize * 0.5 - vCornerRadius;\n
vPosition = aPosition * visualSize;\n
return vec4( (aPosition + anchorPoint)*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );\n
}\n
uniform sampler2D sTexture;\n // sampler1D?
uniform lowp vec4 uColor;\n
uniform lowp vec3 mixColor;\n
- uniform mediump float cornerRadius;\n
varying mediump vec2 vTexCoord;\n
varying mediump vec2 vPosition;\n
varying mediump vec2 vRectSize;\n
+ varying mediump float vCornerRadius;\n
\n
void main()\n
{\n
- mediump float dist = length( max( abs( vPosition ), vRectSize ) - vRectSize ) - cornerRadius;\n
+ mediump float dist = length( max( abs( vPosition ), vRectSize ) - vRectSize ) - vCornerRadius;\n
gl_FragColor = texture2D( sTexture, vec2( vTexCoord.y, 0.5 ) ) * vec4(mixColor, 1.0) * uColor;\n
gl_FragColor *= 1.0 - smoothstep( -1.0, 1.0, dist );\n
}\n
uniform sampler2D sTexture;\n // sampler1D?
uniform lowp vec4 uColor;\n
uniform lowp vec3 mixColor;\n
- uniform mediump float cornerRadius;\n
varying mediump vec2 vTexCoord;\n
varying mediump vec2 vPosition;\n
varying mediump vec2 vRectSize;\n
+ varying mediump float vCornerRadius;\n
\n
void main()\n
{\n
- mediump float dist = length( max( abs( vPosition ), vRectSize ) - vRectSize ) - cornerRadius;\n
+ mediump float dist = length( max( abs( vPosition ), vRectSize ) - vRectSize ) - vCornerRadius;\n
gl_FragColor = texture2D( sTexture, vec2( length(vTexCoord), 0.5 ) ) * vec4(mixColor, 1.0) * uColor;\n
gl_FragColor *= 1.0 - smoothstep( -1.0, 1.0, dist );\n
}\n
varying mediump vec2 vTexCoord;\n
varying mediump vec2 vPosition;\n
varying mediump vec2 vRectSize;\n
+ varying mediump float vCornerRadius;\n
\n
//Visual size and offset
uniform mediump vec2 offset;\n
uniform mediump vec2 origin;\n
uniform mediump vec2 anchorPoint;\n
uniform mediump float cornerRadius;\n
+ uniform mediump float cornerRadiusPolicy;\n
uniform mediump vec2 extraSize;\n
\n
vec4 ComputeVertexPosition()\n
{\n
vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw ) + extraSize;\n
vec2 visualOffset = mix( offset, offset/uSize.xy, offsetSizeMode.xy);\n
- vRectSize = visualSize * 0.5 - cornerRadius;\n
+ mediump float minSize = min( visualSize.x, visualSize.y );\n
+ vCornerRadius = mix( cornerRadius * minSize, cornerRadius, cornerRadiusPolicy);\n
+ vCornerRadius = min( vCornerRadius, minSize * 0.5 );\n
+ vRectSize = visualSize * 0.5 - vCornerRadius;\n
vPosition = aPosition* visualSize;\n
return vec4( vPosition + anchorPoint*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );\n
}\n
varying mediump vec2 vTexCoord;\n
varying mediump vec2 vPosition;\n
varying mediump vec2 vRectSize;\n
+ varying mediump float vCornerRadius;\n
uniform sampler2D sTexture;\n
uniform lowp vec4 uColor;\n
uniform lowp vec3 mixColor;\n
- uniform mediump float cornerRadius;\n
uniform lowp float preMultipliedAlpha;\n
\n
void main()\n
{\n
- mediump float dist = length( max( abs( vPosition ), vRectSize ) - vRectSize ) - cornerRadius;\n
+ mediump float dist = length( max( abs( vPosition ), vRectSize ) - vRectSize ) - vCornerRadius;\n
mediump float opacity = 1.0 - smoothstep( -1.0, 1.0, dist );\n
gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor * vec4( mixColor, 1.0 );\n
gl_FragColor.a *= opacity;\n
mMixColor( Color::WHITE ),
mControlSize( Vector2::ZERO ),
mCornerRadius( 0.0f ),
+ mCornerRadiusPolicy( 1.0f ),
mDepthIndex( 0.0f ),
mMixColorIndex( Property::INVALID_INDEX ),
mCornerRadiusIndex( Property::INVALID_INDEX ),
Vector4 mMixColor;
Size mControlSize;
float mCornerRadius;
+ float mCornerRadiusPolicy;
int mDepthIndex;
Property::Index mMixColorIndex;
Property::Index mCornerRadiusIndex;
{
matchKey = Property::Key( Toolkit::DevelVisual::Property::CORNER_RADIUS );
}
+ else if( matchKey == CORNER_RADIUS_POLICY )
+ {
+ matchKey = Property::Key( Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY );
+ }
}
switch( matchKey.indexKey )
}
break;
}
+ case Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY:
+ {
+ int policy;
+ if( value.Get( policy ) )
+ {
+ switch( policy )
+ {
+ case Toolkit::Visual::Transform::Policy::RELATIVE:
+ case Toolkit::Visual::Transform::Policy::ABSOLUTE:
+ {
+ mImpl->mCornerRadiusPolicy = policy;
+ break;
+ }
+ default:
+ {
+ DALI_LOG_ERROR( "Unsupported policy: %d\n", policy );
+ break;
+ }
+ }
+ }
+ break;
+ }
}
}
if( IsRoundedCornerRequired() )
{
mImpl->mCornerRadiusIndex = mImpl->mRenderer.RegisterProperty( CORNER_RADIUS, mImpl->mCornerRadius );
+ mImpl->mRenderer.RegisterProperty( CORNER_RADIUS_POLICY, mImpl->mCornerRadiusPolicy );
mImpl->mRenderer.SetProperty( Renderer::Property::BLEND_MODE, BlendMode::ON );
}
map.Insert( Toolkit::DevelVisual::Property::VISUAL_FITTING_MODE, fittingModeString );
map.Insert( Toolkit::DevelVisual::Property::CORNER_RADIUS, mImpl->mCornerRadius );
+ map.Insert( Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, static_cast< int >( mImpl->mCornerRadiusPolicy ) );
}
void Visual::Base::CreateInstancePropertyMap( Property::Map& map ) const
// Corner radius
const char * const CORNER_RADIUS( "cornerRadius" );
+const char * const CORNER_RADIUS_POLICY( "cornerRadiusPolicy" );
// Color visual
const char * const RENDER_IF_TRANSPARENT_NAME( "renderIfTransparent" );
// Corner radius
extern const char * const CORNER_RADIUS;
+extern const char * const CORNER_RADIUS_POLICY;
// Color visual
extern const char * const RENDER_IF_TRANSPARENT_NAME;