mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-05 23:58:25 +02:00
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:
parent
213093f437
commit
844d8ea57d
1 changed files with 55 additions and 4 deletions
|
|
@ -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) &&
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue