Пример #1
0
cairo_int_status_t
_cairo_composite_rectangles_lazy_init_for_fill (cairo_composite_rectangles_t *extents,
						cairo_surface_t *surface,
						cairo_operator_t op,
						const cairo_pattern_t *source,
						const cairo_path_fixed_t *path,
						const cairo_clip_t *clip)
{
    cairo_bool_t should_be_lazy = TRUE;
    if (! _cairo_composite_rectangles_init (extents,
					    surface, op, source, clip,
					    &should_be_lazy))
    {
	return CAIRO_INT_STATUS_NOTHING_TO_DO;
    }

    if (! should_be_lazy) {
	_cairo_path_fixed_approximate_fill_extents (path, &extents->mask);

	return _cairo_composite_rectangles_intersect (extents, clip);
    }

    extents->clip = _cairo_clip_copy (clip);
    return CAIRO_INT_STATUS_SUCCESS;
}
Пример #2
0
static cairo_int_status_t
_cairo_analysis_surface_fill (void			*abstract_surface,
			      cairo_operator_t		 op,
			      const cairo_pattern_t	*source,
			      cairo_path_fixed_t	*path,
			      cairo_fill_rule_t		 fill_rule,
			      double			 tolerance,
			      cairo_antialias_t		 antialias,
			      cairo_rectangle_int_t     *fill_extents)
{
    cairo_analysis_surface_t *surface = abstract_surface;
    cairo_status_t	     status, backend_status;
    cairo_rectangle_int_t    extents;
    cairo_bool_t             is_empty;

    if (!surface->target->backend->fill)
	backend_status = CAIRO_INT_STATUS_UNSUPPORTED;
    else
	backend_status = (*surface->target->backend->fill) (surface->target, op,
						    source, path, fill_rule,
							    tolerance, antialias, NULL);

    if (backend_status == CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN)
	backend_status = _analyze_meta_surface_pattern (surface, source);

    status = _cairo_surface_get_extents (&surface->base, &extents);
    if (_cairo_status_is_error (status))
	return status;

    if (_cairo_operator_bounded_by_source (op)) {
	cairo_rectangle_int_t source_extents;

	status = _cairo_pattern_get_extents (source, &source_extents);
	if (unlikely (status))
	    return status;

	is_empty = _cairo_rectangle_intersect (&extents, &source_extents);
    }

    is_empty = _cairo_rectangle_intersect (&extents, &surface->current_clip);

    if (_cairo_operator_bounded_by_mask (op)) {
	cairo_rectangle_int_t mask_extents;

	_cairo_path_fixed_approximate_fill_extents (path,
						    &mask_extents);

	is_empty = _cairo_rectangle_intersect (&extents, &mask_extents);
    }
    if (fill_extents)
	*fill_extents = extents;

    status = _add_operation (surface, &extents, backend_status);

    return status;
}
Пример #3
0
cairo_int_status_t
_cairo_composite_rectangles_init_for_fill (cairo_composite_rectangles_t *extents,
					   cairo_surface_t *surface,
					   cairo_operator_t		 op,
					   const cairo_pattern_t	*source,
					   const cairo_path_fixed_t		*path,
					   const cairo_clip_t		*clip)
{
    if (! _cairo_composite_rectangles_init (extents,
					    surface, op, source, clip))
    {
	return CAIRO_INT_STATUS_NOTHING_TO_DO;
    }

    _cairo_path_fixed_approximate_fill_extents (path, &extents->mask);

    return _cairo_composite_rectangles_intersect (extents, clip);
}
Пример #4
0
void
_cairo_path_fixed_approximate_clip_extents (const cairo_path_fixed_t *path,
        cairo_rectangle_int_t *extents)
{
    _cairo_path_fixed_approximate_fill_extents (path, extents);
}