diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-07-10 10:43:40 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-07-10 11:16:19 +0100 |
commit | eb85ab998b606144daf025285968a5d6031b9aa6 (patch) | |
tree | 1f0e7beb65ee2947143665e32fe6b91cb3098742 | |
parent | 59c83117d77f58e9cb64aaa6b572fab62fb31c6b (diff) | |
download | cairo-eb85ab998b606144daf025285968a5d6031b9aa6.tar.gz |
subsurface: Don't assume we ever own the target.
Andrea pointed out that snapshots can be shared, and so the subsurface
should not be calling finish even on a snapshot.
-rw-r--r-- | src/cairo-surface-subsurface-private.h | 1 | ||||
-rw-r--r-- | src/cairo-surface-subsurface.c | 17 |
2 files changed, 8 insertions, 10 deletions
diff --git a/src/cairo-surface-subsurface-private.h b/src/cairo-surface-subsurface-private.h index 6410abdef..435e1eb83 100644 --- a/src/cairo-surface-subsurface-private.h +++ b/src/cairo-surface-subsurface-private.h @@ -44,7 +44,6 @@ struct _cairo_surface_subsurface { cairo_rectangle_int_t extents; cairo_surface_t *target; - cairo_bool_t owns_target; }; #endif /* CAIRO_SURFACE_SUBSURFACE_PRIVATE_H */ diff --git a/src/cairo-surface-subsurface.c b/src/cairo-surface-subsurface.c index 01ea7e2cf..3cbb51608 100644 --- a/src/cairo-surface-subsurface.c +++ b/src/cairo-surface-subsurface.c @@ -46,16 +46,10 @@ static cairo_status_t _cairo_surface_subsurface_finish (void *abstract_surface) { cairo_surface_subsurface_t *surface = abstract_surface; - cairo_status_t status = CAIRO_STATUS_SUCCESS; - - if (surface->owns_target) { - cairo_surface_finish (surface->target); - status = surface->target->status; - } cairo_surface_destroy (surface->target); - return status; + return CAIRO_STATUS_SUCCESS; } static cairo_surface_t * @@ -419,7 +413,13 @@ _cairo_surface_subsurface_snapshot (void *abstract_surface) NULL, /* device */ surface->target->content); snapshot->target = _cairo_surface_snapshot (surface->target); - snapshot->owns_target = TRUE; + if (unlikely (snapshot->target->status)) { + cairo_status_t status; + + status = snapshot->target->status; + free (snapshot); + return _cairo_surface_create_in_error (status); + } snapshot->base.type = snapshot->target->type; snapshot->extents = surface->extents; @@ -532,7 +532,6 @@ cairo_surface_create_for_rectangle (cairo_surface_t *target, } surface->target = cairo_surface_reference (target); - surface->owns_target = FALSE; return &surface->base; } |