// This file is part of Desktop App Toolkit, // a set of libraries for developing nice desktop applications. // // For license and copyright information please follow this link: // https://github.com/desktop-app/legal/blob/master/LEGAL // #pragma once #include #include #include #include #include class QPainter; namespace Ui::Text { [[nodiscard]] int AdjustCustomEmojiSize(int emojiSize); struct CustomEmojiPaintContext { required textColor; 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; mutable struct { bool colorized = false; bool forceFirstFrame = false; bool forceLastFrame = false; bool overrideFirstWithLastFrame = false; } internal; }; class CustomEmoji { public: virtual ~CustomEmoji() = default; [[nodiscard]] virtual QString entityData() = 0; using Context = CustomEmojiPaintContext; virtual void paint(QPainter &p, const Context &context) = 0; virtual void unload() = 0; [[nodiscard]] virtual bool ready() = 0; [[nodiscard]] virtual bool readyInDefaultState() = 0; }; using CustomEmojiFactory = Fn( QStringView, Fn)>; class ShiftedEmoji final : public CustomEmoji { public: ShiftedEmoji(std::unique_ptr wrapped, QPoint shift); QString entityData() override; void paint(QPainter &p, const Context &context) override; void unload() override; bool ready() override; bool readyInDefaultState() override; private: const std::unique_ptr _wrapped; const QPoint _shift; }; class FirstFrameEmoji final : public CustomEmoji { public: explicit FirstFrameEmoji(std::unique_ptr wrapped); QString entityData() override; void paint(QPainter &p, const Context &context) override; void unload() override; bool ready() override; bool readyInDefaultState() override; private: const std::unique_ptr _wrapped; }; class LimitedLoopsEmoji final : public CustomEmoji { public: LimitedLoopsEmoji( std::unique_ptr wrapped, int limit, bool stopOnLast = false); QString entityData() override; void paint(QPainter &p, const Context &context) override; void unload() override; bool ready() override; bool readyInDefaultState() override; private: const std::unique_ptr _wrapped; const int _limit = 0; int _played = 0; bool _inLoop = false; bool _stopOnLast = false; }; } // namespace Ui::Text