]> cloud.milkyroute.net Git - dolphin.git/commitdiff
[KStandardItemListWidget] Round to icon size before applying scaling
authorKai Uwe Broulik <kde@privat.broulik.de>
Wed, 5 Sep 2018 10:24:10 +0000 (12:24 +0200)
committerKai Uwe Broulik <kde@privat.broulik.de>
Wed, 5 Sep 2018 10:24:10 +0000 (12:24 +0200)
Otherwise for 22px icons on high dpi we will request either the wrong icons or scale them needlessly.
Dolphin requests a pixmap of 22px, this is then multiplied by dpr resulting in 44 which isn't a valid icon size (only 32 or 48 are).
Moreover, we will also hit the path where it will scale the pixmap to a proper icon size resulting in blurry icons
(and a performance penalty).

Differential Revision: https://phabricator.kde.org/D15260

src/kitemviews/kstandarditemlistwidget.cpp

index d0a8fca20de08d7c4c25f3043792e40cdeeba7b2..12bd9d04fc5fc8d4ed986e7effc7c95d92a2caea 100644 (file)
@@ -1462,32 +1462,32 @@ void KStandardItemListWidget::closeRoleEditor()
 QPixmap KStandardItemListWidget::pixmapForIcon(const QString& name, const QStringList& overlays, int size, QIcon::Mode mode)
 {
     static const QIcon fallbackIcon = QIcon::fromTheme(QStringLiteral("unknown"));
+
+    int requestedSize = size;
+    if (size <= KIconLoader::SizeSmall) {
+        requestedSize = KIconLoader::SizeSmall;
+    } else if (size <= KIconLoader::SizeSmallMedium) {
+        requestedSize = KIconLoader::SizeSmallMedium;
+    } else if (size <= KIconLoader::SizeMedium) {
+        requestedSize = KIconLoader::SizeMedium;
+    } else if (size <= KIconLoader::SizeLarge) {
+        requestedSize = KIconLoader::SizeLarge;
+    } else if (size <= KIconLoader::SizeHuge) {
+        requestedSize = KIconLoader::SizeHuge;
+    } else if (size <= KIconLoader::SizeEnormous) {
+        requestedSize = KIconLoader::SizeEnormous;
+    } else if (size <= KIconLoader::SizeEnormous * 2) {
+        requestedSize = KIconLoader::SizeEnormous * 2;
+    }
     size *= qApp->devicePixelRatio();
+    requestedSize *= qApp->devicePixelRatio();
+
     const QString key = "KStandardItemListWidget:" % name % ":" % overlays.join(QStringLiteral(":")) % ":" % QString::number(size) % ":" % QString::number(mode);
     QPixmap pixmap;
 
     if (!QPixmapCache::find(key, pixmap)) {
         const QIcon icon = QIcon::fromTheme(name, fallbackIcon);
 
-        int requestedSize;
-        if (size <= KIconLoader::SizeSmall) {
-            requestedSize = KIconLoader::SizeSmall;
-        } else if (size <= KIconLoader::SizeSmallMedium) {
-            requestedSize = KIconLoader::SizeSmallMedium;
-        } else if (size <= KIconLoader::SizeMedium) {
-            requestedSize = KIconLoader::SizeMedium;
-        } else if (size <= KIconLoader::SizeLarge) {
-            requestedSize = KIconLoader::SizeLarge;
-        } else if (size <= KIconLoader::SizeHuge) {
-            requestedSize = KIconLoader::SizeHuge;
-        } else if (size <= KIconLoader::SizeEnormous) {
-            requestedSize = KIconLoader::SizeEnormous;
-        } else if (size <= KIconLoader::SizeEnormous * 2) {
-            requestedSize = KIconLoader::SizeEnormous * 2;
-        } else {
-            requestedSize = size;
-        }
-
         pixmap = icon.pixmap(requestedSize / qApp->devicePixelRatio(), requestedSize / qApp->devicePixelRatio(), mode);
         if (requestedSize != size) {
             KPixmapModifier::scale(pixmap, QSize(size, size));