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; }