summaryrefslogtreecommitdiff
path: root/src/cairo-clip.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-07-29 11:42:59 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2011-07-29 11:44:21 +0100
commitaac9b261762cdb8039daedfe63a56a83faa0155f (patch)
tree1f6ef0a27f0345ffb23a5b78044013303342751d /src/cairo-clip.c
parentecafad7149cb80bad56cc042ced4bb06c106ce1a (diff)
downloadcairo-aac9b261762cdb8039daedfe63a56a83faa0155f.tar.gz
clip: Fix cairo_clip_equal()
In haste, I completely removed the implementation... Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-clip.c')
-rw-r--r--src/cairo-clip.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/cairo-clip.c b/src/cairo-clip.c
index a90c69873..b01093efb 100644
--- a/src/cairo-clip.c
+++ b/src/cairo-clip.c
@@ -340,11 +340,45 @@ cairo_bool_t
_cairo_clip_equal (const cairo_clip_t *clip_a,
const cairo_clip_t *clip_b)
{
+ const cairo_clip_path_t *cp_a, *cp_b;
+
/* are both all-clipped or no-clip? */
if (clip_a == clip_b)
return TRUE;
- return FALSE;
+ if (clip_a->num_boxes != clip_b->num_boxes)
+ return FALSE;
+
+ if (memcmp (clip_a->boxes, clip_b->boxes,
+ sizeof (cairo_box_t) * clip_a->num_boxes))
+ return FALSE;
+
+ cp_a = clip_a->path;
+ cp_b = clip_b->path;
+ while (cp_a && cp_b) {
+ if (cp_a == cp_b)
+ return TRUE;
+
+ /* XXX compare reduced polygons? */
+
+ if (cp_a->antialias != cp_b->antialias)
+ return FALSE;
+
+ if (cp_a->tolerance != cp_b->tolerance)
+ return FALSE;
+
+ if (cp_a->fill_rule != cp_b->fill_rule)
+ return FALSE;
+
+ if (! _cairo_path_fixed_equal (&cp_a->path,
+ &cp_b->path))
+ return FALSE;
+
+ cp_a = cp_a->prev;
+ cp_b = cp_b->prev;
+ }
+
+ return cp_a == NULL && cp_b == NULL;
}
static cairo_clip_t *