summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristian Ehrlicher <ch.ehrlicher@gmx.de>2024-05-25 15:24:41 +0200
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2024-06-12 17:37:15 +0000
commit03d17faba025c814ea5b5b34cf7b82902aca129e (patch)
tree4d6d592baf6f745bf59a1c7bd8a11179acca5555 /src
parent5fd94d6c26f25d773a72b49ee70d251ea3ebcbd1 (diff)
QSvgIconEngine: reimplement scaledPixmap()HEADdev
Directly implement QSvgIconEngine::scaledPixmap() to avoid the loop through QIconEngine::virtual_hook() and the fallback to QSvgIconEngine::pixmap() which could then not correctly set the devicePixelRatio on the pixmap so the QPixmapCache was rendered useless for a dpr != 1.0. Pick-to: 6.8 Change-Id: I980785eb1d3f383b249aab2ebcd627a8277093db Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp21
-rw-r--r--src/plugins/iconengines/svgiconengine/qsvgiconengine.h2
2 files changed, 17 insertions, 6 deletions
diff --git a/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp b/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp
index 1014b08..14b0af2 100644
--- a/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp
+++ b/src/plugins/iconengines/svgiconengine/qsvgiconengine.cpp
@@ -33,14 +33,15 @@ public:
return ((mode << 4) | state);
}
- QString pmcKey(const QSize &size, QIcon::Mode mode, QIcon::State state) const
+ QString pmcKey(const QSize &size, QIcon::Mode mode, QIcon::State state, qreal scale) const
{
return QLatin1String("$qt_svgicon_")
% HexString<int>(serialNum)
% HexString<qint8>(mode)
% HexString<qint8>(state)
% HexString<int>(size.width())
- % HexString<int>(size.height());
+ % HexString<int>(size.height())
+ % HexString<qint16>(qRound(scale * 1000));
}
void stepSerialNum()
@@ -165,16 +166,22 @@ QIcon::Mode QSvgIconEnginePrivate::loadDataForModeAndState(QSvgRenderer *rendere
QPixmap QSvgIconEngine::pixmap(const QSize &size, QIcon::Mode mode,
QIcon::State state)
{
+ return scaledPixmap(size, mode, state, 1.0);
+}
+
+QPixmap QSvgIconEngine::scaledPixmap(const QSize &size, QIcon::Mode mode, QIcon::State state,
+ qreal scale)
+{
QPixmap pm;
- QString pmckey(d->pmcKey(size, mode, state));
+ QString pmckey(d->pmcKey(size, mode, state, scale));
if (QPixmapCache::find(pmckey, &pm))
return pm;
if (!d->addedPixmaps.isEmpty()) {
const auto key = d->hashKey(mode, state);
pm = d->addedPixmaps.value(key);
- if (!pm.isNull() && pm.size() == size)
+ if (!pm.isNull() && pm.size() == size * scale && pm.devicePixelRatio() == scale)
return pm;
if (pm.isNull())
d->addedPixmaps.remove(key);
@@ -187,7 +194,7 @@ QPixmap QSvgIconEngine::pixmap(const QSize &size, QIcon::Mode mode,
QSize actualSize = renderer.defaultSize();
if (!actualSize.isNull())
- actualSize.scale(size, Qt::KeepAspectRatio);
+ actualSize.scale(size * scale, Qt::KeepAspectRatio);
if (actualSize.isEmpty())
return pm;
@@ -205,8 +212,10 @@ QPixmap QSvgIconEngine::pixmap(const QSize &size, QIcon::Mode mode,
}
}
- if (!pm.isNull())
+ if (!pm.isNull()) {
+ pm.setDevicePixelRatio(scale);
QPixmapCache::insert(pmckey, pm);
+ }
return pm;
}
diff --git a/src/plugins/iconengines/svgiconengine/qsvgiconengine.h b/src/plugins/iconengines/svgiconengine/qsvgiconengine.h
index 44c7fc0..11612a5 100644
--- a/src/plugins/iconengines/svgiconengine/qsvgiconengine.h
+++ b/src/plugins/iconengines/svgiconengine/qsvgiconengine.h
@@ -23,6 +23,8 @@ public:
QIcon::State state) override;
QPixmap pixmap(const QSize &size, QIcon::Mode mode,
QIcon::State state) override;
+ QPixmap scaledPixmap(const QSize &size, QIcon::Mode mode,
+ QIcon::State state, qreal scale) override;
void addPixmap(const QPixmap &pixmap, QIcon::Mode mode,
QIcon::State state) override;