Fix for multi-language support. 26/41126/6
authorVictor Cebollada <v.cebollada@samsung.com>
Thu, 11 Jun 2015 07:00:46 +0000 (08:00 +0100)
committerVictor Cebollada <v.cebollada@samsung.com>
Thu, 11 Jun 2015 09:45:32 +0000 (10:45 +0100)
Change-Id: I0eb938a4edac325daff30cad3a77f5bd1e80f5ac
Signed-off-by: Victor Cebollada <v.cebollada@samsung.com>
dali-toolkit/internal/text/multi-language-support-impl.cpp

index 47db1e2..2d2352e 100644 (file)
@@ -126,24 +126,6 @@ Script GetScript( Length index,
   return script;
 }
 
   return script;
 }
 
-/**
- * @brief Whether the character is valid for all scripts. i.e. the white space.
- *
- * @param[in] character The character.
- *
- * @return @e true if the character is valid for all scripts.
- */
-bool IsValidForAllScripts( Character 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
 {
   for( Vector<FontId>::ConstIterator it = mValidFonts.Begin(),
 bool ValidateFontsPerScript::FindValidFont( FontId fontId ) const
 {
   for( Vector<FontId>::ConstIterator it = mValidFonts.Begin(),
@@ -262,7 +244,7 @@ void MultilanguageSupport::SetScripts( const Vector<Character>& text,
     // Skip those characters valid for many scripts like white spaces or '\n'.
     bool endOfText = index == numberOfCharacters;
     while( !endOfText &&
     // Skip those characters valid for many scripts like white spaces or '\n'.
     bool endOfText = index == numberOfCharacters;
     while( !endOfText &&
-           IsValidForAllScripts( character ) )
+           TextAbstraction::IsCommonScript( character ) )
     {
       // Count all these characters to be added into a script.
       ++numberOfAllScriptCharacters;
     {
       // Count all these characters to be added into a script.
       ++numberOfAllScriptCharacters;
@@ -374,10 +356,12 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
                                           const Vector<ScriptRun>& scripts,
                                           Vector<FontRun>& fonts )
 {
                                           const Vector<ScriptRun>& scripts,
                                           Vector<FontRun>& fonts )
 {
+  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "-->MultilanguageSupport::ValidateFonts\n" );
   const Length numberOfCharacters = text.Count();
 
   if( 0u == numberOfCharacters )
   {
   const Length numberOfCharacters = text.Count();
 
   if( 0u == numberOfCharacters )
   {
+    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--MultilanguageSupport::ValidateFonts\n" );
     // Nothing to do if there are no characters.
     return;
   }
     // Nothing to do if there are no characters.
     return;
   }
@@ -427,6 +411,20 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
                                scriptRunIt,
                                scriptRunEndIt );
 
                                scriptRunIt,
                                scriptRunEndIt );
 
+#ifdef DEBUG_ENABLED
+    {
+      Dali::TextAbstraction::FontDescription description;
+      fontClient.GetDescription( fontId, description );
+
+      DALI_LOG_INFO( gLogFilter,
+                     Debug::Verbose,
+                     "  Initial font set\n  Character : %x, Script : %s, Font : %s \n",
+                     character,
+                     Dali::TextAbstraction::ScriptName[script],
+                     description.path.c_str() );
+    }
+#endif
+
     if( TextAbstraction::UNKNOWN == script )
     {
       DALI_LOG_WARNING( "MultilanguageSupport::ValidateFonts. Unknown script!" );
     if( TextAbstraction::UNKNOWN == script )
     {
       DALI_LOG_WARNING( "MultilanguageSupport::ValidateFonts. Unknown script!" );
@@ -436,6 +434,11 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
     // Whether the font being validated is a default one not set by the user.
     const bool isDefault = ( 0u == fontId );
 
     // Whether the font being validated is a default one not set by the user.
     const bool isDefault = ( 0u == fontId );
 
+    DALI_LOG_INFO( gLogFilter,
+                   Debug::Verbose,
+                   "  Is a default font : %s\n",
+                   ( isDefault ? "true" : "false" ) );
+
     // The default font point size.
     PointSize26Dot6 pointSize = TextAbstraction::FontClient::DEFAULT_POINT_SIZE;
 
     // The default font point size.
     PointSize26Dot6 pointSize = TextAbstraction::FontClient::DEFAULT_POINT_SIZE;
 
@@ -488,6 +491,26 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
             else
             {
               // Add the font to the valid font cache.
             else
             {
               // Add the font to the valid font cache.
+
+              //   At this point the validated font supports the given character. However, characters
+              // common for all scripts, like white spaces or new paragraph characters, need to be
+              // processed differently.
+              //
+              //   i.e. A white space can have assigned a DEVANAGARI script but the font assigned may not
+              // support none of the DEVANAGARI glyphs. This font can't be added to the cache as a valid
+              // font for the DEVANAGARI script but the COMMON one.
+              if( TextAbstraction::IsCommonScript( character ) )
+              {
+                validateFontsPerScript = *( validFontsPerScriptCacheBuffer + TextAbstraction::COMMON );
+
+                if( NULL == validateFontsPerScript )
+                {
+                  validateFontsPerScript = new ValidateFontsPerScript();
+
+                  *( validFontsPerScriptCacheBuffer + TextAbstraction::COMMON ) = validateFontsPerScript;
+                }
+              }
+
               validateFontsPerScript->mValidFonts.PushBack( fontId );
             }
           }
               validateFontsPerScript->mValidFonts.PushBack( fontId );
             }
           }
@@ -520,16 +543,24 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
           fontId = fontClient.FindDefaultFont( UTF32_A, pointSize );
         }
 
           fontId = fontClient.FindDefaultFont( UTF32_A, pointSize );
         }
 
-#ifdef DEBUG_ENABLED
-        Dali::TextAbstraction::FontDescription description;
-        fontClient.GetDescription( fontId, description );
-        DALI_LOG_INFO( gLogFilter, Debug::Concise, "Script: %s; Selected font: %s\n", Dali::TextAbstraction::ScriptName[script], description.path.c_str() );
-#endif
         // Cache the font.
         *( defaultFontPerScriptCacheBuffer + script ) = fontId;
       }
     }
 
         // Cache the font.
         *( defaultFontPerScriptCacheBuffer + script ) = fontId;
       }
     }
 
+#ifdef DEBUG_ENABLED
+    {
+      Dali::TextAbstraction::FontDescription description;
+      fontClient.GetDescription( fontId, description );
+      DALI_LOG_INFO( gLogFilter,
+                     Debug::Verbose,
+                     "  Validated font set\n  Character : %x, Script : %s, Font : %s \n",
+                     character,
+                     Dali::TextAbstraction::ScriptName[script],
+                     description.path.c_str() );
+    }
+#endif
+
     // The font is now validated.
 
     if( ( fontId != currentFontRun.fontId ) ||
     // The font is now validated.
 
     if( ( fontId != currentFontRun.fontId ) ||
@@ -559,6 +590,7 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
     // Store the last run.
     fonts.PushBack( currentFontRun );
   }
     // Store the last run.
     fonts.PushBack( currentFontRun );
   }
+  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--MultilanguageSupport::ValidateFonts\n" );
 }
 
 void MultilanguageSupport::ValidateFonts( LogicalModel& model,
 }
 
 void MultilanguageSupport::ValidateFonts( LogicalModel& model,