28 #include <QApplication>
33 #include <QPaintEngine>
43 QImage result(mask.toImage().convertToFormat(QImage::Format_ARGB32));
44 result.setDevicePixelRatio(mask.devicePixelRatio());
45 QRgb* bits_start =
reinterpret_cast<QRgb*
>(result.bits());
46 const QRgb* bits_end = bits_start + result.width() * result.height();
47 const QRgb tint = color.rgb() & 0x00ffffff;
48 const QRgb alpha = QRgb(color.alpha());
49 for (QRgb* pixel = bits_start; pixel < bits_end; ++pixel) {
50 QRgb pixel_alpha = (((~*pixel) & 0xff) * alpha) >> 8;
51 *pixel = (pixel_alpha << 24) | tint;
53 return QPixmap::fromImage(result);
61 const QString& file_name = i.first;
62 const QColor color = i.second;
63 result.append(qMakePair(QPixmap(file_name), color));
68 static void smearPixmap(QPainter* painter,
const QPixmap& pixmap, qreal radius) {
69 const qreal nagative = -radius - 0.01;
70 const qreal positive = radius;
71 painter->drawPixmap(QPointF(nagative, nagative), pixmap);
72 painter->drawPixmap(QPointF(0, nagative), pixmap);
73 painter->drawPixmap(QPointF(positive, nagative), pixmap);
74 painter->drawPixmap(QPointF(positive, 0), pixmap);
75 painter->drawPixmap(QPointF(positive, positive), pixmap);
76 painter->drawPixmap(QPointF(0, positive), pixmap);
77 painter->drawPixmap(QPointF(nagative, positive), pixmap);
78 painter->drawPixmap(QPointF(nagative, 0), pixmap);
82 if (masks.count() == 1)
83 return masks.first().first;
85 QPixmap result(masks.first().first);
87 p.setCompositionMode(QPainter::CompositionMode_Darken);
88 auto mask_image = masks.constBegin();
90 for (; mask_image != masks.constEnd(); ++mask_image) {
94 p.setCompositionMode(QPainter::CompositionMode_Lighten);
98 p.drawPixmap(0, 0, (*mask_image).first);
106 result.setDevicePixelRatio(
combinedMask.devicePixelRatio());
107 result.fill(Qt::transparent);
110 for (MasksAndColors::const_iterator mask_image = masks.constBegin(); mask_image != masks.constEnd(); ++mask_image) {
115 p.setCompositionMode(QPainter::CompositionMode_DestinationOut);
124 p.setCompositionMode(QPainter::CompositionMode_DestinationOver);
126 p.drawPixmap(QPointF(0, -0.501), shadow_mask);
127 p.drawPixmap(QPointF(-0.501, 0), shadow_mask);
128 p.drawPixmap(QPointF(0.5, 0), shadow_mask);
129 p.drawPixmap(QPointF(0.5, 0.5), shadow_mask);
130 p.drawPixmap(QPointF(-0.501, 0.5), shadow_mask);
132 p.drawPixmap(0, 1, shadow_mask);
141 QPixmap result(images.first().first);
142 auto pixmap = images.constBegin();
144 for (; pixmap != images.constEnd(); ++pixmap) {
145 const QPixmap overlay((*pixmap).first);
146 result.paintEngine()->painter()->drawPixmap(0, 0, overlay);
153 Icon::Icon(std::initializer_list<IconMaskAndColor>
args, Icon::IconStyleOptions style)
156 Icon::Icon(
const QString& imageFileName) : m_style(
NONE) {
157 append({ imageFileName, QColor() });
160 QIcon Icon::icon()
const {
163 }
else if (m_style == NONE) {
167 const int max_dpr = qRound(qApp->devicePixelRatio());
168 for (
int dpr = 1; dpr <= max_dpr; dpr++) {
170 const QPixmap combined_mask =
combinedMask(masks, m_style);
171 result.addPixmap(
masksToIcon(masks, combined_mask, m_style));
173 const QColor disabled_color = QColor::fromRgba(0x60a4a6a8);
180 QPixmap Icon::pixmap()
const {
183 }
else if (m_style == NONE) {
187 const QPixmap combined_mask =
combinedMask(masks, m_style);
192 QString Icon::imageFileName()
const {
193 return first().first;
196 QIcon Icon::combinedIcon(
const QList<QIcon>& icons) {
198 QWindow* window = QApplication::allWidgets().first()->windowHandle();
199 for (
const QIcon& icon : icons)
200 for (
const QIcon::Mode mode : { QIcon::Disabled, QIcon::Normal })
201 for (
const QSize& size : icon.availableSizes(mode))
202 result.addPixmap(icon.pixmap(window, size, mode), mode);