Skip to content

Commit b84421f

Browse files
committed
Fix blurry rendering in hi-dpi (DPR != 1) situations
Fixes #58
1 parent 1230087 commit b84421f

File tree

2 files changed

+20
-13
lines changed

2 files changed

+20
-13
lines changed

docs/CHANGES_2_3.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Bugfixes:
99
* Fix infinite loop and other issues with Qt 6.7 due to QTextFormat behavior change
1010
* Preserve resolution in watermark image (issue #42)
1111
* Fix right-aligned tabs not working when setting paragraphs margins
12+
* Fix blurry rendering in hi-dpi (DPR != 1) situations (issue #58)
1213

1314
New features:
1415
-------------

src/KDReports/KDReportsPreviewWidget.cpp

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -195,21 +195,24 @@ void KDReports::PreviewWidgetPrivate::paintItem(QListWidgetItem *item, int index
195195

196196
// Use a QImage so that the raster paint engine is used.
197197
// Gives a 7.7 times speedup (!) compared to X11.
198-
QImage img(PreviewSize, PreviewSize, QImage::Format_ARGB32_Premultiplied);
198+
const qreal dpr = q->devicePixelRatioF();
199+
QImage img(PreviewSize * dpr, PreviewSize * dpr, QImage::Format_ARGB32_Premultiplied);
200+
img.setDevicePixelRatio(dpr);
201+
img.fill(Qt::transparent);
199202
const QSizeF paperSize = m_report->paperSize();
200-
const qreal longestSide = qMax(paperSize.width(), paperSize.height());
201-
qreal width = img.width() * paperSize.width() / longestSide;
202-
qreal height = img.height() * paperSize.height() / longestSide;
203-
// img.fill( QColor( Qt::white ).rgb() );
204-
img.fill(qRgba(0, 0, 0, 0)); // transparent
203+
const qreal paperWidth = paperSize.width();
204+
const qreal paperHeight = paperSize.height();
205+
const qreal longestSide = qMax(paperWidth, paperHeight);
206+
const qreal width = PreviewSize * paperWidth / longestSide;
207+
const qreal height = PreviewSize * paperHeight / longestSide;
205208
QPainter painter(&img);
206-
painter.setRenderHint(QPainter::Antialiasing);
207-
painter.translate((img.width() - width) / 2, (img.height() - height) / 2);
209+
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform, true);
210+
painter.translate((PreviewSize - width) / 2, (PreviewSize - height) / 2);
208211
painter.fillRect(QRectF(0, 0, width, height), QBrush(Qt::white));
209-
painter.scale(img.width() / longestSide, img.height() / longestSide);
212+
painter.scale(PreviewSize / longestSide, PreviewSize / longestSide);
210213
m_report->paintPage(index, painter);
211214
painter.setPen(QPen(1));
212-
painter.drawRect(QRectF(0, 0, paperSize.width(), paperSize.height()));
215+
painter.drawRect(QRectF(0, 0, paperWidth, paperHeight));
213216

214217
item->setIcon(QIcon(QPixmap::fromImage(img)));
215218
}
@@ -231,15 +234,18 @@ QPixmap KDReports::PreviewWidgetPrivate::paintPreview(int index) const
231234
const QSizeF paperSize = m_report->paperSize();
232235
const int width = qCeil(paperSize.width() * m_zoomFactor);
233236
const int height = qCeil(paperSize.height() * m_zoomFactor);
237+
const qreal dpr = q->devicePixelRatioF();
234238

235-
QPixmap pixmap(width, height);
239+
QPixmap pixmap(width * dpr, height * dpr);
240+
pixmap.setDevicePixelRatio(dpr);
241+
pixmap.fill(Qt::transparent);
236242
// qDebug() << width << "," << height;
237243

238244
// qDebug() << "paintPreview " << index;
239245

240246
QPainter painter(&pixmap);
241-
painter.setRenderHint(QPainter::Antialiasing);
242-
painter.setRenderHint(QPainter::SmoothPixmapTransform);
247+
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform, true);
248+
243249
painter.fillRect(QRectF(0, 0, width, height), QBrush(Qt::white));
244250
painter.scale(m_zoomFactor, m_zoomFactor);
245251
m_report->paintPage(index, painter);

0 commit comments

Comments
 (0)