From: Adeel Kazmi Date: Fri, 16 Feb 2018 15:30:21 +0000 (+0000) Subject: Merge "Text background support for TextLabel" into devel/master X-Git-Tag: dali_1.3.13~5 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=86824206ffe1f9d1ee92ad1fbdd209c8155cd437;hp=71f0932efe2c993f7866949767019d170ced9938 Merge "Text background support for TextLabel" into devel/master --- diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-MultiLanguage.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-MultiLanguage.cpp index c3f0b9b..dbb0e94 100644 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-MultiLanguage.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-MultiLanguage.cpp @@ -238,7 +238,7 @@ bool ScriptsTest( const ScriptsData& data ) if( scriptRun1.script != scriptRun2.script ) { - tet_printf("ScriptsTest FAIL: different script. %s, should be %s\n", TextAbstraction::ScriptName[scriptRun1.script], TextAbstraction::ScriptName[scriptRun2.script] ); + tet_printf("ScriptsTest FAIL: script index: %u, different script. %s, should be %s\n", index, TextAbstraction::ScriptName[scriptRun1.script], TextAbstraction::ScriptName[scriptRun2.script] ); return false; } } @@ -959,7 +959,7 @@ int UtcDaliTextMultiLanguageSetScripts(void) 0u, 3u, }, - TextAbstraction::LATIN + TextAbstraction::UNKNOWN }; ScriptRun scriptRun1101 = { @@ -967,7 +967,7 @@ int UtcDaliTextMultiLanguageSetScripts(void) 3u, 3u, }, - TextAbstraction::LATIN + TextAbstraction::UNKNOWN }; ScriptRun scriptRun1102 = { @@ -983,7 +983,7 @@ int UtcDaliTextMultiLanguageSetScripts(void) 25u, 3u, }, - TextAbstraction::LATIN + TextAbstraction::UNKNOWN }; ScriptRun scriptRun1104 = { @@ -991,7 +991,7 @@ int UtcDaliTextMultiLanguageSetScripts(void) 28u, 3u, }, - TextAbstraction::LATIN + TextAbstraction::UNKNOWN }; ScriptRun scriptRun1105 = { @@ -1007,7 +1007,7 @@ int UtcDaliTextMultiLanguageSetScripts(void) 46u, 2u, }, - TextAbstraction::LATIN + TextAbstraction::UNKNOWN }; ScriptRun scriptRun1107 = { @@ -1015,7 +1015,7 @@ int UtcDaliTextMultiLanguageSetScripts(void) 48u, 2u, }, - TextAbstraction::LATIN + TextAbstraction::UNKNOWN }; ScriptRun scriptRun1108 = { @@ -1023,7 +1023,7 @@ int UtcDaliTextMultiLanguageSetScripts(void) 50u, 2u, }, - TextAbstraction::LATIN + TextAbstraction::UNKNOWN }; scriptRuns11.PushBack( scriptRun1100 ); scriptRuns11.PushBack( scriptRun1101 ); @@ -1043,7 +1043,7 @@ int UtcDaliTextMultiLanguageSetScripts(void) 0u, 3u, }, - TextAbstraction::LATIN + TextAbstraction::UNKNOWN }; ScriptRun scriptRun1201 = { @@ -1051,7 +1051,7 @@ int UtcDaliTextMultiLanguageSetScripts(void) 3u, 3u, }, - TextAbstraction::LATIN + TextAbstraction::UNKNOWN }; ScriptRun scriptRun1202 = { @@ -1059,7 +1059,7 @@ int UtcDaliTextMultiLanguageSetScripts(void) 6u, 3u, }, - TextAbstraction::LATIN + TextAbstraction::UNKNOWN }; ScriptRun scriptRun1203 = { @@ -1067,7 +1067,7 @@ int UtcDaliTextMultiLanguageSetScripts(void) 9u, 2u, }, - TextAbstraction::LATIN + TextAbstraction::UNKNOWN }; scriptRuns12.PushBack( scriptRun1200 ); scriptRuns12.PushBack( scriptRun1201 ); @@ -1081,7 +1081,7 @@ int UtcDaliTextMultiLanguageSetScripts(void) 0u, 4u, }, - TextAbstraction::LATIN // An unknown script is transformed to LATIN + TextAbstraction::UNKNOWN }; scriptRuns13.PushBack( scriptRun1301 ); diff --git a/dali-toolkit/internal/text/multi-language-support-impl.cpp b/dali-toolkit/internal/text/multi-language-support-impl.cpp index 990d0ce..7570e04 100644 --- a/dali-toolkit/internal/text/multi-language-support-impl.cpp +++ b/dali-toolkit/internal/text/multi-language-support-impl.cpp @@ -101,11 +101,11 @@ MultilanguageSupport::MultilanguageSupport() { // Initializes the default font cache to zero (invalid font). // Reserves space to cache the default fonts and access them with the script as an index. - mDefaultFontPerScriptCache.Resize( TextAbstraction::UNKNOWN, NULL ); + mDefaultFontPerScriptCache.Resize( TextAbstraction::UNKNOWN + 1, NULL ); // Initializes the valid fonts cache to NULL (no valid fonts). // Reserves space to cache the valid fonts and access them with the script as an index. - mValidFontsPerScriptCache.Resize( TextAbstraction::UNKNOWN, NULL ); + mValidFontsPerScriptCache.Resize( TextAbstraction::UNKNOWN + 1, NULL ); } MultilanguageSupport::~MultilanguageSupport() @@ -254,10 +254,6 @@ void MultilanguageSupport::SetScripts( const Vector& text, currentScriptRun.characterRun.numberOfCharacters += numberOfAllScriptCharacters; // Store the script run. - if( TextAbstraction::UNKNOWN == currentScriptRun.script ) - { - currentScriptRun.script = TextAbstraction::LATIN; - } scripts.Insert( scripts.Begin() + scriptIndex, currentScriptRun ); ++scriptIndex; @@ -320,7 +316,6 @@ void MultilanguageSupport::SetScripts( const Vector& text, else if( ( TextAbstraction::UNKNOWN == currentScriptRun.script ) && ( TextAbstraction::EMOJI == script ) ) { - currentScriptRun.script = TextAbstraction::LATIN; currentScriptRun.characterRun.numberOfCharacters += numberOfAllScriptCharacters; numberOfAllScriptCharacters = 0u; } @@ -357,12 +352,6 @@ void MultilanguageSupport::SetScripts( const Vector& text, if( 0u != currentScriptRun.characterRun.numberOfCharacters ) { - if( TextAbstraction::UNKNOWN == currentScriptRun.script ) - { - // There are only white spaces in the last script. Set the latin script. - currentScriptRun.script = TextAbstraction::LATIN; - } - // Store the last run. scripts.Insert( scripts.Begin() + scriptIndex, currentScriptRun ); ++scriptIndex; @@ -490,10 +479,6 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, description.path.c_str() ); } #endif - if( script == TextAbstraction::UNKNOWN ) - { - script = TextAbstraction::LATIN; - } // Validate whether the current character is supported by the given font. bool isValidFont = false; @@ -670,18 +655,21 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, fontId = fontClient.FindDefaultFont( UTF32_A, currentFontPointSize ); } - // Cache the font. - if( NULL == defaultFontsPerScript ) + if ( script != TextAbstraction::UNKNOWN ) { - defaultFontsPerScript = *( defaultFontPerScriptCacheBuffer + script ); - + // Cache the font if it is not an unknown script if( NULL == defaultFontsPerScript ) { - defaultFontsPerScript = new DefaultFonts(); - *( defaultFontPerScriptCacheBuffer + script ) = defaultFontsPerScript; + defaultFontsPerScript = *( defaultFontPerScriptCacheBuffer + script ); + + if( NULL == defaultFontsPerScript ) + { + defaultFontsPerScript = new DefaultFonts(); + *( defaultFontPerScriptCacheBuffer + script ) = defaultFontsPerScript; + } } + defaultFontsPerScript->Cache( currentFontDescription, fontId ); } - defaultFontsPerScript->Cache( currentFontDescription, fontId ); } } // !isValidFont (3) } // !isValidFont (2) diff --git a/dali-toolkit/internal/visuals/text/text-visual.cpp b/dali-toolkit/internal/visuals/text/text-visual.cpp index ca3d296..d1ad16c 100755 --- a/dali-toolkit/internal/visuals/text/text-visual.cpp +++ b/dali-toolkit/internal/visuals/text/text-visual.cpp @@ -685,17 +685,21 @@ void TextVisual::UpdateRenderer() const Vector4* const colorsBuffer = mController->GetTextModel()->GetColors(); bool hasMultipleTextColors = ( NULL != colorsBuffer ); - // Check whether the text contains any emoji - bool containsEmoji = false; + // Check whether the text contains any color glyph + bool containsColorGlyph = false; - Text::ScriptRunIndex numberOfScripts = mController->GetTextModel()->GetNumberOfScripts(); - const Text::ScriptRun* scripts = mController->GetTextModel()->GetScriptRuns(); - for ( Text::ScriptRunIndex scriptIndex = 0u; scriptIndex < numberOfScripts; scriptIndex++ ) + TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); + const Text::GlyphInfo* const glyphsBuffer = mController->GetTextModel()->GetGlyphs(); + const Text::Length numberOfGlyphs = mController->GetTextModel()->GetNumberOfGlyphs(); + for ( Text::Length glyphIndex = 0; glyphIndex < numberOfGlyphs; glyphIndex++ ) { - const Text::ScriptRun& scriptRun = *( scripts + scriptIndex ); - if( TextAbstraction::EMOJI == scriptRun.script ) + // Retrieve the glyph's info. + const Text::GlyphInfo* const glyphInfo = glyphsBuffer + glyphIndex; + + // Whether the current glyph is a color one. + if( fontClient.IsColorGlyph( glyphInfo->fontId, glyphInfo->index ) ) { - containsEmoji = true; + containsColorGlyph = true; break; } } @@ -715,10 +719,10 @@ void TextVisual::UpdateRenderer() const bool styleEnabled = ( shadowEnabled || underlineEnabled || outlineEnabled || backgroundEnabled ); - TextureSet textureSet = GetTextTexture( relayoutSize, hasMultipleTextColors, containsEmoji, styleEnabled ); + TextureSet textureSet = GetTextTexture( relayoutSize, hasMultipleTextColors, containsColorGlyph, styleEnabled ); mImpl->mRenderer.SetTextures( textureSet ); - Shader shader = GetTextShader( mFactoryCache, hasMultipleTextColors, containsEmoji, styleEnabled ); + Shader shader = GetTextShader( mFactoryCache, hasMultipleTextColors, containsColorGlyph, styleEnabled ); mImpl->mRenderer.SetShader(shader); mImpl->mFlags &= ~Impl::IS_ATLASING_APPLIED; @@ -759,7 +763,7 @@ void TextVisual::RemoveTextureSet() } } -TextureSet TextVisual::GetTextTexture( const Vector2& size, bool hasMultipleTextColors, bool containsEmoji, bool styleEnabled ) +TextureSet TextVisual::GetTextTexture( const Vector2& size, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled ) { // Filter mode needs to be set to linear to produce better quality while scaling. Sampler sampler = Sampler::New(); @@ -768,7 +772,7 @@ TextureSet TextVisual::GetTextTexture( const Vector2& size, bool hasMultipleText TextureSet textureSet = TextureSet::New(); // Create RGBA texture if the text contains emojis or multiple text colors, otherwise L8 texture - Pixel::Format textPixelFormat = ( containsEmoji || hasMultipleTextColors ) ? Pixel::RGBA8888 : Pixel::L8; + Pixel::Format textPixelFormat = ( containsColorGlyph || hasMultipleTextColors ) ? Pixel::RGBA8888 : Pixel::L8; // Check the text direction Toolkit::DevelText::TextDirection::Type textDirection = mController->GetTextDirection(); @@ -805,7 +809,7 @@ TextureSet TextVisual::GetTextTexture( const Vector2& size, bool hasMultipleText textureSet.SetSampler( 1u, sampler ); } - if ( containsEmoji && !hasMultipleTextColors ) + if ( containsColorGlyph && !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, textDirection, Text::Typesetter::RENDER_MASK, false, Pixel::L8 ); @@ -832,7 +836,7 @@ TextureSet TextVisual::GetTextTexture( const Vector2& size, bool hasMultipleText return textureSet; } -Shader TextVisual::GetTextShader( VisualFactoryCache& factoryCache, bool hasMultipleTextColors, bool containsEmoji, bool styleEnabled ) +Shader TextVisual::GetTextShader( VisualFactoryCache& factoryCache, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled ) { Shader shader; @@ -858,7 +862,7 @@ Shader TextVisual::GetTextShader( VisualFactoryCache& factoryCache, bool hasMult factoryCache.SaveShader( VisualFactoryCache::TEXT_SHADER_MULTI_COLOR_TEXT_WITH_STYLE, shader ); } } - else if( !hasMultipleTextColors && !containsEmoji && !styleEnabled ) + else if( !hasMultipleTextColors && !containsColorGlyph && !styleEnabled ) { shader = factoryCache.GetShader( VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT ); if( !shader ) @@ -868,7 +872,7 @@ Shader TextVisual::GetTextShader( VisualFactoryCache& factoryCache, bool hasMult factoryCache.SaveShader( VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT, shader ); } } - else if( !hasMultipleTextColors && !containsEmoji && styleEnabled ) + else if( !hasMultipleTextColors && !containsColorGlyph && styleEnabled ) { shader = factoryCache.GetShader( VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE ); if( !shader ) @@ -878,7 +882,7 @@ Shader TextVisual::GetTextShader( VisualFactoryCache& factoryCache, bool hasMult factoryCache.SaveShader( VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE, shader ); } } - else if( !hasMultipleTextColors && containsEmoji && !styleEnabled ) + else if( !hasMultipleTextColors && containsColorGlyph && !styleEnabled ) { shader = factoryCache.GetShader( VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_EMOJI ); if( !shader ) @@ -888,7 +892,7 @@ Shader TextVisual::GetTextShader( VisualFactoryCache& factoryCache, bool hasMult factoryCache.SaveShader( VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_EMOJI, shader ); } } - else // if( !hasMultipleTextColors && containsEmoji && styleEnabled ) + else // if( !hasMultipleTextColors && containsColorGlyph && styleEnabled ) { shader = factoryCache.GetShader( VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE_AND_EMOJI ); if( !shader ) diff --git a/dali-toolkit/internal/visuals/text/text-visual.h b/dali-toolkit/internal/visuals/text/text-visual.h index 765b9bf..6fbf8ed 100644 --- a/dali-toolkit/internal/visuals/text/text-visual.h +++ b/dali-toolkit/internal/visuals/text/text-visual.h @@ -205,19 +205,19 @@ private: * Get the texture of the text for rendering. * @param[in] size The texture size. * @param[in] hasMultipleTextColors Whether the text contains multiple colors. - * @param[in] containsEmoji Whether the text contains emoji. + * @param[in] containsColorGlyph Whether the text contains color glyph. * @param[in] styleEnabled Whether the text contains any styles (e.g. shadow, underline, etc.). */ - TextureSet GetTextTexture( const Vector2& size, bool hasMultipleTextColors, bool containsEmoji, bool styleEnabled ); + TextureSet GetTextTexture( const Vector2& size, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled ); /** * Get the text rendering shader. * @param[in] factoryCache A pointer pointing to the VisualFactoryCache object * @param[in] hasMultipleTextColors Whether the text contains multiple colors. - * @param[in] containsEmoji Whether the text contains emoji. + * @param[in] containsColorGlyph Whether the text contains color glyph. * @param[in] styleEnabled Whether the text contains any styles (e.g. shadow, underline, etc.). */ - Shader GetTextShader( VisualFactoryCache& factoryCache, bool hasMultipleTextColors, bool containsEmoji, bool styleEnabled ); + Shader GetTextShader( VisualFactoryCache& factoryCache, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled ); /** * @brief Retrieve the text's controller.