[cairo] [PATCH] Speeding up clipping: Redux

Jeff Muizelaar jeff at infidigm.net
Wed Nov 21 19:04:18 PST 2007

I posted this patch back in June.
Back then, it apparently broke a test case. However, trying it now I
can't seem to reproduce the problem. It looks like a bunch of X test
cases are broken on my system, so I can't be sure. Anyways, if someone
could verify that this doesn't break anything, I'd love to check it in.

I also haven't rerun the performance test suite with it recently, so if
someone wants to try that, that could be helpful as well. I expect it
should similar results as it did in June.

-------------- next part --------------
commit 0bab5049bdeb4783424e7dc6ce72a4cb362d970a
Author: Jeff Muizelaar <jeff at infidigm.net>
Date:   Mon Jun 18 05:28:38 2007 -0400

    Use ADD instead of IN for clipping.
    ADD is already special-cased by pixman, so using it instead avoids hitting
    the slower general path.

diff --git a/src/cairo-clip.c b/src/cairo-clip.c
index 0fed3f6..c12b1b7 100644
--- a/src/cairo-clip.c
+++ b/src/cairo-clip.c
@@ -451,11 +451,41 @@ _cairo_clip_intersect_mask (cairo_clip_t      *clip,
     _cairo_pattern_init_solid (&pattern.solid, CAIRO_COLOR_WHITE,
+    /* The clipping operation should ideally be something like the following to
+     * avoid having to do as many passes over the data
+	if (clip->surface != NULL) {
+	    _cairo_pattern_init_for_surface (&pattern.surface, clip->surface);
+	} else {
+	    _cairo_pattern_init_solid (&pattern.solid, CAIRO_COLOR_WHITE,
+	}
+	status = _cairo_surface_composite_trapezoids (CAIRO_OPERATOR_IN,
+						  &pattern.base,
+						  surface,
+						  antialias,
+						  0, 0,
+						  0, 0,
+						  surface_rect.width,
+						  surface_rect.height,
+						  traps->traps,
+						  traps->num_traps);
+	However this operation is not accelerated by pixman
+	I believe the best possible operation would probably an unbounded SRC
+	operator.  Using SRC we could potentially avoid having to initialize
+	the surface which would be ideal from an efficiency point of view.
+	However, _cairo_surface_composite_trapezoids (CAIRO_OPERATOR_SOURCE) is
+	bounded by the mask.
+    */
     surface = _cairo_surface_create_similar_solid (target,
     if (surface->status) {
 	_cairo_pattern_fini (&pattern.base);
@@ -466,7 +496,7 @@ _cairo_clip_intersect_mask (cairo_clip_t      *clip,
     _cairo_traps_translate (traps, -surface_rect.x, -surface_rect.y);
-    status = _cairo_surface_composite_trapezoids (CAIRO_OPERATOR_IN,
+    status = _cairo_surface_composite_trapezoids (CAIRO_OPERATOR_ADD,

More information about the cairo mailing list