summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEirik Aavitsland <[email protected]>2025-02-27 11:05:42 +0100
committerEirik Aavitsland <[email protected]>2025-02-28 21:04:48 +0100
commit56de11397559af3b9694ef2b99d93a469889ae5e (patch)
tree6afdba753a7d3048837a83d0030130c8b6539021
parent9a753fa656a9bcae4193ceb38cfaf6e21641ddc2 (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.cpp7
-rw-r--r--tests/baseline/painting/scripts/lines.qps54
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