[cairo] Report true error via pattern from cairo_pop_group()

Report the correct error via the returned pattern->status rather than
simply returning the NO_MEMORY nil object.
This commit is contained in:
Chris Wilson 2009-06-27 22:48:19 +01:00
parent 5c3be3ece2
commit 2b1ec7a4d8
3 changed files with 16 additions and 10 deletions

View file

@ -566,7 +566,7 @@ _cairo_pattern_create_solid (const cairo_color_t *color,
return &pattern->base;
}
static const cairo_pattern_t *
cairo_pattern_t *
_cairo_pattern_create_in_error (cairo_status_t status)
{
cairo_pattern_t *pattern;
@ -686,7 +686,7 @@ cairo_pattern_create_for_surface (cairo_surface_t *surface)
}
if (surface->status)
return (cairo_pattern_t*) _cairo_pattern_create_in_error (surface->status);
return _cairo_pattern_create_in_error (surface->status);
pattern =
_freed_pattern_get (&freed_pattern_pool[CAIRO_PATTERN_TYPE_SURFACE]);

View file

@ -569,11 +569,12 @@ cairo_pattern_t *
cairo_pop_group (cairo_t *cr)
{
cairo_surface_t *group_surface, *parent_target;
cairo_pattern_t *group_pattern = (cairo_pattern_t*) &_cairo_pattern_nil.base;
cairo_pattern_t *group_pattern;
cairo_matrix_t group_matrix;
cairo_status_t status;
if (unlikely (cr->status))
return group_pattern;
return _cairo_pattern_create_in_error (cr->status);
/* Grab the active surfaces */
group_surface = _cairo_gstate_get_target (cr->gstate);
@ -582,7 +583,7 @@ cairo_pop_group (cairo_t *cr)
/* Verify that we are at the right nesting level */
if (parent_target == NULL) {
_cairo_set_error (cr, CAIRO_STATUS_INVALID_POP_GROUP);
return group_pattern;
return _cairo_pattern_create_in_error (CAIRO_STATUS_INVALID_POP_GROUP);
}
/* We need to save group_surface before we restore; we don't need
@ -592,12 +593,15 @@ cairo_pop_group (cairo_t *cr)
cairo_restore (cr);
if (unlikely (cr->status))
if (unlikely (cr->status)) {
group_pattern = _cairo_pattern_create_in_error (cr->status);
goto done;
}
group_pattern = cairo_pattern_create_for_surface (group_surface);
if (cairo_pattern_status (group_pattern)) {
_cairo_set_error (cr, cairo_pattern_status (group_pattern));
status = group_pattern->status;
if (unlikely (status)) {
_cairo_set_error (cr, status);
goto done;
}
@ -894,7 +898,7 @@ cairo_pattern_t *
cairo_get_source (cairo_t *cr)
{
if (unlikely (cr->status))
return (cairo_pattern_t*) &_cairo_pattern_nil.base;
return _cairo_pattern_create_in_error (cr->status);
return _cairo_gstate_get_source (cr->gstate);
}

View file

@ -916,7 +916,6 @@ struct _cairo_solid_pattern {
cairo_content_t content;
};
extern const cairo_private cairo_solid_pattern_t _cairo_pattern_nil;
extern const cairo_private cairo_solid_pattern_t _cairo_pattern_black;
typedef struct _cairo_surface_pattern {
@ -2468,6 +2467,9 @@ _cairo_slope_compare (const cairo_slope_t *a,
/* cairo-pattern.c */
cairo_private cairo_pattern_t *
_cairo_pattern_create_in_error (cairo_status_t status);
cairo_private cairo_status_t
_cairo_pattern_create_copy (cairo_pattern_t **pattern,
const cairo_pattern_t *other);