diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-01-19 09:46:52 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-01-19 09:54:06 +0000 |
commit | 3c010745076204ed3b66e947c9eab6de84f670fe (patch) | |
tree | dba0253416ad0f8cc9bee9bf007a96547f8b954f | |
parent | 35f81005f91d294e61bb4ced7cbddd1a76ccb324 (diff) |
sna: filter out degenerate segments whilst drawing unclipped PolySegment
The damage layer was detecting that we were asking it to accumulate a
degenerate box emanating from PolySegment, as the unclipped paths made
the fatal assumption that it would not need to filter out degenerate
boxes. However, a degenerate line becomes a point, does the same apply
to a degenerate segment?
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/sna/sna_accel.c | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 0f21ffaa..79555e57 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -5534,18 +5534,25 @@ sna_poly_segment_blt(DrawablePtr drawable, b->x2--; } - b->x1 += dx; - b->x2 += dx; - b->y1 += dy; - b->y2 += dy; - b++; + /* XXX does a degenerate segment + * become a point? + */ + if (b->y2 > b->y1 && b->x2 > b->x1) { + b->x1 += dx; + b->x2 += dx; + b->y1 += dy; + b->y2 += dy; + b++; + } seg++; } while (--nbox); - fill.boxes(sna, &fill, boxes, b-boxes); - if (damage) - sna_damage_add_boxes(damage, boxes, b-boxes, 0, 0); - b = boxes; + if (b != boxes) { + fill.boxes(sna, &fill, boxes, b-boxes); + if (damage) + sna_damage_add_boxes(damage, boxes, b-boxes, 0, 0); + b = boxes; + } } while (n); } else { do { @@ -5580,14 +5587,17 @@ sna_poly_segment_blt(DrawablePtr drawable, b->x2--; } - b++; + if (b->y2 > b->y1 && b->x2 > b->x1) + b++; seg++; } while (--nbox); - fill.boxes(sna, &fill, boxes, b-boxes); - if (damage) - sna_damage_add_boxes(damage, boxes, b-boxes, 0, 0); - b = boxes; + if (b != boxes) { + fill.boxes(sna, &fill, boxes, b-boxes); + if (damage) + sna_damage_add_boxes(damage, boxes, b-boxes, 0, 0); + b = boxes; + } } while (n); } } else { |