From e05097c604c607d27b341cd33426001bd2d1f690 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 27 May 2009 16:45:20 +0100 Subject: [PATCH] [surface] Assign a unique id to the surface. Allocate an ever-increasing, non-zero, unique identifier to each surface. True for the first 4-billion... --- src/cairo-pattern.c | 11 ++++++++--- src/cairo-surface-private.h | 2 ++ src/cairo-surface.c | 25 +++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/cairo-pattern.c b/src/cairo-pattern.c index 654989f88..cf41a8758 100644 --- a/src/cairo-pattern.c +++ b/src/cairo-pattern.c @@ -2424,7 +2424,10 @@ static unsigned long _cairo_surface_pattern_hash (unsigned long hash, const cairo_pattern_t *pattern) { - /* XXX requires cow-snapshots */ + const cairo_surface_pattern_t *surface = (cairo_surface_pattern_t *) pattern; + + hash ^= surface->surface->unique_id; + return hash; } @@ -2578,8 +2581,10 @@ static cairo_bool_t _cairo_surface_pattern_equal (const cairo_pattern_t *A, const cairo_pattern_t *B) { - /* XXX requires cow-snapshots */ - return FALSE; + const cairo_surface_pattern_t *a = (cairo_surface_pattern_t *) A; + const cairo_surface_pattern_t *b = (cairo_surface_pattern_t *) B; + + return a->surface->unique_id == b->surface->unique_id; } cairo_bool_t diff --git a/src/cairo-surface-private.h b/src/cairo-surface-private.h index 12b38f015..b07f7806d 100644 --- a/src/cairo-surface-private.h +++ b/src/cairo-surface-private.h @@ -56,6 +56,8 @@ struct _cairo_surface { cairo_reference_count_t ref_count; cairo_status_t status; cairo_bool_t finished; + unsigned int unique_id; + cairo_user_data_array_t user_data; cairo_user_data_array_t mime_data; diff --git a/src/cairo-surface.c b/src/cairo-surface.c index d42e1ef96..d21ebf247 100644 --- a/src/cairo-surface.c +++ b/src/cairo-surface.c @@ -50,6 +50,7 @@ const cairo_surface_t name = { \ CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ \ status, /* status */ \ FALSE, /* finished */ \ + 0, /* unique id */ \ { 0, 0, 0, NULL, }, /* user_data */ \ { 0, 0, 0, NULL, }, /* mime_data */ \ { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }, /* device_transform */ \ @@ -180,6 +181,29 @@ cairo_surface_status (cairo_surface_t *surface) } slim_hidden_def (cairo_surface_status); +static unsigned long +_cairo_surface_allocate_unique_id (void) +{ + static unsigned int unique_id; + +#if CAIRO_NO_MUTEX + if (++unique_id == 0) + unique_id = 1; + return unique_id; +#else + unsigned int old, id; + + do { + old = _cairo_atomic_int_get (&unique_id); + id = old + 1; + if (id == 0) + id = 1; + } while (! _cairo_atomic_int_cmpxchg (&unique_id, old, id)); + + return id; +#endif +} + void _cairo_surface_init (cairo_surface_t *surface, const cairo_surface_backend_t *backend, @@ -194,6 +218,7 @@ _cairo_surface_init (cairo_surface_t *surface, CAIRO_REFERENCE_COUNT_INIT (&surface->ref_count, 1); surface->status = CAIRO_STATUS_SUCCESS; surface->finished = FALSE; + surface->unique_id = _cairo_surface_allocate_unique_id (); _cairo_user_data_array_init (&surface->user_data); _cairo_user_data_array_init (&surface->mime_data);