Skip to content

Commit

Permalink
fix: svg pixmap not clear when DPR > 1
Browse files Browse the repository at this point in the history
QSvgIOHandler multiply final size by device pixel ratio
and setDevicePixelRatio to make pixmap clear

```cpp
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
QLabel label;
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_svg
-platformpath /path/to/qt5integratoin-plugins-path
```
  • Loading branch information
kegechen committed Nov 1, 2023
1 parent 4bbcb4f commit 2efcbfd
Showing 1 changed file with 14 additions and 8 deletions.
22 changes: 14 additions & 8 deletions imageformatplugins/svg/qsvgiohandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "qvariant.h"
#include "qbuffer.h"
#include "qdebug.h"
#include <QGuiApplication>

#include <DSvgRenderer>

Expand Down Expand Up @@ -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())
Expand All @@ -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)
{
Expand Down Expand Up @@ -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 {
Expand All @@ -150,6 +159,7 @@ bool QSvgIOHandler::read(QImage *image)
d->r.render(&p, bounds);
p.end();
}
image->setDevicePixelRatio(ratio);
}
d->readDone = true;
return true;
Expand All @@ -158,7 +168,6 @@ bool QSvgIOHandler::read(QImage *image)
return false;
}


QVariant QSvgIOHandler::option(ImageOption option) const
{
switch(option) {
Expand Down Expand Up @@ -187,7 +196,6 @@ QVariant QSvgIOHandler::option(ImageOption option) const
return QVariant();
}


void QSvgIOHandler::setOption(ImageOption option, const QVariant & value)
{
switch(option) {
Expand All @@ -208,7 +216,6 @@ void QSvgIOHandler::setOption(ImageOption option, const QVariant & value)
}
}


bool QSvgIOHandler::supportsOption(ImageOption option) const
{
switch(option)
Expand All @@ -226,7 +233,6 @@ bool QSvgIOHandler::supportsOption(ImageOption option) const
return false;
}


bool QSvgIOHandler::canRead(QIODevice *device)
{
QByteArray buf = device->peek(8);
Expand Down

0 comments on commit 2efcbfd

Please sign in to comment.