summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-09-27 11:13:23 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-09-27 11:13:23 +0100
commit7e856071a27b06a6ae35b6445635da9276975c69 (patch)
tree858559463b5b7e34ade6a0e91fbebc7a3533b08c
parent3969f2c687aa94721e02d50c2f9e1b4d62a546f7 (diff)
polygon-intersect: Exclude non-overlapping clip boxes from consideration
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/cairo-polygon-intersect.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/src/cairo-polygon-intersect.c b/src/cairo-polygon-intersect.c
index c900c89d..2cd73d2e 100644
--- a/src/cairo-polygon-intersect.c
+++ b/src/cairo-polygon-intersect.c
@@ -1394,7 +1394,7 @@ _cairo_polygon_intersect (cairo_polygon_t *a, int winding_a,
if (unlikely (0 == a->num_edges))
return CAIRO_STATUS_SUCCESS;
- if (unlikely (b->num_edges == 0)) {
+ if (unlikely (0 == b->num_edges)) {
a->num_edges = 0;
return CAIRO_STATUS_SUCCESS;
}
@@ -1505,16 +1505,22 @@ _cairo_polygon_intersect_with_boxes (cairo_polygon_t *polygon,
_cairo_polygon_init (&b, NULL, 0);
for (n = 0; n < num_boxes; n++) {
- cairo_point_t p1, p2;
+ if (boxes[n].p2.x > polygon->extents.p1.x &&
+ boxes[n].p1.x < polygon->extents.p2.x &&
+ boxes[n].p2.y > polygon->extents.p1.y &&
+ boxes[n].p1.y < polygon->extents.p2.y)
+ {
+ cairo_point_t p1, p2;
- p1.y = boxes[n].p1.y;
- p2.y = boxes[n].p2.y;
+ p1.y = boxes[n].p1.y;
+ p2.y = boxes[n].p2.y;
- p2.x = p1.x = boxes[n].p1.x;
- _cairo_polygon_add_external_edge (&b, &p1, &p2);
+ p2.x = p1.x = boxes[n].p1.x;
+ _cairo_polygon_add_external_edge (&b, &p1, &p2);
- p2.x = p1.x = boxes[n].p2.x;
- _cairo_polygon_add_external_edge (&b, &p2, &p1);
+ p2.x = p1.x = boxes[n].p2.x;
+ _cairo_polygon_add_external_edge (&b, &p2, &p1);
+ }
}
status = _cairo_polygon_intersect (polygon, *winding,