diff --git a/Telegram/Resources/art/background.jpg b/Telegram/Resources/art/background.jpg deleted file mode 100644 index 04d57e4db..000000000 Binary files a/Telegram/Resources/art/background.jpg and /dev/null differ diff --git a/Telegram/Resources/art/background.tgv b/Telegram/Resources/art/background.tgv new file mode 100644 index 000000000..a106f042d Binary files /dev/null and b/Telegram/Resources/art/background.tgv differ diff --git a/Telegram/Resources/art/bg_thumbnail.png b/Telegram/Resources/art/bg_thumbnail.png new file mode 100644 index 000000000..529b87c55 Binary files /dev/null and b/Telegram/Resources/art/bg_thumbnail.png differ diff --git a/Telegram/SourceFiles/boxes/background_box.cpp b/Telegram/SourceFiles/boxes/background_box.cpp index ffe69d903..e514f2f7d 100644 --- a/Telegram/SourceFiles/boxes/background_box.cpp +++ b/Telegram/SourceFiles/boxes/background_box.cpp @@ -242,6 +242,7 @@ void BackgroundBox::Inner::sortPapers() { night ? data.isDark() : !data.isDark(), Data::IsDefaultWallPaper(data), !data.isDefault() && !Data::IsLegacy1DefaultWallPaper(data), + Data::IsLegacy3DefaultWallPaper(data), Data::IsLegacy2DefaultWallPaper(data), Data::IsLegacy1DefaultWallPaper(data)); }); @@ -379,6 +380,7 @@ void BackgroundBox::Inner::paintPaper( } else if (Data::IsCloudWallPaper(paper.data) && !Data::IsDefaultWallPaper(paper.data) && !Data::IsLegacy2DefaultWallPaper(paper.data) + && !Data::IsLegacy3DefaultWallPaper(paper.data) && !v::is_null(over) && (&paper == &_papers[getSelectionIndex(over)])) { const auto deleteSelected = v::is(over); @@ -419,6 +421,7 @@ void BackgroundBox::Inner::mouseMoveEvent(QMouseEvent *e) { && Data::IsCloudWallPaper(data) && !Data::IsDefaultWallPaper(data) && !Data::IsLegacy2DefaultWallPaper(data) + && !Data::IsLegacy3DefaultWallPaper(data) && (currentId != data.id()); return (result >= _papers.size()) ? Selection() diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index aab3a1ff6..137ac67d0 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -4054,10 +4054,18 @@ void Session::setWallpapers(const QVector &data, int32 hash) { ranges::rotate(begin(_wallpapers), legacy2, legacy2 + 1); } + // Put the legacy3 (static gradient) wallpaper to the front of the list. + const auto legacy3 = ranges::find_if( + _wallpapers, + Data::IsLegacy3DefaultWallPaper); + if (legacy3 != end(_wallpapers)) { + ranges::rotate(begin(_wallpapers), legacy3, legacy3 + 1); + } + if (ranges::none_of(_wallpapers, Data::IsDefaultWallPaper)) { _wallpapers.push_back(Data::DefaultWallPaper()); _wallpapers.back().setLocalImageAsThumbnail(std::make_shared( - u":/gui/art/background.jpg"_q)); + u":/gui/art/bg_thumbnail.png"_q)); } } diff --git a/Telegram/SourceFiles/data/data_wall_paper.cpp b/Telegram/SourceFiles/data/data_wall_paper.cpp index 0d8371d0e..353ca70fd 100644 --- a/Telegram/SourceFiles/data/data_wall_paper.cpp +++ b/Telegram/SourceFiles/data/data_wall_paper.cpp @@ -30,7 +30,9 @@ constexpr auto kThemeBackground = FromLegacyBackgroundId(-2); constexpr auto kCustomBackground = FromLegacyBackgroundId(-1); constexpr auto kLegacy1DefaultBackground = FromLegacyBackgroundId(0); constexpr auto kLegacy2DefaultBackground = 5947530738516623361; -constexpr auto kDefaultBackground = 5778236420632084488; +constexpr auto kLegacy3DefaultBackground = 5778236420632084488; +constexpr auto kLegacy4DefaultBackground = 5945087215657811969; +constexpr auto kDefaultBackground = 5933856211186221059; constexpr auto kIncorrectDefaultBackground = FromLegacyBackgroundId(105); constexpr auto kVersionTag = qint32(0x7FFFFFFF); @@ -388,13 +390,16 @@ WallPaper WallPaper::withBackgroundColors(std::vector colors) const { WallPaper WallPaper::withParamsFrom(const WallPaper &other) const { auto result = *this; result._blurred = other._blurred; - if (!other._backgroundColors.empty() || ColorsFromString(_slug).empty()) { + if (!other._backgroundColors.empty()) { result._backgroundColors = other._backgroundColors; if (!ColorsFromString(_slug).empty()) { result._slug = StringFromColors(result._backgroundColors); } } result._intensity = other._intensity; + if (other.isPattern()) { + result._flags |= WallPaperFlag::Pattern; + } return result; } @@ -632,6 +637,19 @@ std::optional WallPaper::FromColorsSlug(const QString &slug) { return result; } +WallPaper WallPaper::ConstructDefault() { + auto result = WallPaper( + kDefaultBackground + ).withPatternIntensity(50).withBackgroundColors({ + QColor(219, 221, 187), + QColor(107, 165, 135), + QColor(213, 216, 141), + QColor(136, 184, 132), + }); + result._flags |= WallPaperFlag::Default | WallPaperFlag::Pattern; + return result; +} + WallPaper ThemeWallPaper() { return WallPaper(kThemeBackground); } @@ -661,8 +679,16 @@ bool IsLegacy2DefaultWallPaper(const WallPaper &paper) { || (paper.id() == kIncorrectDefaultBackground); } +bool IsLegacy3DefaultWallPaper(const WallPaper &paper) { + return (paper.id() == kLegacy3DefaultBackground); +} + +bool IsLegacy4DefaultWallPaper(const WallPaper &paper) { + return (paper.id() == kLegacy4DefaultBackground); +} + WallPaper DefaultWallPaper() { - return WallPaper(kDefaultBackground); + return WallPaper::ConstructDefault(); } bool IsDefaultWallPaper(const WallPaper &paper) { @@ -728,7 +754,9 @@ bool IsTestingThemeWallPaper(const WallPaper &paper) { } WallPaper TestingDefaultWallPaper() { - return WallPaper(kTestingDefaultBackground); + return WallPaper( + kTestingDefaultBackground + ).withParamsFrom(DefaultWallPaper()); } bool IsTestingDefaultWallPaper(const WallPaper &paper) { diff --git a/Telegram/SourceFiles/data/data_wall_paper.h b/Telegram/SourceFiles/data/data_wall_paper.h index 40893bf70..ee4975278 100644 --- a/Telegram/SourceFiles/data/data_wall_paper.h +++ b/Telegram/SourceFiles/data/data_wall_paper.h @@ -90,6 +90,7 @@ public: qint32 legacyId); [[nodiscard]] static std::optional FromColorsSlug( const QString &slug); + [[nodiscard]] static WallPaper ConstructDefault(); private: static constexpr auto kDefaultIntensity = 50; @@ -117,6 +118,8 @@ private: [[nodiscard]] WallPaper Legacy1DefaultWallPaper(); [[nodiscard]] bool IsLegacy1DefaultWallPaper(const WallPaper &paper); [[nodiscard]] bool IsLegacy2DefaultWallPaper(const WallPaper &paper); +[[nodiscard]] bool IsLegacy3DefaultWallPaper(const WallPaper &paper); +[[nodiscard]] bool IsLegacy4DefaultWallPaper(const WallPaper &paper); [[nodiscard]] WallPaper DefaultWallPaper(); [[nodiscard]] bool IsDefaultWallPaper(const WallPaper &paper); [[nodiscard]] bool IsCloudWallPaper(const WallPaper &paper); diff --git a/Telegram/SourceFiles/storage/localstorage.cpp b/Telegram/SourceFiles/storage/localstorage.cpp index 7917297c8..61e6f5996 100644 --- a/Telegram/SourceFiles/storage/localstorage.cpp +++ b/Telegram/SourceFiles/storage/localstorage.cpp @@ -682,12 +682,13 @@ bool readBackground() { const auto isOldEmptyImage = (bg.stream.status() != QDataStream::Ok); if (isOldEmptyImage || Data::IsLegacy1DefaultWallPaper(*paper) - || (Data::IsLegacy2DefaultWallPaper(*paper) && bg.version < 2008012) + || (Data::IsLegacy2DefaultWallPaper(*paper) && bg.version < 3000000) + || (Data::IsLegacy3DefaultWallPaper(*paper) && bg.version < 3000000) + || (Data::IsLegacy4DefaultWallPaper(*paper) && bg.version < 3000000) || Data::IsDefaultWallPaper(*paper)) { _backgroundCanWrite = false; - if (isOldEmptyImage || bg.version < 2008012) { + if (isOldEmptyImage || bg.version < 3000000) { Window::Theme::Background()->set(Data::DefaultWallPaper()); - Window::Theme::Background()->setTile(false); } else { Window::Theme::Background()->set(*paper); } diff --git a/Telegram/SourceFiles/window/themes/window_theme.cpp b/Telegram/SourceFiles/window/themes/window_theme.cpp index 94fa6e561..8d9697469 100644 --- a/Telegram/SourceFiles/window/themes/window_theme.cpp +++ b/Telegram/SourceFiles/window/themes/window_theme.cpp @@ -59,6 +59,13 @@ inline bool AreTestingTheme() { return !GlobalApplying.paletteForRevert.isEmpty(); } +[[nodiscard]] QImage ReadDefaultImage() { + return Ui::ReadBackgroundImage( + u":/gui/art/background.tgv"_q, + QByteArray(), + true); +} + [[nodiscard]] bool GoodImageFormatAndSize(const QImage &image) { return !image.size().isEmpty() && (image.format() == QImage::Format_ARGB32_Premultiplied @@ -432,8 +439,7 @@ bool InitializeFromSaved(Saved &&saved) { QImage::Format_ARGB32_Premultiplied); } image.setDevicePixelRatio(cRetinaFactor()); - if (Data::IsDefaultWallPaper(paper) - || Data::details::IsTestingDefaultWallPaper(paper)) { + if (Data::IsLegacy3DefaultWallPaper(paper)) { return Images::DitherImage(std::move(image)); } return image; @@ -659,13 +665,11 @@ void ChatBackground::set(const Data::WallPaper &paper, QImage image) { || Data::details::IsTestingEditorWallPaper(_paper)) { if (Data::details::IsTestingDefaultWallPaper(_paper) || image.isNull()) { - image.load(qsl(":/gui/art/background.jpg")); + image = ReadDefaultImage(); setPaper(Data::details::TestingDefaultWallPaper()); } - image = postprocessBackgroundImage(std::move(image)); - setPrepared(image, image, QImage()); + setPreparedAfterPaper(std::move(image)); } else { - const auto &bgColors = _paper.backgroundColors(); if (Data::IsLegacy1DefaultWallPaper(_paper)) { image.load(qsl(":/gui/art/bg_initial.jpg")); const auto scale = cScale() * cIntRetinaFactor(); @@ -675,9 +679,9 @@ void ChatBackground::set(const Data::WallPaper &paper, QImage image) { Qt::SmoothTransformation); } } else if (Data::IsDefaultWallPaper(_paper) - || (bgColors.empty() && image.isNull())) { + || (_paper.backgroundColors().empty() && image.isNull())) { setPaper(Data::DefaultWallPaper().withParamsFrom(_paper)); - image.load(qsl(":/gui/art/background.jpg")); + image = ReadDefaultImage(); } Local::writeBackground( _paper, @@ -685,36 +689,7 @@ void ChatBackground::set(const Data::WallPaper &paper, QImage image) { || Data::IsLegacy1DefaultWallPaper(_paper)) ? QImage() : image)); - if (_paper.isPattern() && !image.isNull()) { - if (bgColors.size() < 2) { - auto prepared = postprocessBackgroundImage( - Ui::PreparePatternImage( - image, - bgColors, - _paper.gradientRotation(), - _paper.patternOpacity())); - setPrepared( - std::move(image), - std::move(prepared), - QImage()); - } else { - image = postprocessBackgroundImage(std::move(image)); - setPrepared( - image, - image, - Data::GenerateDitheredGradient(_paper)); - } - } else if (bgColors.size() == 1) { - setPrepared(QImage(), QImage(), QImage()); - } else if (!bgColors.empty()) { - setPrepared( - QImage(), - QImage(), - Data::GenerateDitheredGradient(_paper)); - } else { - image = postprocessBackgroundImage(std::move(image)); - setPrepared(image, image, QImage()); - } + setPreparedAfterPaper(std::move(image)); } Assert(colorForFill() || !_gradient.isNull() @@ -730,6 +705,40 @@ void ChatBackground::set(const Data::WallPaper &paper, QImage image) { checkUploadWallPaper(); } +void ChatBackground::setPreparedAfterPaper(QImage image) { + const auto &bgColors = _paper.backgroundColors(); + if (_paper.isPattern() && !image.isNull()) { + if (bgColors.size() < 2) { + auto prepared = postprocessBackgroundImage( + Ui::PreparePatternImage( + image, + bgColors, + _paper.gradientRotation(), + _paper.patternOpacity())); + setPrepared( + std::move(image), + std::move(prepared), + QImage()); + } else { + image = postprocessBackgroundImage(std::move(image)); + setPrepared( + image, + image, + Data::GenerateDitheredGradient(_paper)); + } + } else if (bgColors.size() == 1) { + setPrepared(QImage(), QImage(), QImage()); + } else if (!bgColors.empty()) { + setPrepared( + QImage(), + QImage(), + Data::GenerateDitheredGradient(_paper)); + } else { + image = postprocessBackgroundImage(std::move(image)); + setPrepared(image, image, QImage()); + } +} + void ChatBackground::setPrepared( QImage original, QImage prepared, diff --git a/Telegram/SourceFiles/window/themes/window_theme.h b/Telegram/SourceFiles/window/themes/window_theme.h index 0edb918b0..6c2b691dc 100644 --- a/Telegram/SourceFiles/window/themes/window_theme.h +++ b/Telegram/SourceFiles/window/themes/window_theme.h @@ -207,6 +207,7 @@ private: [[nodiscard]] bool started() const; void initialRead(); void saveForRevert(); + void setPreparedAfterPaper(QImage image); void setPrepared(QImage original, QImage prepared, QImage gradient); void prepareImageForTiled(); void writeNewBackgroundSettings(); diff --git a/Telegram/SourceFiles/window/themes/window_theme_preview.cpp b/Telegram/SourceFiles/window/themes/window_theme_preview.cpp index cae3ae0c3..9a9a03619 100644 --- a/Telegram/SourceFiles/window/themes/window_theme_preview.cpp +++ b/Telegram/SourceFiles/window/themes/window_theme_preview.cpp @@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/image/image_prepare.h" #include "ui/emoji_config.h" #include "ui/chat/chat_theme.h" +#include "ui/image/image_prepare.h" #include "styles/style_widgets.h" #include "styles/style_window.h" #include "styles/style_media_view.h" @@ -417,7 +418,16 @@ void Generator::paintHistoryBackground() { if (background.isNull()) { const auto fakePaper = Data::WallPaper(_current.backgroundId); if (Data::IsThemeWallPaper(fakePaper)) { - background.load(qsl(":/gui/art/background.jpg")); + background = Ui::ReadBackgroundImage( + u":/gui/art/background.tgv"_q, + QByteArray(), + true); + const auto paper = Data::DefaultWallPaper(); + background = Ui::PreparePatternImage( + std::move(background), + paper.backgroundColors(), + paper.gradientRotation(), + paper.patternOpacity()); tiled = false; } else { background = std::move(_current.backgroundImage);