diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-08-20 12:48:25 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-08-20 12:48:25 +0100 |
commit | cb243acee59be4802153d7e18ef25d24815bb2e4 (patch) | |
tree | 78890913affca5de58536485c5434366cef93cdf /src | |
parent | 236cb8aa22f780b24e1d1485dc1f5384946fe181 (diff) |
recording: optionally disable optimise away clears
The observer wants to get an accurate recording of all operations,
including clears.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src')
-rw-r--r-- | src/cairo-composite-rectangles.c | 2 | ||||
-rw-r--r-- | src/cairo-recording-surface-private.h | 1 | ||||
-rw-r--r-- | src/cairo-recording-surface.c | 12 | ||||
-rw-r--r-- | src/cairo-surface-observer.c | 25 |
4 files changed, 28 insertions, 12 deletions
diff --git a/src/cairo-composite-rectangles.c b/src/cairo-composite-rectangles.c index 6083973f..a25e6d34 100644 --- a/src/cairo-composite-rectangles.c +++ b/src/cairo-composite-rectangles.c @@ -224,9 +224,7 @@ _cairo_composite_rectangles_init_for_glyphs (cairo_composite_rectangles_t *exten if (! _cairo_composite_rectangles_init (extents, unbounded, op, source, clip)) - { return CAIRO_INT_STATUS_NOTHING_TO_DO; - } /* Computing the exact bbox and the overlap is expensive. * First perform a cheap test to see if the glyphs are all clipped out. diff --git a/src/cairo-recording-surface-private.h b/src/cairo-recording-surface-private.h index b7843e6c..ea38c198 100644 --- a/src/cairo-recording-surface-private.h +++ b/src/cairo-recording-surface-private.h @@ -134,6 +134,7 @@ typedef struct _cairo_recording_surface { cairo_array_t commands; int *indices; int num_indices; + cairo_bool_t optimize_clears; struct bbtree { cairo_box_t extents; diff --git a/src/cairo-recording-surface.c b/src/cairo-recording-surface.c index beafb785..6d4cb379 100644 --- a/src/cairo-recording-surface.c +++ b/src/cairo-recording-surface.c @@ -413,6 +413,7 @@ cairo_recording_surface_create (cairo_content_t content, surface->indices = NULL; surface->num_indices = 0; + surface->optimize_clears = TRUE; return &surface->base; } @@ -714,13 +715,12 @@ _cairo_recording_surface_paint (void *abstract_surface, cairo_composite_rectangles_t composite; const cairo_rectangle_int_t *extents; - /* An optimisation that takes care to not replay what was done - * before surface is cleared. We don't erase recorded commands - * since we may have earlier snapshots of this surface. */ if (op == CAIRO_OPERATOR_CLEAR && clip == NULL) { - _cairo_recording_surface_destroy_bbtree (surface); - surface->commands.num_elements = 0; - return CAIRO_STATUS_SUCCESS; + if (surface->optimize_clears) { + _cairo_recording_surface_destroy_bbtree (surface); + surface->commands.num_elements = 0; + return CAIRO_STATUS_SUCCESS; + } } extents = _cairo_recording_surface_extents (surface); diff --git a/src/cairo-surface-observer.c b/src/cairo-surface-observer.c index abb00e7e..370b05b9 100644 --- a/src/cairo-surface-observer.c +++ b/src/cairo-surface-observer.c @@ -113,7 +113,7 @@ static void init_glyphs (struct glyphs *g) init_clip (&g->clip); } -static void +static cairo_status_t log_init (cairo_observation_t *log) { memset (log, 0, sizeof(*log)); @@ -125,8 +125,15 @@ log_init (cairo_observation_t *log) init_glyphs (&log->glyphs); _cairo_array_init (&log->timings, sizeof (cairo_observation_record_t)); + log->record = (cairo_recording_surface_t *) cairo_recording_surface_create (CAIRO_CONTENT_COLOR_ALPHA, NULL); + if (unlikely (log->record->base.status)) + return log->record->base.status; + + log->record->optimize_clears = FALSE; + + return CAIRO_STATUS_SUCCESS; } static void @@ -323,15 +330,20 @@ static cairo_device_t * _cairo_device_create_observer_internal (cairo_device_t *target) { cairo_device_observer_t *device; + cairo_status_t status; device = malloc (sizeof (cairo_device_observer_t)); if (unlikely (device == NULL)) return _cairo_device_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); _cairo_device_init (&device->base, &_cairo_device_observer_backend); - device->target = cairo_device_reference (target); + status = log_init (&device->log); + if (unlikely (status)) { + free (device); + return _cairo_device_create_in_error (status); + } - log_init (&device->log); + device->target = cairo_device_reference (target); return &device->base; } @@ -349,6 +361,7 @@ _cairo_surface_create_observer_internal (cairo_device_t *device, cairo_surface_t *target) { cairo_surface_observer_t *surface; + cairo_status_t status; surface = malloc (sizeof (cairo_surface_observer_t)); if (unlikely (surface == NULL)) @@ -358,7 +371,11 @@ _cairo_surface_create_observer_internal (cairo_device_t *device, &_cairo_surface_observer_backend, device, target->content); - log_init (&surface->log); + status = log_init (&surface->log); + if (unlikely (status)) { + free (surface); + return _cairo_surface_create_in_error (status); + } surface->target = cairo_surface_reference (target); surface->base.type = surface->target->type; |