summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland Scheidegger <[email protected]>2018-03-09 05:27:25 +0100
committerRoland Scheidegger <[email protected]>2018-03-10 02:11:50 +0100
commitd62f0df3541ab9ee7a4999f0ecedc52f8d1ab8cc (patch)
tree10f041f03fa48824e6597ff0814220b61ee8e833
parent24b415270ffeef873ba4772d1b3c7c185c9b1958 (diff)
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 <[email protected]>
-rw-r--r--src/gallium/auxiliary/draw/draw_pipe_aaline.c25
-rw-r--r--src/gallium/auxiliary/draw/draw_pipe_stipple.c1
2 files changed, 24 insertions, 2 deletions
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++) {