From 202356ba893f645b6b6dd688792968dff1e68b50 Mon Sep 17 00:00:00 2001 From: Volodymyr Zolotopupov Date: Sun, 24 Mar 2024 22:12:58 +0200 Subject: [PATCH] plugins/screenshot: Snap pixel grid for rectangular screenshots To prevent blurring with fractional scaling --- src/plugins/screenshot/screenshot.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/plugins/screenshot/screenshot.cpp b/src/plugins/screenshot/screenshot.cpp index 4b3b607b2e..c85205fb7d 100644 --- a/src/plugins/screenshot/screenshot.cpp +++ b/src/plugins/screenshot/screenshot.cpp @@ -83,6 +83,12 @@ static void convertFromGLImage(QImage &img, int w, int h, const OutputTransform img = img.transformed(matrix.toTransform()); } +static QRectF roundedRect(const QRect &rect, qreal scale) +{ + const QRect scaled = snapToPixelGrid(scaledRect(rect, scale)); + return scaledRect(scaled, 1.0 / scale); +} + bool ScreenShotEffect::supported() { return effects->isOpenGLCompositing(); @@ -313,13 +319,13 @@ bool ScreenShotEffect::takeScreenShot(const RenderTarget &renderTarget, const Re } const QImage snapshot = blitScreenshot(renderTarget, viewport, sourceRect, sourceDevicePixelRatio); - const QRect nativeArea(screenshot->area.topLeft(), - screenshot->area.size() * screenshot->result.devicePixelRatio()); + const QSize nativeAreaSize = snapToPixelGrid(scaledRect(screenshot->area, screenshot->result.devicePixelRatio())).size(); + const QRect nativeArea(screenshot->area.topLeft(), nativeAreaSize); QPainter painter(&screenshot->result); painter.setRenderHint(QPainter::SmoothPixmapTransform); painter.setWindow(nativeArea); - painter.drawImage(sourceRect, snapshot); + painter.drawImage(roundedRect(sourceRect, sourceDevicePixelRatio), snapshot); painter.end(); if (screenshot->screens.isEmpty()) {