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. Change-Id: Idff8a2de54c97e35facc8f4e09c43dfea7397588 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> (cherry picked from commit 56de11397559af3b9694ef2b99d93a469889ae5e) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> (cherry picked from commit 8159f4626bb1c1a267f464464cd757638fda7110)
This commit is contained in:
parent
f03c3055e6
commit
e9146b64f2
@ -1584,11 +1584,8 @@ void QRasterPaintEngine::stroke(const QVectorPath &path, const QPen &pen)
|
|||||||
const QLineF line = s->matrix.map(lines[i]);
|
const QLineF line = s->matrix.map(lines[i]);
|
||||||
if (line.p1() == line.p2()) {
|
if (line.p1() == line.p2()) {
|
||||||
if (s->lastPen.capStyle() != Qt::FlatCap) {
|
if (s->lastPen.capStyle() != Qt::FlatCap) {
|
||||||
QPointF p = lines[i].p1();
|
const QPointF delta(width / 2, 0);
|
||||||
QLineF mappedline = s->matrix.map(QLineF(QPointF(p.x() - width*0.5, p.y()),
|
d->rasterizer->rasterizeLine(line.p1() - delta, line.p1() + delta, 1);
|
||||||
QPointF(p.x() + width*0.5, p.y())));
|
|
||||||
d->rasterizer->rasterizeLine(mappedline.p1(), mappedline.p2(),
|
|
||||||
width / mappedline.length());
|
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -306,9 +306,11 @@ translate 20 450
|
|||||||
drawText 0 0 "Zero length lines:"
|
drawText 0 0 "Zero length lines:"
|
||||||
|
|
||||||
translate 0 20
|
translate 0 20
|
||||||
drawText 100 10 "Square cap"
|
drawText 220 10 "Square cap"
|
||||||
save
|
save
|
||||||
begin_block points
|
begin_block points
|
||||||
|
setPen 0x000000 .5 solidline squarecap
|
||||||
|
drawLine -4 0 -4 0
|
||||||
setPen 0x000000 1 solidline squarecap
|
setPen 0x000000 1 solidline squarecap
|
||||||
drawLine 0 0 0 0
|
drawLine 0 0 0 0
|
||||||
setPen 0x000000 2 solidline squarecap
|
setPen 0x000000 2 solidline squarecap
|
||||||
@ -329,6 +331,20 @@ setPen 0x000000 9 solidline squarecap
|
|||||||
drawLine 67 0 67 0
|
drawLine 67 0 67 0
|
||||||
setPen 0x000000 10 solidline squarecap
|
setPen 0x000000 10 solidline squarecap
|
||||||
drawLine 78 0 78 0
|
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
|
end_block points
|
||||||
restore
|
restore
|
||||||
|
|
||||||
@ -338,9 +354,11 @@ repeat_block points
|
|||||||
setRenderHint Antialiasing
|
setRenderHint Antialiasing
|
||||||
|
|
||||||
translate 0 20
|
translate 0 20
|
||||||
drawText 100 10 "Round cap"
|
drawText 220 10 "Round cap"
|
||||||
save
|
save
|
||||||
begin_block points2
|
begin_block points2
|
||||||
|
setPen 0x000000 .5 solidline roundcap
|
||||||
|
drawLine -4 0 -4 0
|
||||||
setPen 0x000000 1 solidline roundcap
|
setPen 0x000000 1 solidline roundcap
|
||||||
drawLine 0 0 0 0
|
drawLine 0 0 0 0
|
||||||
setPen 0x000000 2 solidline roundcap
|
setPen 0x000000 2 solidline roundcap
|
||||||
@ -361,6 +379,20 @@ setPen 0x000000 9 solidline roundcap
|
|||||||
drawLine 67 0 67 0
|
drawLine 67 0 67 0
|
||||||
setPen 0x000000 10 solidline roundcap
|
setPen 0x000000 10 solidline roundcap
|
||||||
drawLine 78 0 78 0
|
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
|
end_block points2
|
||||||
restore
|
restore
|
||||||
|
|
||||||
@ -370,9 +402,11 @@ repeat_block points2
|
|||||||
setRenderHint Antialiasing
|
setRenderHint Antialiasing
|
||||||
|
|
||||||
translate 0 20
|
translate 0 20
|
||||||
drawText 100 10 "Flat cap"
|
drawText 220 10 "Flat cap"
|
||||||
save
|
save
|
||||||
begin_block points3
|
begin_block points3
|
||||||
|
setPen 0x000000 .5 solidline flatcap
|
||||||
|
drawLine -4 0 -4 0
|
||||||
setPen 0x000000 1 solidline flatcap
|
setPen 0x000000 1 solidline flatcap
|
||||||
drawLine 0 0 0 0
|
drawLine 0 0 0 0
|
||||||
setPen 0x000000 2 solidline flatcap
|
setPen 0x000000 2 solidline flatcap
|
||||||
@ -393,6 +427,20 @@ setPen 0x000000 9 solidline flatcap
|
|||||||
drawLine 67 0 67 0
|
drawLine 67 0 67 0
|
||||||
setPen 0x000000 10 solidline flatcap
|
setPen 0x000000 10 solidline flatcap
|
||||||
drawLine 78 0 78 0
|
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
|
end_block points3
|
||||||
restore
|
restore
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user