diff --git a/autotests/kiconengine_unittest.cpp b/autotests/kiconengine_unittest.cpp --- a/autotests/kiconengine_unittest.cpp +++ b/autotests/kiconengine_unittest.cpp @@ -127,6 +127,21 @@ QCOMPARE(icon3.name(), nonExistingIconName); } + + void testCenterIcon() + { + QIcon icon(new KIconEngine(QStringLiteral("kde"), KIconLoader::global())); + QVERIFY(!icon.isNull()); + + // "kde" icon is actually "test-22x22.png", so this is original icon image + const QImage image = icon.pixmap(22, 22).toImage(); + + // center vertically + QVERIFY(icon.pixmap(22, 26).toImage().copy(0, 2, 22, 22) == image); + + // center horizontally + QVERIFY(icon.pixmap(26, 22).toImage().copy(2, 0, 22, 22) == image); + } private: QDir testIconsDir; }; diff --git a/src/kiconengine.cpp b/src/kiconengine.cpp --- a/src/kiconengine.cpp +++ b/src/kiconengine.cpp @@ -72,18 +72,12 @@ return; } - Q_UNUSED(state) - #if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) const qreal dpr = painter->device()->devicePixelRatioF(); #else const qreal dpr = painter->device()->devicePixelRatio(); #endif - - const int kstate = qIconModeToKIconState(mode); - const int iconSize = qMin(rect.width(), rect.height()) * dpr; - const QPixmap pix = mIconLoader.data()->loadIcon(mIconName, KIconLoader::Desktop, iconSize, kstate, mOverlays); - painter->drawPixmap(rect, pix); + painter->drawPixmap(rect, pixmap(rect.size() * dpr, mode, state)); } QPixmap KIconEngine::pixmap(const QSize &size, QIcon::Mode mode, QIcon::State state) @@ -113,7 +107,7 @@ pix2.fill(QColor(0, 0, 0, 0)); QPainter painter(&pix2); - painter.drawPixmap(QPoint(), pix); + painter.drawPixmap(QPoint((pix2.width() - pix.width()) / 2, (pix2.height() - pix.height()) / 2), pix); return pix2; }