From d62f0df3541ab9ee7a4999f0ecedc52f8d1ab8cc Mon Sep 17 00:00:00 2001 From: Roland Scheidegger Date: Fri, 9 Mar 2018 05:27:25 +0100 Subject: draw: fix alpha value for very short aa lines The logic would not work correctly for line lengths smaller than 1.0, even a degenerated line with length 0 would still produce a fragment with anyhwere between alpha 0.0 and 0.5. Reviewed-by: Brian Paul --- src/gallium/auxiliary/draw/draw_pipe_aaline.c | 25 ++++++++++++++++++++++++- src/gallium/auxiliary/draw/draw_pipe_stipple.c | 1 - 2 files changed, 24 insertions(+), 2 deletions(-) (limited to 'src/gallium') diff --git a/src/gallium/auxiliary/draw/draw_pipe_aaline.c b/src/gallium/auxiliary/draw/draw_pipe_aaline.c index 14a4b2f4b00..66a943aff42 100644 --- a/src/gallium/auxiliary/draw/draw_pipe_aaline.c +++ b/src/gallium/auxiliary/draw/draw_pipe_aaline.c @@ -370,7 +370,30 @@ aaline_line(struct draw_stage *stage, struct prim_header *header) float t_l, t_w; uint i; - half_length = 0.5f * sqrtf(dx * dx + dy * dy) + 0.5f; + half_length = 0.5f * sqrtf(dx * dx + dy * dy); + + if (half_length < 0.5f) { + /* + * The logic we use for "normal" sized segments is incorrect + * for very short segments (basically because we only have + * one value to interpolate, not a distance to each endpoint). + * Therefore, we calculate half_length differently, so that for + * original line length (near) 0, we get alpha 0 - otherwise + * max alpha would still be 0.5. This also prevents us from + * artifacts due to degenerated lines (the endpoints being + * identical, which would still receive anywhere from alpha + * 0-0.5 otherwise) (at least the pstipple stage may generate + * such lines due to float inaccuracies if line length is very + * close to a integer). + * Might not be fully accurate neither (because the "strength" of + * the line is going to be determined by how close to the pixel + * center those 1 or 2 fragments are) but it's probably the best + * we can do. + */ + half_length = 2.0f * half_length; + } else { + half_length = half_length + 0.5f; + } t_w = half_width; t_l = 0.5f; diff --git a/src/gallium/auxiliary/draw/draw_pipe_stipple.c b/src/gallium/auxiliary/draw/draw_pipe_stipple.c index 3a44e96add0..d30572cc61c 100644 --- a/src/gallium/auxiliary/draw/draw_pipe_stipple.c +++ b/src/gallium/auxiliary/draw/draw_pipe_stipple.c @@ -150,7 +150,6 @@ stipple_line(struct draw_stage *stage, struct prim_header *header) if (header->flags & DRAW_PIPE_RESET_STIPPLE) stipple->counter = 0; - /* XXX ToDo: instead of iterating pixel-by-pixel, use a look-up table. */ for (i = 0; i < length; i++) { -- cgit v1.2.3