diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-02-24 13:45:44 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-02-24 13:51:25 +0000 |
commit | b2cb9ec31ea580164a3d5a267bff334a0c6b4dc5 (patch) | |
tree | 9303565bac9c2ddab4ffa52859b6e994c172b8c5 /src/cairo-recording-surface.c | |
parent | 8028f04a919d1e6afe95c21cd16172c367f05392 (diff) | |
download | cairo-b2cb9ec31ea580164a3d5a267bff334a0c6b4dc5.tar.gz |
recording: Optimize a copy of one recording surface onto another
Rather than store a command to copy from a reference of another recording
surface onto this, just replay the other recording surface.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-recording-surface.c')
-rw-r--r-- | src/cairo-recording-surface.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/cairo-recording-surface.c b/src/cairo-recording-surface.c index 2e83a9c32..601eb0fd9 100644 --- a/src/cairo-recording-surface.c +++ b/src/cairo-recording-surface.c @@ -677,6 +677,21 @@ _cairo_recording_surface_reset (cairo_recording_surface_t *surface) _cairo_array_init (&surface->commands, sizeof (cairo_command_t *)); } +static cairo_bool_t +is_identity_recording_pattern (const cairo_pattern_t *pattern) +{ + cairo_surface_t *surface; + + if (pattern->type != CAIRO_PATTERN_TYPE_SURFACE) + return FALSE; + + if (!_cairo_matrix_is_identity(&pattern->matrix)) + return FALSE; + + surface = ((cairo_surface_pattern_t *)pattern)->surface; + return surface->backend->type == CAIRO_SURFACE_TYPE_RECORDING; +} + static cairo_int_status_t _cairo_recording_surface_paint (void *abstract_surface, cairo_operator_t op, @@ -698,12 +713,16 @@ _cairo_recording_surface_paint (void *abstract_surface, } if (clip == NULL && surface->optimize_clears && - source->type == CAIRO_PATTERN_TYPE_SOLID && (op == CAIRO_OPERATOR_SOURCE || (op == CAIRO_OPERATOR_OVER && (surface->base.is_clear || _cairo_pattern_is_opaque_solid (source))))) { _cairo_recording_surface_reset (surface); + if (is_identity_recording_pattern (source)) { + cairo_surface_t *src = ((cairo_surface_pattern_t *)source)->surface; + _cairo_recording_surface_reset (surface); + return _cairo_recording_surface_replay (src, &surface->base); + } } status = _cairo_composite_rectangles_init_for_paint (&composite, |