fix QTransform regression since b2a2032ea0

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2021-09-20 17:55:47 +03:00
parent f03d910da3
commit 5ce921f356

View file

@ -63,12 +63,13 @@ QT_BEGIN_NAMESPACE
ny = affine._m12 * FX_ + affine._m22 * FY_ + affine._dy; \ ny = affine._m12 * FX_ + affine._m22 * FY_ + affine._dy; \
break; \ break; \
case TxProject: \ case TxProject: \
nx = affine._m11 * FX_ + affine._m21 * FY_ + affine._dx; \
ny = affine._m12 * FX_ + affine._m22 * FY_ + affine._dy; \
qreal w = (m_13 * FX_ + m_23 * FY_ + m_33); \ qreal w = (m_13 * FX_ + m_23 * FY_ + m_33); \
if (w < Q_NEAR_CLIP) w = Q_NEAR_CLIP; \ if (w < qreal(Q_NEAR_CLIP)) w = qreal(Q_NEAR_CLIP); \
w = 1./w; \ w = 1./w; \
nx = affine._m11 * FX_ + affine._m21 * FY_ + affine._dx * w; \ nx *= w; \
ny = affine._m12 * FX_ + affine._m22 * FY_ + affine._dy * w; \ ny *= w; \
break; \
} \ } \
} while (0) } while (0)
@ -1122,9 +1123,11 @@ QPoint QTransform::map(const QPoint &p) const
y = affine._m12 * fx + affine._m22 * fy + affine._dy; y = affine._m12 * fx + affine._m22 * fy + affine._dy;
break; break;
case TxProject: case TxProject:
x = affine._m11 * fx + affine._m21 * fy + affine._dx;
y = affine._m12 * fx + affine._m22 * fy + affine._dy;
qreal w = 1./(m_13 * fx + m_23 * fy + m_33); qreal w = 1./(m_13 * fx + m_23 * fy + m_33);
x = affine._m11 * fx + affine._m21 * fy + affine._dx * w; x *= w;
y = affine._m12 * fx + affine._m22 * fy + affine._dy * w; y *= w;
break; break;
} }
return QPoint(qRound(x), qRound(y)); return QPoint(qRound(x), qRound(y));
@ -1173,9 +1176,11 @@ QPointF QTransform::map(const QPointF &p) const
y = affine._m12 * fx + affine._m22 * fy + affine._dy; y = affine._m12 * fx + affine._m22 * fy + affine._dy;
break; break;
case TxProject: case TxProject:
x = affine._m11 * fx + affine._m21 * fy + affine._dx;
y = affine._m12 * fx + affine._m22 * fy + affine._dy;
qreal w = 1./(m_13 * fx + m_23 * fy + m_33); qreal w = 1./(m_13 * fx + m_23 * fy + m_33);
x = affine._m11 * fx + affine._m21 * fy + affine._dx * w; x *= w;
y = affine._m12 * fx + affine._m22 * fy + affine._dy * w; y *= w;
break; break;
} }
return QPointF(x, y); return QPointF(x, y);
@ -1252,12 +1257,16 @@ QLine QTransform::map(const QLine &l) const
y2 = affine._m12 * fx2 + affine._m22 * fy2 + affine._dy; y2 = affine._m12 * fx2 + affine._m22 * fy2 + affine._dy;
break; break;
case TxProject: case TxProject:
x1 = affine._m11 * fx1 + affine._m21 * fy1 + affine._dx;
y1 = affine._m12 * fx1 + affine._m22 * fy1 + affine._dy;
x2 = affine._m11 * fx2 + affine._m21 * fy2 + affine._dx;
y2 = affine._m12 * fx2 + affine._m22 * fy2 + affine._dy;
qreal w = 1./(m_13 * fx1 + m_23 * fy1 + m_33); qreal w = 1./(m_13 * fx1 + m_23 * fy1 + m_33);
x1 = affine._m11 * fx1 + affine._m21 * fy1 + affine._dx * w; x1 *= w;
y1 = affine._m12 * fx1 + affine._m22 * fy1 + affine._dy * w; y1 *= w;
w = 1./(m_13 * fx2 + m_23 * fy2 + m_33); w = 1./(m_13 * fx2 + m_23 * fy2 + m_33);
x2 = affine._m11 * fx2 + affine._m21 * fy2 + affine._dx * w; x2 *= w;
y2 = affine._m12 * fx2 + affine._m22 * fy2 + affine._dy * w; y2 *= w;
break; break;
} }
return QLine(qRound(x1), qRound(y1), qRound(x2), qRound(y2)); return QLine(qRound(x1), qRound(y1), qRound(x2), qRound(y2));
@ -1265,9 +1274,7 @@ QLine QTransform::map(const QLine &l) const
/*! /*!
\overload \overload
\fn QLineF QTransform::map(const QLineF &line) const \fn QLineF QTransform::map(const QLineF &line) const
Creates and returns a QLine object that is a copy of the given \a Creates and returns a QLine object that is a copy of the given \a
line, mapped into the coordinate system defined by this matrix. line, mapped into the coordinate system defined by this matrix.
Note that the transformed coordinates are rounded to the nearest Note that the transformed coordinates are rounded to the nearest
@ -1311,12 +1318,16 @@ QLineF QTransform::map(const QLineF &l) const
y2 = affine._m12 * fx2 + affine._m22 * fy2 + affine._dy; y2 = affine._m12 * fx2 + affine._m22 * fy2 + affine._dy;
break; break;
case TxProject: case TxProject:
x1 = affine._m11 * fx1 + affine._m21 * fy1 + affine._dx;
y1 = affine._m12 * fx1 + affine._m22 * fy1 + affine._dy;
x2 = affine._m11 * fx2 + affine._m21 * fy2 + affine._dx;
y2 = affine._m12 * fx2 + affine._m22 * fy2 + affine._dy;
qreal w = 1./(m_13 * fx1 + m_23 * fy1 + m_33); qreal w = 1./(m_13 * fx1 + m_23 * fy1 + m_33);
x1 = affine._m11 * fx1 + affine._m21 * fy1 + affine._dx * w; x1 *= w;
y1 = affine._m12 * fx1 + affine._m22 * fy1 + affine._dy * w; y1 *= w;
w = 1./(m_13 * fx2 + m_23 * fy2 + m_33); w = 1./(m_13 * fx2 + m_23 * fy2 + m_33);
x2 = affine._m11 * fx2 + affine._m21 * fy2 + affine._dx * w; x2 *= w;
y2 = affine._m12 * fx2 + affine._m22 * fy2 + affine._dy * w; y2 *= w;
break; break;
} }
return QLineF(x1, y1, x2, y2); return QLineF(x1, y1, x2, y2);