surface: Check pattern for error status.

Ensure that the error status from patterns is propagated when used by
doing so in the surface layer. Similarly check that a surface pattern
has not been finished.
This commit is contained in:
Chris Wilson 2010-03-22 10:37:18 +00:00
parent 213093f437
commit 844d8ea57d

View file

@ -1885,6 +1885,27 @@ _cairo_surface_fill_rectangles (cairo_surface_t *surface,
rects, num_rects));
}
static cairo_status_t
_pattern_has_error (const cairo_pattern_t *pattern)
{
const cairo_surface_pattern_t *spattern;
if (unlikely (pattern->status))
return pattern->status;
if (pattern->type != CAIRO_PATTERN_TYPE_SURFACE)
return CAIRO_STATUS_SUCCESS;
spattern = (const cairo_surface_pattern_t *) pattern;
if (unlikely (spattern->surface->status))
return spattern->surface->status;
if (unlikely (spattern->surface->finished))
return _cairo_error (CAIRO_STATUS_SURFACE_FINISHED);
return CAIRO_STATUS_SUCCESS;
}
cairo_status_t
_cairo_surface_paint (cairo_surface_t *surface,
cairo_operator_t op,
@ -1902,6 +1923,10 @@ _cairo_surface_paint (cairo_surface_t *surface,
if (op == CAIRO_OPERATOR_CLEAR && surface->is_clear)
return CAIRO_STATUS_SUCCESS;
status = _pattern_has_error (source);
if (unlikely (status))
return status;
_cairo_surface_begin_modification (surface);
if (surface->backend->paint != NULL) {
@ -1943,6 +1968,14 @@ _cairo_surface_mask (cairo_surface_t *surface,
return CAIRO_STATUS_SUCCESS;
}
status = _pattern_has_error (source);
if (unlikely (status))
return status;
status = _pattern_has_error (mask);
if (unlikely (status))
return status;
_cairo_surface_begin_modification (surface);
if (surface->backend->mask != NULL) {
@ -1991,6 +2024,14 @@ _cairo_surface_fill_stroke (cairo_surface_t *surface,
return CAIRO_STATUS_SUCCESS;
}
status = _pattern_has_error (fill_source);
if (unlikely (status))
return status;
status = _pattern_has_error (stroke_source);
if (unlikely (status))
return status;
_cairo_surface_begin_modification (surface);
if (surface->backend->fill_stroke) {
@ -2053,6 +2094,10 @@ _cairo_surface_stroke (cairo_surface_t *surface,
if (op == CAIRO_OPERATOR_CLEAR && surface->is_clear)
return CAIRO_STATUS_SUCCESS;
status = _pattern_has_error (source);
if (unlikely (status))
return status;
_cairo_surface_begin_modification (surface);
if (surface->backend->stroke != NULL) {
@ -2099,6 +2144,10 @@ _cairo_surface_fill (cairo_surface_t *surface,
if (op == CAIRO_OPERATOR_CLEAR && surface->is_clear)
return CAIRO_STATUS_SUCCESS;
status = _pattern_has_error (source);
if (unlikely (status))
return status;
_cairo_surface_begin_modification (surface);
if (surface->backend->fill != NULL) {
@ -2323,11 +2372,9 @@ cairo_bool_t
_cairo_surface_get_extents (cairo_surface_t *surface,
cairo_rectangle_int_t *extents)
{
cairo_bool_t bounded = FALSE;
if (unlikely (surface->status || surface->finished))
return TRUE;
cairo_bool_t bounded;
bounded = FALSE;
if (surface->backend->get_extents != NULL)
bounded = surface->backend->get_extents (surface, extents);
@ -2423,6 +2470,10 @@ _cairo_surface_show_text_glyphs (cairo_surface_t *surface,
if (op == CAIRO_OPERATOR_CLEAR && surface->is_clear)
return CAIRO_STATUS_SUCCESS;
status = _pattern_has_error (source);
if (unlikely (status))
return status;
_cairo_surface_begin_modification (surface);
if (_cairo_surface_has_device_transform (surface) &&