Fix raster paint error in path joins of tightly bending bezier curves

The code for generating round line joins is optimized with a shortcut
for the inner, normally invisible joins.  For certain joins of a
tightly turning bezier, this optimization would lead to visible
painting error. Fix by avoiding the optimization if the next control
point is so close as to allow such tight turns.

As a driveby, make the angle > 90 test cheaper, since absolute
precision is not required in the optimization choice.

Fixes: QTBUG-75008
Change-Id: I293e0776003310dc36fa7f43fbcd9c25f1f8fa5d
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Eirik Aavitsland 2019-06-14 10:34:15 +02:00
parent dd5b829468
commit 1640973a82
2 changed files with 12 additions and 1 deletions

View File

@ -524,7 +524,7 @@ void QStroker::joinPoints(qfixed focal_x, qfixed focal_y, const QLineF &nextLine
QLineF shortCut(prevLine.p2(), nextLine.p1());
qreal angle = shortCut.angleTo(prevLine);
if (type == QLineF::BoundedIntersection || (angle > 90 && !qFuzzyCompare(angle, (qreal)90))) {
if ((type == QLineF::BoundedIntersection || (angle > qreal(90.01))) && nextLine.length() > offset) {
emitLineTo(focal_x, focal_y);
emitLineTo(qt_real_to_fixed(nextLine.x1()), qt_real_to_fixed(nextLine.y1()));
return;

View File

@ -34,3 +34,14 @@ setPen blue 40 solidline roundcap
drawPath revbez
setPen red 0
drawPath revbez
resetMatrix
path_lineTo tightJoin 60 10
path_cubicTo tightJoin 50 0 100 0 100 50
translate 50 500
setPen green 40 solidline roundcap roundjoin
drawPath tightJoin
setPen red 0
drawPath tightJoin