static void
_cairo_xcb_surface_ensure_gc (cairo_xcb_surface_t *surface)
{
    if (surface->gc.xid)
	return;

    surface->gc = XCBGCONTEXTNew(surface->dpy);
    XCBCreateGC (surface->dpy, surface->gc, surface->drawable, 0, 0);
    _cairo_xcb_surface_set_gc_clip_rects(surface);
}
/* gcvalues: the values themselves */
GC XCreateGC(register Display *dpy, Drawable drawable, unsigned long valuemask, XGCValues *gcvalues)
{
    register GC gc;
    register _XExtension *ext;
    GCONTEXT g;
    CARD32 values[32];

    LockDisplay(dpy);
    gc = (GC)Xmalloc (sizeof(struct _XGC));
    if (gc == NULL)
	goto done;
    g = XCBGCONTEXTNew(XCBConnectionOfDisplay(dpy));

    gc->gid = g.xid;
    gc->rects = 0;
    gc->dashes = 0;
    gc->ext_data = NULL;
    gc->values = initial_GC;
    gc->dirty = 0L;

    valuemask &= (1L << (GCLastBit + 1)) - 1;
    if (valuemask)
	_XUpdateGCCache (gc, valuemask, gcvalues);
    if (gc->dirty)
	_XGenerateGCList (&gc->values, gc->dirty, values);
    XCBCreateGC(XCBConnectionOfDisplay(dpy), g, XCLDRAWABLE(drawable), gc->dirty, values);

    /* call out to any extensions interested */
    for (ext = dpy->ext_procs; ext; ext = ext->next)
	if (ext->create_GC) (*ext->create_GC)(dpy, gc, &ext->codes);
    gc->dirty = 0L; /* allow extensions to see dirty bits */

done:
    UnlockDisplay(dpy);
    return (gc);
}