plugins/screenshot: Snap pixel grid for rectangular screenshots

To prevent blurring with fractional scaling
This commit is contained in:
Volodymyr Zolotopupov 2024-03-24 22:12:58 +02:00 committed by Vlad Zahorodnii
parent f4232bc391
commit 202356ba89

View file

@ -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()) {