diff options
Diffstat (limited to 'src/cairo-spans-compositor.c')
-rw-r--r--[-rwxr-xr-x] | src/cairo-spans-compositor.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/src/cairo-spans-compositor.c b/src/cairo-spans-compositor.c index 8580da383..ef213b491 100755..100644 --- a/src/cairo-spans-compositor.c +++ b/src/cairo-spans-compositor.c @@ -95,11 +95,11 @@ get_clip_surface (const cairo_spans_compositor_t *compositor, assert (clip->path); - surface = _cairo_surface_create_similar_solid (dst, - CAIRO_CONTENT_ALPHA, - extents->width, - extents->height, - CAIRO_COLOR_TRANSPARENT); + surface = _cairo_surface_create_scratch (dst, + CAIRO_CONTENT_ALPHA, + extents->width, + extents->height, + CAIRO_COLOR_TRANSPARENT); _cairo_box_from_rectangle (&box, extents); _cairo_polygon_init (&polygon, &box, 1); @@ -588,20 +588,34 @@ composite_aligned_boxes (const cairo_spans_compositor_t *compositor, { cairo_clip_t *recording_clip; const cairo_pattern_t *source = &extents->source_pattern.base; + const cairo_matrix_t *m; + cairo_matrix_t matrix; /* XXX could also do tiling repeat modes... */ /* first clear the area about to be overwritten */ - if (! dst->is_clear) + if (! dst->is_clear) { status = compositor->fill_boxes (dst, CAIRO_OPERATOR_CLEAR, CAIRO_COLOR_TRANSPARENT, boxes); + if (unlikely (status)) + return status; + + dst->is_clear = TRUE; + } + + m = &source->matrix; + if (_cairo_surface_has_device_transform (dst)) { + cairo_matrix_multiply (&matrix, + &source->matrix, + &dst->device_transform); + m = &matrix; + } recording_clip = _cairo_clip_from_boxes (boxes); status = _cairo_recording_surface_replay_with_clip (unwrap_source (source), - &source->matrix, - dst, recording_clip); + m, dst, recording_clip); _cairo_clip_destroy (recording_clip); return status; |