[Tizen] Fix ZWJ issue 40/300240/1 accepted/tizen/7.0/unified/20231024.025350
authorBowon Ryu <bowon.ryu@samsung.com>
Tue, 17 Oct 2023 06:36:03 +0000 (15:36 +0900)
committerBowon Ryu <bowon.ryu@samsung.com>
Thu, 19 Oct 2023 06:59:04 +0000 (15:59 +0900)
Added ZWJ sequence to solve the issue of ZWJ not working.
this patch processes ZWJ as one sequnce.
and this condition has been merged with the previous emoji logic.

Added exception handling in editable environment.
Removed unnecessary variables related to emoji.

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

index 03e51ef..f1530e3 100644 (file)
@@ -1294,11 +1294,12 @@ CharacterIndex Controller::Impl::CalculateNewCursorIndex(CharacterIndex index) c
 
   if(index < mEventData->mPrimaryCursorPosition)
   {
-    cursorIndex -= numberOfCharacters;
+    cursorIndex = cursorIndex < numberOfCharacters ? 0u : cursorIndex - numberOfCharacters;
   }
   else
   {
-    cursorIndex += numberOfCharacters;
+    Length textLength = mModel->mVisualModel->mCharactersToGlyph.Count();
+    cursorIndex = cursorIndex + numberOfCharacters > textLength ? textLength : cursorIndex + numberOfCharacters;
   }
 
   // Will update the cursor hook position.
index 1bf3c17..dfabf89 100644 (file)
@@ -474,9 +474,8 @@ void MultilanguageSupport::ValidateFonts(const Vector<Character>&
   Vector<ScriptRun>::ConstIterator scriptRunEndIt          = scripts.End();
   bool                             isNewParagraphCharacter = false;
 
-  FontId previousEmojiFontId = 0u;
-  FontId currentFontId       = 0u;
-  FontId previousFontId      = 0u;
+  FontId currentFontId  = 0u;
+  FontId previousFontId = 0u;
   TextAbstraction::Script previousScript = TextAbstraction::UNKNOWN;
 
   CharacterIndex lastCharacter = startIndex + numberOfCharacters - 1u;
@@ -551,15 +550,16 @@ void MultilanguageSupport::ValidateFonts(const Vector<Character>&
       isValidFont = fontClient.IsCharacterSupportedByFont(fontId, character);
     }
 
-    bool isCommonScript = false;
-    bool isEmojiScript  = TextAbstraction::IsOneOfEmojiScripts(script);
+    bool isEmojiScript = IsEmojiColorScript(script) || IsEmojiTextScript(script);
+    bool isZWJ         = TextAbstraction::IsZeroWidthJoiner(character);
 
-    if(isEmojiScript && (previousScript == script))
+    if((previousScript == script) &&
+       (isEmojiScript || isZWJ))
     {
-      // Emoji sequence should use the previous emoji font.
-      if(0u != previousEmojiFontId)
+      // This sequence should use the previous font.
+      if(0u != previousFontId)
       {
-        fontId      = previousEmojiFontId;
+        fontId      = previousFontId;
         isValidFont = true;
       }
     }
@@ -573,6 +573,9 @@ void MultilanguageSupport::ValidateFonts(const Vector<Character>&
       isValidFont = true;
     }
 
+    // This is valid after CheckFontSupportsCharacter();
+    bool isCommonScript = false;
+
     // If the given font is not valid, it means either:
     // - there is no cached font for the current script yet or,
     // - the user has set a different font than the default one for the current script or,
@@ -724,19 +727,6 @@ void MultilanguageSupport::ValidateFonts(const Vector<Character>&
       }
     }
 
-    // Store the font id when the first character is an emoji.
-    if(isEmojiScript)
-    {
-      if(0u != fontId && previousScript != script)
-      {
-        previousEmojiFontId = fontId;
-      }
-    }
-    else
-    {
-      previousEmojiFontId = 0u;
-    }
-
 #ifdef DEBUG_ENABLED
     if(gLogFilter->IsEnabledFor(Debug::Verbose))
     {
@@ -795,6 +785,7 @@ void MultilanguageSupport::ValidateFonts(const Vector<Character>&
     // Whether the current character is a new paragraph character.
     isNewParagraphCharacter = TextAbstraction::IsNewParagraph(character);
     previousScript          = script;
+    currentFontId           = fontId;
     previousFontId          = currentFontId;
   } // end traverse characters.