void _XFlushGCCache(Display *dpy, GC gc)
{
    register _XExtension *ext;
    CARD32 values[32];

    if (!gc->dirty)
	return;

    _XGenerateGCList (&gc->values, gc->dirty, values);
    XCBChangeGC(XCBConnectionOfDisplay(dpy), XCLGCONTEXT(gc->gid), gc->dirty, values);

    /* call out to any extensions interested */
    for (ext = dpy->ext_procs; ext; ext = ext->next)
	if (ext->flush_GC) (*ext->flush_GC)(dpy, gc, &ext->codes);
    gc->dirty = 0L; /* allow extensions to see dirty bits */
}
static cairo_int_status_t
_cairo_xcb_surface_set_clip_region (void              *abstract_surface,
				    pixman_region16_t *region)
{
    cairo_xcb_surface_t *surface = abstract_surface;

    if (surface->clip_rects) {
	free (surface->clip_rects);
	surface->clip_rects = NULL;
    }

    surface->num_clip_rects = 0;

    if (region == NULL) {
	if (surface->gc.xid) {
	    CARD32 mask = XCBGCClipMask;
	    CARD32 pa[] = { XCBNone };

	    XCBChangeGC (surface->dpy, surface->gc, mask, pa);
	}

	if (surface->has_format && surface->picture.xid) {
	    CARD32 mask = XCBRenderCPClipMask;
	    CARD32 pa[] = { XCBNone };

	    XCBRenderChangePicture (surface->dpy, surface->picture, mask, pa);
	}
    } else {
	pixman_box16_t *boxes;
	XCBRECTANGLE *rects = NULL;
	int n_boxes, i;

	n_boxes = pixman_region_num_rects (region);
	if (n_boxes > 0) {
	    rects = malloc (sizeof(XCBRECTANGLE) * n_boxes);
	    if (rects == NULL)
		return CAIRO_STATUS_NO_MEMORY;
	} else {
	    rects = NULL;
	}

	boxes = pixman_region_rects (region);

	for (i = 0; i < n_boxes; i++) {
	    rects[i].x = boxes[i].x1;
	    rects[i].y = boxes[i].y1;
	    rects[i].width = boxes[i].x2 - boxes[i].x1;
	    rects[i].height = boxes[i].y2 - boxes[i].y1;
	}

	surface->clip_rects = rects;
	surface->num_clip_rects = n_boxes;

	if (surface->gc.xid)
	    _cairo_xcb_surface_set_gc_clip_rects (surface);

	if (surface->picture.xid)
	    _cairo_xcb_surface_set_picture_clip_rects (surface);
    }

    return CAIRO_STATUS_SUCCESS;
}