From 01c4ba869a07eabc9eea2b633542a53e9ff6ff4c Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 23 Aug 2022 17:46:56 +0300 Subject: [PATCH] Allow requesting low-quality scaling of custom emoji. --- ui/text/text.cpp | 13 ++++++------- ui/text/text_block.h | 21 ++++++++++++++------- ui/widgets/input_fields.cpp | 15 ++++++++------- 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/ui/text/text.cpp b/ui/text/text.cpp index 1877de5..7a2af6c 100644 --- a/ui/text/text.cpp +++ b/ui/text/text.cpp @@ -1724,13 +1724,12 @@ private: _customEmojiSize = AdjustCustomEmojiSize(st::emojiSize); _customEmojiSkip = (st::emojiSize - _customEmojiSize) / 2; } - custom->paint( - *_p, - x + _customEmojiSkip, - y + _customEmojiSkip, - _now, - _textPalette->spoilerActiveBg->c, - _p->inactive()); + custom->paint(*_p, { + .preview = _textPalette->spoilerActiveBg->c, + .now = _now, + .position = { x + _customEmojiSkip, y + _customEmojiSkip }, + .paused = _p->inactive(), + }); } } if (hasSpoiler) { diff --git a/ui/text/text_block.h b/ui/text/text_block.h index da10ab2..c55e59e 100644 --- a/ui/text/text_block.h +++ b/ui/text/text_block.h @@ -166,17 +166,24 @@ private: }; +struct CustomEmojiPaintContext { + QColor preview; + QSize size; // Required only when scaled = true, for path scaling. + crl::time now = 0; + float64 scale = 0.; + QPoint position; + bool paused = false; + bool scaled = false; +}; + class CustomEmoji { public: virtual ~CustomEmoji() = default; + [[nodiscard]] virtual QString entityData() = 0; - virtual void paint( - QPainter &p, - int x, - int y, - crl::time now, - const QColor &preview, - bool paused) = 0; + + using Context = CustomEmojiPaintContext; + virtual void paint(QPainter &p, const Context &context) = 0; virtual void unload() = 0; }; diff --git a/ui/widgets/input_fields.cpp b/ui/widgets/input_fields.cpp index 09128f5..490a025 100644 --- a/ui/widgets/input_fields.cpp +++ b/ui/widgets/input_fields.cpp @@ -1424,13 +1424,14 @@ void CustomEmojiObject::drawObject( if (i == end(_emoji)) { return; } - i->second->paint( - *painter, - int(base::SafeRound(rect.x())) + st::emojiPadding + _skip, - int(base::SafeRound(rect.y())) + _skip, - _now, - st::defaultTextPalette.spoilerActiveBg->c, - _paused && _paused()); + i->second->paint(*painter, { + .preview = st::defaultTextPalette.spoilerActiveBg->c, + .now = _now, + .position = QPoint( + int(base::SafeRound(rect.x())) + st::emojiPadding + _skip, + int(base::SafeRound(rect.y())) + _skip), + .paused = _paused && _paused(), + }); } void CustomEmojiObject::clear() {