cairo_int_status_t _cairo_compositor_paint (const cairo_compositor_t *compositor, cairo_surface_t *surface, cairo_operator_t op, const cairo_pattern_t *source, const cairo_clip_t *clip) { cairo_composite_rectangles_t extents; cairo_int_status_t status; TRACE ((stderr, "%s\n", __FUNCTION__)); status = _cairo_composite_rectangles_init_for_paint (&extents, surface, op, source, clip); if (unlikely (status)) return status; do { while (compositor->paint == XNULL) compositor = compositor->delegate; status = compositor->paint (compositor, &extents); compositor = compositor->delegate; } while (status == CAIRO_INT_STATUS_UNSUPPORTED); if (status == CAIRO_INT_STATUS_SUCCESS && surface->damage) { TRACE ((stderr, "%s: applying damage (%d,%d)x(%d, %d)\n", __FUNCTION__, extents.unbounded.x, extents.unbounded.y, extents.unbounded.width, extents.unbounded.height)); surface->damage = _cairo_damage_add_rectangle (surface->damage, &extents.unbounded); } _cairo_composite_rectangles_fini (&extents); return status; }
static cairo_int_status_t _cairo_xcb_surface_paint (void *abstract_surface, cairo_operator_t op, const cairo_pattern_t *source, const cairo_clip_t *clip) { cairo_xcb_surface_t *surface = abstract_surface; cairo_composite_rectangles_t composite; cairo_int_status_t status; status = _cairo_composite_rectangles_init_for_paint (&composite, &surface->base, op, source, clip); if (unlikely (status)) return status; if (surface->fallback == NULL) { status = _cairo_xcb_surface_cairo_paint (surface, op, source, clip); if (status != CAIRO_INT_STATUS_UNSUPPORTED) goto done; status = _cairo_xcb_surface_render_paint (surface, op, source, &composite); if (status != CAIRO_INT_STATUS_UNSUPPORTED) goto done; } status = _cairo_surface_paint (_cairo_xcb_surface_fallback (surface, &composite), op, source, clip); done: _cairo_composite_rectangles_fini (&composite); return status; }