From e4ba8c550fbafac94c8759b83f493273ab9923e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pa=CC=84vels=20Nadtoc=CC=8Cajevs?= <7645683+bruvzg@users.noreply.github.com> Date: Tue, 11 Nov 2025 12:05:46 +0200 Subject: [PATCH] [TextServer] Fix some emoji sequences and add missing ICU emoji property data. --- modules/text_server_adv/script_iterator.cpp | 13 ++++++++----- thirdparty/icu4c/godot_data.json | 2 ++ thirdparty/icu4c/icudt_godot.dat | Bin 4784480 -> 4797808 bytes 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/modules/text_server_adv/script_iterator.cpp b/modules/text_server_adv/script_iterator.cpp index b03231b239..41ef6f1349 100644 --- a/modules/text_server_adv/script_iterator.cpp +++ b/modules/text_server_adv/script_iterator.cpp @@ -32,17 +32,21 @@ // This implementation is derived from ICU: icu4c/source/extra/scrptrun/scrptrun.cpp +inline constexpr UChar32 ZERO_WIDTH_JOINER = 0x200d; +inline constexpr UChar32 VARIATION_SELECTOR_15 = 0xfe0e; +inline constexpr UChar32 VARIATION_SELECTOR_16 = 0xfe0f; + inline bool ScriptIterator::same_script(int32_t p_script_one, int32_t p_script_two) { return p_script_one <= USCRIPT_INHERITED || p_script_two <= USCRIPT_INHERITED || p_script_one == p_script_two; } inline bool ScriptIterator::is_emoji(UChar32 p_c, UChar32 p_next) { - if (p_next == 0xFE0E) { // Variation Selector-15 + if (p_next == VARIATION_SELECTOR_15 && (u_hasBinaryProperty(p_c, UCHAR_EMOJI) || u_hasBinaryProperty(p_c, UCHAR_EXTENDED_PICTOGRAPHIC))) { return false; - } else if (p_next == 0xFE0F) { // Variation Selector-16 + } else if (p_next == VARIATION_SELECTOR_16 && (u_hasBinaryProperty(p_c, UCHAR_EMOJI) || u_hasBinaryProperty(p_c, UCHAR_EXTENDED_PICTOGRAPHIC))) { return true; } else { - return u_hasBinaryProperty(p_c, UCHAR_EMOJI) || u_hasBinaryProperty(p_c, UCHAR_EMOJI_PRESENTATION) || u_hasBinaryProperty(p_c, UCHAR_EMOJI_MODIFIER) || u_hasBinaryProperty(p_c, UCHAR_REGIONAL_INDICATOR) || u_hasBinaryProperty(p_c, UCHAR_EXTENDED_PICTOGRAPHIC); + return u_hasBinaryProperty(p_c, UCHAR_EMOJI_PRESENTATION) || u_hasBinaryProperty(p_c, UCHAR_EMOJI_MODIFIER) || u_hasBinaryProperty(p_c, UCHAR_REGIONAL_INDICATOR); } } @@ -119,8 +123,7 @@ ScriptIterator::ScriptIterator(const String &p_string, int p_start, int p_length } if (script_code == USCRIPT_SYMBOLS_EMOJI && script_code != sc) { - UCharCategory cat = (UCharCategory)u_charType(ch); - if ((cat >= U_SPACE_SEPARATOR && cat <= U_CONTROL_CHAR) || (cat >= U_DASH_PUNCTUATION && cat <= U_OTHER_PUNCTUATION) || (cat >= U_INITIAL_PUNCTUATION && cat <= U_FINAL_PUNCTUATION)) { + if (ch == VARIATION_SELECTOR_15 || n == VARIATION_SELECTOR_15 || !(is_emoji(ch, n) || ch == ZERO_WIDTH_JOINER || ch == VARIATION_SELECTOR_16 || u_hasBinaryProperty(ch, UCHAR_EXTENDED_PICTOGRAPHIC))) { break; } } else if (same_script(script_code, sc)) { diff --git a/thirdparty/icu4c/godot_data.json b/thirdparty/icu4c/godot_data.json index e36e2b078b..645be125df 100644 --- a/thirdparty/icu4c/godot_data.json +++ b/thirdparty/icu4c/godot_data.json @@ -7,5 +7,7 @@ misc: include normalization: include confusables: include + uemoji: include + uprops: include } } diff --git a/thirdparty/icu4c/icudt_godot.dat b/thirdparty/icu4c/icudt_godot.dat index c6b96c477b38368496659e0718fd5a7fc569e6eb..16fe24004b5eb2ea193eabdd93c1a7e3fc833a70 100644 GIT binary patch delta 13571 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 NpyIxLf{Mq5I{+#G5_kXr delta 830 zcmezHY6;VWrX@@hCe+(9FfhDfWMFXMU|`^7Vqh?M#mu0_#K4ds$HL$QqW3E?L^3fj z2%J`8C}3h>*l=2jp`D3=VZkLOhJ{QF3?D8jF&t!KV3=@OiQxuF-5n){_aJ?Dlo;5U z85jf}Dly11GcX)@ti)i#%)qeVof1PZNPM>@Ll!ebJ%hnsO@?-628IF)9fk$W3=9on zx(s`m85lN{=rP=8W?(Rwt6O76t|bH)DoO76t}|3=@XQ zEDQ_@^Gq4Gu`n=fxM0R`mW6>~!A&!U*C6$`%otc$85lO)HDi!wWnf^qZ^mH4%D`|z z$DAR6wVr`tLzOv0I!L10oS~JKf#E>9CBuA>hUu0JJ6IVQ5L%00{hhF;!4*m8I90u(lI1JlAa2U0J z;4p6gz+uw{(-}`{R4+x`v(sD y_75Bm?H@QC+dptPwSVAnZvVjHvi$>x>lx|xH4(1uYa-m**F?B)UlZYR