diff options
author | Shawn Rutledge <shawn.rutledge@digia.com> | 2015-01-19 15:22:28 +0100 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@digia.com> | 2015-01-23 05:34:11 +0100 |
commit | e910c36a3f5cdd01c1a7bebe409189fda2d128e2 (patch) | |
tree | e8232731711c12372629dc10239893d50d5d0c07 /src/platformsupport | |
parent | cec103897f5109c70f2fd69460d10d21fa4feded (diff) |
D-Bus tray icon: ensure that the image is square before sending
Sometimes KDE doesn't render non-square icons properly when they have
been received over the D-Bus protocol.
Change-Id: Icc6fa3d64a1598ea8f719192ae18d32f287d6a79
Reviewed-by: Dmitry Shachnev <mitya57@gmail.com>
Reviewed-by: Jørgen Lind <jorgen.lind@theqtcompany.com>
Diffstat (limited to 'src/platformsupport')
-rw-r--r-- | src/platformsupport/dbustray/qdbustraytypes.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/platformsupport/dbustray/qdbustraytypes.cpp b/src/platformsupport/dbustray/qdbustraytypes.cpp index 5100f8ee2c..bd64c59274 100644 --- a/src/platformsupport/dbustray/qdbustraytypes.cpp +++ b/src/platformsupport/dbustray/qdbustraytypes.cpp @@ -44,6 +44,7 @@ #include <QPixmap> #include <QDebug> #include <QtEndian> +#include <QPainter> #include <qpa/qplatformmenu.h> #include "qdbusplatformmenu_p.h" @@ -62,9 +63,10 @@ QXdgDBusImageVector iconToQXdgDBusImageVector(const QIcon &icon) bool hasSmallIcon = false; QList<QSize> toRemove; Q_FOREACH (const QSize &size, sizes) { - if (size.width() <= IconNormalSmallSize) + int maxSize = qMax(size.width(), size.height()); + if (maxSize <= IconNormalSmallSize) hasSmallIcon = true; - else if (size.width() > IconSizeLimit) + else if (maxSize > IconSizeLimit) toRemove << size; } Q_FOREACH (const QSize &size, toRemove) @@ -73,12 +75,21 @@ QXdgDBusImageVector iconToQXdgDBusImageVector(const QIcon &icon) sizes.append(QSize(IconNormalSmallSize, IconNormalSmallSize)); foreach (QSize size, sizes) { - QXdgDBusImageStruct kim; - kim.width = size.width(); - kim.height = size.height(); // Protocol specifies ARGB32 format in network byte order QImage im = icon.pixmap(size).toImage().convertToFormat(QImage::Format_ARGB32); - kim.data = QByteArray((char *)(im.bits()), im.byteCount()); + // letterbox if necessary to make it square + if (im.height() != im.width()) { + int maxSize = qMax(im.width(), im.height()); + QImage padded(maxSize, maxSize, QImage::Format_ARGB32); + padded.fill(Qt::transparent); + QPainter painter(&padded); + painter.drawImage((maxSize - im.width()) / 2, (maxSize - im.height()) / 2, im); + im = padded; + } + QXdgDBusImageStruct kim; + kim.width = im.width(); + kim.height = im.height(); + kim.data = QByteArray(reinterpret_cast<const char*>(im.constBits()), im.byteCount()); if (QSysInfo::ByteOrder == QSysInfo::LittleEndian) { for (char *ptr = kim.data.begin(); ptr < kim.data.end(); ptr += 4) qToUnaligned(qToBigEndian<quint32>(*ptr), reinterpret_cast<uchar *>(ptr)); |