Ejemplo n.º 1
0
static cairo_int_status_t
_cairo_xcb_surface_fill (void			*abstract_surface,
			 cairo_operator_t	 op,
			 const cairo_pattern_t	*source,
			 const cairo_path_fixed_t*path,
			 cairo_fill_rule_t	 fill_rule,
			 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_fill (&composite,
							&surface->base,
							op, source, path,
							clip);
    if (unlikely (status))
	return status;

    if (surface->fallback == NULL) {
	status = _cairo_xcb_surface_cairo_fill (surface, op, source,
						path, fill_rule,
						tolerance, antialias,
						clip);
	if (status != CAIRO_INT_STATUS_UNSUPPORTED)
	    goto done;

	status = _cairo_xcb_surface_render_fill (surface, op, source,
						 path, fill_rule,
						 tolerance, antialias,
						 &composite);
	if (status != CAIRO_INT_STATUS_UNSUPPORTED)
	    goto done;
    }

    status = _cairo_surface_fill (_cairo_xcb_surface_fallback (surface,
							       &composite),
				  op, source,
				  path, fill_rule,
				  tolerance, antialias,
				  clip);
done:
    _cairo_composite_rectangles_fini (&composite);
    return status;
}
Ejemplo n.º 2
0
cairo_int_status_t
_cairo_compositor_fill (const cairo_compositor_t	*compositor,
            cairo_surface_t			*surface,
            cairo_operator_t		 op,
            const cairo_pattern_t		*source,
            const cairo_path_fixed_t	*path,
            cairo_fill_rule_t		 fill_rule,
            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__));
    status = _cairo_composite_rectangles_init_for_fill (&extents, surface,
                            op, source, path,
                            clip);
    if (unlikely (status))
    return status;

    do {
    while (compositor->fill == XNULL)
        compositor = compositor->delegate;

    status = compositor->fill (compositor, &extents,
                   path, fill_rule, 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;
}