From f5000beeb6644fdcd6c110652112106fdd4a88bc Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Sat, 28 Dec 2024 10:57:04 +0100 Subject: [PATCH] Fix QTransform::quadToQuad() to work with QRectF A typical usage for mapping a 4-point polygon to a rectangle might be QTransform transform; bool ok = QTransform::quadToQuad(polygon, polygon->boundingRect(), transform); It works because the QPolygonF(QRectF) ctor is implicitly called on the second argument; but that ctor turns it into a 5-point polygon. So it should be legal for QTransform functions to work with 5-point closed paths. Fixes: QTBUG-21329 Change-Id: Iae249012e14b8a3e8d3b0dfa35da8f9759359832 Pick-to: 6.5 5.15 Reviewed-by: Eirik Aavitsland (cherry picked from commit 48b1af941c50ab28cc92f9ea65a8a74a32eaf2bc) Reviewed-by: Qt Cherry-pick Bot (cherry picked from commit 5ead2a3d63a905ed758390e1558dbac744756077) --- src/gui/painting/qtransform.cpp | 2 +- tests/auto/gui/painting/qtransform/tst_qtransform.cpp | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/gui/painting/qtransform.cpp b/src/gui/painting/qtransform.cpp index 6f6cc8a4ea7..d051cf55315 100644 --- a/src/gui/painting/qtransform.cpp +++ b/src/gui/painting/qtransform.cpp @@ -1613,7 +1613,7 @@ QPolygon QTransform::mapToPolygon(const QRect &rect) const */ bool QTransform::squareToQuad(const QPolygonF &quad, QTransform &trans) { - if (quad.size() != 4) + if (quad.size() != (quad.isClosed() ? 5 : 4)) return false; qreal dx0 = quad[0].x(); diff --git a/tests/auto/gui/painting/qtransform/tst_qtransform.cpp b/tests/auto/gui/painting/qtransform/tst_qtransform.cpp index 9da3cb568dd..73b66775cea 100644 --- a/tests/auto/gui/painting/qtransform/tst_qtransform.cpp +++ b/tests/auto/gui/painting/qtransform/tst_qtransform.cpp @@ -35,6 +35,7 @@ private slots: void mapInt(); void mapPathWithPoint(); void mapRectToPolygon(); // QTBUG-127723 + void quadToQuad(); // QTBUG-21329 private: void mapping_data(); @@ -714,6 +715,14 @@ void tst_QTransform::mapRectToPolygon() QCOMPARE(polygon1, polygon2); } +void tst_QTransform::quadToQuad() // QTBUG-21329 +{ + QTransform result; + QVERIFY(QTransform::quadToQuad(QRectF(0, 0, 1, 1), QRectF(0, 0, 1, 1), result)); + QPolygonF trapezoid({{0, 0}, {10, 0}, {11, 11}, {0, 10}}); + QVERIFY(QTransform::quadToQuad(trapezoid, trapezoid.boundingRect(), result)); +} + QTEST_APPLESS_MAIN(tst_QTransform)