X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Fmulti-language-support-impl.cpp;h=c596045596baeab1ffd5cbfe081f059b8c8eb1d0;hp=051b35a277c05914b2baffb29f27f53b101acbf0;hb=1812ba73f9c6639bb9420a9126b499ec3873d672;hpb=b9766132aa8325588733797031076ea5ee825369 diff --git a/dali-toolkit/internal/text/multi-language-support-impl.cpp b/dali-toolkit/internal/text/multi-language-support-impl.cpp index 051b35a..c596045 100644 --- a/dali-toolkit/internal/text/multi-language-support-impl.cpp +++ b/dali-toolkit/internal/text/multi-language-support-impl.cpp @@ -23,12 +23,13 @@ #include #include #include +#include // INTERNAL INCLUDES -#include -#include -#include -#include +#include +#include +#include +#include namespace Dali { @@ -41,6 +42,8 @@ namespace #if defined(DEBUG_ENABLED) Debug::Filter* gLogFilter = Debug::Filter::New(Debug::Concise, true, "LOG_MULTI_LANGUAGE_SUPPORT"); #endif + +const Dali::Toolkit::Text::Character UTF32_A = 0x0041; } namespace Text @@ -132,13 +135,13 @@ Script GetScript( Length index, */ bool IsValidForAllScripts( Character character ) { - return ( IsWhiteSpace( character ) || - IsZeroWidthNonJoiner( character ) || - IsZeroWidthJoiner( character ) || - IsZeroWidthSpace( character ) || - IsLeftToRightMark( character ) || - IsRightToLeftMark( character ) || - IsThinSpace( character ) ); + return ( TextAbstraction::IsWhiteSpace( character ) || + TextAbstraction::IsZeroWidthNonJoiner( character ) || + TextAbstraction::IsZeroWidthJoiner( character ) || + TextAbstraction::IsZeroWidthSpace( character ) || + TextAbstraction::IsLeftToRightMark( character ) || + TextAbstraction::IsRightToLeftMark( character ) || + TextAbstraction::IsThinSpace( character ) ); } bool ValidateFontsPerScript::FindValidFont( FontId fontId ) const @@ -292,14 +295,14 @@ void MultilanguageSupport::SetScripts( const Vector& text, } // Get the script of the character. - Script script = GetCharacterScript( character ); + Script script = TextAbstraction::GetCharacterScript( character ); // Check if it is the first character of a paragraph. if( firstValidScript && ( TextAbstraction::UNKNOWN != script ) ) { // Sets the direction of the first valid script. - isParagraphRTL = ( TextAbstraction::ARABIC == script ); + isParagraphRTL = TextAbstraction::IsRightToLeftScript( script ); firstValidScript = false; } @@ -307,7 +310,7 @@ void MultilanguageSupport::SetScripts( const Vector& text, { // Current run needs to be stored and a new one initialized. - if( isParagraphRTL != ( TextAbstraction::ARABIC == script ) ) + if( isParagraphRTL != TextAbstraction::IsRightToLeftScript( script ) ) { // Current script has different direction than the first script of the paragraph. // All the previously skipped characters need to be added to the previous script before it's stored. @@ -447,12 +450,33 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, { // Check in the valid fonts cache. ValidateFontsPerScript* validateFontsPerScript = *( validFontsPerScriptCacheBuffer + script ); + + if( NULL == validateFontsPerScript ) + { + validateFontsPerScript = new ValidateFontsPerScript(); + + mValidFontsPerScriptCache.PushBack( validateFontsPerScript ); + validFontsPerScriptCacheBuffer = mValidFontsPerScriptCache.Begin(); + } + if( NULL != validateFontsPerScript ) { if( !validateFontsPerScript->FindValidFont( fontId ) ) { // Use the font client to validate the font. - const GlyphIndex glyphIndex = fontClient.GetGlyphIndex( fontId, character ); + GlyphIndex glyphIndex = fontClient.GetGlyphIndex( fontId, character ); + + // Emojis are present in many monochrome fonts; prefer color by default. + if( TextAbstraction::EMOJI == script && + 0u != glyphIndex ) + { + BufferImage bitmap = fontClient.CreateBitmap( fontId, glyphIndex ); + if( bitmap && + Pixel::BGRA8888 != bitmap.GetPixelFormat() ) + { + glyphIndex = 0; + } + } if( 0u == glyphIndex ) { @@ -469,30 +493,8 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, } } } - else - { - // Use the font client to validate the font. - const GlyphIndex glyphIndex = fontClient.GetGlyphIndex( fontId, character ); - - if( 0u == glyphIndex ) - { - // Get the point size of the current font. It will be used to get a default font id. - pointSize = fontClient.GetPointSize( fontId ); - - // The font is not valid. Set to zero and a default one will be set. - fontId = 0u; - } - else - { - // Add the font to the valid font cache. - validateFontsPerScript = new ValidateFontsPerScript(); - *( validFontsPerScriptCacheBuffer + script ) = validateFontsPerScript; - - validateFontsPerScript->mValidFonts.PushBack( fontId ); - } - } } - } + } // !isDefault // The font has not been validated. Find a default one. if( 0u == fontId ) @@ -503,8 +505,21 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, // If the cache has not a default font, get one from the font client. if( 0u == fontId ) { + // Emojis are present in many monochrome fonts; prefer color by default. + bool preferColor = ( TextAbstraction::EMOJI == script ); + // Find a default font. - fontId = fontClient.FindDefaultFont( character, pointSize ); + fontId = fontClient.FindDefaultFont( character, pointSize, preferColor ); + + // If the system does not support a suitable font, fallback to Latin + if( 0u == fontId ) + { + fontId = *( defaultFontPerScriptCacheBuffer + TextAbstraction::LATIN ); + } + if( 0u == fontId ) + { + fontId = fontClient.FindDefaultFont( UTF32_A, pointSize ); + } #ifdef DEBUG_ENABLED Dali::TextAbstraction::FontDescription description;