From: Richard Huang Date: Thu, 8 Feb 2018 17:55:52 +0000 (+0000) Subject: [4.0] Stop caching fonts for unknown text script X-Git-Tag: submit/tizen_4.0/20180214.070807~2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=415f0b6d0ed9eafd6aef6bd9f75c0db29f7027da [4.0] Stop caching fonts for unknown text script Change-Id: I53ccb43e0c47137f90814be728ee71d6ca70be85 --- diff --git a/dali-toolkit/internal/text/multi-language-support-impl.cpp b/dali-toolkit/internal/text/multi-language-support-impl.cpp index a217b0a..723a343 100644 --- a/dali-toolkit/internal/text/multi-language-support-impl.cpp +++ b/dali-toolkit/internal/text/multi-language-support-impl.cpp @@ -102,11 +102,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 ); // Add custom font directory Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get(); @@ -269,10 +269,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; @@ -335,7 +331,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; } @@ -372,12 +367,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; @@ -505,10 +494,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; @@ -685,18 +670,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 f652e16..542a10f 100755 --- a/dali-toolkit/internal/visuals/text/text-visual.cpp +++ b/dali-toolkit/internal/visuals/text/text-visual.cpp @@ -686,17 +686,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 ); - 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; // Create a texture for the text without any styles PixelData data = mTypesetter->Render( size, Text::Typesetter::RENDER_NO_STYLES, false, textPixelFormat ); @@ -802,7 +806,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, Text::Typesetter::RENDER_MASK, false, Pixel::L8 ); @@ -829,7 +833,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; @@ -855,7 +859,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 ) @@ -865,7 +869,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 ) @@ -875,7 +879,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 ) @@ -885,7 +889,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.