From baec928a69b5b763b30766cddfb1473e4e05fc3c Mon Sep 17 00:00:00 2001 From: Vladimir Vukicevic Date: Mon, 25 Feb 2008 21:06:36 -0500 Subject: [PATCH] [quartz] More mask fixes -- handle all types via fallback mask image --- src/cairo-quartz-surface.c | 85 +++++++++++++++++++++++++-------- test/mask-quartz-ref.png | Bin 0 -> 10657 bytes test/mask-quartz-rgb24-ref.png | Bin 0 -> 8418 bytes 3 files changed, 65 insertions(+), 20 deletions(-) create mode 100644 test/mask-quartz-ref.png create mode 100644 test/mask-quartz-rgb24-ref.png diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c index f42134746..83c2b81ca 100644 --- a/src/cairo-quartz-surface.c +++ b/src/cairo-quartz-surface.c @@ -1654,6 +1654,52 @@ _cairo_quartz_surface_mask_with_surface (cairo_quartz_surface_t *surface, return status; } +/* This is somewhat less than ideal, but it gets the job done; + * it would be better to avoid calling back into cairo. This + * creates a temporary surface to use as the mask. + */ +static cairo_int_status_t +_cairo_quartz_surface_mask_with_generic (cairo_quartz_surface_t *surface, + cairo_operator_t op, + cairo_pattern_t *source, + cairo_pattern_t *mask) +{ + int width = surface->extents.width - surface->extents.x; + int height = surface->extents.height - surface->extents.y; + + cairo_surface_t *gradient_surf = NULL; + cairo_t *gradient_surf_cr = NULL; + + cairo_pattern_union_t surface_pattern; + cairo_int_status_t status; + + /* Render the gradient to a surface */ + gradient_surf = cairo_quartz_surface_create (CAIRO_FORMAT_ARGB32, + width, + height); + gradient_surf_cr = cairo_create(gradient_surf); + cairo_set_source (gradient_surf_cr, mask); + cairo_set_operator (gradient_surf_cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (gradient_surf_cr); + status = cairo_status (gradient_surf_cr); + cairo_destroy (gradient_surf_cr); + + if (status) + goto BAIL; + + _cairo_pattern_init_for_surface (&surface_pattern.surface, gradient_surf); + + status = _cairo_quartz_surface_mask_with_surface (surface, op, source, &surface_pattern.surface); + + _cairo_pattern_fini (&surface_pattern.base); + + BAIL: + if (gradient_surf) + cairo_surface_destroy (gradient_surf); + + return status; +} + static cairo_int_status_t _cairo_quartz_surface_mask (void *abstract_surface, cairo_operator_t op, @@ -1673,30 +1719,29 @@ _cairo_quartz_surface_mask (void *abstract_surface, cairo_solid_pattern_t *solid_mask = (cairo_solid_pattern_t *) mask; CGContextSetAlpha (surface->cgContext, solid_mask->color.alpha); - } else if (CGContextClipToMaskPtr && - mask->type == CAIRO_PATTERN_TYPE_SURFACE && - mask->extend == CAIRO_EXTEND_NONE) { - return _cairo_quartz_surface_mask_with_surface (surface, op, source, (cairo_surface_pattern_t *) mask); - } else { - /* So, CGContextClipToMask is not present in 10.3.9, so we're - * doomed; if we have imageData, we can do fallback, otherwise - * just pretend success. - */ - if (surface->imageData) - return CAIRO_INT_STATUS_UNSUPPORTED; - - return CAIRO_STATUS_SUCCESS; - } - - rv = _cairo_quartz_surface_paint (surface, op, source); - - if (mask->type == CAIRO_PATTERN_TYPE_SOLID) { + rv = _cairo_quartz_surface_paint (surface, op, source); CGContextSetAlpha (surface->cgContext, 1.0); + + return rv; } - ND((stderr, "-- mask\n")); + /* If we have CGContextClipToMask, we can do more complex masks */ + if (CGContextClipToMaskPtr) { + /* For these, we can skip creating a temporary surface, since we already have one */ + if (mask->type == CAIRO_PATTERN_TYPE_SURFACE && mask->extend == CAIRO_EXTEND_NONE) + return _cairo_quartz_surface_mask_with_surface (surface, op, source, (cairo_surface_pattern_t *) mask); - return rv; + return _cairo_quartz_surface_mask_with_generic (surface, op, source, mask); + } + + /* So, CGContextClipToMask is not present in 10.3.9, so we're + * doomed; if we have imageData, we can do fallback, otherwise + * just pretend success. + */ + if (surface->imageData) + return CAIRO_INT_STATUS_UNSUPPORTED; + + return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t diff --git a/test/mask-quartz-ref.png b/test/mask-quartz-ref.png new file mode 100644 index 0000000000000000000000000000000000000000..392574091376dae2a8e551a5ca6f9e7539731722 GIT binary patch literal 10657 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