QGraphicsBlurEffect: Fix for high DPI scaling
Preserve the device pixel ratio in the various helper functions and when drawing. Task-number: QTBUG-60026 Change-Id: Ieac9360b00044b6aedd0d3e1ad6e3b16d436f20f Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
This commit is contained in:
parent
fc2f0fb390
commit
9595622e36
@ -719,6 +719,7 @@ void expblur(QImage &img, qreal radius, bool improvedQuality = false, int transp
|
|||||||
}
|
}
|
||||||
|
|
||||||
QImage temp(img.height(), img.width(), img.format());
|
QImage temp(img.height(), img.width(), img.format());
|
||||||
|
temp.setDevicePixelRatio(img.devicePixelRatioF());
|
||||||
if (transposed >= 0) {
|
if (transposed >= 0) {
|
||||||
if (img.depth() == 8) {
|
if (img.depth() == 8) {
|
||||||
qt_memrotate270(reinterpret_cast<const quint8*>(img.bits()),
|
qt_memrotate270(reinterpret_cast<const quint8*>(img.bits()),
|
||||||
@ -780,6 +781,7 @@ Q_WIDGETS_EXPORT QImage qt_halfScaled(const QImage &source)
|
|||||||
if (source.format() == QImage::Format_Indexed8 || source.format() == QImage::Format_Grayscale8) {
|
if (source.format() == QImage::Format_Indexed8 || source.format() == QImage::Format_Grayscale8) {
|
||||||
// assumes grayscale
|
// assumes grayscale
|
||||||
QImage dest(source.width() / 2, source.height() / 2, srcImage.format());
|
QImage dest(source.width() / 2, source.height() / 2, srcImage.format());
|
||||||
|
dest.setDevicePixelRatio(source.devicePixelRatioF());
|
||||||
|
|
||||||
const uchar *src = reinterpret_cast<const uchar*>(const_cast<const QImage &>(srcImage).bits());
|
const uchar *src = reinterpret_cast<const uchar*>(const_cast<const QImage &>(srcImage).bits());
|
||||||
int sx = srcImage.bytesPerLine();
|
int sx = srcImage.bytesPerLine();
|
||||||
@ -801,6 +803,7 @@ Q_WIDGETS_EXPORT QImage qt_halfScaled(const QImage &source)
|
|||||||
return dest;
|
return dest;
|
||||||
} else if (source.format() == QImage::Format_ARGB8565_Premultiplied) {
|
} else if (source.format() == QImage::Format_ARGB8565_Premultiplied) {
|
||||||
QImage dest(source.width() / 2, source.height() / 2, srcImage.format());
|
QImage dest(source.width() / 2, source.height() / 2, srcImage.format());
|
||||||
|
dest.setDevicePixelRatio(source.devicePixelRatioF());
|
||||||
|
|
||||||
const uchar *src = reinterpret_cast<const uchar*>(const_cast<const QImage &>(srcImage).bits());
|
const uchar *src = reinterpret_cast<const uchar*>(const_cast<const QImage &>(srcImage).bits());
|
||||||
int sx = srcImage.bytesPerLine();
|
int sx = srcImage.bytesPerLine();
|
||||||
@ -837,6 +840,7 @@ Q_WIDGETS_EXPORT QImage qt_halfScaled(const QImage &source)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QImage dest(source.width() / 2, source.height() / 2, srcImage.format());
|
QImage dest(source.width() / 2, source.height() / 2, srcImage.format());
|
||||||
|
dest.setDevicePixelRatio(source.devicePixelRatioF());
|
||||||
|
|
||||||
const quint32 *src = reinterpret_cast<const quint32*>(const_cast<const QImage &>(srcImage).bits());
|
const quint32 *src = reinterpret_cast<const quint32*>(const_cast<const QImage &>(srcImage).bits());
|
||||||
int sx = srcImage.bytesPerLine() >> 2;
|
int sx = srcImage.bytesPerLine() >> 2;
|
||||||
@ -881,7 +885,7 @@ Q_WIDGETS_EXPORT void qt_blurImage(QPainter *p, QImage &blurImage, qreal radius,
|
|||||||
if (p) {
|
if (p) {
|
||||||
p->scale(scale, scale);
|
p->scale(scale, scale);
|
||||||
p->setRenderHint(QPainter::SmoothPixmapTransform);
|
p->setRenderHint(QPainter::SmoothPixmapTransform);
|
||||||
p->drawImage(QRect(0, 0, blurImage.width(), blurImage.height()), blurImage);
|
p->drawImage(QRect(QPoint(0, 0), blurImage.size() / blurImage.devicePixelRatioF()), blurImage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -390,6 +390,7 @@ QT_END_NAMESPACE
|
|||||||
void tst_QPixmapFilter::blurIndexed8()
|
void tst_QPixmapFilter::blurIndexed8()
|
||||||
{
|
{
|
||||||
QImage img(16, 32, QImage::Format_Indexed8);
|
QImage img(16, 32, QImage::Format_Indexed8);
|
||||||
|
img.setDevicePixelRatio(2);
|
||||||
img.setColorCount(256);
|
img.setColorCount(256);
|
||||||
for (int i = 0; i < 256; ++i)
|
for (int i = 0; i < 256; ++i)
|
||||||
img.setColor(i, qRgb(i, i, i));
|
img.setColor(i, qRgb(i, i, i));
|
||||||
@ -399,9 +400,13 @@ void tst_QPixmapFilter::blurIndexed8()
|
|||||||
QImage original = img;
|
QImage original = img;
|
||||||
qt_blurImage(img, 10, true, false);
|
qt_blurImage(img, 10, true, false);
|
||||||
QCOMPARE(original.size(), img.size());
|
QCOMPARE(original.size(), img.size());
|
||||||
|
QVERIFY2(qFuzzyCompare(img.devicePixelRatioF(), qreal(2)),
|
||||||
|
QByteArray::number(img.devicePixelRatioF()).constData());
|
||||||
|
|
||||||
original = img;
|
original = img;
|
||||||
qt_blurImage(img, 10, true, true);
|
qt_blurImage(img, 10, true, true);
|
||||||
|
QVERIFY2(qFuzzyCompare(img.devicePixelRatioF(), qreal(2)),
|
||||||
|
QByteArray::number(img.devicePixelRatioF()).constData());
|
||||||
QCOMPARE(original.size(), QSize(img.height(), img.width()));
|
QCOMPARE(original.size(), QSize(img.height(), img.width()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user