Fix ZWJ issue 25/300125/4
authorBowon Ryu <bowon.ryu@samsung.com>
Tue, 17 Oct 2023 06:36:03 +0000 (15:36 +0900)
committerBowon Ryu <bowon.ryu@samsung.com>
Wed, 18 Oct 2023 10:22:54 +0000 (19:22 +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 a84509f4c6e267fb9f05737fd57d60dcc2f41a69..eb85c8378c233c7ec9bcd4e4a58ab04ced8b8b20 100644 (file)
@@ -1305,11 +1305,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 5a5c0d855921ea12b495f3bd024588eede90fb22..b3226832ce907af260b48c0f349ce5a05305cd2b 100644 (file)
@@ -633,7 +633,6 @@ void MultilanguageSupport::ValidateFonts(const Vector<Character>&
   Vector<ScriptRun>::ConstIterator scriptRunEndIt          = scripts.End();
   bool                             isNewParagraphCharacter = false;
 
-  FontId                  previousEmojiFontId = 0u;
   FontId                  currentFontId       = 0u;
   FontId                  previousFontId      = 0u;
   TextAbstraction::Script previousScript      = TextAbstraction::UNKNOWN;
@@ -710,15 +709,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;
       }
     }
@@ -732,6 +732,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,
@@ -778,19 +781,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))
     {
@@ -849,6 +839,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.