static cairo_int_status_t _cairo_xcb_surface_stroke (void *abstract_surface, cairo_operator_t op, const cairo_pattern_t *source, const cairo_path_fixed_t *path, const cairo_stroke_style_t *style, const cairo_matrix_t *ctm, const cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias, 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_stroke (&composite, &surface->base, op, source, path, style, ctm, clip); if (unlikely (status)) return status; if (surface->fallback == NULL) { status = _cairo_xcb_surface_cairo_stroke (surface, op, source, path, style, ctm, ctm_inverse, tolerance, antialias, clip); if (status != CAIRO_INT_STATUS_UNSUPPORTED) goto done; status = _cairo_xcb_surface_render_stroke (surface, op, source, path, style, ctm, ctm_inverse, tolerance, antialias, &composite); if (status != CAIRO_INT_STATUS_UNSUPPORTED) goto done; } status = _cairo_surface_stroke (_cairo_xcb_surface_fallback (surface, &composite), op, source, path, style, ctm, ctm_inverse, tolerance, antialias, clip); done: _cairo_composite_rectangles_fini (&composite); return status; }
cairo_int_status_t _cairo_compositor_stroke (const cairo_compositor_t *compositor, cairo_surface_t *surface, cairo_operator_t op, const cairo_pattern_t *source, const cairo_path_fixed_t *path, const cairo_stroke_style_t *style, const cairo_matrix_t *ctm, const cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias, const cairo_clip_t *clip) { cairo_composite_rectangles_t extents; cairo_int_status_t status; TRACE ((stderr, "%s\n", __FUNCTION__)); if (_cairo_pen_vertices_needed (tolerance, style->line_width/2, ctm) <= 1) return CAIRO_INT_STATUS_NOTHING_TO_DO; status = _cairo_composite_rectangles_init_for_stroke (&extents, surface, op, source, path, style, ctm, clip); if (unlikely (status)) return status; do { while (compositor->stroke == XNULL) compositor = compositor->delegate; status = compositor->stroke (compositor, &extents, path, style, ctm, ctm_inverse, tolerance, antialias); 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; }