예제 #1
0
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;
}
예제 #2
0
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;
}