Fix variation selector 15 issue 12/317812/7
authorBowon Ryu <bowon.ryu@samsung.com>
Wed, 8 Jan 2025 08:10:09 +0000 (17:10 +0900)
committerBowon Ryu <bowon.ryu@samsung.com>
Thu, 9 Jan 2025 12:00:19 +0000 (21:00 +0900)
The behavior of variation selector 15 is not guaranteed
because the current script run is forced to change in IsScriptChangedToFollowSequence.

TODO:
There is an issue with ignoring font fallback priorities
because most emoji cases follow a sequence.

Change-Id: I24308f530c70923b8aef48dbad701e05a042ebd7
Signed-off-by: Bowon Ryu <bowon.ryu@samsung.com>
dali-toolkit/internal/text/emoji-helper.cpp
dali-toolkit/internal/text/multi-language-support-impl.cpp

index 35a7760a0d680034e0ee685088fe891a1c4406bf..cce3f74a08c9f0e052920d78d612865f3e2a4ec2 100644 (file)
@@ -193,7 +193,7 @@ bool IsScriptChangedToFollowSequence(const TextAbstraction::Script&    currentRu
     currentCharacterScript = TextAbstraction::EMOJI;
   }
   // Emoji sequences
-  else if(IsEmojiSequence(currentRunScript, character, currentCharacterScript))
+  else if(IsEmojiSequence(currentRunScript, character, currentCharacterScript) && currentCharacterScript != TextAbstraction::EMOJI_TEXT)
   {
     // Emoji request an emoji presentation for an emoji character.
     isUpdated              = (currentCharacterScript != TextAbstraction::EMOJI_COLOR);
index b16e6d5dcbb54c8d01aef2b011b72dd129021b80..4729c52e3f3089d9c6c2e3788dec3f873ba12342 100644 (file)
@@ -419,7 +419,11 @@ void MultilanguageSupport::SetScripts(const Vector<Character>& text,
     }
     else if(IsScriptChangedToFollowSequence(currentScriptRun.script, character, script))
     {
-      currentScriptRun.script = script;
+      // To guarantee behavior of VARIATION_SELECTOR_15.
+      if(currentScriptRun.script != TextAbstraction::EMOJI_TEXT)
+      {
+        currentScriptRun.script = script;
+      }
     }
     else if(IsOneOfEmojiScripts(currentScriptRun.script) && (TextAbstraction::COMMON == script))
     {
@@ -813,7 +817,25 @@ void MultilanguageSupport::ValidateFonts(TextAbstraction::FontClient&
 
         if(isModifiedByVariationSelector)
         {
-          FontId requestedFontId = fontClient.FindDefaultFont(character, currentFontPointSize, IsEmojiColorScript(script));
+          FontId requestedFontId = 0u;
+          if(TextAbstraction::IsEmojiTextScript(script))
+          {
+            // Find a fallback-font.
+            requestedFontId = fontClient.FindFallbackFont(character,
+                                         currentFontDescription,
+                                         currentFontPointSize,
+                                         false);
+
+            if(fontClient.IsColorGlyph(requestedFontId, glyphIndexChar))
+            {
+              // Try to find text style glyph.
+              requestedFontId = 0;
+            }
+          }
+          if(0u == requestedFontId)
+          {
+            requestedFontId = fontClient.FindDefaultFont(character, currentFontPointSize, IsEmojiColorScript(script));
+          }
           if(0u != requestedFontId)
           {
             currentFontRun.fontId = fontId = requestedFontId;