draw: fix alpha value for very short aa lines
authorRoland Scheidegger <sroland@vmware.com>
Fri, 9 Mar 2018 04:27:25 +0000 (05:27 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Sat, 10 Mar 2018 01:11:50 +0000 (02:11 +0100)
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 <brianp@vmware.com>
src/gallium/auxiliary/draw/draw_pipe_aaline.c
src/gallium/auxiliary/draw/draw_pipe_stipple.c

index 14a4b2f4b0027ead8a1e70c8c6d9cce3f4d3b178..66a943aff425d80a84870c612f78818971a8f430 100644 (file)
@@ -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;
index 3a44e96add0a204ab9d2d8223b1b2af538c63a42..d30572cc61c48f17b2adcd7dcbb667000daff842 100644 (file)
@@ -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++) {