From 1b6b0c1732f96fbce428a2332dfafcef021fa5ca Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 19 Apr 2023 12:14:39 +0400 Subject: [PATCH] Show blur / dimming in wallpaper preview. --- .../media/history_view_theme_document.cpp | 39 ++++++++++++++----- .../view/media/history_view_theme_document.h | 6 ++- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/Telegram/SourceFiles/history/view/media/history_view_theme_document.cpp b/Telegram/SourceFiles/history/view/media/history_view_theme_document.cpp index 5e4a48623..1ed00b91b 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_theme_document.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_theme_document.cpp @@ -30,6 +30,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/painter.h" #include "ui/ui_utility.h" #include "window/window_session_controller.h" +#include "window/themes/window_theme.h" #include "styles/style_chat.h" namespace HistoryView { @@ -54,6 +55,10 @@ ThemeDocument::ThemeDocument( _background = params->backgroundColors(); _patternOpacity = params->patternOpacity(); _gradientRotation = params->gradientRotation(); + _blurredWallPaper = params->isBlurred(); + _dimmingIntensity = (params->isPattern() || !_serviceWidth) + ? 0 + : std::max(params->patternIntensity(), 0); } const auto fullId = _parent->data()->fullId(); if (_data) { @@ -267,6 +272,11 @@ bool ThemeDocument::checkGoodThumbnail() const { } void ThemeDocument::validateThumbnail() const { + const auto isDark = Window::Theme::IsNightMode(); + if (_isDark != isDark) { + _isDark = isDark; + _thumbnailGood = -1; + } if (checkGoodThumbnail()) { if (_thumbnailGood > 0) { return; @@ -294,16 +304,30 @@ void ThemeDocument::validateThumbnail() const { } } +QImage ThemeDocument::finishServiceThumbnail(QImage image) const { + if (!_serviceWidth) { + return image; + } else if (_isDark && _dimmingIntensity > 0) { + image.setDevicePixelRatio(cIntRetinaFactor()); + auto p = QPainter(&image); + const auto alpha = 255 * _dimmingIntensity / 100; + p.fillRect(0, 0, _pixw, _pixh, QColor(0, 0, 0, alpha)); + } + if (_blurredWallPaper) { + constexpr auto kRadius = 16; + image = Images::BlurLargeImage(std::move(image), kRadius); + } + return Images::Circle(std::move(image)); +} + void ThemeDocument::generateThumbnail() const { auto image = Ui::GenerateBackgroundImage( QSize(_pixw, _pixh) * cIntRetinaFactor(), _background, _gradientRotation, _patternOpacity); - if (_serviceWidth) { - image = Images::Circle(std::move(image)); - } - _thumbnail = Ui::PixmapFromImage(std::move(image)); + _thumbnail = Ui::PixmapFromImage( + finishServiceThumbnail(std::move(image))); _thumbnail.setDevicePixelRatio(cRetinaFactor()); _thumbnailGood = 1; } @@ -317,7 +341,6 @@ void ThemeDocument::prepareThumbnailFrom( const auto isTheme = _data->isTheme(); const auto isPattern = _data->isPatternWallPaper(); auto options = (good >= 0 ? Images::Option(0) : Images::Option::Blur) - | (_serviceWidth ? Images::Option::RoundCircle : Images::Option(0)) | (isPattern ? Images::Option::TransparentBackground : Images::Option(0)); @@ -344,10 +367,8 @@ void ThemeDocument::prepareThumbnailFrom( _patternOpacity); original.setDevicePixelRatio(ratio); } - if (_serviceWidth) { - original = Images::Circle(std::move(original)); - } - _thumbnail = Ui::PixmapFromImage(std::move(original)); + _thumbnail = Ui::PixmapFromImage( + finishServiceThumbnail(std::move(original))); _thumbnailGood = good; } diff --git a/Telegram/SourceFiles/history/view/media/history_view_theme_document.h b/Telegram/SourceFiles/history/view/media/history_view_theme_document.h index 99bbd7a47..f923ca253 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_theme_document.h +++ b/Telegram/SourceFiles/history/view/media/history_view_theme_document.h @@ -63,12 +63,12 @@ private: QSize countOptimalSize() override; QSize countCurrentSize(int newWidth) override; - void fillPatternFieldsFrom(const QString &url); [[nodiscard]] bool checkGoodThumbnail() const; void validateThumbnail() const; void prepareThumbnailFrom(not_null image, int good) const; void generateThumbnail() const; void ensureDataMediaCreated() const; + [[nodiscard]] QImage finishServiceThumbnail(QImage image) const; DocumentData *_data = nullptr; int _pixw = 1; @@ -83,6 +83,10 @@ private: float64 _patternOpacity = 0.; int _gradientRotation = 0; + mutable bool _isDark = false; + int _dimmingIntensity = 0; + bool _blurredWallPaper = false; + }; class ThemeDocumentBox final : public ServiceBoxContent {