From 3c8cf5f5dbc90fecb77bb87555b99fe964d03025 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 6 Mar 2024 17:35:19 +0300 Subject: [PATCH] Added storage of surrogate pairs count to every emoji. --- ui/emoji_config.cpp | 34 ++++++++++++++++++++++++++++++ ui/emoji_config.h | 50 ++++++++++++++++++++++++--------------------- 2 files changed, 61 insertions(+), 23 deletions(-) diff --git a/ui/emoji_config.cpp b/ui/emoji_config.cpp index 49f29e9..349d939 100644 --- a/ui/emoji_config.cpp +++ b/ui/emoji_config.cpp @@ -373,6 +373,24 @@ void ClearUniversalChecked() { } } +[[nodiscard]] uint8 EmojiSurrogatePairs(const QString &e) { + if (e.size() > 1) { + auto count = uint8(0); + const auto begin = e.data(); + auto ch = begin; + for (const auto end = begin + e.size(); ch != end; ++ch) { + if ((ch + 1 < end) + && ch->isHighSurrogate() + && (ch + 1)->isLowSurrogate()) { + count++; + } + } + return count; + } else { + return 0; + } +} + } // namespace namespace internal { @@ -627,6 +645,22 @@ int GetSizeTouchbar() { } #endif +One::One( + const QString &id, + EmojiPtr original, + uint32 index, + bool hasPostfix, + bool colorizable, + const CreationTag &) +: _id(id) +, _original(original) +, _index(index) +, _hasPostfix(hasPostfix) +, _colorizable(colorizable) +, _surrogatePairs(EmojiSurrogatePairs(text())) { + Expects(!_colorizable || !colored()); +} + int One::variantsCount() const { return hasVariants() ? 5 : 0; } diff --git a/ui/emoji_config.h b/ui/emoji_config.h index 95dd23b..30fbc77 100644 --- a/ui/emoji_config.h +++ b/ui/emoji_config.h @@ -51,66 +51,70 @@ class One { public: One(One &&other) = default; - One(const QString &id, EmojiPtr original, uint32 index, bool hasPostfix, bool colorizable, const CreationTag &) - : _id(id) - , _original(original) - , _index(index) - , _hasPostfix(hasPostfix) - , _colorizable(colorizable) { - Expects(!_colorizable || !colored()); - } + One( + const QString &id, + EmojiPtr original, + uint32 index, + bool hasPostfix, + bool colorizable, + const CreationTag &); - QString id() const { + [[nodiscard]] QString id() const { return _id; } - QString text() const { + [[nodiscard]] QString text() const { return hasPostfix() ? (_id + QChar(kPostfix)) : _id; } - bool colored() const { + [[nodiscard]] bool colored() const { return (_original != nullptr); } - EmojiPtr original() const { + [[nodiscard]] EmojiPtr original() const { return _original ? _original : this; } - QString nonColoredId() const { + [[nodiscard]] QString nonColoredId() const { return original()->id(); } - bool hasPostfix() const { + [[nodiscard]] bool hasPostfix() const { return _hasPostfix; } - bool hasVariants() const { + [[nodiscard]] bool hasVariants() const { return _colorizable || colored(); } - int variantsCount() const; - int variantIndex(EmojiPtr variant) const; - EmojiPtr variant(int index) const; + [[nodiscard]] int variantsCount() const; + [[nodiscard]] int variantIndex(EmojiPtr variant) const; + [[nodiscard]] EmojiPtr variant(int index) const; - int index() const { + [[nodiscard]] int index() const { return _index; } - int sprite() const { + [[nodiscard]] int sprite() const { return int(_index >> 9); } - int row() const { + [[nodiscard]] int row() const { return int((_index >> 5) & 0x0FU); } - int column() const { + [[nodiscard]] int column() const { return int(_index & 0x1FU); } - QString toUrl() const { + [[nodiscard]] QString toUrl() const { return "emoji://e." + QString::number(index()); } + [[nodiscard]] uint8 surrogatePairs() const { + return _surrogatePairs; + } + private: const QString _id; const EmojiPtr _original = nullptr; const uint32 _index = 0; const bool _hasPostfix = false; const bool _colorizable = false; + const uint8 _surrogatePairs; friend void internal::Init();