From c857c24a648e08c3c9e64bfb447ea7a6eb4ef474 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Fri, 18 Oct 2024 12:10:13 +0300 Subject: [PATCH] Added util functions to process photo and document as dynamic images. --- .../SourceFiles/ui/dynamic_thumbnails.cpp | 85 +++++++++++++------ Telegram/SourceFiles/ui/dynamic_thumbnails.h | 9 ++ 2 files changed, 67 insertions(+), 27 deletions(-) diff --git a/Telegram/SourceFiles/ui/dynamic_thumbnails.cpp b/Telegram/SourceFiles/ui/dynamic_thumbnails.cpp index 868e95cb5..67cda874c 100644 --- a/Telegram/SourceFiles/ui/dynamic_thumbnails.cpp +++ b/Telegram/SourceFiles/ui/dynamic_thumbnails.cpp @@ -61,7 +61,7 @@ private: class StoryThumbnail : public DynamicImage { public: - explicit StoryThumbnail(FullStoryId id); + explicit StoryThumbnail(Data::FileOrigin origin, bool forceRound); QImage image(int size) override; void subscribeToUpdates(Fn callback) override; @@ -72,14 +72,16 @@ protected: bool blurred = false; }; - [[nodiscard]] FullStoryId id() const; + [[nodiscard]] Data::FileOrigin origin() const; + [[nodiscard]] bool forceRound() const; [[nodiscard]] virtual Main::Session &session() = 0; - [[nodiscard]] virtual Thumb loaded(FullStoryId id) = 0; + [[nodiscard]] virtual Thumb loaded(Data::FileOrigin origin) = 0; virtual void clear() = 0; private: - const FullStoryId _id; + const Data::FileOrigin _origin; + const bool _forceRound; QImage _full; rpl::lifetime _subscription; QImage _prepared; @@ -89,13 +91,16 @@ private: class PhotoThumbnail final : public StoryThumbnail { public: - PhotoThumbnail(not_null photo, FullStoryId id); + PhotoThumbnail( + not_null photo, + Data::FileOrigin origin, + bool forceRound); std::shared_ptr clone() override; private: Main::Session &session() override; - Thumb loaded(FullStoryId id) override; + Thumb loaded(Data::FileOrigin origin) override; void clear() override; const not_null _photo; @@ -105,13 +110,16 @@ private: class VideoThumbnail final : public StoryThumbnail { public: - VideoThumbnail(not_null video, FullStoryId id); + VideoThumbnail( + not_null video, + Data::FileOrigin origin, + bool forceRound); std::shared_ptr clone() override; private: Main::Session &session() override; - Thumb loaded(FullStoryId id) override; + Thumb loaded(Data::FileOrigin origin) override; void clear() override; const not_null _video; @@ -296,8 +304,9 @@ void PeerUserpic::processNewPhoto() { }, _subscribed->downloadLifetime); } -StoryThumbnail::StoryThumbnail(FullStoryId id) -: _id(id) { +StoryThumbnail::StoryThumbnail(Data::FileOrigin origin, bool forceRound) +: _origin(origin) +, _forceRound(forceRound) { } QImage StoryThumbnail::image(int size) { @@ -316,7 +325,9 @@ QImage StoryThumbnail::image(int size) { Qt::IgnoreAspectRatio, Qt::SmoothTransformation); } - _prepared = Images::Circle(std::move(_prepared)); + if (_forceRound) { + _prepared = Images::Circle(std::move(_prepared)); + } _prepared.setDevicePixelRatio(ratio); } return _prepared; @@ -330,7 +341,7 @@ void StoryThumbnail::subscribeToUpdates(Fn callback) { } else if (!_full.isNull() && !_blurred) { return; } - const auto thumbnail = loaded(_id); + const auto thumbnail = loaded(_origin); if (const auto image = thumbnail.image) { _full = image->original(); } @@ -340,7 +351,7 @@ void StoryThumbnail::subscribeToUpdates(Fn callback) { } else { _subscription = session().downloaderTaskFinished( ) | rpl::filter([=] { - const auto thumbnail = loaded(_id); + const auto thumbnail = loaded(_origin); if (!thumbnail.blurred) { _full = thumbnail.image->original(); _prepared = QImage(); @@ -352,27 +363,34 @@ void StoryThumbnail::subscribeToUpdates(Fn callback) { } } -FullStoryId StoryThumbnail::id() const { - return _id; +Data::FileOrigin StoryThumbnail::origin() const { + return _origin; } -PhotoThumbnail::PhotoThumbnail(not_null photo, FullStoryId id) -: StoryThumbnail(id) +bool StoryThumbnail::forceRound() const { + return _forceRound; +} + +PhotoThumbnail::PhotoThumbnail( + not_null photo, + Data::FileOrigin origin, + bool forceRound) +: StoryThumbnail(origin, forceRound) , _photo(photo) { } std::shared_ptr PhotoThumbnail::clone() { - return std::make_shared(_photo, id()); + return std::make_shared(_photo, origin(), forceRound()); } Main::Session &PhotoThumbnail::session() { return _photo->session(); } -StoryThumbnail::Thumb PhotoThumbnail::loaded(FullStoryId id) { +StoryThumbnail::Thumb PhotoThumbnail::loaded(Data::FileOrigin origin) { if (!_media) { _media = _photo->createMediaView(); - _media->wanted(Data::PhotoSize::Small, id); + _media->wanted(Data::PhotoSize::Small, origin); } if (const auto small = _media->image(Data::PhotoSize::Small)) { return { .image = small }; @@ -386,23 +404,24 @@ void PhotoThumbnail::clear() { VideoThumbnail::VideoThumbnail( not_null video, - FullStoryId id) -: StoryThumbnail(id) + Data::FileOrigin origin, + bool forceRound) +: StoryThumbnail(origin, forceRound) , _video(video) { } std::shared_ptr VideoThumbnail::clone() { - return std::make_shared(_video, id()); + return std::make_shared(_video, origin(), forceRound()); } Main::Session &VideoThumbnail::session() { return _video->session(); } -StoryThumbnail::Thumb VideoThumbnail::loaded(FullStoryId id) { +StoryThumbnail::Thumb VideoThumbnail::loaded(Data::FileOrigin origin) { if (!_media) { _media = _video->createMediaView(); - _media->thumbnailWanted(id); + _media->thumbnailWanted(origin); } if (const auto small = _media->thumbnail()) { return { .image = small }; @@ -634,9 +653,9 @@ std::shared_ptr MakeStoryThumbnail( return v::match(story->media().data, [](v::null_t) -> Result { return std::make_shared(); }, [&](not_null photo) -> Result { - return std::make_shared(photo, id); + return std::make_shared(photo, id, true); }, [&](not_null video) -> Result { - return std::make_shared(video, id); + return std::make_shared(video, id, true); }); } @@ -650,4 +669,16 @@ std::shared_ptr MakeEmojiThumbnail( return std::make_shared(owner, data); } +std::shared_ptr MakePhotoThumbnail( + not_null photo, + FullMsgId fullId) { + return std::make_shared(photo, fullId, false); +} + +std::shared_ptr MakeDocumentThumbnail( + not_null document, + FullMsgId fullId) { + return std::make_shared(document, fullId, false); +} + } // namespace Ui diff --git a/Telegram/SourceFiles/ui/dynamic_thumbnails.h b/Telegram/SourceFiles/ui/dynamic_thumbnails.h index 9876d3df8..3f4bd4337 100644 --- a/Telegram/SourceFiles/ui/dynamic_thumbnails.h +++ b/Telegram/SourceFiles/ui/dynamic_thumbnails.h @@ -7,7 +7,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once +class DocumentData; class PeerData; +class PhotoData; namespace Data { class Story; @@ -32,4 +34,11 @@ class DynamicImage; not_null owner, const QString &data); +[[nodiscard]] std::shared_ptr MakePhotoThumbnail( + not_null photo, + FullMsgId fullId); +[[nodiscard]] std::shared_ptr MakeDocumentThumbnail( + not_null document, + FullMsgId fullId); + } // namespace Ui