Revert "[Tizen] Check supported by font and find fallback font for common script."
authorSeoyeon Kim <seoyeon2.kim@samsung.com>
Mon, 5 Nov 2018 08:19:26 +0000 (17:19 +0900)
committerSeoyeon Kim <seoyeon2.kim@samsung.com>
Mon, 5 Nov 2018 08:19:26 +0000 (17:19 +0900)
This reverts commit 517f682b687f203edc00c698806f898c150323f5.

automated-tests/src/dali-toolkit-internal/utc-Dali-Text-MultiLanguage.cpp [changed mode: 0755->0644]
dali-toolkit/internal/text/multi-language-support-impl.cpp [changed mode: 0755->0644]

old mode 100755 (executable)
new mode 100644 (file)
index 559e34e..94bb485
@@ -1649,94 +1649,6 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
   Vector<FontDescriptionRun> fontDescriptions11;
   fontDescriptions11.PushBack( fontDescription1101 );
 
-  FontRun fontRun1201 =
-  {
-    {
-      0u,
-      6u
-    },
-    8u
-  };
-  FontRun fontRun1202 =
-  {
-    {
-      6u,
-      1u
-    },
-    9u
-  };
-  FontRun fontRun1203 =
-  {
-    {
-      7u,
-      5u
-    },
-    8u
-  };
-  Vector<FontRun> fontRuns12;
-  fontRuns12.PushBack( fontRun1201 );
-  fontRuns12.PushBack( fontRun1202 );
-  fontRuns12.PushBack( fontRun1203 );
-
-  FontDescriptionRun fontDescription1201 =
-  {
-    {
-      0u,
-      6u
-    },
-    const_cast<char*>( "TizenSans" ),
-    9u,
-    TextAbstraction::FontWeight::NORMAL,
-    TextAbstraction::FontWidth::NORMAL,
-    TextAbstraction::FontSlant::NORMAL,
-    0u,
-    true,
-    false,
-    false,
-    false,
-    false
-  };
-  FontDescriptionRun fontDescription1202 =
-  {
-    {
-      6u,
-      1u
-    },
-    const_cast<char*>( "TizenSans" ),
-    9u,
-    TextAbstraction::FontWeight::NORMAL,
-    TextAbstraction::FontWidth::NORMAL,
-    TextAbstraction::FontSlant::NORMAL,
-    0u,
-    true,
-    false,
-    false,
-    false,
-    false
-  };
-  FontDescriptionRun fontDescription1203 =
-  {
-    {
-      7u,
-      5u
-    },
-    const_cast<char*>( "TizenSans" ),
-    9u,
-    TextAbstraction::FontWeight::NORMAL,
-    TextAbstraction::FontWidth::NORMAL,
-    TextAbstraction::FontSlant::NORMAL,
-    0u,
-    true,
-    false,
-    false,
-    false,
-    false
-  };
-  Vector<FontDescriptionRun> fontDescriptions12;
-  fontDescriptions12.PushBack( fontDescription1201 );
-  fontDescriptions12.PushBack( fontDescription1202 );
-  fontDescriptions12.PushBack( fontDescription1203 );
-
   const ValidateFontsData data[] =
   {
     {
@@ -1849,18 +1761,8 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
       fontDescriptions11,
       fontRuns11
     },
-    {
-      "Common script.",
-      "Hello \tworld",
-      "/tizen/TizenSansRegular.ttf",
-      TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
-      0u,
-      12u,
-      fontDescriptions12,
-      fontRuns12
-    },
   };
-  const unsigned int numberOfTests = 12u;
+  const unsigned int numberOfTests = 11u;
 
   for( unsigned int index = 0u; index < numberOfTests; ++index )
   {
old mode 100755 (executable)
new mode 100644 (file)
index 4b6eee2..6ca96ad
@@ -436,6 +436,8 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
   Vector<ScriptRun>::ConstIterator scriptRunEndIt = scripts.End();
   bool isNewParagraphCharacter = false;
 
+  FontId currentFontId = 0u;
+  FontId previousFontId = 0u;
   bool isPreviousEmojiScript = false;
 
   // Description of fallback font which is selected at current iteration.
@@ -463,6 +465,7 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
 
     // Get the font for the current character.
     FontId fontId = fontClient.GetFontId( currentFontDescription, currentFontPointSize );
+    currentFontId = fontId;
 
     // Get the script for the current character.
     Script script = GetScript( index,
@@ -550,107 +553,133 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
       //      supports the 'white space'. However, that font may not support the DEVANAGARI script.
       isCommonScript = TextAbstraction::IsCommonScript( character );
 
-      // Check in the valid fonts cache.
-      ValidateFontsPerScript* validateFontsPerScript = *( validFontsPerScriptCacheBuffer + script );
-
-      if( NULL != validateFontsPerScript )
+      if( isCommonScript )
       {
-        // 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 )
+        if( isValidCachedDefaultFont &&
+            ( isDefaultFont || ( currentFontId == previousFontId ) ) &&
+            !isEmojiScript )
         {
-          // Checks if the current character is supported by the font is needed.
-          isValidFont = fontClient.IsCharacterSupportedByFont( fontId, character );
+          // At this point the character common for all scripts has no font assigned.
+          // If there is a valid previously cached default font for it, use that one.
+          fontId = cachedDefaultFontId;
         }
       }
-
-      if( !isValidFont ) // (2)
+      else
       {
-        // The selected font is not stored in any cache.
-
-        // Checks if the current character is supported by the selected font.
-        isValidFont = fontClient.IsCharacterSupportedByFont( fontId, character );
+        // Check in the valid fonts cache.
+        ValidateFontsPerScript* validateFontsPerScript = *( validFontsPerScriptCacheBuffer + script );
 
-        // Emojis are present in many monochrome fonts; prefer color by default.
-        if( isValidFont &&
-            isEmojiScript )
+        if( NULL != validateFontsPerScript )
         {
-          const GlyphIndex glyphIndex = fontClient.GetGlyphIndex( fontId, character );
+          // This cache stores valid fonts set by the user.
+          isValidFont = validateFontsPerScript->IsValidFont( fontId );
 
-          // For color emojis, the font is valid if the glyph is a color glyph (the bitmap is RGBA).
-          isValidFont = fontClient.IsColorGlyph( fontId, glyphIndex );
-        }
-
-        // If there is a valid font, cache it.
-        if( isValidFont && !isCommonScript )
-        {
-          if( NULL == validateFontsPerScript )
+          // 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 )
           {
-            validateFontsPerScript = new ValidateFontsPerScript();
-
-            *( validFontsPerScriptCacheBuffer + script ) = validateFontsPerScript;
+            // Checks if the current character is supported by the font is needed.
+            isValidFont = fontClient.IsCharacterSupportedByFont( fontId, character );
           }
-
-          validateFontsPerScript->mValidFonts.PushBack( fontId );
         }
 
-        if( !isValidFont && ( fontId != cachedDefaultFontId ) && ( !TextAbstraction::IsNewParagraph( character ) )) // (3)
+        if( !isValidFont ) // (2)
         {
-          // The selected font by the user or the platform's default font has failed to validate the character.
+          // The selected font is not stored in any cache.
 
-          // Checks if the previously discarted cached default font supports the character.
-          bool isValidCachedFont = false;
-          if( isValidCachedDefaultFont )
-          {
-            isValidCachedFont = fontClient.IsCharacterSupportedByFont( cachedDefaultFontId, character );
-          }
+          // Checks if the current character is supported by the selected font.
+          isValidFont = fontClient.IsCharacterSupportedByFont( fontId, character );
 
-          if( isValidCachedFont )
+          // Emojis are present in many monochrome fonts; prefer color by default.
+          if( isValidFont &&
+              isEmojiScript )
           {
-            // Use the cached default font for the script if there is one.
-            fontId = cachedDefaultFontId;
+            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 );
           }
-          else
+
+          // If there is a valid font, cache it.
+          if( isValidFont )
           {
-            // There is no valid cached default font for the script.
+            if( NULL == validateFontsPerScript )
+            {
+              validateFontsPerScript = new ValidateFontsPerScript();
 
-            DefaultFonts* defaultFontsPerScript = NULL;
+              *( validFontsPerScriptCacheBuffer + script ) = validateFontsPerScript;
+            }
 
-            // Emojis are present in many monochrome fonts; prefer color by default.
-            const bool preferColor = ( TextAbstraction::EMOJI == script );
+            validateFontsPerScript->mValidFonts.PushBack( fontId );
+          }
 
-            // Find a fallback-font.
-            fontId = fontClient.FindFallbackFont( character,
-                                                  currentFontDescription,
-                                                  currentFontPointSize,
-                                                  preferColor );
+          if( !isValidFont && ( fontId != cachedDefaultFontId ) ) // (3)
+          {
+            // The selected font by the user or the platform's default font has failed to validate the character.
 
-            if( 0u == fontId )
+            // Checks if the previously discarted cached default font supports the character.
+            bool isValidCachedFont = false;
+            if( isValidCachedDefaultFont )
             {
-              fontId = fontClient.FindDefaultFont( UTF32_A, currentFontPointSize );
+              isValidCachedFont = fontClient.IsCharacterSupportedByFont( cachedDefaultFontId, character );
             }
 
-            if ( !isCommonScript && (script != TextAbstraction::UNKNOWN) )
+            if( isValidCachedFont )
+            {
+              // Use the cached default font for the script if there is one.
+              fontId = cachedDefaultFontId;
+            }
+            else
             {
-              // Cache the font if it is not an unknown script
-              if( NULL == defaultFontsPerScript )
+              // There is no valid cached default font for the script.
+
+              DefaultFonts* defaultFontsPerScript = NULL;
+
+              // Emojis are present in many monochrome fonts; prefer color by default.
+              const bool preferColor = ( TextAbstraction::EMOJI == script );
+
+              // Find a fallback-font.
+              fontId = fontClient.FindFallbackFont( character,
+                                                    currentFontDescription,
+                                                    currentFontPointSize,
+                                                    preferColor );
+
+              if( 0u == fontId )
               {
-                defaultFontsPerScript = *( defaultFontPerScriptCacheBuffer + script );
+                // If the system does not support a suitable font, fallback to Latin
+                defaultFontsPerScript = *( defaultFontPerScriptCacheBuffer + TextAbstraction::LATIN );
+                if( NULL != defaultFontsPerScript )
+                {
+                  fontId = defaultFontsPerScript->FindFont( fontClient,
+                                                            currentFontDescription,
+                                                            currentFontPointSize );
+                }
+              }
+
+              if( 0u == fontId )
+              {
+                fontId = fontClient.FindDefaultFont( UTF32_A, currentFontPointSize );
+              }
 
+              if ( script != TextAbstraction::UNKNOWN )
+              {
+                // 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)
+          } // !isValidFont (3)
+        } // !isValidFont (2)
+      } // !isCommonScript
     } // !isValidFont (1)
 
 #ifdef DEBUG_ENABLED
@@ -705,6 +734,7 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
 
     // Whether the current character is a new paragraph character.
     isNewParagraphCharacter = TextAbstraction::IsNewParagraph( character );
+    previousFontId = currentFontId;
     isPreviousEmojiScript = isEmojiScript;
   } // end traverse characters.