mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-07 23:50:11 +01:00
draw: fix line stippling
The logic was comparing actual ints, not true/false values.
This meant that it was emitting always multiple line segments instead of just
one even if the stipple test had the same result, which looks inefficient, and
the segments also overlapped thus breaking line aa as well.
(In practice, with the no-op default line stipple pattern, for a 10-pixel
long line from 0-9 it was emitting 10 segments, with the individual segments
ranging from 0-1, 0-2, 0-3 and so on.)
This fixes https://bugs.freedesktop.org/show_bug.cgi?id=94193
Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
CC: <mesa-stable@lists.freedesktop.org>
(cherry picked from commit 12a4f0bed6)
This commit is contained in:
parent
0cf5990385
commit
2c592ae450
1 changed files with 15 additions and 15 deletions
|
|
@ -108,11 +108,11 @@ emit_segment(struct draw_stage *stage, struct prim_header *header,
|
|||
}
|
||||
|
||||
|
||||
static inline unsigned
|
||||
static inline bool
|
||||
stipple_test(int counter, ushort pattern, int factor)
|
||||
{
|
||||
int b = (counter / factor) & 0xf;
|
||||
return (1 << b) & pattern;
|
||||
return !!((1 << b) & pattern);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -126,7 +126,7 @@ stipple_line(struct draw_stage *stage, struct prim_header *header)
|
|||
const float *pos0 = v0->data[pos];
|
||||
const float *pos1 = v1->data[pos];
|
||||
float start = 0;
|
||||
int state = 0;
|
||||
bool state = 0;
|
||||
|
||||
float x0 = pos0[0];
|
||||
float x1 = pos1[0];
|
||||
|
|
@ -143,29 +143,29 @@ stipple_line(struct draw_stage *stage, struct prim_header *header)
|
|||
stipple->counter = 0;
|
||||
|
||||
|
||||
/* XXX ToDo: intead of iterating pixel-by-pixel, use a look-up table.
|
||||
/* XXX ToDo: instead of iterating pixel-by-pixel, use a look-up table.
|
||||
*/
|
||||
for (i = 0; i < length; i++) {
|
||||
int result = stipple_test( (int) stipple->counter+i,
|
||||
(ushort) stipple->pattern, stipple->factor );
|
||||
bool result = stipple_test((int)stipple->counter + i,
|
||||
(ushort)stipple->pattern, stipple->factor);
|
||||
if (result != state) {
|
||||
/* changing from "off" to "on" or vice versa */
|
||||
if (state) {
|
||||
if (start != i) {
|
||||
if (state) {
|
||||
if (start != i) {
|
||||
/* finishing an "on" segment */
|
||||
emit_segment( stage, header, start / length, i / length );
|
||||
emit_segment(stage, header, start / length, i / length);
|
||||
}
|
||||
}
|
||||
else {
|
||||
}
|
||||
else {
|
||||
/* starting an "on" segment */
|
||||
start = (float) i;
|
||||
}
|
||||
state = result;
|
||||
start = (float)i;
|
||||
}
|
||||
state = result;
|
||||
}
|
||||
}
|
||||
|
||||
if (state && start < length)
|
||||
emit_segment( stage, header, start / length, 1.0 );
|
||||
emit_segment(stage, header, start / length, 1.0);
|
||||
|
||||
stipple->counter += length;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue