mirror of
https://github.com/telegramdesktop/tdesktop
synced 2025-08-31 06:26:18 +00:00
Closed beta 10019001: style::color copy is denied, only const refs.
This commit is contained in:
@@ -127,13 +127,6 @@ namespace {
|
||||
LastPhotosList lastPhotos;
|
||||
using LastPhotosMap = QHash<PhotoData*, LastPhotosList::iterator>;
|
||||
LastPhotosMap lastPhotosMap;
|
||||
|
||||
style::color _msgServiceBg;
|
||||
style::color _msgServiceSelectBg;
|
||||
style::color _historyScrollBarColor;
|
||||
style::color _historyScrollBgColor;
|
||||
style::color _historyScrollBarOverColor;
|
||||
style::color _historyScrollBgOverColor;
|
||||
}
|
||||
|
||||
namespace App {
|
||||
@@ -2270,6 +2263,23 @@ namespace {
|
||||
prepareCorners(MessageInSelectedCorners, msgRadius(), st::msgInBgSelected, &st::msgInShadowSelected);
|
||||
prepareCorners(MessageOutCorners, msgRadius(), st::msgOutBg, &st::msgOutShadow);
|
||||
prepareCorners(MessageOutSelectedCorners, msgRadius(), st::msgOutBgSelected, &st::msgOutShadowSelected);
|
||||
|
||||
static auto subscription = Window::Theme::Background()->add_subscription([](const Window::Theme::BackgroundUpdate &update) {
|
||||
if (update.type != Window::Theme::BackgroundUpdate::Type::New) {
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
delete ::corners[StickerCorners].p[i]; ::corners[StickerCorners].p[i] = nullptr;
|
||||
delete ::corners[StickerSelectedCorners].p[i]; ::corners[StickerSelectedCorners].p[i] = nullptr;
|
||||
}
|
||||
prepareCorners(StickerCorners, st::dateRadius, st::msgServiceBg);
|
||||
prepareCorners(StickerSelectedCorners, st::dateRadius, st::msgServiceSelectBg);
|
||||
|
||||
if (App::main()) {
|
||||
App::main()->updateScrollColors();
|
||||
}
|
||||
HistoryLayout::serviceColorsUpdated();
|
||||
});
|
||||
}
|
||||
|
||||
void clearHistories() {
|
||||
@@ -2774,125 +2784,6 @@ namespace {
|
||||
roundRect(p, x, y, w, h, bg, i.value(), 0);
|
||||
}
|
||||
|
||||
void initColorsFromBackground(const QImage &img) {
|
||||
uint64 components[3] = { 0 }, componentsScroll[3] = { 0 };
|
||||
auto w = img.width();
|
||||
auto h = img.height();
|
||||
auto size = w * h;
|
||||
if (auto pix = img.constBits()) {
|
||||
for (int i = 0, l = size * 4; i != l; i += 4) {
|
||||
components[2] += pix[i + 0];
|
||||
components[1] += pix[i + 1];
|
||||
components[0] += pix[i + 2];
|
||||
}
|
||||
}
|
||||
|
||||
if (size) {
|
||||
for (int i = 0; i != 3; ++i) {
|
||||
components[i] /= size;
|
||||
}
|
||||
}
|
||||
int maxtomin[3] = { 0, 1, 2 };
|
||||
if (components[maxtomin[0]] < components[maxtomin[1]]) {
|
||||
qSwap(maxtomin[0], maxtomin[1]);
|
||||
}
|
||||
if (components[maxtomin[1]] < components[maxtomin[2]]) {
|
||||
qSwap(maxtomin[1], maxtomin[2]);
|
||||
if (components[maxtomin[0]] < components[maxtomin[1]]) {
|
||||
qSwap(maxtomin[0], maxtomin[1]);
|
||||
}
|
||||
}
|
||||
|
||||
uint64 max = qMax(1ULL, components[maxtomin[0]]), mid = qMax(1ULL, components[maxtomin[1]]), min = qMax(1ULL, components[maxtomin[2]]);
|
||||
|
||||
memcpy(componentsScroll, components, sizeof(components));
|
||||
|
||||
if (max != min) {
|
||||
if (min > uint64(qRound(0.77 * max))) {
|
||||
uint64 newmin = qRound(0.77 * max); // min saturation 23%
|
||||
uint64 newmid = max - ((max - mid) * (max - newmin)) / (max - min);
|
||||
components[maxtomin[1]] = newmid;
|
||||
components[maxtomin[2]] = newmin;
|
||||
}
|
||||
uint64 newmin = qRound(0.77 * max); // saturation 23% for scroll
|
||||
uint64 newmid = max - ((max - mid) * (max - newmin)) / (max - min);
|
||||
componentsScroll[maxtomin[1]] = newmid;
|
||||
componentsScroll[maxtomin[2]] = newmin;
|
||||
}
|
||||
|
||||
float64 luminance = 0.299 * componentsScroll[0] + 0.587 * componentsScroll[1] + 0.114 * componentsScroll[2];
|
||||
uint64 maxScroll = max;
|
||||
if (luminance < 0.5 * 0xFF) {
|
||||
maxScroll += qRound(0.2 * 0xFF);
|
||||
} else {
|
||||
maxScroll -= qRound(0.2 * 0xFF);
|
||||
}
|
||||
componentsScroll[maxtomin[2]] = qMin(uint64(float64(componentsScroll[maxtomin[2]]) * maxScroll / float64(componentsScroll[maxtomin[0]])), 0xFFULL);
|
||||
componentsScroll[maxtomin[1]] = qMin(uint64(float64(componentsScroll[maxtomin[1]]) * maxScroll / float64(componentsScroll[maxtomin[0]])), 0xFFULL);
|
||||
componentsScroll[maxtomin[0]] = qMin(maxScroll, 0xFFULL);
|
||||
|
||||
if (max > uint64(qRound(0.2 * 0xFF))) { // brightness greater than 20%
|
||||
max -= qRound(0.2 * 0xFF);
|
||||
} else {
|
||||
max = 0;
|
||||
}
|
||||
components[maxtomin[2]] = uint64(float64(components[maxtomin[2]]) * max / float64(components[maxtomin[0]]));
|
||||
components[maxtomin[1]] = uint64(float64(components[maxtomin[1]]) * max / float64(components[maxtomin[0]]));
|
||||
components[maxtomin[0]] = max;
|
||||
|
||||
uchar r = uchar(components[0]), g = uchar(components[1]), b = uchar(components[2]);
|
||||
float64 alpha = st::msgServiceBg->c.alphaF();
|
||||
_msgServiceBg = style::color(r, g, b, qRound(alpha * 0xFF));
|
||||
|
||||
float64 alphaSel = st::msgServiceSelectBg->c.alphaF(), addSel = (1. - ((1. - alphaSel) / (1. - alpha))) * 0xFF;
|
||||
uchar rsel = snap(qRound(((1. - alphaSel) * r + addSel) / alphaSel), 0, 0xFF);
|
||||
uchar gsel = snap(qRound(((1. - alphaSel) * g + addSel) / alphaSel), 0, 0xFF);
|
||||
uchar bsel = snap(qRound(((1. - alphaSel) * b + addSel) / alphaSel), 0, 0xFF);
|
||||
_msgServiceSelectBg = style::color(r, g, b, qRound(alphaSel * 0xFF));
|
||||
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
delete ::corners[StickerCorners].p[i]; ::corners[StickerCorners].p[i] = nullptr;
|
||||
delete ::corners[StickerSelectedCorners].p[i]; ::corners[StickerSelectedCorners].p[i] = nullptr;
|
||||
}
|
||||
prepareCorners(StickerCorners, st::dateRadius, _msgServiceBg);
|
||||
prepareCorners(StickerSelectedCorners, st::dateRadius, _msgServiceSelectBg);
|
||||
|
||||
uchar rScroll = uchar(componentsScroll[0]), gScroll = uchar(componentsScroll[1]), bScroll = uchar(componentsScroll[2]);
|
||||
_historyScrollBarColor = style::color(rScroll, gScroll, bScroll, st::historyScroll.barColor->c.alpha());
|
||||
_historyScrollBgColor = style::color(rScroll, gScroll, bScroll, st::historyScroll.bgColor->c.alpha());
|
||||
_historyScrollBarOverColor = style::color(rScroll, gScroll, bScroll, st::historyScroll.barOverColor->c.alpha());
|
||||
_historyScrollBgOverColor = style::color(rScroll, gScroll, bScroll, st::historyScroll.bgOverColor->c.alpha());
|
||||
|
||||
if (App::main()) {
|
||||
App::main()->updateScrollColors();
|
||||
}
|
||||
HistoryLayout::serviceColorsUpdated();
|
||||
}
|
||||
|
||||
const style::color &msgServiceBg() {
|
||||
return _msgServiceBg;
|
||||
}
|
||||
|
||||
const style::color &msgServiceSelectBg() {
|
||||
return _msgServiceSelectBg;
|
||||
}
|
||||
|
||||
const style::color &historyScrollBarColor() {
|
||||
return _historyScrollBarColor;
|
||||
}
|
||||
|
||||
const style::color &historyScrollBgColor() {
|
||||
return _historyScrollBgColor;
|
||||
}
|
||||
|
||||
const style::color &historyScrollBarOverColor() {
|
||||
return _historyScrollBarOverColor;
|
||||
}
|
||||
|
||||
const style::color &historyScrollBgOverColor() {
|
||||
return _historyScrollBgOverColor;
|
||||
}
|
||||
|
||||
WallPapers gServerBackgrounds;
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user