Merge "Replace visual opacity with Renderer's opacity" into devel/master
authorHeeyong Song <heeyong.song@samsung.com>
Thu, 22 Mar 2018 06:56:14 +0000 (06:56 +0000)
committerGerrit Code Review <gerrit@review.ap-northeast-2.compute.internal>
Thu, 22 Mar 2018 06:56:14 +0000 (06:56 +0000)
1  2 
dali-toolkit/internal/visuals/text/text-visual.cpp

@@@ -20,6 -20,7 +20,7 @@@
  
  // EXTERNAL INCLUDES
  #include <dali/public-api/animation/constraints.h>
+ #include <dali/devel-api/rendering/renderer-devel.h>
  #include <dali/devel-api/text-abstraction/text-abstraction-definitions.h>
  
  // INTERNAL HEADER
@@@ -106,44 -107,36 +107,32 @@@ const char* FRAGMENT_SHADER_SINGLE_COLO
    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
 +    mediump vec4 textTexture = texture2D( sTexture, vTexCoord );\n
      textTexture.rgb *= mix( 1.0, textTexture.a, preMultipliedAlpha );\n
  
-     gl_FragColor = textTexture * uColor * visualMixColor();
+     gl_FragColor = textTexture * uColor * vec4( mixColor, 1.0 );
    }\n
  );
  
@@@ -152,23 -145,19 +141,17 @@@ const char* FRAGMENT_SHADER_SINGLE_COLO
    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 - textTexture ) ) * uColor * vec4( mixColor, 1.0 );\n
    }\n
  );
  
@@@ -176,24 -165,20 +159,18 @@@ const char* FRAGMENT_SHADER_MULTI_COLOR
    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
 +    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 * visualMixColor();\n
+     gl_FragColor = ( textTexture + styleTexture * ( 1.0 - textTexture.a ) ) * uColor * vec4( mixColor, 1.0 );\n
    }\n
  );
  
@@@ -202,20 -187,16 +179,14 @@@ const char* FRAGMENT_SHADER_SINGLE_COLO
    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).
      textTexture.rgb = mix( textTexture.rgb, uTextColorAnimatable.rgb, vstep * maskTexture ) * mix( 1.0, textTexture.a, preMultipliedAlpha );\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
  );
  
@@@ -235,21 -216,17 +206,15 @@@ const char* FRAGMENT_SHADER_SINGLE_COLO
    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).
      textTexture.rgb = mix( textTexture.rgb, uTextColorAnimatable.rgb, vstep * maskTexture * ( 1.0 - uHasMultipleTextColors ) ) * mix( 1.0, textTexture.a, preMultipliedAlpha );\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
  );
  
@@@ -332,6 -309,11 +297,11 @@@ Dali::Property::Index StringKeyToIndexK
    return result;
  }
  
+ void OpacityConstraint( float& current, const PropertyInputContainer& inputs )
+ {
+   current = inputs[0]->GetVector4().a;
+ }
  } // unnamed namespace
  
  TextVisualPtr TextVisual::New( VisualFactoryCache& factoryCache, const Property::Map& properties )
@@@ -483,9 -465,13 +453,13 @@@ void TextVisual::DoSetOnStage( Actor& a
      // Create constraint for the animatable text's color Property with uTextColorAnimatable in the renderer.
      if( shaderTextColorIndex != Property::INVALID_INDEX )
      {
-       Constraint constraint = Constraint::New<Vector4>( mImpl->mRenderer, shaderTextColorIndex, EqualToConstraint() );
-       constraint.AddSource( Source( actor, mAnimatableTextColorPropertyIndex ) );
-       constraint.Apply();
+       Constraint colorConstraint = Constraint::New<Vector4>( mImpl->mRenderer, shaderTextColorIndex, EqualToConstraint() );
+       colorConstraint.AddSource( Source( actor, mAnimatableTextColorPropertyIndex ) );
+       colorConstraint.Apply();
+       Constraint opacityConstraint = Constraint::New< float >( mImpl->mRenderer, Dali::DevelRenderer::Property::OPACITY, OpacityConstraint );
+       opacityConstraint.AddSource( Source( actor, mAnimatableTextColorPropertyIndex ) );
+       opacityConstraint.Apply();
      }
    }
  
@@@ -715,6 -701,8 +689,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<float>( hasMultipleTextColors ) );
  
        mImpl->mRenderer.SetProperty( Renderer::Property::BLEND_MODE, BlendMode::ON);