Fix text color issue 93/183793/4
authorHeeyong Song <heeyong.song@samsung.com>
Wed, 11 Jul 2018 06:20:43 +0000 (15:20 +0900)
committerAdeel Kazmi <adeel.kazmi@samsung.com>
Tue, 17 Jul 2018 15:30:17 +0000 (16:30 +0100)
- Alpha values are pre-multiplied in all text cases. Don't multiply alpha in text shaders.
- Make Renderer's opacity 0 only if a text color's alpha is zero to skip rendering

Change-Id: Ie27ecf23d5b38a2234466ba4963a4a04103b5a45

automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp
dali-toolkit/internal/text/text-scroller.cpp
dali-toolkit/internal/visuals/text/text-visual.cpp

index e0daf86..db4f6bd 100644 (file)
@@ -1135,6 +1135,29 @@ int UtcDaliToolkitTextLabelColorComponents(void)
   DALI_TEST_EQUALS( label.GetProperty< Vector4 >( TextLabel::Property::TEXT_COLOR ), Vector4( 0.0f, 0.0f, 1.0f, 0.6f ), TEST_LOCATION );
   DALI_TEST_EQUALS( label.GetProperty< Vector4 >( TextLabel::Property::UNUSED_PROPERTY_TEXT_COLOR ), Vector4( 0.0f, 0.0f, 1.0f, 0.6f ), TEST_LOCATION );
 
   DALI_TEST_EQUALS( label.GetProperty< Vector4 >( TextLabel::Property::TEXT_COLOR ), Vector4( 0.0f, 0.0f, 1.0f, 0.6f ), TEST_LOCATION );
   DALI_TEST_EQUALS( label.GetProperty< Vector4 >( TextLabel::Property::UNUSED_PROPERTY_TEXT_COLOR ), Vector4( 0.0f, 0.0f, 1.0f, 0.6f ), TEST_LOCATION );
 
+  // Test a transparent text - Rendering should be skipped.
+  label.SetProperty( TextLabel::Property::TEXT, "Hello world Hello world" );
+  label.SetProperty( TextLabel::Property::TEXT_COLOR, Color::BLUE );
+
+  Stage::GetCurrent().Add( label );
+
+  TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+  drawTrace.Enable( true );
+
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_EQUALS( drawTrace.FindMethod( "DrawArrays" ), true, TEST_LOCATION );  // Should be rendered
+
+  label.SetProperty( TextLabel::Property::TEXT_COLOR, Color::TRANSPARENT );
+
+  drawTrace.Reset();
+
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_EQUALS( drawTrace.FindMethod( "DrawArrays" ), false, TEST_LOCATION ); // Rendering should be skipped
+
   END_TEST;
 }
 
   END_TEST;
 }
 
@@ -1287,4 +1310,4 @@ int UtcDaliToolkitTextlabelVerticalLineAlignment(void)
   DALI_TEST_EQUALS( label.GetProperty< int >( DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT ), static_cast< int >( Toolkit::DevelText::VerticalLineAlignment::BOTTOM ), TEST_LOCATION );
 
   END_TEST;
   DALI_TEST_EQUALS( label.GetProperty< int >( DevelTextLabel::Property::VERTICAL_LINE_ALIGNMENT ), static_cast< int >( Toolkit::DevelText::VerticalLineAlignment::BOTTOM ), TEST_LOCATION );
 
   END_TEST;
-}
\ No newline at end of file
+}
index e6da930..4ca011e 100644 (file)
@@ -80,7 +80,6 @@ const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
   uniform sampler2D sTexture;\n
   uniform lowp vec4 uColor;\n
   uniform lowp vec3 mixColor;\n
   uniform sampler2D sTexture;\n
   uniform lowp vec4 uColor;\n
   uniform lowp vec3 mixColor;\n
-  uniform lowp float preMultipliedAlpha;\n
   \n
   void main()\n
   {\n
   \n
   void main()\n
   {\n
index eb2dc04..c6309f1 100755 (executable)
@@ -109,7 +109,6 @@ const char* FRAGMENT_SHADER_SINGLE_COLOR_TEXT = DALI_COMPOSE_SHADER(
   uniform lowp vec4 uTextColorAnimatable;\n
   uniform lowp vec4 uColor;\n
   uniform lowp vec3 mixColor;\n
   uniform lowp vec4 uTextColorAnimatable;\n
   uniform lowp vec4 uColor;\n
   uniform lowp vec3 mixColor;\n
-  uniform lowp float preMultipliedAlpha;\n
   \n
   void main()\n
   {\n
   \n
   void main()\n
   {\n
@@ -125,12 +124,10 @@ const char* FRAGMENT_SHADER_MULTI_COLOR_TEXT = DALI_COMPOSE_SHADER(
   uniform sampler2D sTexture;\n
   uniform lowp vec4 uColor;\n
   uniform lowp vec3 mixColor;\n
   uniform sampler2D sTexture;\n
   uniform lowp vec4 uColor;\n
   uniform lowp vec3 mixColor;\n
-  uniform lowp float preMultipliedAlpha;\n
   \n
   void main()\n
   {\n
     mediump vec4 textTexture = texture2D( sTexture, vTexCoord );\n
   \n
   void main()\n
   {\n
     mediump vec4 textTexture = texture2D( sTexture, vTexCoord );\n
-    textTexture.rgb *= mix( 1.0, textTexture.a, preMultipliedAlpha );\n
 
     gl_FragColor = textTexture * uColor * vec4( mixColor, 1.0 );
   }\n
 
     gl_FragColor = textTexture * uColor * vec4( mixColor, 1.0 );
   }\n
@@ -143,7 +140,6 @@ const char* FRAGMENT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE = DALI_COMPOSE_SHADER(
   uniform lowp vec4 uTextColorAnimatable;\n
   uniform lowp vec4 uColor;\n
   uniform lowp vec3 mixColor;\n
   uniform lowp vec4 uTextColorAnimatable;\n
   uniform lowp vec4 uColor;\n
   uniform lowp vec3 mixColor;\n
-  uniform lowp float preMultipliedAlpha;\n
   \n
   void main()\n
   {\n
   \n
   void main()\n
   {\n
@@ -161,13 +157,11 @@ const char* FRAGMENT_SHADER_MULTI_COLOR_TEXT_WITH_STYLE = DALI_COMPOSE_SHADER(
   uniform sampler2D sStyle;\n
   uniform lowp vec4 uColor;\n
   uniform lowp vec3 mixColor;\n
   uniform sampler2D sStyle;\n
   uniform lowp vec4 uColor;\n
   uniform lowp vec3 mixColor;\n
-  uniform lowp float preMultipliedAlpha;\n
   \n
   void main()\n
   {\n
     mediump vec4 textTexture = texture2D( sTexture, vTexCoord );\n
     mediump vec4 styleTexture = texture2D( sStyle, vTexCoord );\n
   \n
   void main()\n
   {\n
     mediump vec4 textTexture = texture2D( sTexture, vTexCoord );\n
     mediump vec4 styleTexture = texture2D( sStyle, vTexCoord );\n
-    textTexture.rgb *= mix( 1.0, textTexture.a, preMultipliedAlpha );\n
 
     // Draw the text as overlay above the style
     gl_FragColor = ( textTexture + styleTexture * ( 1.0 - textTexture.a ) ) * uColor * vec4( mixColor, 1.0 );\n
 
     // Draw the text as overlay above the style
     gl_FragColor = ( textTexture + styleTexture * ( 1.0 - textTexture.a ) ) * uColor * vec4( mixColor, 1.0 );\n
@@ -181,7 +175,6 @@ const char* FRAGMENT_SHADER_SINGLE_COLOR_TEXT_WITH_EMOJI = DALI_COMPOSE_SHADER(
   uniform lowp vec4 uTextColorAnimatable;\n
   uniform lowp vec4 uColor;\n
   uniform lowp vec3 mixColor;\n
   uniform lowp vec4 uTextColorAnimatable;\n
   uniform lowp vec4 uColor;\n
   uniform lowp vec3 mixColor;\n
-  uniform lowp float preMultipliedAlpha;\n
   \n
   void main()\n
   {\n
   \n
   void main()\n
   {\n
@@ -192,7 +185,7 @@ const char* FRAGMENT_SHADER_SINGLE_COLOR_TEXT_WITH_EMOJI = DALI_COMPOSE_SHADER(
     // 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
     // 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 * vec4( mixColor, 1.0 );\n
 
     // Draw the text as overlay above the style
     gl_FragColor = textTexture * uColor * vec4( mixColor, 1.0 );\n
@@ -208,7 +201,6 @@ const char* FRAGMENT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE_AND_EMOJI = DALI_COMPOS
   uniform lowp vec4 uTextColorAnimatable;\n
   uniform lowp vec4 uColor;\n
   uniform lowp vec3 mixColor;\n
   uniform lowp vec4 uTextColorAnimatable;\n
   uniform lowp vec4 uColor;\n
   uniform lowp vec3 mixColor;\n
-  uniform lowp float preMultipliedAlpha;\n
   \n
   void main()\n
   {\n
   \n
   void main()\n
   {\n
@@ -220,7 +212,7 @@ const char* FRAGMENT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE_AND_EMOJI = DALI_COMPOS
     // 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
     // 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 * vec4( mixColor, 1.0 );\n
 
     // Draw the text as overlay above the style
     gl_FragColor = ( textTexture + styleTexture * ( 1.0 - textTexture.a ) ) * uColor * vec4( mixColor, 1.0 );\n
@@ -308,7 +300,11 @@ void TextColorConstraint( Vector4& current, const PropertyInputContainer& inputs
 
 void OpacityConstraint( float& current, const PropertyInputContainer& inputs )
 {
 
 void OpacityConstraint( float& current, const PropertyInputContainer& inputs )
 {
-  current = inputs[0]->GetVector4().a;
+  // Make zero if the alpha value of text color is zero to skip rendering text
+  if( EqualsZero( inputs[0]->GetVector4().a ) )
+  {
+    current = 0.0f;
+  }
 }
 
 } // unnamed namespace
 }
 
 } // unnamed namespace
@@ -466,6 +462,7 @@ void TextVisual::DoSetOnStage( Actor& actor )
       colorConstraint.AddSource( Source( actor, mAnimatableTextColorPropertyIndex ) );
       colorConstraint.Apply();
 
       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();
       Constraint opacityConstraint = Constraint::New< float >( mImpl->mRenderer, Dali::DevelRenderer::Property::OPACITY, OpacityConstraint );
       opacityConstraint.AddSource( Source( actor, mAnimatableTextColorPropertyIndex ) );
       opacityConstraint.Apply();