summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-05-26 15:20:56 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-05-26 15:21:23 +0100
commit11e276753f0d335027a7727bf17006d612b4e4c2 (patch)
tree25520305995cecdf162284a0228cf5a0125847e0
parentfc33cc3c3af1fc616ae445a15d2b146a29090b0f (diff)
image: Propagate errors from clone_subimage
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/cairo-image-surface.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/src/cairo-image-surface.c b/src/cairo-image-surface.c
index 13e1d038..33170cd3 100644
--- a/src/cairo-image-surface.c
+++ b/src/cairo-image-surface.c
@@ -1214,12 +1214,15 @@ _cairo_image_surface_clone_subimage (cairo_surface_t *surface,
{
cairo_surface_t *image;
cairo_surface_pattern_t pattern;
- cairo_status_t ignored;
+ cairo_status_t status;
image = cairo_surface_create_similar_image (surface,
_cairo_format_from_content (surface->content),
extents->width,
extents->height);
+ if (image->status)
+ return to_image_surface (image);
+
/* TODO: check me with non-identity device_transform. Should we
* clone the scaling, too? */
cairo_surface_set_device_offset (image,
@@ -1229,16 +1232,25 @@ _cairo_image_surface_clone_subimage (cairo_surface_t *surface,
_cairo_pattern_init_for_surface (&pattern, surface);
pattern.base.filter = CAIRO_FILTER_NEAREST;
- ignored = _cairo_surface_paint (image,
- CAIRO_OPERATOR_SOURCE,
- &pattern.base,
- NULL);
+ status = _cairo_surface_paint (image,
+ CAIRO_OPERATOR_SOURCE,
+ &pattern.base,
+ NULL);
_cairo_pattern_fini (&pattern.base);
- cairo_surface_set_user_data (image, &clone_key, surface, NULL);
+ if (unlikely (status))
+ goto error;
+
+ status = cairo_surface_set_user_data (image, &clone_key, surface, NULL);
+ if (unlikely (status))
+ goto error;
+
+ return to_image_surface (image);
- return (cairo_image_surface_t *) image;
+error:
+ cairo_surface_destroy (image);
+ return to_image_surface (_cairo_surface_create_in_error (status));
}
cairo_bool_t