summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/image/qiconloader.cpp10
-rw-r--r--tests/auto/gui/image/qicon/tst_qicon.cpp6
2 files changed, 14 insertions, 2 deletions
diff --git a/src/gui/image/qiconloader.cpp b/src/gui/image/qiconloader.cpp
index 7e62a5846c..ba2731b210 100644
--- a/src/gui/image/qiconloader.cpp
+++ b/src/gui/image/qiconloader.cpp
@@ -504,17 +504,23 @@ QPixmap PixmapEntry::pixmap(const QSize &size, QIcon::Mode mode, QIcon::State st
if (basePixmap.isNull())
basePixmap.load(filename);
- int actualSize = qMin(size.width(), size.height());
+ QSize actualSize = basePixmap.size();
+ if (!actualSize.isNull() && (actualSize.width() > size.width() || actualSize.height() > size.height()))
+ actualSize.scale(size, Qt::KeepAspectRatio);
+
QString key = QLatin1String("$qt_theme_")
% HexString<qint64>(basePixmap.cacheKey())
% HexString<int>(mode)
% HexString<qint64>(QGuiApplication::palette().cacheKey())
- % HexString<int>(actualSize);
+ % HexString<int>(actualSize.width())
+ % HexString<int>(actualSize.height());
QPixmap cachedPixmap;
if (QPixmapCache::find(key, &cachedPixmap)) {
return cachedPixmap;
} else {
+ if (basePixmap.size() != actualSize)
+ basePixmap = basePixmap.scaled(actualSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
cachedPixmap = basePixmap;
if (QGuiApplication *guiApp = qobject_cast<QGuiApplication *>(qApp))
cachedPixmap = static_cast<QGuiApplicationPrivate*>(QObjectPrivate::get(guiApp))->applyQIconStyleHelper(mode, basePixmap);
diff --git a/tests/auto/gui/image/qicon/tst_qicon.cpp b/tests/auto/gui/image/qicon/tst_qicon.cpp
index 3ada9b9a80..acbb50d8f3 100644
--- a/tests/auto/gui/image/qicon/tst_qicon.cpp
+++ b/tests/auto/gui/image/qicon/tst_qicon.cpp
@@ -591,6 +591,12 @@ void tst_QIcon::fromTheme()
noIcon = QIcon::fromTheme("svg-icon", abIcon);
QVERIFY(!noIcon.availableSizes().isEmpty());
+ // Pixmaps should be no larger than the requested size (QTBUG-17953)
+ QCOMPARE(appointmentIcon.pixmap(22).size(), QSize(22, 22)); // exact
+ QCOMPARE(appointmentIcon.pixmap(32).size(), QSize(32, 32)); // exact
+ QCOMPARE(appointmentIcon.pixmap(48).size(), QSize(32, 32)); // smaller
+ QCOMPARE(appointmentIcon.pixmap(8).size(), QSize(8, 8)); // scaled down
+
QByteArray ba;
// write to QByteArray
{