diff options
author | Carl Worth <cworth@cworth.org> | 2005-12-07 12:19:10 +0000 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2005-12-07 12:19:10 +0000 |
commit | 964c56e72bf5d4b1911b59070413e3424b88b6f4 (patch) | |
tree | d7b8f8cd943a049e02b83469deb88b46a641421f /src/cairo-array.c | |
parent | 96be55124f3abcb03ed3a901bc4f099185ab8864 (diff) | |
download | cairo-964c56e72bf5d4b1911b59070413e3424b88b6f4.tar.gz |
Note that self-copy now works with the PS backend.
Add _cairo_array_init_snapshot and checks for is_snapshot throughout.
Add a new surface->backend->snapshot function.
Implement _cairo_meta_surface_snapshot and _cairo_meta_surface_acquire/release_source_image. Change _cairo_meta_surface_create to require the width and height in pixels to be used when replaying for purposed of _cairo_meta_surface_aquire_source_image.
Track change in prototype of _cairo_meta_surface_create. Implement _cairo_ps_surface_snapshot by deferring down into _cairo_meta_surface_snapshot.
Diffstat (limited to 'src/cairo-array.c')
-rw-r--r-- | src/cairo-array.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/cairo-array.c b/src/cairo-array.c index dac460f52..7153c7c58 100644 --- a/src/cairo-array.c +++ b/src/cairo-array.c @@ -58,6 +58,29 @@ _cairo_array_init (cairo_array_t *array, int element_size) array->num_elements = 0; array->element_size = element_size; array->elements = NULL; + + array->is_snapshot = FALSE; +} + +/** + * _cairo_array_init_snapshot: + * @array: A #cairo_array_t to be initialized as a snapshot + * @other: The #cairo_array_t from which to create the snapshot + * + * Initialize @array as an immutable copy of @other. It is an error to + * call an array-modifying function (other than _cairo_array_fini) on + * @array after calling this function. + **/ +void +_cairo_array_init_snapshot (cairo_array_t *array, + const cairo_array_t *other) +{ + array->size = other->size; + array->num_elements = other->num_elements; + array->element_size = other->element_size; + array->elements = other->elements; + + array->is_snapshot = TRUE; } /** @@ -70,6 +93,9 @@ _cairo_array_init (cairo_array_t *array, int element_size) void _cairo_array_fini (cairo_array_t *array) { + if (array->is_snapshot) + return; + free (array->elements); } @@ -88,6 +114,8 @@ _cairo_array_grow_by (cairo_array_t *array, int additional) int required_size = array->num_elements + additional; int new_size; + assert (! array->is_snapshot); + if (required_size <= old_size) return CAIRO_STATUS_SUCCESS; @@ -123,6 +151,8 @@ _cairo_array_grow_by (cairo_array_t *array, int additional) void _cairo_array_truncate (cairo_array_t *array, int num_elements) { + assert (! array->is_snapshot); + if (num_elements < array->num_elements) array->num_elements = num_elements; } @@ -184,6 +214,8 @@ cairo_status_t _cairo_array_append (cairo_array_t *array, const void *element) { + assert (! array->is_snapshot); + return _cairo_array_append_multiple (array, element, 1); } @@ -206,6 +238,8 @@ _cairo_array_append_multiple (cairo_array_t *array, cairo_status_t status; void *dest; + assert (! array->is_snapshot); + status = _cairo_array_allocate (array, num_elements, &dest); if (status) return status; @@ -234,6 +268,8 @@ _cairo_array_allocate (cairo_array_t *array, { cairo_status_t status; + assert (! array->is_snapshot); + status = _cairo_array_grow_by (array, num_elements); if (status) return status; |