From 81d930a594ae25a92bdaf2f7ed2ca3fea0523325 Mon Sep 17 00:00:00 2001 From: Jonathan Kew <jkew@mozilla.com> Date: Tue, 28 Feb 2023 09:58:36 +0000 Subject: [PATCH] Bug 1819025 - Don't consider following join-controls when determining whether a space is collapsible. r=emilio Differential Revision: https://phabricator.services.mozilla.com/D171061 --- intl/unicharutil/util/nsUnicodeProperties.cpp | 9 +++++++++ intl/unicharutil/util/nsUnicodeProperties.h | 6 ++++++ layout/generic/nsTextFrameUtils.cpp | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/intl/unicharutil/util/nsUnicodeProperties.cpp b/intl/unicharutil/util/nsUnicodeProperties.cpp index 7f5029765cc41..ea7fa80ea92b8 100644 --- a/intl/unicharutil/util/nsUnicodeProperties.cpp +++ b/intl/unicharutil/util/nsUnicodeProperties.cpp @@ -167,6 +167,15 @@ bool 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 +} + uint32_t CountGraphemeClusters(Span<const char16_t> aText) { intl::GraphemeClusterBreakIteratorUtf16 iter(aText); uint32_t result = 0; diff --git a/intl/unicharutil/util/nsUnicodeProperties.h b/intl/unicharutil/util/nsUnicodeProperties.h index 610dc3c734d27..6f3c9dbaf8936 100644 --- a/intl/unicharutil/util/nsUnicodeProperties.h +++ b/intl/unicharutil/util/nsUnicodeProperties.h @@ -159,6 +159,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)); +} + // Count the number of grapheme clusters in the given string uint32_t CountGraphemeClusters(Span<const char16_t> aText); diff --git a/layout/generic/nsTextFrameUtils.cpp b/layout/generic/nsTextFrameUtils.cpp index 170ee0f7e6179..1cfa51fbdecf5 100644 --- a/layout/generic/nsTextFrameUtils.cpp +++ b/layout/generic/nsTextFrameUtils.cpp @@ -23,7 +23,7 @@ using namespace mozilla::dom; bool nsTextFrameUtils::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))); } -- GitLab