From: Victor Cebollada Date: Tue, 15 Aug 2017 14:59:20 +0000 (+0100) Subject: Fix for multi-language support. X-Git-Tag: dali_1.2.53~1^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=dd0c9395ff85899332844c0acfa604fce5011b6a Fix for multi-language support. * Fixes the issue when a font doesn't support all the glyphs of the script. i.e a font validated for the CJK script may contain glyphs for the chinese language but not for the Japanese. Uses the new IsCharacterSupportedByFont() method added to the font client. Change-Id: I5f6e125298605d170de2d31f7ee7fc18585790f4 Signed-off-by: Victor Cebollada --- diff --git a/dali-toolkit/internal/text/multi-language-support-impl.cpp b/dali-toolkit/internal/text/multi-language-support-impl.cpp index fd1d8e4..e88a286 100644 --- a/dali-toolkit/internal/text/multi-language-support-impl.cpp +++ b/dali-toolkit/internal/text/multi-language-support-impl.cpp @@ -494,7 +494,7 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, description.path.c_str() ); } #endif - if (script == TextAbstraction::UNKNOWN) + if( script == TextAbstraction::UNKNOWN ) { script = TextAbstraction::LATIN; } @@ -504,10 +504,11 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, // Check first in the cache of default fonts per script and size. - DefaultFonts* defaultFonts = *( defaultFontPerScriptCacheBuffer + script ); FontId cachedDefaultFontId = 0u; + DefaultFonts* defaultFonts = *( defaultFontPerScriptCacheBuffer + script ); if( NULL != defaultFonts ) { + // This cache stores fall-back fonts. cachedDefaultFontId = defaultFonts->FindFont( fontClient, currentFontDescription, currentFontPointSize ); @@ -519,6 +520,12 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, // The font is valid if it matches with the default one for the current script and size and it's different than zero. isValidFont = isValidCachedDefaultFont && ( fontId == cachedDefaultFontId ); + if( isValidFont ) + { + // Check if the font supports the character. + isValidFont = fontClient.IsCharacterSupportedByFont( fontId, character ); + } + bool isCommonScript = false; bool isEmojiScript = TextAbstraction::EMOJI == script; @@ -537,7 +544,6 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, currentFontRun.fontId = fontId; } - // If the given font is not valid, it means either: // - there is no cached font for the current script yet or, // - the user has set a different font than the default one for the current script or, @@ -578,21 +584,31 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, if( NULL != validateFontsPerScript ) { + // This cache stores valid fonts set by the user. isValidFont = validateFontsPerScript->IsValidFont( fontId ); + + // It may happen that a validated font for a script doesn't have all the glyphs for that script. + // i.e a font validated for the CJK script may contain glyphs for the chinese language but not for the Japanese. + if( isValidFont ) + { + // Checks if the current character is supported by the font is needed. + isValidFont = fontClient.IsCharacterSupportedByFont( fontId, character ); + } } if( !isValidFont ) // (2) { - // Use the font client to validate the font. - const GlyphIndex glyphIndex = fontClient.GetGlyphIndex( fontId, character ); + // The selected font is not stored in any cache. - // The font is valid if there is a glyph for that character. - isValidFont = 0u != glyphIndex; + // Checks if the current character is supported by the selected font. + isValidFont = fontClient.IsCharacterSupportedByFont( fontId, character ); // Emojis are present in many monochrome fonts; prefer color by default. if( isValidFont && isEmojiScript ) { + const GlyphIndex glyphIndex = fontClient.GetGlyphIndex( fontId, character ); + // For color emojis, the font is valid if the glyph is a color glyph (the bitmap is RGBA). isValidFont = fontClient.IsColorGlyph( fontId, glyphIndex ); } @@ -610,12 +626,19 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, validateFontsPerScript->mValidFonts.PushBack( fontId ); } - if( !isValidFont ) // (3) + if( !isValidFont && ( fontId != cachedDefaultFontId ) ) // (3) { - // The given font has not been validated. + // The selected font by the user or the platform's default font has failed to validate the character. + // Checks if the previously discarted cached default font supports the character. + bool isValidCachedFont = false; if( isValidCachedDefaultFont ) { + isValidCachedFont = fontClient.IsCharacterSupportedByFont( cachedDefaultFontId, character ); + } + + if( isValidCachedFont ) + { // Use the cached default font for the script if there is one. fontId = cachedDefaultFontId; } diff --git a/dali-toolkit/internal/text/multi-language-support-impl.h b/dali-toolkit/internal/text/multi-language-support-impl.h index afbeb23..c9a7d30 100644 --- a/dali-toolkit/internal/text/multi-language-support-impl.h +++ b/dali-toolkit/internal/text/multi-language-support-impl.h @@ -80,7 +80,7 @@ struct DefaultFonts struct CacheItem { TextAbstraction::FontDescription description; - FontId fontId ; + FontId fontId; }; /**