summaryrefslogtreecommitdiff
path: root/src/cairo-spans-compositor.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cairo-spans-compositor.c')
-rw-r--r--[-rwxr-xr-x]src/cairo-spans-compositor.c30
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;