X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Ftext%2Ftext-visual.cpp;h=b8edc7a42441aa30efdf6d6d4f57a2c0cd14b961;hp=d1ad16c6461f2675de7e245181e0df4ad501de02;hb=cdac11c27bab99068abd2ecabb1c54645b2f90a9;hpb=86824206ffe1f9d1ee92ad1fbdd209c8155cd437 diff --git a/dali-toolkit/internal/visuals/text/text-visual.cpp b/dali-toolkit/internal/visuals/text/text-visual.cpp index d1ad16c..b8edc7a 100755 --- a/dali-toolkit/internal/visuals/text/text-visual.cpp +++ b/dali-toolkit/internal/visuals/text/text-visual.cpp @@ -20,6 +20,7 @@ // EXTERNAL INCLUDES #include +#include #include // INTERNAL HEADER @@ -106,48 +107,29 @@ const char* FRAGMENT_SHADER_SINGLE_COLOR_TEXT = DALI_COMPOSE_SHADER( varying mediump vec2 vTexCoord;\n uniform sampler2D sTexture;\n uniform lowp vec4 uTextColorAnimatable;\n - uniform mediump vec4 uAtlasRect;\n uniform lowp vec4 uColor;\n uniform lowp vec3 mixColor;\n - uniform lowp float opacity;\n - uniform lowp float preMultipliedAlpha;\n - \n - lowp vec4 visualMixColor()\n - {\n - return vec4( mixColor * mix( 1.0, opacity, preMultipliedAlpha ), opacity );\n - }\n \n void main()\n {\n - mediump vec2 texCoord = clamp( mix( uAtlasRect.xy, uAtlasRect.zw, vTexCoord ), uAtlasRect.xy, uAtlasRect.zw );\n - mediump float textTexture = texture2D( sTexture, texCoord ).r;\n + mediump float textTexture = texture2D( sTexture, vTexCoord ).r;\n // Set the color of the text to what it is animated to. - gl_FragColor = uTextColorAnimatable * textTexture * uColor * visualMixColor(); + gl_FragColor = uTextColorAnimatable * textTexture * uColor * vec4( mixColor, 1.0 ); }\n ); const char* FRAGMENT_SHADER_MULTI_COLOR_TEXT = DALI_COMPOSE_SHADER( varying mediump vec2 vTexCoord;\n uniform sampler2D sTexture;\n - uniform mediump vec4 uAtlasRect;\n uniform lowp vec4 uColor;\n uniform lowp vec3 mixColor;\n - uniform lowp float opacity;\n - uniform lowp float preMultipliedAlpha;\n - \n - lowp vec4 visualMixColor()\n - {\n - return vec4( mixColor * mix( 1.0, opacity, preMultipliedAlpha ), opacity );\n - }\n \n void main()\n {\n - mediump vec2 texCoord = clamp( mix( uAtlasRect.xy, uAtlasRect.zw, vTexCoord ), uAtlasRect.xy, uAtlasRect.zw );\n - mediump vec4 textTexture = texture2D( sTexture, texCoord );\n - textTexture.rgb *= mix( 1.0, textTexture.a, preMultipliedAlpha );\n + mediump vec4 textTexture = texture2D( sTexture, vTexCoord );\n - gl_FragColor = textTexture * uColor * visualMixColor(); + gl_FragColor = textTexture * uColor * vec4( mixColor, 1.0 ); }\n ); @@ -156,25 +138,16 @@ const char* FRAGMENT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE = DALI_COMPOSE_SHADER( uniform sampler2D sTexture;\n uniform sampler2D sStyle;\n uniform lowp vec4 uTextColorAnimatable;\n - uniform mediump vec4 uAtlasRect;\n uniform lowp vec4 uColor;\n uniform lowp vec3 mixColor;\n - uniform lowp float opacity;\n - uniform lowp float preMultipliedAlpha;\n - \n - lowp vec4 visualMixColor()\n - {\n - return vec4( mixColor * mix( 1.0, opacity, preMultipliedAlpha ), opacity );\n - }\n \n void main()\n {\n - mediump vec2 texCoord = clamp( mix( uAtlasRect.xy, uAtlasRect.zw, vTexCoord ), uAtlasRect.xy, uAtlasRect.zw );\n - mediump float textTexture = texture2D( sTexture, texCoord ).r;\n - mediump vec4 styleTexture = texture2D( sStyle, texCoord );\n + mediump float textTexture = texture2D( sTexture, vTexCoord ).r;\n + mediump vec4 styleTexture = texture2D( sStyle, vTexCoord );\n // Draw the text as overlay above the style - gl_FragColor = ( uTextColorAnimatable * textTexture + styleTexture * ( 1.0 - textTexture ) ) * uColor * visualMixColor();\n + gl_FragColor = ( uTextColorAnimatable * textTexture + styleTexture * ( 1.0 - uTextColorAnimatable.a * textTexture ) ) * uColor * vec4( mixColor, 1.0 );\n }\n ); @@ -182,26 +155,16 @@ const char* FRAGMENT_SHADER_MULTI_COLOR_TEXT_WITH_STYLE = DALI_COMPOSE_SHADER( varying mediump vec2 vTexCoord;\n uniform sampler2D sTexture;\n uniform sampler2D sStyle;\n - uniform mediump vec4 uAtlasRect;\n uniform lowp vec4 uColor;\n uniform lowp vec3 mixColor;\n - uniform lowp float opacity;\n - uniform lowp float preMultipliedAlpha;\n - \n - lowp vec4 visualMixColor()\n - {\n - return vec4( mixColor * mix( 1.0, opacity, preMultipliedAlpha ), opacity );\n - }\n \n void main()\n {\n - mediump vec2 texCoord = clamp( mix( uAtlasRect.xy, uAtlasRect.zw, vTexCoord ), uAtlasRect.xy, uAtlasRect.zw );\n - mediump vec4 textTexture = texture2D( sTexture, texCoord );\n - mediump vec4 styleTexture = texture2D( sStyle, texCoord );\n - textTexture.rgb *= mix( 1.0, textTexture.a, preMultipliedAlpha );\n + mediump vec4 textTexture = texture2D( sTexture, vTexCoord );\n + mediump vec4 styleTexture = texture2D( sStyle, vTexCoord );\n // Draw the text as overlay above the style - gl_FragColor = ( textTexture + styleTexture * ( 1.0 - textTexture.a ) ) * uColor * visualMixColor();\n + gl_FragColor = ( textTexture + styleTexture * ( 1.0 - textTexture.a ) ) * uColor * vec4( mixColor, 1.0 );\n }\n ); @@ -210,31 +173,22 @@ const char* FRAGMENT_SHADER_SINGLE_COLOR_TEXT_WITH_EMOJI = DALI_COMPOSE_SHADER( uniform sampler2D sTexture;\n uniform sampler2D sMask;\n uniform lowp vec4 uTextColorAnimatable;\n - uniform mediump vec4 uAtlasRect;\n uniform lowp vec4 uColor;\n uniform lowp vec3 mixColor;\n - uniform lowp float opacity;\n - uniform lowp float preMultipliedAlpha;\n - \n - lowp vec4 visualMixColor()\n - {\n - return vec4( mixColor * mix( 1.0, opacity, preMultipliedAlpha ), opacity );\n - }\n \n void main()\n {\n - mediump vec2 texCoord = clamp( mix( uAtlasRect.xy, uAtlasRect.zw, vTexCoord ), uAtlasRect.xy, uAtlasRect.zw );\n - mediump vec4 textTexture = texture2D( sTexture, texCoord );\n - mediump float maskTexture = texture2D( sMask, texCoord ).r;\n + mediump vec4 textTexture = texture2D( sTexture, vTexCoord );\n + mediump float maskTexture = texture2D( sMask, vTexCoord ).r;\n // Set the color of non-transparent pixel in text to what it is animated to. // Markup text with multiple text colors are not animated (but can be supported later on if required). // Emoji color are not animated. mediump float vstep = step( 0.0001, textTexture.a );\n - textTexture.rgb = mix( textTexture.rgb, uTextColorAnimatable.rgb, vstep * maskTexture ) * mix( 1.0, textTexture.a, preMultipliedAlpha );\n + textTexture.rgb = mix( textTexture.rgb, uTextColorAnimatable.rgb, vstep * maskTexture );\n // Draw the text as overlay above the style - gl_FragColor = textTexture * uColor * visualMixColor();\n + gl_FragColor = textTexture * uColor * vec4( mixColor, 1.0 );\n }\n ); @@ -245,32 +199,23 @@ const char* FRAGMENT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE_AND_EMOJI = DALI_COMPOS uniform sampler2D sMask;\n uniform lowp float uHasMultipleTextColors;\n uniform lowp vec4 uTextColorAnimatable;\n - uniform mediump vec4 uAtlasRect;\n uniform lowp vec4 uColor;\n uniform lowp vec3 mixColor;\n - uniform lowp float opacity;\n - uniform lowp float preMultipliedAlpha;\n - \n - lowp vec4 visualMixColor()\n - {\n - return vec4( mixColor * mix( 1.0, opacity, preMultipliedAlpha ), opacity );\n - }\n \n void main()\n {\n - mediump vec2 texCoord = clamp( mix( uAtlasRect.xy, uAtlasRect.zw, vTexCoord ), uAtlasRect.xy, uAtlasRect.zw );\n - mediump vec4 textTexture = texture2D( sTexture, texCoord );\n - mediump vec4 styleTexture = texture2D( sStyle, texCoord );\n - mediump float maskTexture = texture2D( sMask, texCoord ).r;\n + mediump vec4 textTexture = texture2D( sTexture, vTexCoord );\n + mediump vec4 styleTexture = texture2D( sStyle, vTexCoord );\n + mediump float maskTexture = texture2D( sMask, vTexCoord ).r;\n // Set the color of non-transparent pixel in text to what it is animated to. // Markup text with multiple text colors are not animated (but can be supported later on if required). // Emoji color are not animated. mediump float vstep = step( 0.0001, textTexture.a );\n - textTexture.rgb = mix( textTexture.rgb, uTextColorAnimatable.rgb, vstep * maskTexture * ( 1.0 - uHasMultipleTextColors ) ) * mix( 1.0, textTexture.a, preMultipliedAlpha );\n + textTexture.rgb = mix( textTexture.rgb, uTextColorAnimatable.rgb, vstep * maskTexture * ( 1.0 - uHasMultipleTextColors ) );\n // Draw the text as overlay above the style - gl_FragColor = ( textTexture + styleTexture * ( 1.0 - textTexture.a ) ) * uColor * visualMixColor();\n + gl_FragColor = ( textTexture + styleTexture * ( 1.0 - textTexture.a ) ) * uColor * vec4( mixColor, 1.0 );\n }\n ); @@ -344,6 +289,28 @@ Dali::Property::Index StringKeyToIndexKey( const std::string& stringKey ) return result; } +void TextColorConstraint( Vector4& current, const PropertyInputContainer& inputs ) +{ + Vector4 color = inputs[0]->GetVector4(); + current.r = color.r * color.a; + current.g = color.g * color.a; + current.b = color.b * color.a; + current.a = color.a; +} + +void OpacityConstraint( float& current, const PropertyInputContainer& inputs ) +{ + // Make zero if the alpha value of text color is zero to skip rendering text + if( EqualsZero( inputs[0]->GetVector4().a ) ) + { + current = 0.0f; + } + else + { + current = 1.0f; + } +} + } // unnamed namespace TextVisualPtr TextVisual::New( VisualFactoryCache& factoryCache, const Property::Map& properties ) @@ -495,9 +462,14 @@ void TextVisual::DoSetOnStage( Actor& actor ) // Create constraint for the animatable text's color Property with uTextColorAnimatable in the renderer. if( shaderTextColorIndex != Property::INVALID_INDEX ) { - Constraint constraint = Constraint::New( mImpl->mRenderer, shaderTextColorIndex, EqualToConstraint() ); - constraint.AddSource( Source( actor, mAnimatableTextColorPropertyIndex ) ); - constraint.Apply(); + Constraint colorConstraint = Constraint::New( mImpl->mRenderer, shaderTextColorIndex, TextColorConstraint ); + colorConstraint.AddSource( Source( actor, mAnimatableTextColorPropertyIndex ) ); + colorConstraint.Apply(); + + // Make zero if the alpha value of text color is zero to skip rendering text + Constraint opacityConstraint = Constraint::New< float >( mImpl->mRenderer, Dali::DevelRenderer::Property::OPACITY, OpacityConstraint ); + opacityConstraint.AddSource( Source( actor, mAnimatableTextColorPropertyIndex ) ); + opacityConstraint.Apply(); } } @@ -727,8 +699,6 @@ void TextVisual::UpdateRenderer() mImpl->mFlags &= ~Impl::IS_ATLASING_APPLIED; - Vector4 atlasRect = FULL_TEXTURE_RECT; - mImpl->mRenderer.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, atlasRect ); mImpl->mRenderer.RegisterProperty( "uHasMultipleTextColors", static_cast( hasMultipleTextColors ) ); mImpl->mRenderer.SetProperty( Renderer::Property::BLEND_MODE, BlendMode::ON);