diff --git a/src/cairo-clip.c b/src/cairo-clip.c index 6e52ab28e..bce6117a7 100644 --- a/src/cairo-clip.c +++ b/src/cairo-clip.c @@ -404,7 +404,8 @@ _cairo_clip_intersect_mask (cairo_clip_t *clip, CAIRO_CONTENT_ALPHA, surface_rect.width, surface_rect.height, - CAIRO_COLOR_WHITE); + CAIRO_COLOR_WHITE, + NULL); if (surface->status) return CAIRO_STATUS_NO_MEMORY; diff --git a/src/cairo-glitz-surface.c b/src/cairo-glitz-surface.c index f8207e745..cfebc3244 100644 --- a/src/cairo-glitz-surface.c +++ b/src/cairo-glitz-surface.c @@ -1002,7 +1002,8 @@ _cairo_glitz_surface_fill_rectangles (void *abstract_dst, _cairo_surface_create_similar_solid (&dst->base, CAIRO_CONTENT_COLOR_ALPHA, 1, 1, - (cairo_color_t *) color); + (cairo_color_t *) color, + NULL); if (src->base.status) return CAIRO_STATUS_NO_MEMORY; diff --git a/src/cairo-pattern.c b/src/cairo-pattern.c index 2bc893ea6..e29778dce 100644 --- a/src/cairo-pattern.c +++ b/src/cairo-pattern.c @@ -1250,7 +1250,8 @@ _cairo_pattern_acquire_surface_for_solid (cairo_solid_pattern_t *pattern, CAIRO_CONTENT_COLOR : CAIRO_CONTENT_COLOR_ALPHA, 1, 1, - &pattern->color); + &pattern->color, + &pattern->base); if ((*out)->status) return CAIRO_STATUS_NO_MEMORY; diff --git a/src/cairo-surface.c b/src/cairo-surface.c index efd193613..104996400 100644 --- a/src/cairo-surface.c +++ b/src/cairo-surface.c @@ -288,7 +288,8 @@ cairo_surface_create_similar (cairo_surface_t *other, return _cairo_surface_create_similar_solid (other, content, width, height, - CAIRO_COLOR_TRANSPARENT); + CAIRO_COLOR_TRANSPARENT, + NULL); } slim_hidden_def (cairo_surface_create_similar); @@ -297,7 +298,8 @@ _cairo_surface_create_similar_solid (cairo_surface_t *other, cairo_content_t content, int width, int height, - const cairo_color_t *color) + const cairo_color_t *color, + cairo_pattern_t *pattern) { cairo_status_t status; cairo_surface_t *surface; @@ -310,19 +312,23 @@ _cairo_surface_create_similar_solid (cairo_surface_t *other, return (cairo_surface_t*) &_cairo_surface_nil; } - source = _cairo_pattern_create_solid (color); - if (source->status) { - cairo_surface_destroy (surface); - _cairo_error (CAIRO_STATUS_NO_MEMORY); - return (cairo_surface_t*) &_cairo_surface_nil; - } + if (pattern == NULL) { + source = _cairo_pattern_create_solid (color); + if (source->status) { + cairo_surface_destroy (surface); + _cairo_error (CAIRO_STATUS_NO_MEMORY); + return (cairo_surface_t*) &_cairo_surface_nil; + } + } else + source = pattern; status = _cairo_surface_paint (surface, color == CAIRO_COLOR_TRANSPARENT ? CAIRO_OPERATOR_CLEAR : CAIRO_OPERATOR_SOURCE, source); - cairo_pattern_destroy (source); + if (source != pattern) + cairo_pattern_destroy (source); if (status) { cairo_surface_destroy (surface); diff --git a/src/cairoint.h b/src/cairoint.h index 2a3ff0111..76397e2e0 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -1851,12 +1851,16 @@ _cairo_surface_create_similar_scratch (cairo_surface_t *other, int width, int height); +/* Note: the color_pattern argument is optional - if provided it will reuse + * that pattern instead of creating a very short-lived fresh solid pattern + */ cairo_private cairo_surface_t * _cairo_surface_create_similar_solid (cairo_surface_t *other, cairo_content_t content, int width, int height, - const cairo_color_t *color); + const cairo_color_t *color, + cairo_pattern_t *color_pattern); cairo_private void _cairo_surface_init (cairo_surface_t *surface,