From 19f29802bf7daafacd0fd824c2a1349e80eac536 Mon Sep 17 00:00:00 2001 From: Eirik Aavitsland Date: Thu, 17 Oct 2019 13:25:06 +0200 Subject: Fix: QPainter off-by-one clipping for some non-integer scalings For some scalings, setClipRect(QRect) would produce a clip one pixel different from setClipRect(QRectF) because of different rounding. Ditto for setClipRegion. Fix by making sure to transform QRectFs instead of QRects. Fixes: QTBUG-78962 Fixes: QTBUG-78963 Change-Id: I0be721133858c30769ec6d81e978962a3d6b70cf Reviewed-by: Christoph Cullmann Reviewed-by: Allan Sandfeld Jensen --- tests/auto/gui/painting/qpainter/tst_qpainter.cpp | 49 ++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) (limited to 'tests/auto/gui/painting/qpainter/tst_qpainter.cpp') diff --git a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp index d2a4dfc3e9..6e48439944 100644 --- a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp +++ b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp @@ -157,10 +157,10 @@ private slots: void clippedLines(); void clippedPolygon_data(); void clippedPolygon(); - void clippedText(); void clipBoundingRect(); + void transformedClip(); void setOpacity_data(); void setOpacity(); @@ -4589,6 +4589,53 @@ void tst_QPainter::clipBoundingRect() } +void tst_QPainter::transformedClip() +{ + QImage img(8, 4, QImage::Format_ARGB32_Premultiplied); + QImage img2(img.size(), img.format()); + QRect clip(0, 0, 2, 1); + QTransform xf; + xf.translate(0.2, 0); + xf.scale(2.2, 1); + // setClipRect(QRectF) + { + img.fill(Qt::green); + QPainter p(&img); + p.setTransform(xf); + p.setClipRect(QRectF(clip)); + p.fillRect(img.rect(), Qt::white); + } + // setClipRect(QRect) + { + img2.fill(Qt::green); + QPainter p(&img2); + p.setTransform(xf); + p.setClipRect(clip); + p.fillRect(img2.rect(), Qt::white); + QCOMPARE(img, img2); + } + // setClipRegion + { + img2.fill(Qt::green); + QPainter p(&img2); + p.setTransform(xf); + p.setClipRegion(QRegion(clip) + QRect(0, 3, 1, 1)); // dummy extra rect to avoid single-rect codepath + p.fillRect(img2.rect(), Qt::white); + QCOMPARE(img.copy(0, 0, 8, 2), img2.copy(0, 0, 8, 2)); + } + // setClipPath + { + img2.fill(Qt::green); + QPainter p(&img2); + p.setTransform(xf); + QPainterPath path; + path.addRect(clip); + p.setClipPath(path); + p.fillRect(img2.rect(), Qt::white); + QCOMPARE(img, img2); + } +} + #if defined(Q_OS_MAC) // Only Mac supports sub pixel positions in raster engine currently void tst_QPainter::drawText_subPixelPositionsInRaster_qtbug5053() -- cgit v1.2.3