]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/private/kpixmapmodifier.cpp
[KItemListSelectionToggle] Adjust painting icon for high dpi scaling
[dolphin.git] / src / kitemviews / private / kpixmapmodifier.cpp
index fff8fd6603a3e33e8750f8d6f37cbb6b52a7105f..402fccfdecf55b526ba734036da8b72d62a3b6f4 100644 (file)
 
 #include "kpixmapmodifier.h"
 
+#include <QGuiApplication>
 #include <QImage>
 #include <QPainter>
-#include <QPixmap>
-#include <QSize>
-
-#include <QDebug>
-
-#include <config-X11.h> // for HAVE_XRENDER
-#if defined(Q_WS_X11) && defined(HAVE_XRENDER)
-#  include <QX11Info>
-#  include <X11/Xlib.h>
-#  include <X11/extensions/Xrender.h>
-#endif
 
 static const quint32 stackBlur8Mul[255] =
 {
@@ -331,61 +321,31 @@ void KPixmapModifier::scale(QPixmap& pixmap, const QSize& scaledSize)
         pixmap = QPixmap();
         return;
     }
-
-#if defined(Q_WS_X11) && defined(HAVE_XRENDER)
-    // Assume that the texture size limit is 2048x2048
-    if ((pixmap.width() <= 2048) && (pixmap.height() <= 2048) && pixmap.x11PictureHandle()) {
-        const QPixmap unscaledPixmap = pixmap.copy(); // Make a deep copy for XRender
-        QSize scaledPixmapSize = pixmap.size();
-        scaledPixmapSize.scale(scaledSize, Qt::KeepAspectRatio);
-
-        const qreal factor = scaledPixmapSize.width() / qreal(unscaledPixmap.width());
-
-        XTransform xform = {{
-            { XDoubleToFixed(1 / factor), 0, 0 },
-            { 0, XDoubleToFixed(1 / factor), 0 },
-            { 0, 0, XDoubleToFixed(1) }
-        }};
-
-        QPixmap scaledPixmap(scaledPixmapSize);
-        scaledPixmap.fill(Qt::transparent);
-
-        Display* dpy = QX11Info::display();
-
-        XRenderPictureAttributes attr;
-        attr.repeat = RepeatPad;
-        XRenderChangePicture(dpy, unscaledPixmap.x11PictureHandle(), CPRepeat, &attr);
-
-        XRenderSetPictureFilter(dpy, unscaledPixmap.x11PictureHandle(), FilterBilinear, 0, 0);
-        XRenderSetPictureTransform(dpy, unscaledPixmap.x11PictureHandle(), &xform);
-        XRenderComposite(dpy, PictOpOver, unscaledPixmap.x11PictureHandle(), None, scaledPixmap.x11PictureHandle(),
-                         0, 0, 0, 0, 0, 0, scaledPixmap.width(), scaledPixmap.height());
-        pixmap = scaledPixmap;
-    } else {
-        pixmap = pixmap.scaled(scaledSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
-    }
-#else
+    qreal dpr = pixmap.devicePixelRatio();
     pixmap = pixmap.scaled(scaledSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
-#endif
+    pixmap.setDevicePixelRatio(dpr);
 }
 
 void KPixmapModifier::applyFrame(QPixmap& icon, const QSize& scaledSize)
 {
     static TileSet tileSet;
+    qreal dpr = qApp->devicePixelRatio();
 
     // Resize the icon to the maximum size minus the space required for the frame
     const QSize size(scaledSize.width() - TileSet::LeftMargin - TileSet::RightMargin,
                      scaledSize.height() - TileSet::TopMargin - TileSet::BottomMargin);
-    scale(icon, size);
+    scale(icon, size * dpr);
+    icon.setDevicePixelRatio(dpr);
 
-    QPixmap framedIcon(icon.size().width() + TileSet::LeftMargin + TileSet::RightMargin,
-                       icon.size().height() + TileSet::TopMargin + TileSet::BottomMargin);
+    QPixmap framedIcon(icon.size().width() + (TileSet::LeftMargin + TileSet::RightMargin) * dpr,
+                       icon.size().height() + (TileSet::TopMargin + TileSet::BottomMargin) * dpr);
+    framedIcon.setDevicePixelRatio(dpr);
     framedIcon.fill(Qt::transparent);
 
     QPainter painter;
     painter.begin(&framedIcon);
     painter.setCompositionMode(QPainter::CompositionMode_Source);
-    tileSet.paint(&painter, framedIcon.rect());
+    tileSet.paint(&painter, QRect(QPoint(0,0), framedIcon.size() / dpr));
     painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
     painter.drawPixmap(TileSet::LeftMargin, TileSet::TopMargin, icon);