From f5cf131a9d8984bd6b3403396beed2ffbc26bded Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 27 Apr 2010 18:56:23 +0100 Subject: [PATCH] surface: skip OVER is the source is clear. If the source has no alpha, the OVER operation becomes DST, i.e. a no-op. --- src/cairo-surface.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/cairo-surface.c b/src/cairo-surface.c index 8a5937349..ddb1ffd8b 100644 --- a/src/cairo-surface.c +++ b/src/cairo-surface.c @@ -1926,6 +1926,12 @@ _cairo_surface_paint (cairo_surface_t *surface, if (op == CAIRO_OPERATOR_CLEAR && surface->is_clear) return CAIRO_STATUS_SUCCESS; + if (op == CAIRO_OPERATOR_OVER && + _cairo_pattern_is_clear (source)) + { + return CAIRO_STATUS_SUCCESS; + } + status = _pattern_has_error (source); if (unlikely (status)) return status; @@ -1971,6 +1977,12 @@ _cairo_surface_mask (cairo_surface_t *surface, return CAIRO_STATUS_SUCCESS; } + if (op == CAIRO_OPERATOR_OVER && + _cairo_pattern_is_clear (source)) + { + return CAIRO_STATUS_SUCCESS; + } + status = _pattern_has_error (source); if (unlikely (status)) return status; @@ -2097,6 +2109,12 @@ _cairo_surface_stroke (cairo_surface_t *surface, if (op == CAIRO_OPERATOR_CLEAR && surface->is_clear) return CAIRO_STATUS_SUCCESS; + if (op == CAIRO_OPERATOR_OVER && + _cairo_pattern_is_clear (source)) + { + return CAIRO_STATUS_SUCCESS; + } + status = _pattern_has_error (source); if (unlikely (status)) return status; @@ -2147,6 +2165,12 @@ _cairo_surface_fill (cairo_surface_t *surface, if (op == CAIRO_OPERATOR_CLEAR && surface->is_clear) return CAIRO_STATUS_SUCCESS; + if (op == CAIRO_OPERATOR_OVER && + _cairo_pattern_is_clear (source)) + { + return CAIRO_STATUS_SUCCESS; + } + status = _pattern_has_error (source); if (unlikely (status)) return status;