diff --git a/Telegram/Resources/icons/tray_monochrome.svg b/Telegram/Resources/icons/tray_monochrome.svg
new file mode 100644
index 000000000..b960a4afd
--- /dev/null
+++ b/Telegram/Resources/icons/tray_monochrome.svg
@@ -0,0 +1,6 @@
+
+
\ No newline at end of file
diff --git a/Telegram/Resources/qrc/telegram/telegram.qrc b/Telegram/Resources/qrc/telegram/telegram.qrc
index 8eac62c66..0e43acb03 100644
--- a/Telegram/Resources/qrc/telegram/telegram.qrc
+++ b/Telegram/Resources/qrc/telegram/telegram.qrc
@@ -28,6 +28,7 @@
../../icons/settings/dino.svg
../../icons/settings/star.svg
../../icons/settings/starmini.svg
+ ../../icons/tray_monochrome.svg
../../art/topic_icons/blue.svg
../../art/topic_icons/yellow.svg
../../art/topic_icons/violet.svg
diff --git a/Telegram/SourceFiles/platform/win/tray_win.cpp b/Telegram/SourceFiles/platform/win/tray_win.cpp
index 9c72068e9..fda59791e 100644
--- a/Telegram/SourceFiles/platform/win/tray_win.cpp
+++ b/Telegram/SourceFiles/platform/win/tray_win.cpp
@@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "core/application.h"
#include "main/main_session.h"
#include "storage/localstorage.h"
+#include "ui/painter.h"
#include "ui/ui_utility.h"
#include "ui/widgets/popup_menu.h"
#include "window/window_controller.h"
@@ -23,6 +24,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include
#include
#include
+#include
namespace Platform {
@@ -61,6 +63,49 @@ constexpr auto kTooltipDelay = crl::time(10000);
return (value == 0);
}
+[[nodiscard]] QImage MonochromeIconFor(int size, bool darkMode) {
+ Expects(size > 0);
+
+ static const auto Content = [&] {
+ auto f = QFile(u":/gui/icons/tray/monochrome.svg"_q);
+ f.open(QIODevice::ReadOnly);
+ return f.readAll();
+ }();
+ static auto Mask = QImage();
+ static auto Size = 0;
+ if (Mask.isNull() || Size != size) {
+ Size = size;
+ Mask = QImage(size, size, QImage::Format_ARGB32_Premultiplied);
+ Mask.fill(Qt::transparent);
+ auto p = QPainter(&Mask);
+ QSvgRenderer(Content).render(&p, QRectF(0, 0, size, size));
+ }
+ static auto Colored = QImage();
+ static auto ColoredDark = QImage();
+ auto &use = darkMode ? ColoredDark : Colored;
+ if (use.size() != Mask.size()) {
+ const auto color = darkMode ? 255 : 0;
+ const auto alpha = darkMode ? 255 : 228;
+ use = style::colorizeImage(Mask, { color, color, color, alpha });
+ }
+ return use;
+}
+
+[[nodiscard]] QImage MonochromeWithDot(QImage image, style::color color) {
+ auto p = QPainter(&image);
+ auto hq = PainterHighQualityEnabler(p);
+ const auto xm = image.width() / 16.;
+ const auto ym = image.height() / 16.;
+ p.setBrush(color);
+ p.setPen(Qt::NoPen);
+ p.drawEllipse(QRectF( // cx=3.9, cy=12.7, r=2.2
+ 1.7 * xm,
+ 10.5 * ym,
+ 4.4 * xm,
+ 4.4 * ym));
+ return image;
+}
+
[[nodiscard]] QImage ImageIconWithCounter(
Window::CounterLayerArgs &&args,
bool supportMode,
@@ -83,42 +128,16 @@ constexpr auto kTooltipDelay = crl::time(10000);
auto result = [&] {
if (const auto it = scaled.find(args.size); it != scaled.end()) {
return it->second;
- } else {
- if (monochrome && darkMode) {
- const auto withColor = [&](QColor color) -> std::pair {
- if (args.size <= 16) {
- return { st::macTrayIcon.instance(color, 100 / cIntRetinaFactor()), 3 };
- } else if (args.size <= 32) {
- return { st::macTrayIcon.instance(color, 200 / cIntRetinaFactor()), 6 };
- } else {
- return { st::macTrayIcon.instance(color, 300 / cIntRetinaFactor()), 9 };
- }
- };
- const auto result = *darkMode
- ? withColor({ 255, 255, 255 })
- : withColor({ 0, 0, 0, 228 });
- auto &image = scaled.emplace(
- args.size,
- result.first.copy(
- QRect(
- QPoint(result.second, result.second),
- result.first.size()
- - QSize(result.second * 2, result.second * 2)
- )
- ).scaledToWidth(args.size, Qt::SmoothTransformation)
- ).first->second;
- image.setDevicePixelRatio(1);
- return image;
- } else {
- return scaled.emplace(
- args.size,
- (smallIcon
- ? Window::LogoNoMargin()
- : Window::Logo()
- ).scaledToWidth(args.size, Qt::SmoothTransformation)
- ).first->second;
- }
+ } else if (monochrome && darkMode) {
+ return MonochromeIconFor(args.size, *darkMode);
}
+ return scaled.emplace(
+ args.size,
+ (smallIcon
+ ? Window::LogoNoMargin()
+ : Window::Logo()
+ ).scaledToWidth(args.size, Qt::SmoothTransformation)
+ ).first->second;
}();
if ((!monochrome || !darkMode) && supportMode) {
Window::ConvertIconToBlack(result);
@@ -126,6 +145,9 @@ constexpr auto kTooltipDelay = crl::time(10000);
if (!args.count) {
return result;
} else if (smallIcon) {
+ if (monochrome && darkMode) {
+ return MonochromeWithDot(std::move(result), args.bg);
+ }
return Window::WithSmallCounter(std::move(result), std::move(args));
}
QPainter p(&result);