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(),
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<DeleteSelected>(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()

View File

@ -4054,10 +4054,18 @@ void Session::setWallpapers(const QVector<MTPWallPaper> &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<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 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<QColor> 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> 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) {

View File

@ -90,6 +90,7 @@ public:
qint32 legacyId);
[[nodiscard]] static std::optional<WallPaper> 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);

View File

@ -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);
}

View File

@ -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,

View File

@ -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();

View File

@ -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);