From 854fac5c4cef8a62d3c5f421eb4b7e45045cb63b Mon Sep 17 00:00:00 2001 From: roytam1 Date: Sat, 8 Jun 2024 12:10:00 +0800 Subject: [PATCH] ported from mozilla: Bug 1819025 - Don't consider following join-controls when determining whether a space is collapsible. r=emilio (fad4426b7b) --- intl/unicharutil/util/nsUnicodeProperties.cpp | 10 ++++++++++ intl/unicharutil/util/nsUnicodeProperties.h | 6 ++++++ layout/generic/nsTextFrameUtils.h | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/intl/unicharutil/util/nsUnicodeProperties.cpp b/intl/unicharutil/util/nsUnicodeProperties.cpp index e78725b036..9d1a940968 100644 --- a/intl/unicharutil/util/nsUnicodeProperties.cpp +++ b/intl/unicharutil/util/nsUnicodeProperties.cpp @@ -158,6 +158,16 @@ IsClusterExtender(uint32_t aCh, uint8_t aCategory) (aCh >= 0xe0020 && aCh <= 0xe007f)); // emoji (flag) tag characters } +bool IsClusterExtenderExcludingJoiners(uint32_t aCh, uint8_t aCategory) +{ + return ((aCategory >= HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK && + aCategory <= HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) || + (aCh >= 0xff9e && aCh <= 0xff9f) || // katakana sound marks + (aCh >= 0x1F3FB && aCh <= 0x1F3FF) || // fitzpatrick skin tone modifiers + (aCh >= 0xe0020 && aCh <= 0xe007f)); // emoji (flag) tag characters +} + + enum HSType { HST_NONE = U_HST_NOT_APPLICABLE, HST_L = U_HST_LEADING_JAMO, diff --git a/intl/unicharutil/util/nsUnicodeProperties.h b/intl/unicharutil/util/nsUnicodeProperties.h index eaa066b7f6..3a85a2ecb6 100644 --- a/intl/unicharutil/util/nsUnicodeProperties.h +++ b/intl/unicharutil/util/nsUnicodeProperties.h @@ -216,6 +216,12 @@ inline bool IsClusterExtender(uint32_t aCh) { return IsClusterExtender(aCh, GetGeneralCategory(aCh)); } +bool IsClusterExtenderExcludingJoiners(uint32_t aCh, uint8_t aCategory); + +inline bool IsClusterExtenderExcludingJoiners(uint32_t aCh) { + return IsClusterExtenderExcludingJoiners(aCh, GetGeneralCategory(aCh)); +} + // A simple iterator for a string of char16_t codepoints that advances // by Unicode grapheme clusters class ClusterIterator diff --git a/layout/generic/nsTextFrameUtils.h b/layout/generic/nsTextFrameUtils.h index 6274705bc3..c721799d03 100644 --- a/layout/generic/nsTextFrameUtils.h +++ b/layout/generic/nsTextFrameUtils.h @@ -81,7 +81,7 @@ public: static bool IsSpaceCombiningSequenceTail(const char16_t* aChars, int32_t aLength) { return aLength > 0 && - (mozilla::unicode::IsClusterExtender(aChars[0]) || + (mozilla::unicode::IsClusterExtenderExcludingJoiners(aChars[0]) || (IsBidiControl(aChars[0]) && IsSpaceCombiningSequenceTail(aChars + 1, aLength - 1) )