Update default chat background.

This commit is contained in:
John Preston 2021-08-31 22:10:39 +03:00
parent d29a1f5cd2
commit f59db10267
11 changed files with 110 additions and 47 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

View File

@ -242,6 +242,7 @@ void BackgroundBox::Inner::sortPapers() {
night ? data.isDark() : !data.isDark(), night ? data.isDark() : !data.isDark(),
Data::IsDefaultWallPaper(data), Data::IsDefaultWallPaper(data),
!data.isDefault() && !Data::IsLegacy1DefaultWallPaper(data), !data.isDefault() && !Data::IsLegacy1DefaultWallPaper(data),
Data::IsLegacy3DefaultWallPaper(data),
Data::IsLegacy2DefaultWallPaper(data), Data::IsLegacy2DefaultWallPaper(data),
Data::IsLegacy1DefaultWallPaper(data)); Data::IsLegacy1DefaultWallPaper(data));
}); });
@ -379,6 +380,7 @@ void BackgroundBox::Inner::paintPaper(
} else if (Data::IsCloudWallPaper(paper.data) } else if (Data::IsCloudWallPaper(paper.data)
&& !Data::IsDefaultWallPaper(paper.data) && !Data::IsDefaultWallPaper(paper.data)
&& !Data::IsLegacy2DefaultWallPaper(paper.data) && !Data::IsLegacy2DefaultWallPaper(paper.data)
&& !Data::IsLegacy3DefaultWallPaper(paper.data)
&& !v::is_null(over) && !v::is_null(over)
&& (&paper == &_papers[getSelectionIndex(over)])) { && (&paper == &_papers[getSelectionIndex(over)])) {
const auto deleteSelected = v::is<DeleteSelected>(over); const auto deleteSelected = v::is<DeleteSelected>(over);
@ -419,6 +421,7 @@ void BackgroundBox::Inner::mouseMoveEvent(QMouseEvent *e) {
&& Data::IsCloudWallPaper(data) && Data::IsCloudWallPaper(data)
&& !Data::IsDefaultWallPaper(data) && !Data::IsDefaultWallPaper(data)
&& !Data::IsLegacy2DefaultWallPaper(data) && !Data::IsLegacy2DefaultWallPaper(data)
&& !Data::IsLegacy3DefaultWallPaper(data)
&& (currentId != data.id()); && (currentId != data.id());
return (result >= _papers.size()) return (result >= _papers.size())
? Selection() ? Selection()

View File

@ -4054,10 +4054,18 @@ void Session::setWallpapers(const QVector<MTPWallPaper> &data, int32 hash) {
ranges::rotate(begin(_wallpapers), legacy2, legacy2 + 1); 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)) { if (ranges::none_of(_wallpapers, Data::IsDefaultWallPaper)) {
_wallpapers.push_back(Data::DefaultWallPaper()); _wallpapers.push_back(Data::DefaultWallPaper());
_wallpapers.back().setLocalImageAsThumbnail(std::make_shared<Image>( _wallpapers.back().setLocalImageAsThumbnail(std::make_shared<Image>(
u":/gui/art/background.jpg"_q)); u":/gui/art/bg_thumbnail.png"_q));
} }
} }

View File

@ -30,7 +30,9 @@ constexpr auto kThemeBackground = FromLegacyBackgroundId(-2);
constexpr auto kCustomBackground = FromLegacyBackgroundId(-1); constexpr auto kCustomBackground = FromLegacyBackgroundId(-1);
constexpr auto kLegacy1DefaultBackground = FromLegacyBackgroundId(0); constexpr auto kLegacy1DefaultBackground = FromLegacyBackgroundId(0);
constexpr auto kLegacy2DefaultBackground = 5947530738516623361; 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 kIncorrectDefaultBackground = FromLegacyBackgroundId(105);
constexpr auto kVersionTag = qint32(0x7FFFFFFF); constexpr auto kVersionTag = qint32(0x7FFFFFFF);
@ -388,13 +390,16 @@ WallPaper WallPaper::withBackgroundColors(std::vector<QColor> colors) const {
WallPaper WallPaper::withParamsFrom(const WallPaper &other) const { WallPaper WallPaper::withParamsFrom(const WallPaper &other) const {
auto result = *this; auto result = *this;
result._blurred = other._blurred; result._blurred = other._blurred;
if (!other._backgroundColors.empty() || ColorsFromString(_slug).empty()) { if (!other._backgroundColors.empty()) {
result._backgroundColors = other._backgroundColors; result._backgroundColors = other._backgroundColors;
if (!ColorsFromString(_slug).empty()) { if (!ColorsFromString(_slug).empty()) {
result._slug = StringFromColors(result._backgroundColors); result._slug = StringFromColors(result._backgroundColors);
} }
} }
result._intensity = other._intensity; result._intensity = other._intensity;
if (other.isPattern()) {
result._flags |= WallPaperFlag::Pattern;
}
return result; return result;
} }
@ -632,6 +637,19 @@ std::optional<WallPaper> WallPaper::FromColorsSlug(const QString &slug) {
return result; 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() { WallPaper ThemeWallPaper() {
return WallPaper(kThemeBackground); return WallPaper(kThemeBackground);
} }
@ -661,8 +679,16 @@ bool IsLegacy2DefaultWallPaper(const WallPaper &paper) {
|| (paper.id() == kIncorrectDefaultBackground); || (paper.id() == kIncorrectDefaultBackground);
} }
bool IsLegacy3DefaultWallPaper(const WallPaper &paper) {
return (paper.id() == kLegacy3DefaultBackground);
}
bool IsLegacy4DefaultWallPaper(const WallPaper &paper) {
return (paper.id() == kLegacy4DefaultBackground);
}
WallPaper DefaultWallPaper() { WallPaper DefaultWallPaper() {
return WallPaper(kDefaultBackground); return WallPaper::ConstructDefault();
} }
bool IsDefaultWallPaper(const WallPaper &paper) { bool IsDefaultWallPaper(const WallPaper &paper) {
@ -728,7 +754,9 @@ bool IsTestingThemeWallPaper(const WallPaper &paper) {
} }
WallPaper TestingDefaultWallPaper() { WallPaper TestingDefaultWallPaper() {
return WallPaper(kTestingDefaultBackground); return WallPaper(
kTestingDefaultBackground
).withParamsFrom(DefaultWallPaper());
} }
bool IsTestingDefaultWallPaper(const WallPaper &paper) { bool IsTestingDefaultWallPaper(const WallPaper &paper) {

View File

@ -90,6 +90,7 @@ public:
qint32 legacyId); qint32 legacyId);
[[nodiscard]] static std::optional<WallPaper> FromColorsSlug( [[nodiscard]] static std::optional<WallPaper> FromColorsSlug(
const QString &slug); const QString &slug);
[[nodiscard]] static WallPaper ConstructDefault();
private: private:
static constexpr auto kDefaultIntensity = 50; static constexpr auto kDefaultIntensity = 50;
@ -117,6 +118,8 @@ private:
[[nodiscard]] WallPaper Legacy1DefaultWallPaper(); [[nodiscard]] WallPaper Legacy1DefaultWallPaper();
[[nodiscard]] bool IsLegacy1DefaultWallPaper(const WallPaper &paper); [[nodiscard]] bool IsLegacy1DefaultWallPaper(const WallPaper &paper);
[[nodiscard]] bool IsLegacy2DefaultWallPaper(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]] WallPaper DefaultWallPaper();
[[nodiscard]] bool IsDefaultWallPaper(const WallPaper &paper); [[nodiscard]] bool IsDefaultWallPaper(const WallPaper &paper);
[[nodiscard]] bool IsCloudWallPaper(const WallPaper &paper); [[nodiscard]] bool IsCloudWallPaper(const WallPaper &paper);

View File

@ -682,12 +682,13 @@ bool readBackground() {
const auto isOldEmptyImage = (bg.stream.status() != QDataStream::Ok); const auto isOldEmptyImage = (bg.stream.status() != QDataStream::Ok);
if (isOldEmptyImage if (isOldEmptyImage
|| Data::IsLegacy1DefaultWallPaper(*paper) || 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)) { || Data::IsDefaultWallPaper(*paper)) {
_backgroundCanWrite = false; _backgroundCanWrite = false;
if (isOldEmptyImage || bg.version < 2008012) { if (isOldEmptyImage || bg.version < 3000000) {
Window::Theme::Background()->set(Data::DefaultWallPaper()); Window::Theme::Background()->set(Data::DefaultWallPaper());
Window::Theme::Background()->setTile(false);
} else { } else {
Window::Theme::Background()->set(*paper); Window::Theme::Background()->set(*paper);
} }

View File

@ -59,6 +59,13 @@ inline bool AreTestingTheme() {
return !GlobalApplying.paletteForRevert.isEmpty(); return !GlobalApplying.paletteForRevert.isEmpty();
} }
[[nodiscard]] QImage ReadDefaultImage() {
return Ui::ReadBackgroundImage(
u":/gui/art/background.tgv"_q,
QByteArray(),
true);
}
[[nodiscard]] bool GoodImageFormatAndSize(const QImage &image) { [[nodiscard]] bool GoodImageFormatAndSize(const QImage &image) {
return !image.size().isEmpty() return !image.size().isEmpty()
&& (image.format() == QImage::Format_ARGB32_Premultiplied && (image.format() == QImage::Format_ARGB32_Premultiplied
@ -432,8 +439,7 @@ bool InitializeFromSaved(Saved &&saved) {
QImage::Format_ARGB32_Premultiplied); QImage::Format_ARGB32_Premultiplied);
} }
image.setDevicePixelRatio(cRetinaFactor()); image.setDevicePixelRatio(cRetinaFactor());
if (Data::IsDefaultWallPaper(paper) if (Data::IsLegacy3DefaultWallPaper(paper)) {
|| Data::details::IsTestingDefaultWallPaper(paper)) {
return Images::DitherImage(std::move(image)); return Images::DitherImage(std::move(image));
} }
return image; return image;
@ -659,13 +665,11 @@ void ChatBackground::set(const Data::WallPaper &paper, QImage image) {
|| Data::details::IsTestingEditorWallPaper(_paper)) { || Data::details::IsTestingEditorWallPaper(_paper)) {
if (Data::details::IsTestingDefaultWallPaper(_paper) if (Data::details::IsTestingDefaultWallPaper(_paper)
|| image.isNull()) { || image.isNull()) {
image.load(qsl(":/gui/art/background.jpg")); image = ReadDefaultImage();
setPaper(Data::details::TestingDefaultWallPaper()); setPaper(Data::details::TestingDefaultWallPaper());
} }
image = postprocessBackgroundImage(std::move(image)); setPreparedAfterPaper(std::move(image));
setPrepared(image, image, QImage());
} else { } else {
const auto &bgColors = _paper.backgroundColors();
if (Data::IsLegacy1DefaultWallPaper(_paper)) { if (Data::IsLegacy1DefaultWallPaper(_paper)) {
image.load(qsl(":/gui/art/bg_initial.jpg")); image.load(qsl(":/gui/art/bg_initial.jpg"));
const auto scale = cScale() * cIntRetinaFactor(); const auto scale = cScale() * cIntRetinaFactor();
@ -675,9 +679,9 @@ void ChatBackground::set(const Data::WallPaper &paper, QImage image) {
Qt::SmoothTransformation); Qt::SmoothTransformation);
} }
} else if (Data::IsDefaultWallPaper(_paper) } else if (Data::IsDefaultWallPaper(_paper)
|| (bgColors.empty() && image.isNull())) { || (_paper.backgroundColors().empty() && image.isNull())) {
setPaper(Data::DefaultWallPaper().withParamsFrom(_paper)); setPaper(Data::DefaultWallPaper().withParamsFrom(_paper));
image.load(qsl(":/gui/art/background.jpg")); image = ReadDefaultImage();
} }
Local::writeBackground( Local::writeBackground(
_paper, _paper,
@ -685,36 +689,7 @@ void ChatBackground::set(const Data::WallPaper &paper, QImage image) {
|| Data::IsLegacy1DefaultWallPaper(_paper)) || Data::IsLegacy1DefaultWallPaper(_paper))
? QImage() ? QImage()
: image)); : image));
if (_paper.isPattern() && !image.isNull()) { setPreparedAfterPaper(std::move(image));
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());
}
} }
Assert(colorForFill() Assert(colorForFill()
|| !_gradient.isNull() || !_gradient.isNull()
@ -730,6 +705,40 @@ void ChatBackground::set(const Data::WallPaper &paper, QImage image) {
checkUploadWallPaper(); 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( void ChatBackground::setPrepared(
QImage original, QImage original,
QImage prepared, QImage prepared,

View File

@ -207,6 +207,7 @@ private:
[[nodiscard]] bool started() const; [[nodiscard]] bool started() const;
void initialRead(); void initialRead();
void saveForRevert(); void saveForRevert();
void setPreparedAfterPaper(QImage image);
void setPrepared(QImage original, QImage prepared, QImage gradient); void setPrepared(QImage original, QImage prepared, QImage gradient);
void prepareImageForTiled(); void prepareImageForTiled();
void writeNewBackgroundSettings(); void writeNewBackgroundSettings();

View File

@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/image/image_prepare.h" #include "ui/image/image_prepare.h"
#include "ui/emoji_config.h" #include "ui/emoji_config.h"
#include "ui/chat/chat_theme.h" #include "ui/chat/chat_theme.h"
#include "ui/image/image_prepare.h"
#include "styles/style_widgets.h" #include "styles/style_widgets.h"
#include "styles/style_window.h" #include "styles/style_window.h"
#include "styles/style_media_view.h" #include "styles/style_media_view.h"
@ -417,7 +418,16 @@ void Generator::paintHistoryBackground() {
if (background.isNull()) { if (background.isNull()) {
const auto fakePaper = Data::WallPaper(_current.backgroundId); const auto fakePaper = Data::WallPaper(_current.backgroundId);
if (Data::IsThemeWallPaper(fakePaper)) { 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; tiled = false;
} else { } else {
background = std::move(_current.backgroundImage); background = std::move(_current.backgroundImage);