summaryrefslogtreecommitdiff
path: root/src/cairo-recording-surface.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-02-24 13:45:44 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-02-24 13:51:25 +0000
commitb2cb9ec31ea580164a3d5a267bff334a0c6b4dc5 (patch)
tree9303565bac9c2ddab4ffa52859b6e994c172b8c5 /src/cairo-recording-surface.c
parent8028f04a919d1e6afe95c21cd16172c367f05392 (diff)
downloadcairo-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.c21
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,