diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-07-24 15:10:18 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-07-24 15:10:18 +0100 |
commit | 87e9c8a5ea84bd00311a6a6ea3cea1fd87823172 (patch) | |
tree | 6d2223f3a90c7943e28572f619a6ef02eb73a58a /src/cairo-surface-wrapper.c | |
parent | 59612847e31ac6f22f7a59c57ff39c179aab9bca (diff) | |
download | cairo-87e9c8a5ea84bd00311a6a6ea3cea1fd87823172.tar.gz |
recording: Move the glyph allocation into the wrapper after checking clip status
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-surface-wrapper.c')
-rw-r--r-- | src/cairo-surface-wrapper.c | 88 |
1 files changed, 59 insertions, 29 deletions
diff --git a/src/cairo-surface-wrapper.c b/src/cairo-surface-wrapper.c index 5684a14e7..b21f445b6 100644 --- a/src/cairo-surface-wrapper.c +++ b/src/cairo-surface-wrapper.c @@ -134,7 +134,9 @@ _cairo_surface_wrapper_paint (cairo_surface_wrapper_t *wrapper, if (wrapper->clip) dev_clip = _cairo_clip_copy_intersect_clip (dev_clip, wrapper->clip); - status = _cairo_surface_paint (wrapper->target, op, source, dev_clip); + status = CAIRO_INT_STATUS_NOTHING_TO_DO; + if (! _cairo_clip_is_all_clipped (dev_clip)) + status = _cairo_surface_paint (wrapper->target, op, source, dev_clip); FINISH: _cairo_clip_destroy (target_clip); @@ -189,7 +191,9 @@ _cairo_surface_wrapper_mask (cairo_surface_wrapper_t *wrapper, if (wrapper->clip) dev_clip = _cairo_clip_copy_intersect_clip (dev_clip, wrapper->clip); - status = _cairo_surface_mask (wrapper->target, op, source, mask, dev_clip); + status = CAIRO_INT_STATUS_NOTHING_TO_DO; + if (! _cairo_clip_is_all_clipped (dev_clip)) + status = _cairo_surface_mask (wrapper->target, op, source, mask, dev_clip); FINISH: _cairo_clip_destroy (target_clip); @@ -260,11 +264,14 @@ _cairo_surface_wrapper_stroke (cairo_surface_wrapper_t *wrapper, if (wrapper->clip) dev_clip = _cairo_clip_copy_intersect_clip (dev_clip, wrapper->clip); - status = _cairo_surface_stroke (wrapper->target, op, source, - dev_path, stroke_style, - &dev_ctm, &dev_ctm_inverse, - tolerance, antialias, - dev_clip); + status = CAIRO_INT_STATUS_NOTHING_TO_DO; + if (! _cairo_clip_is_all_clipped (dev_clip)) { + status = _cairo_surface_stroke (wrapper->target, op, source, + dev_path, stroke_style, + &dev_ctm, &dev_ctm_inverse, + tolerance, antialias, + dev_clip); + } FINISH: if (dev_path != path) @@ -346,15 +353,18 @@ _cairo_surface_wrapper_fill_stroke (cairo_surface_wrapper_t *wrapper, if (wrapper->clip) dev_clip = _cairo_clip_copy_intersect_clip (dev_clip, wrapper->clip); - status = _cairo_surface_fill_stroke (wrapper->target, - fill_op, fill_source, fill_rule, - fill_tolerance, fill_antialias, - dev_path, - stroke_op, stroke_source, - stroke_style, - &dev_ctm, &dev_ctm_inverse, - stroke_tolerance, stroke_antialias, - dev_clip); + status = CAIRO_INT_STATUS_NOTHING_TO_DO; + if (! _cairo_clip_is_all_clipped (dev_clip)) { + status = _cairo_surface_fill_stroke (wrapper->target, + fill_op, fill_source, fill_rule, + fill_tolerance, fill_antialias, + dev_path, + stroke_op, stroke_source, + stroke_style, + &dev_ctm, &dev_ctm_inverse, + stroke_tolerance, stroke_antialias, + dev_clip); + } FINISH: if (dev_path != path) @@ -419,10 +429,13 @@ _cairo_surface_wrapper_fill (cairo_surface_wrapper_t *wrapper, if (wrapper->clip) dev_clip = _cairo_clip_copy_intersect_clip (dev_clip, wrapper->clip); - status = _cairo_surface_fill (wrapper->target, op, source, - dev_path, fill_rule, - tolerance, antialias, - dev_clip); + status = CAIRO_INT_STATUS_NOTHING_TO_DO; + if (! _cairo_clip_is_all_clipped (dev_clip)) { + status = _cairo_surface_fill (wrapper->target, op, source, + dev_path, fill_rule, + tolerance, antialias, + dev_clip); + } FINISH: if (dev_path != path) @@ -467,17 +480,26 @@ _cairo_surface_wrapper_show_text_glyphs (cairo_surface_wrapper_t *wrapper, goto FINISH; } + if (wrapper->extents.x | wrapper->extents.y) { + /* XXX */ + dev_clip = _cairo_clip_copy_with_translation (dev_clip, + wrapper->extents.x, + wrapper->extents.y); + + } + + if (wrapper->clip) + dev_clip = _cairo_clip_copy_intersect_clip (dev_clip, wrapper->clip); + + if (_cairo_clip_is_all_clipped (dev_clip)) + return CAIRO_INT_STATUS_NOTHING_TO_DO; + if (wrapper->needs_transform) { cairo_matrix_t m; int i; _cairo_surface_wrapper_get_transform (wrapper, &m); - /* XXX */ - dev_clip = _cairo_clip_copy_with_translation (dev_clip, - wrapper->extents.x, - wrapper->extents.y); - dev_glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); if (dev_glyphs == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); @@ -494,10 +516,19 @@ _cairo_surface_wrapper_show_text_glyphs (cairo_surface_wrapper_t *wrapper, _copy_transformed_pattern (&source_copy.base, source, &m); source = &source_copy.base; - } + } else { + /* show_text_glyphs is special because _cairo_surface_show_text_glyphs is allowed + * to modify the glyph array that's passed in. We must always + * copy the array before handing it to the backend. + */ + dev_glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); + if (unlikely (dev_glyphs == NULL)) { + status = _cairo_error (CAIRO_STATUS_NO_MEMORY); + goto FINISH; + } - if (wrapper->clip) - dev_clip = _cairo_clip_copy_intersect_clip (dev_clip, wrapper->clip); + memcpy (dev_glyphs, glyphs, sizeof (cairo_glyph_t) * num_glyphs); + } status = _cairo_surface_show_text_glyphs (wrapper->target, op, source, utf8, utf8_len, @@ -506,7 +537,6 @@ _cairo_surface_wrapper_show_text_glyphs (cairo_surface_wrapper_t *wrapper, cluster_flags, scaled_font, dev_clip); - FINISH: if (dev_clip != clip) _cairo_clip_destroy (dev_clip); |