From 591544d7e2aab7dd2f7edece0d7850e6e111e14e Mon Sep 17 00:00:00 2001 From: ck Date: Mon, 30 Oct 2023 17:02:39 +0800 Subject: [PATCH] fix: svg/dci pixmap not clear when DPR > 1 QSvgIOHandler multiply final size by device pixel ratio and setDevicePixelRatio to make pixmap clear ```cpp QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); QLabel label; // /usr/share/dsg/icons/flow/3depict.dci label.setPixmap(QPixmap("/usr/share/icons/bloom/apps/32/preferences-system.svg")); label.show(); ``` ```sh D_DXCB_DISABLE_OVERRIDE_HIDPI=1 QT_SCALE_FACTOR=1.25 ./test_pix -platformpath /path/to/qt5integratoin-plugins-path ``` --- imageformatplugins/dci/qdciiohandler.cpp | 15 +++++++++++++-- imageformatplugins/svg/qsvgiohandler.cpp | 22 ++++++++++++++-------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/imageformatplugins/dci/qdciiohandler.cpp b/imageformatplugins/dci/qdciiohandler.cpp index f7c17613..548b1f3e 100644 --- a/imageformatplugins/dci/qdciiohandler.cpp +++ b/imageformatplugins/dci/qdciiohandler.cpp @@ -11,6 +11,7 @@ #include "qvariant.h" #include "qbuffer.h" #include "qdebug.h" +#include #include @@ -95,7 +96,6 @@ QDciIOHandler::QDciIOHandler() } - QDciIOHandler::~QDciIOHandler() { delete d; @@ -120,6 +120,17 @@ QByteArray QDciIOHandler::name() const return "dci"; } +static inline qreal devicePixelRatio() +{ + qreal ratio = 1.0; +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + if (qApp->testAttribute(Qt::AA_UseHighDpiPixmaps)) +#endif + ratio = qApp->devicePixelRatio(); + + return ratio; +} + bool QDciIOHandler::read(QImage *image) { if (d->readDone || d->load(device())) { @@ -128,7 +139,7 @@ bool QDciIOHandler::read(QImage *image) if (finalSize > 0) { DDciIconPalette palette(QColor::Invalid, d->backColor); - *image = d->icon.pixmap(1.0, finalSize, d->current, palette).toImage(); + *image = d->icon.pixmap(devicePixelRatio(), finalSize, d->current, palette).toImage(); } d->readDone = true; return true; diff --git a/imageformatplugins/svg/qsvgiohandler.cpp b/imageformatplugins/svg/qsvgiohandler.cpp index f71b9469..420ecd7b 100644 --- a/imageformatplugins/svg/qsvgiohandler.cpp +++ b/imageformatplugins/svg/qsvgiohandler.cpp @@ -10,6 +10,7 @@ #include "qvariant.h" #include "qbuffer.h" #include "qdebug.h" +#include #include @@ -71,20 +72,17 @@ bool QSvgIOHandlerPrivate::load(QIODevice *device) return loaded; } - QSvgIOHandler::QSvgIOHandler() : d(new QSvgIOHandlerPrivate(this)) { } - QSvgIOHandler::~QSvgIOHandler() { delete d; } - bool QSvgIOHandler::canRead() const { if (!device()) @@ -103,12 +101,21 @@ bool QSvgIOHandler::canRead() const return false; } - QByteArray QSvgIOHandler::name() const { return "svg"; } +static inline qreal devicePixelRatio() +{ + qreal ratio = 1.0; +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + if (qApp->testAttribute(Qt::AA_UseHighDpiPixmaps)) +#endif + ratio = qApp->devicePixelRatio(); + + return ratio; +} bool QSvgIOHandler::read(QImage *image) { @@ -140,6 +147,8 @@ bool QSvgIOHandler::read(QImage *image) bounds = t.mapRect(bounds); } if (!finalSize.isEmpty()) { + qreal ratio = devicePixelRatio(); + finalSize *= ratio; if (bounds.isEmpty() && d->backColor.alpha() == 0) { *image = d->r.toImage(finalSize); } else { @@ -150,6 +159,7 @@ bool QSvgIOHandler::read(QImage *image) d->r.render(&p, bounds); p.end(); } + image->setDevicePixelRatio(ratio); } d->readDone = true; return true; @@ -158,7 +168,6 @@ bool QSvgIOHandler::read(QImage *image) return false; } - QVariant QSvgIOHandler::option(ImageOption option) const { switch(option) { @@ -187,7 +196,6 @@ QVariant QSvgIOHandler::option(ImageOption option) const return QVariant(); } - void QSvgIOHandler::setOption(ImageOption option, const QVariant & value) { switch(option) { @@ -208,7 +216,6 @@ void QSvgIOHandler::setOption(ImageOption option, const QVariant & value) } } - bool QSvgIOHandler::supportsOption(ImageOption option) const { switch(option) @@ -226,7 +233,6 @@ bool QSvgIOHandler::supportsOption(ImageOption option) const return false; } - bool QSvgIOHandler::canRead(QIODevice *device) { QByteArray buf = device->peek(8);