diff --git a/src/gui/painting/qbezier.cpp b/src/gui/painting/qbezier.cpp index 65e6063fe4..fcf19a1a63 100644 --- a/src/gui/painting/qbezier.cpp +++ b/src/gui/painting/qbezier.cpp @@ -400,6 +400,33 @@ static bool addCircle(const QBezier *b, qreal offset, QBezier *o) return true; } +// Patch: Workaround VS2019 compiler bug, see QTBUG-75280. +#ifdef Q_OS_WIN +Q_NEVER_INLINE void QBezier::split(QBezier *firstHalf, QBezier *secondHalf) const +{ + Q_ASSERT(firstHalf); + Q_ASSERT(secondHalf); + + qreal c = (x2 + x3)*.5; + firstHalf->x2 = (x1 + x2)*.5; + secondHalf->x3 = (x3 + x4)*.5; + firstHalf->x1 = x1; + secondHalf->x4 = x4; + firstHalf->x3 = (firstHalf->x2 + c)*.5; + secondHalf->x2 = (secondHalf->x3 + c)*.5; + firstHalf->x4 = secondHalf->x1 = (firstHalf->x3 + secondHalf->x2)*.5; + + c = (y2 + y3)/2; + firstHalf->y2 = (y1 + y2)*.5; + secondHalf->y3 = (y3 + y4)*.5; + firstHalf->y1 = y1; + secondHalf->y4 = y4; + firstHalf->y3 = (firstHalf->y2 + c)*.5; + secondHalf->y2 = (secondHalf->y3 + c)*.5; + firstHalf->y4 = secondHalf->y1 = (firstHalf->y3 + secondHalf->y2)*.5; +} +#endif // Q_OS_WIN + int QBezier::shifted(QBezier *curveSegments, int maxSegments, qreal offset, float threshold) const { Q_ASSERT(curveSegments); diff --git a/src/gui/painting/qbezier_p.h b/src/gui/painting/qbezier_p.h index f8a91e9ef3..50c60b2d71 100644 --- a/src/gui/painting/qbezier_p.h +++ b/src/gui/painting/qbezier_p.h @@ -222,6 +222,8 @@ inline QPointF QBezier::secondDerivedAt(qreal t) const a * y1 + b * y2 + c * y3 + d * y4); } +// Patch: Workaround VS2019 compiler bug, see QTBUG-75280. +#ifndef Q_OS_WIN inline void QBezier::split(QBezier *firstHalf, QBezier *secondHalf) const { Q_ASSERT(firstHalf); @@ -245,6 +247,7 @@ inline void QBezier::split(QBezier *firstHalf, QBezier *secondHalf) const secondHalf->y2 = (secondHalf->y3 + c)*.5; firstHalf->y4 = secondHalf->y1 = (firstHalf->y3 + secondHalf->y2)*.5; } +#endif // Q_OS_WIN inline void QBezier::parameterSplitLeft(qreal t, QBezier *left) {