summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-01-19 09:46:52 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-01-19 09:54:06 +0000
commit3c010745076204ed3b66e947c9eab6de84f670fe (patch)
treedba0253416ad0f8cc9bee9bf007a96547f8b954f
parent35f81005f91d294e61bb4ced7cbddd1a76ccb324 (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.c38
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 {