[PATCH 1/2] XCB: Fix clip-fill-{eo,nz}-unbounded tests

Uli Schlachter psychon at znc.in
Sat Nov 27 12:52:59 PST 2010


The X server calculates the bounding box for traps and then allocates a
temporary picture for this. When the X server calculates different values than
cairo got in extents->bounded, unbounded operators will have wrong results. The
X server only ever calculates bounds that are larger than the real value.

Fix this by explicitly clipping the drawing to the expected bounds.

Signed-off-by: Uli Schlachter <psychon at znc.in>
---
 src/cairo-xcb-surface-render.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/src/cairo-xcb-surface-render.c b/src/cairo-xcb-surface-render.c
index f712818..7bf9c13 100644
--- a/src/cairo-xcb-surface-render.c
+++ b/src/cairo-xcb-surface-render.c
@@ -2391,6 +2391,7 @@ _clip_and_composite (cairo_xcb_surface_t	*dst,
 {
     cairo_status_t status;
     cairo_region_t *clip_region = NULL;
+    cairo_region_t *region_extents = NULL;
     cairo_bool_t need_clip_surface = FALSE;
 
     if (clip != NULL) {
@@ -2414,6 +2415,14 @@ _clip_and_composite (cairo_xcb_surface_t	*dst,
 	    if (unlikely (is_empty && extents->is_bounded))
 		return CAIRO_STATUS_SUCCESS;
 	}
+    } else if (!extents->is_bounded) {
+	/* The X server will estimate the affected region of the unbounded
+	 * operation and will apply the operation to that rectangle.
+	 * However, there are cases where this estimate is too high (e.g.
+	 * the test suite's clip-fill-{eo,nz}-unbounded tests).
+	 */
+	region_extents = cairo_region_create_rectangle (&extents->unbounded);
+	clip_region = region_extents;
     }
 
     status = _cairo_xcb_connection_acquire (dst->connection);
@@ -2482,6 +2491,7 @@ _clip_and_composite (cairo_xcb_surface_t	*dst,
 
     if (clip_region != NULL)
 	_cairo_xcb_surface_clear_clip_region (dst);
+    cairo_region_destroy (region_extents);
 
     _cairo_xcb_connection_release (dst->connection);
 
-- 
1.7.2.3


--------------070300010402070502090409
Content-Type: text/x-diff;
 name="0002-XCB-Remove-a-wrong-optimization.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="0002-XCB-Remove-a-wrong-optimization.patch"



More information about the cairo mailing list