// INTERNAL HEADER
#include <dali-toolkit/public-api/visuals/text-visual-properties.h>
+#include <dali-toolkit/devel-api/visuals/text-visual-properties-devel.h>
#include <dali-toolkit/public-api/visuals/visual-properties.h>
#include <dali-toolkit/devel-api/controls/control-depth-index-ranges.h>
#include <dali-toolkit/internal/visuals/image-atlas-manager.h>
#include <dali-toolkit/internal/text/text-effects-style.h>
#include <dali-toolkit/internal/text/script-run.h>
#include <dali-toolkit/internal/text/text-enumerations-impl.h>
+#include <dali-toolkit/devel-api/text/text-enumerations-devel.h>
namespace Dali
{
const char * const ENABLE_MARKUP_PROPERTY( "enableMarkup" );
const char * const SHADOW_PROPERTY( "shadow" );
const char * const UNDERLINE_PROPERTY( "underline" );
+const char * const OUTLINE_PROPERTY( "outline" );
const Vector4 FULL_TEXTURE_RECT( 0.f, 0.f, 1.f, 1.f );
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 float textTexture = texture2D( sTexture, texCoord ).r;\n
// Set the color of the text to what it is animated to.
- gl_FragColor = uTextColorAnimatable * textTexture * uColor * vec4( mixColor, opacity );
+ gl_FragColor = uTextColorAnimatable * textTexture * uColor * visualMixColor();
}\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
- gl_FragColor = textTexture * uColor * vec4( mixColor, opacity );
+ gl_FragColor = textTexture * uColor * visualMixColor();
}\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 vec4 styleTexture = texture2D( sStyle, texCoord );\n
// Draw the text as overlay above the style
- gl_FragColor = ( uTextColorAnimatable * textTexture + styleTexture * ( 1.0 - textTexture ) ) * uColor * vec4( mixColor, opacity );\n
+ gl_FragColor = ( uTextColorAnimatable * textTexture + styleTexture * ( 1.0 - textTexture ) ) * uColor * visualMixColor();\n
}\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
// Draw the text as overlay above the style
- gl_FragColor = ( textTexture + styleTexture * ( 1.0 - textTexture.a ) ) * uColor * vec4( mixColor, opacity );\n
+ gl_FragColor = ( textTexture + styleTexture * ( 1.0 - textTexture.a ) ) * uColor * visualMixColor();\n
}\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
// 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 );\n
+ 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 * vec4( mixColor, opacity );\n
+ gl_FragColor = textTexture * uColor * visualMixColor();\n
}\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
// 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 ) );\n
+ 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 * vec4( mixColor, opacity );\n
+ gl_FragColor = ( textTexture + styleTexture * ( 1.0 - textTexture.a ) ) * uColor * visualMixColor();\n
}\n
);
{
result = Toolkit::TextVisual::Property::UNDERLINE;
}
+ else if( stringKey == OUTLINE_PROPERTY )
+ {
+ result = Toolkit::DevelTextVisual::Property::OUTLINE;
+ }
return result;
}
GetUnderlineProperties( mController, value, Text::EffectStyle::DEFAULT );
map.Insert( Toolkit::TextVisual::Property::UNDERLINE, value );
+
+ GetOutlineProperties( mController, value, Text::EffectStyle::DEFAULT );
+ map.Insert( Toolkit::DevelTextVisual::Property::OUTLINE, value );
}
void TextVisual::DoCreateInstancePropertyMap( Property::Map& map ) const
mImpl->mRenderer = Renderer::New( geometry, shader );
mImpl->mRenderer.SetProperty( Dali::Renderer::Property::DEPTH_INDEX, Toolkit::DepthIndex::CONTENT );
+ // Enable the pre-multiplied alpha to improve the text quality
+ EnablePreMultipliedAlpha(true);
+
const Vector4& defaultColor = mController->GetTextModel()->GetDefaultColor();
Dali::Property::Index shaderTextColorIndex = mImpl->mRenderer.RegisterProperty( "uTextColorAnimatable", defaultColor );
SetUnderlineProperties( mController, propertyValue, Text::EffectStyle::DEFAULT );
break;
}
+ case Toolkit::DevelTextVisual::Property::OUTLINE:
+ {
+ SetOutlineProperties( mController, propertyValue, Text::EffectStyle::DEFAULT );
+ break;
+ }
}
}
}
// Nothing else to do if the relayout size is zero.
- ResourceReady();
+ ResourceReady( Toolkit::Visual::ResourceStatus::READY );
return;
}
const bool styleEnabled = ( shadowEnabled || underlineEnabled || outlineEnabled );
- TextureSet textureSet = GetTextTexture( relayoutSize, hasMultipleTextColors, containsEmoji, styleEnabled );
+ TextureSet textureSet = GetTextTexture( mImpl->mTransform.mSize, hasMultipleTextColors, containsEmoji, styleEnabled );
mImpl->mRenderer.SetTextures( textureSet );
Shader shader = GetTextShader( mFactoryCache, hasMultipleTextColors, containsEmoji, styleEnabled );
mImpl->mRenderer.RegisterProperty( "uHasMultipleTextColors", static_cast<float>( hasMultipleTextColors ) );
mImpl->mRenderer.SetProperty( Renderer::Property::BLEND_MODE, BlendMode::ON);
- mImpl->mRenderer.SetProperty( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true );
//Register transform properties
mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT );
control.AddRenderer( mImpl->mRenderer );
// Text rendered and ready to display
- ResourceReady();
+ ResourceReady( Toolkit::Visual::ResourceStatus::READY );
}
}
}
// Create RGBA texture if the text contains emojis or multiple text colors, otherwise L8 texture
Pixel::Format textPixelFormat = ( containsEmoji || hasMultipleTextColors ) ? Pixel::RGBA8888 : Pixel::L8;
+ // Check the text direction
+ Toolkit::DevelText::TextDirection::Type textDirection = mController->GetTextDirection();
+
// Create a texture for the text without any styles
- PixelData data = mTypesetter->Render( size, Text::Typesetter::RENDER_NO_STYLES, false, textPixelFormat );
+ PixelData data = mTypesetter->Render( size, textDirection, Text::Typesetter::RENDER_NO_STYLES, false, textPixelFormat );
// It may happen the image atlas can't handle a pixel data it exceeds the maximum size.
// In that case, create a texture. TODO: should tile the text.
if ( styleEnabled )
{
// Create RGBA texture for all the text styles (without the text itself)
- PixelData styleData = mTypesetter->Render( size, Text::Typesetter::RENDER_NO_TEXT, false, Pixel::RGBA8888 );
+ PixelData styleData = mTypesetter->Render( size, textDirection, Text::Typesetter::RENDER_NO_TEXT, false, Pixel::RGBA8888 );
Texture styleTexture = Texture::New( Dali::TextureType::TEXTURE_2D,
styleData.GetPixelFormat(),
if ( containsEmoji && !hasMultipleTextColors )
{
// Create a L8 texture as a mask to avoid color glyphs (e.g. emojis) to be affected by text color animation
- PixelData maskData = mTypesetter->Render( size, Text::Typesetter::RENDER_MASK, false, Pixel::L8 );
+ PixelData maskData = mTypesetter->Render( size, textDirection, Text::Typesetter::RENDER_MASK, false, Pixel::L8 );
Texture maskTexture = Texture::New( Dali::TextureType::TEXTURE_2D,
maskData.GetPixelFormat(),