Prefer color Emoji by default
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / multi-language-support-impl.cpp
index 42c9e84..4c68a74 100644 (file)
 #include <dali/integration-api/debug.h>
 #include <dali/public-api/adaptor-framework/singleton-service.h>
 #include <dali/public-api/text-abstraction/font-client.h>
+#include <dali/public-api/text-abstraction/script.h>
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/internal/text/logical-model.h>
 #include <dali-toolkit/internal/text/font-run.h>
-#include <dali-toolkit/internal/text/script.h>
 #include <dali-toolkit/internal/text/script-run.h>
 
 namespace Dali
@@ -41,6 +41,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 +134,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 +294,14 @@ void MultilanguageSupport::SetScripts( const Vector<Character>& 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 +309,7 @@ void MultilanguageSupport::SetScripts( const Vector<Character>& 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.
@@ -503,8 +505,21 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& 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;