From 35c0972671c1f90f76d8d86b002b2e1f8bac79dd Mon Sep 17 00:00:00 2001 From: David Edmundson Date: Thu, 26 Mar 2015 16:06:52 +0100 Subject: [PATCH] Make KPixmapModifier::applyFrame handle high DPI images --- src/kitemviews/kfileitemmodelrolesupdater.cpp | 9 ++++----- src/kitemviews/private/kpixmapmodifier.cpp | 10 ++++++---- src/kitemviews/private/kpixmapmodifier.h | 17 +++++++++++++++++ 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/kitemviews/kfileitemmodelrolesupdater.cpp b/src/kitemviews/kfileitemmodelrolesupdater.cpp index c6ce877e3..068118983 100644 --- a/src/kitemviews/kfileitemmodelrolesupdater.cpp +++ b/src/kitemviews/kfileitemmodelrolesupdater.cpp @@ -493,7 +493,7 @@ void KFileItemModelRolesUpdater::slotGotPreview(const KFileItem& item, const QPi const QString mimeTypeGroup = mimeType.left(slashIndex); if (mimeTypeGroup == QLatin1String("image")) { if (m_enlargeSmallPreviews) { - KPixmapModifier::applyFrame(scaledPixmap, m_iconSize * qApp->devicePixelRatio()); + KPixmapModifier::applyFrame(scaledPixmap, m_iconSize * scaledPixmap.devicePixelRatio()); } else { // Assure that small previews don't get enlarged. Instead they // should be shown centered within the frame. @@ -502,7 +502,7 @@ void KFileItemModelRolesUpdater::slotGotPreview(const KFileItem& item, const QPi scaledPixmap.height() < contentSize.height(); if (enlargingRequired) { QSize frameSize = scaledPixmap.size(); - frameSize.scale(m_iconSize * qApp->devicePixelRatio(), Qt::KeepAspectRatio); + frameSize.scale(m_iconSize * scaledPixmap.devicePixelRatio(), Qt::KeepAspectRatio); QPixmap largeFrame(frameSize); largeFrame.fill(Qt::transparent); @@ -517,13 +517,12 @@ void KFileItemModelRolesUpdater::slotGotPreview(const KFileItem& item, const QPi } else { // The image must be shrinked as it is too large to fit into // the available icon size - KPixmapModifier::applyFrame(scaledPixmap, m_iconSize * qApp->devicePixelRatio()); + KPixmapModifier::applyFrame(scaledPixmap, m_iconSize * scaledPixmap.devicePixelRatio()); } } } else { - KPixmapModifier::scale(scaledPixmap, m_iconSize * qApp->devicePixelRatio()); + KPixmapModifier::scale(scaledPixmap, m_iconSize * scaledPixmap.devicePixelRatio()); } - scaledPixmap.setDevicePixelRatio(qApp->devicePixelRatio()); QHash data = rolesData(item); diff --git a/src/kitemviews/private/kpixmapmodifier.cpp b/src/kitemviews/private/kpixmapmodifier.cpp index ee1f84366..3e0edf02c 100644 --- a/src/kitemviews/private/kpixmapmodifier.cpp +++ b/src/kitemviews/private/kpixmapmodifier.cpp @@ -374,14 +374,16 @@ void KPixmapModifier::scale(QPixmap& pixmap, const QSize& scaledSize) void KPixmapModifier::applyFrame(QPixmap& icon, const QSize& scaledSize) { static TileSet tileSet; + qreal dpr = icon.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); + const QSize size(scaledSize.width() - (TileSet::LeftMargin + TileSet::RightMargin) * dpr, + scaledSize.height() - (TileSet::TopMargin + TileSet::BottomMargin) * dpr); scale(icon, size); - 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; diff --git a/src/kitemviews/private/kpixmapmodifier.h b/src/kitemviews/private/kpixmapmodifier.h index e8ca11ac1..9089a1001 100644 --- a/src/kitemviews/private/kpixmapmodifier.h +++ b/src/kitemviews/private/kpixmapmodifier.h @@ -28,8 +28,25 @@ class QSize; class DOLPHIN_EXPORT KPixmapModifier { public: + /** + * Scale a pixmap to a given size. + * @arg scaledSize is assumed to be the scaled to the same device pixel ratio as the source pixmap + * @arg scaledSize is in device pixels + */ static void scale(QPixmap& pixmap, const QSize& scaledSize); + + /** + * Resize and paint a frame round an icon + * @arg scaledSize is assumed to be the scaled to the same device pixel ratio as the source icon + */ static void applyFrame(QPixmap& icon, const QSize& scaledSize); + + /** + * return and paint a frame round an icon + * @arg framesize is in device-independent pixels + * @return is in device-indepent pixels + */ + static QSize sizeInsideFrame(const QSize& frameSize); }; -- 2.47.3