Fix: VS15 hides non-Emoji Negative Squared Latin Capital Letter 21/277821/6
authorssabah <s.sabah@samsung.com>
Wed, 13 Jul 2022 12:01:44 +0000 (15:01 +0300)
committershrouq Sabah <s.sabah@samsung.com>
Mon, 18 Jul 2022 13:07:49 +0000 (13:07 +0000)
The non-emoji letters form Negative-Squared-Latin-Capital-Letter become invisible
when use VS16 or Emoji Color Font.

Examples:
   "1F170 ~ 1F174 with variation selector, text vs emoji: &#x1f170;&#xfe0f;&#x1f171;&#xfe0f;&#x1f172;&#xfe0e;&#x1f173;&#xfe0e;&#x1f174;&#xfe0e;\n"
   "1F170 ~ 1F174 with VS15: &#x1f170;&#xfe0e;&#x1f171;&#xfe0e;&#x1f172;&#xfe0e;&#x1f173;&#xfe0e;&#x1f174;&#xfe0e;\n"
   "1F170 ~ 1F174 with VS16: &#x1f170;&#xfe0f;&#x1f171;&#xfe0f;&#x1f172;&#xfe0f;&#x1f173;&#xfe0f;&#x1f174;&#xfe0f;\n";

In Negative-Squared-Latin-Capital-Letter from enclosed-alphanumeric-supplement,
The Letters A,B,O,P are Emoji Variation Sequences.
https://unicode-table.com/en/blocks/enclosed-alphanumeric-supplement/

This patch should be preceded by the patch below:
https://review.tizen.org/gerrit/c/platform/core/uifw/dali-adaptor/+/277666

Change-Id: Ie61ef6744ebfee1b58a07ab302d9151ce765677d

automated-tests/src/dali-adaptor/utc-Dali-TextScript.cpp
dali/devel-api/text-abstraction/emoji-character-properties.cpp
dali/devel-api/text-abstraction/emoji-character-properties.h
dali/devel-api/text-abstraction/emoji-helper.cpp
dali/devel-api/text-abstraction/script.cpp
dali/devel-api/text-abstraction/script.h
dali/internal/text/text-abstraction/shaping-impl.cpp

index ad9d6de..2e09c19 100644 (file)
@@ -215,7 +215,8 @@ int UtcDaliGetCharacterScript(void)
   GetCharacterScriptCheckRange(0xFF5B, 0xFFEF, HWFW_S, TEST_LOCATION);
 
   GetCharacterScriptCheckRange(0x1ee00, 0x1eeff, ARABIC, TEST_LOCATION);
-  GetCharacterScriptCheckRange(0x1f170, 0x1f6ff, EMOJI, TEST_LOCATION);
+  GetCharacterScriptCheckRange(0x1f170, 0x1f189, SYMBOLS_NSLCL, TEST_LOCATION);
+  GetCharacterScriptCheckRange(0x1f18a, 0x1f6ff, EMOJI, TEST_LOCATION);
   GetCharacterScriptCheckRange(0x1f900, 0x1f9ff, EMOJI, TEST_LOCATION);
   GetCharacterScriptCheckRange(0x20000, 0x215ff, CJK, TEST_LOCATION);
   GetCharacterScriptCheckRange(0x21600, 0x230ff, CJK, TEST_LOCATION);
index c6c8f99..7aef4ed 100644 (file)
@@ -435,8 +435,8 @@ DALI_ADAPTOR_API bool IsEmojiItem(Character character)
 {
   return (IsEmojiComponent(character) ||
           IsEmojiModifier(character) ||
-          IsTextPresentationSelector(character) ||
-          IsEmojiPresentationSelector(character) ||
+          // IsTextPresentationSelector(character) ||
+          // IsEmojiPresentationSelector(character) ||
           IsTagSpec(character) ||
           IsTagEnd(character));
 }
@@ -464,6 +464,12 @@ DALI_ADAPTOR_API bool IsEmojiVariationSequences(Character character)
   return SET_CHAR_EMOJI_VARIATION_SEQUENCES.find(character) != SET_CHAR_EMOJI_VARIATION_SEQUENCES.end();
 }
 
+DALI_ADAPTOR_API bool IsNegativeSquaredLatinCapitalLetter(Character character)
+{
+  return (0x1F170 <= character &&
+          0x1F189 >= character);
+}
+
 } // namespace TextAbstraction
 
 } // namespace Dali
index 13287e3..2eb95b2 100644 (file)
@@ -183,6 +183,17 @@ DALI_ADAPTOR_API bool IsASCIIDigits(Character character);
  */
 DALI_ADAPTOR_API bool IsEmojiVariationSequences(Character character);
 
+/**
+ * @brief Whether the character is Negative Squared Latin Capital Letter.
+ * Read more at White on black squared Latin letters: https://unicode-table.com/en/blocks/enclosed-alphanumeric-supplement/
+ *
+ *
+ * @param[in] character The character.
+ *
+ * @return @e true if the character is Negative Squared Latin Capital Letter.
+ */
+DALI_ADAPTOR_API bool IsNegativeSquaredLatinCapitalLetter(Character character);
+
 } // namespace TextAbstraction
 
 } // namespace Dali
index a86572f..c7ecc37 100644 (file)
@@ -28,7 +28,8 @@ DALI_ADAPTOR_API bool IsSymbolScript(const TextAbstraction::Script& script)
           TextAbstraction::SYMBOLS2 == script ||
           TextAbstraction::SYMBOLS3 == script ||
           TextAbstraction::SYMBOLS4 == script ||
-          TextAbstraction::SYMBOLS5 == script);
+          TextAbstraction::SYMBOLS5 == script ||
+          TextAbstraction::SYMBOLS_NSLCL == script);
 }
 
 DALI_ADAPTOR_API bool IsEmojiScript(const TextAbstraction::Script& script)
index 1a5b742..ef4ecff 100644 (file)
@@ -863,6 +863,7 @@ inline Script GetScriptAboveArabicPresentationFormsA(Character character)
   }
   // U+1f170 4. Enclosed characters: negative squared latin capital letter A
   // U+1f6ff 6b. Additional transport and map symbols
+  // Exclude U+1f170 ~ U+1f189. They are SYMBOLS_NSLCL (negative squared latin capital letter)
   else if((0x1f170 <= character) && (character <= 0x1f6ff))
   {
     script = EMOJI;
@@ -941,10 +942,22 @@ Script GetCharacterScript(Character character)
 {
   Script script = UNKNOWN;
 
-  if(IsEmojiItem(character))
+  if(IsTextPresentationSelector(character))
+  {
+    script = EMOJI_TEXT;
+  }
+  else if(IsEmojiPresentationSelector(character))
+  {
+    script = EMOJI_COLOR;
+  }
+  else if(IsEmojiItem(character))
   {
     script = EMOJI;
   }
+  else if(IsNegativeSquaredLatinCapitalLetter(character))
+  {
+    script = SYMBOLS_NSLCL;
+  }
   else if(IsCommonScript(character))
   {
     script = COMMON;
@@ -1041,7 +1054,7 @@ bool HasLigatureMustBreak(Script script)
 
 Length GetNumberOfScripts()
 {
-  return EMOJI_COLOR + 1;
+  return SYMBOLS_NSLCL + 1;
 }
 
 } // namespace TextAbstraction
index ab22ac7..71d3087 100644 (file)
@@ -102,9 +102,10 @@ enum Script
   SYMBOLS4, ///< Some symbols.
   SYMBOLS5, ///< Some symbols.
 
-  UNKNOWN,    ///< The script is unknown.
-  EMOJI_TEXT, ///< The Emoji request a text presentation for an emoji character.
-  EMOJI_COLOR ///< The Emoji request a color-emoji presentation for an emoji character.
+  UNKNOWN,      ///< The script is unknown.
+  EMOJI_TEXT,   ///< The Emoji request a text presentation for an emoji character.
+  EMOJI_COLOR,  ///< The Emoji request a color-emoji presentation for an emoji character.
+  SYMBOLS_NSLCL ///< THe Negative Squared Latin Capital Letter
 
   //Note: update ScriptName and GetNumberOfScripts when adding new script
 };
@@ -179,9 +180,10 @@ const char* const ScriptName[] =
     "SYMBOLS4", ///< Some symbols.
     "SYMBOLS5", ///< Some symbols.
 
-    "UNKNOWN",    ///< The script is unknown.
-    "EMOJI_TEXT", ///< The Emoji request a text presentation for an emoji character.
-    "EMOJI_COLOR" ///< The Emoji request a color-emoji presentation for an emoji character.
+    "UNKNOWN",      ///< The script is unknown.
+    "EMOJI_TEXT",   ///< The Emoji request a text presentation for an emoji character.
+    "EMOJI_COLOR",  ///< The Emoji request a color-emoji presentation for an emoji character.
+    "SYMBOLS_NSLCL" ///< THe Negative Squared Latin Capital Letter
 };
 
 /**
index 75074d5..7ce76bc 100644 (file)
@@ -114,7 +114,8 @@ const hb_script_t SCRIPT_TO_HARFBUZZ[] =
     HB_SCRIPT_UNKNOWN,  // SYMBOLS5
     HB_SCRIPT_UNKNOWN,  // UNKNOWN
     HB_SCRIPT_UNKNOWN,  // EMOJI_TEXT
-    HB_SCRIPT_UNKNOWN}; // EMOJI_COLOR
+    HB_SCRIPT_UNKNOWN,  // EMOJI_COLOR
+    HB_SCRIPT_UNKNOWN}; // SYMBOLS_NSLCL
 
 struct Shaping::Plugin
 {