summaryrefslogtreecommitdiff
path: root/src/cairo-array.c
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2005-12-07 12:19:10 +0000
committerCarl Worth <cworth@cworth.org>2005-12-07 12:19:10 +0000
commit964c56e72bf5d4b1911b59070413e3424b88b6f4 (patch)
treed7b8f8cd943a049e02b83469deb88b46a641421f /src/cairo-array.c
parent96be55124f3abcb03ed3a901bc4f099185ab8864 (diff)
downloadcairo-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.c36
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;