diff options
author | Eirik Aavitsland <[email protected]> | 2025-02-27 11:05:42 +0100 |
---|---|---|
committer | Eirik Aavitsland <[email protected]> | 2025-02-28 21:04:48 +0100 |
commit | 56de11397559af3b9694ef2b99d93a469889ae5e (patch) | |
tree | 6afdba753a7d3048837a83d0030130c8b6539021 | |
parent | 9a753fa656a9bcae4193ceb38cfaf6e21641ddc2 (diff) |
Raster engine: Fix painting of zero length, square cap wide lines
Such lines are rendered by drawing a capless line that is pen-width
long, i.e. a square, to represent the two line caps. However, the line
length offset was added before any transformation, so one could end up
with a long line being rendered if the world transform had a large
scale, say.
Pick-to: 6.9 6.8
Change-Id: Idff8a2de54c97e35facc8f4e09c43dfea7397588
Reviewed-by: Eskil Abrahamsen Blomfeldt <[email protected]>
-rw-r--r-- | src/gui/painting/qpaintengine_raster.cpp | 7 | ||||
-rw-r--r-- | tests/baseline/painting/scripts/lines.qps | 54 |
2 files changed, 53 insertions, 8 deletions
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index 0cb9edab577..f8c9f8b2ba4 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -1584,11 +1584,8 @@ void QRasterPaintEngine::stroke(const QVectorPath &path, const QPen &pen) const QLineF line = s->matrix.map(lines[i]); if (line.p1() == line.p2()) { if (s->lastPen.capStyle() != Qt::FlatCap) { - QPointF p = lines[i].p1(); - QLineF mappedline = s->matrix.map(QLineF(QPointF(p.x() - width*0.5, p.y()), - QPointF(p.x() + width*0.5, p.y()))); - d->rasterizer->rasterizeLine(mappedline.p1(), mappedline.p2(), - width / mappedline.length()); + const QPointF delta(width / 2, 0); + d->rasterizer->rasterizeLine(line.p1() - delta, line.p1() + delta, 1); } continue; } diff --git a/tests/baseline/painting/scripts/lines.qps b/tests/baseline/painting/scripts/lines.qps index 274a7f31ec1..3dfdd6c253b 100644 --- a/tests/baseline/painting/scripts/lines.qps +++ b/tests/baseline/painting/scripts/lines.qps @@ -306,9 +306,11 @@ translate 20 450 drawText 0 0 "Zero length lines:" translate 0 20 -drawText 100 10 "Square cap" +drawText 220 10 "Square cap" save begin_block points +setPen 0x000000 .5 solidline squarecap +drawLine -4 0 -4 0 setPen 0x000000 1 solidline squarecap drawLine 0 0 0 0 setPen 0x000000 2 solidline squarecap @@ -329,6 +331,20 @@ setPen 0x000000 9 solidline squarecap drawLine 67 0 67 0 setPen 0x000000 10 solidline squarecap drawLine 78 0 78 0 +save +translate 95 0 +save +rotate 30 +drawLine 0 0 0 0 +restore +setPen 0x000000 3 solidline squarecap +translate 30 0 +scale 3 3 +drawLine 0 0 0 0 +translate 20 0 +rotate 30 +drawLine 0 0 0 0 +restore end_block points restore @@ -338,9 +354,11 @@ repeat_block points setRenderHint Antialiasing translate 0 20 -drawText 100 10 "Round cap" +drawText 220 10 "Round cap" save begin_block points2 +setPen 0x000000 .5 solidline roundcap +drawLine -4 0 -4 0 setPen 0x000000 1 solidline roundcap drawLine 0 0 0 0 setPen 0x000000 2 solidline roundcap @@ -361,6 +379,20 @@ setPen 0x000000 9 solidline roundcap drawLine 67 0 67 0 setPen 0x000000 10 solidline roundcap drawLine 78 0 78 0 +save +translate 95 0 +save +rotate 30 +drawLine 0 0 0 0 +restore +setPen 0x000000 3 solidline roundcap +translate 30 0 +scale 3 3 +drawLine 0 0 0 0 +translate 20 0 +rotate 30 +drawLine 0 0 0 0 +restore end_block points2 restore @@ -370,9 +402,11 @@ repeat_block points2 setRenderHint Antialiasing translate 0 20 -drawText 100 10 "Flat cap" +drawText 220 10 "Flat cap" save begin_block points3 +setPen 0x000000 .5 solidline flatcap +drawLine -4 0 -4 0 setPen 0x000000 1 solidline flatcap drawLine 0 0 0 0 setPen 0x000000 2 solidline flatcap @@ -393,6 +427,20 @@ setPen 0x000000 9 solidline flatcap drawLine 67 0 67 0 setPen 0x000000 10 solidline flatcap drawLine 78 0 78 0 +save +translate 95 0 +save +rotate 30 +drawLine 0 0 0 0 +restore +setPen 0x000000 3 solidline flatcap +translate 30 0 +scale 3 3 +drawLine 0 0 0 0 +translate 20 0 +rotate 30 +drawLine 0 0 0 0 +restore end_block points3 restore |