diff options
-rw-r--r-- | src/gui/image/qiconloader.cpp | 10 | ||||
-rw-r--r-- | tests/auto/gui/image/qicon/tst_qicon.cpp | 6 |
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 { |