diff options
author | Andrea Canciani <ranma42@gmail.com> | 2012-05-20 07:32:36 +0200 |
---|---|---|
committer | Andrea Canciani <ranma42@gmail.com> | 2012-05-20 07:33:53 +0200 |
commit | 298c2c7deff1f4d6651878d164c051875b9edbf5 (patch) | |
tree | 6aaa3064aa256dd924770956c922abfac2d01ccc | |
parent | 70458a75d76d3a1ef913723be9ddf9f9f1ca6850 (diff) |
wipwip/totest
-rw-r--r-- | src/cairo-quartz-surface.c | 100 |
1 files changed, 67 insertions, 33 deletions
diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c index 0195da10c..baf7e49c3 100644 --- a/src/cairo-quartz-surface.c +++ b/src/cairo-quartz-surface.c @@ -1020,6 +1020,26 @@ typedef struct { CGRect clipRect; } cairo_quartz_drawing_state_t; +static cairo_int_status_t +_cairo_quartz_setup_state_source_solid (cairo_quartz_drawing_state_t *state, + const cairo_color_t *color) +{ + CGContextSetRGBStrokeColor (state->cgDrawContext, + color->red, + color->green, + color->blue, + color->alpha); + + CGContextSetRGBFillColor (state->cgDrawContext, + color->red, + color->green, + color->blue, + color->alpha); + + state->action = DO_DIRECT; + return CAIRO_STATUS_SUCCESS; +} + /* Quartz does not support repeating radients. We handle repeating gradients by manually extending the gradient and repeating color stops. We need to @@ -1031,16 +1051,23 @@ the gradient is very coarse. _cairo_quartz_create_gradient_function computes the number of repetitions needed based on the extents. */ static cairo_int_status_t -_cairo_quartz_setup_gradient_source (cairo_quartz_drawing_state_t *state, - const cairo_gradient_pattern_t *gradient, - const cairo_rectangle_int_t *extents) +_cairo_quartz_setup_state_source_gradient (cairo_quartz_drawing_state_t *state, + const cairo_gradient_pattern_t *gradient, + cairo_composite_rectangles_t *extents) { + cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) extents->surface; + cairo_rectangle_int_t repeat_extents; cairo_matrix_t mat; cairo_circle_double_t start, end; CGFunctionRef gradFunc; CGColorSpaceRef rgb; bool extend = gradient->base.extend != CAIRO_EXTEND_NONE; + repeat_extents = surface->virtual_extents; + repeat_extents.x -= surface->base.device_transform.x0; + repeat_extents.y -= surface->base.device_transform.y0; + _cairo_rectangle_union (&repeat_extents, &surface->extents); + assert (gradient->n_stops > 0); mat = gradient->base.matrix; @@ -1082,6 +1109,41 @@ _cairo_quartz_setup_gradient_source (cairo_quartz_drawing_state_t *state, return CAIRO_STATUS_SUCCESS; } + + +static cairo_int_status_t +_cairo_quartz_setup_state_source (cairo_quartz_drawing_state_t *state, + cairo_composite_rectangles_t *extents) +{ + switch (pattern->type) { + default: + ASSERT_NOT_REACHED; + return CAIRO_INT_STATUS_UNSUPPORTED; + + case CAIRO_PATTERN_TYPE_SOLID: + return _cairo_quartz_setup_state_solid (state, + &((const cairo_solid_pattern_t *) pattern)->color); + + case CAIRO_PATTERN_TYPE_RADIAL: + case CAIRO_PATTERN_TYPE_LINEAR: + return _cairo_quartz_setup_state_gradient (state, + (const cairo_gradient_pattern_t *) pattern, + extents); + + case CAIRO_PATTERN_TYPE_SURFACE: + return _cairo_quartz_setup_state_surface (state, + (const cairo_surface_pattern_t *) pattern, + extents); + + default: + ASSERT_NOT_REACHED; + + case CAIRO_PATTERN_TYPE_MESH: + case CAIRO_PATTERN_TYPE_RASTER_SOURCE: + return CAIRO_INT_STATUS_UNSUPPORTED; + } +} + static cairo_int_status_t _cairo_quartz_setup_state (cairo_quartz_drawing_state_t *state, cairo_composite_rectangles_t *extents) @@ -1160,37 +1222,9 @@ _cairo_quartz_setup_state (cairo_quartz_drawing_state_t *state, -state->clipRect.origin.y); } - if (source->type == CAIRO_PATTERN_TYPE_SOLID) { - cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) source; - - CGContextSetRGBStrokeColor (state->cgDrawContext, - solid->color.red, - solid->color.green, - solid->color.blue, - solid->color.alpha); - CGContextSetRGBFillColor (state->cgDrawContext, - solid->color.red, - solid->color.green, - solid->color.blue, - solid->color.alpha); - - state->action = DO_DIRECT; - return CAIRO_STATUS_SUCCESS; - } - - if (source->type == CAIRO_PATTERN_TYPE_LINEAR || - source->type == CAIRO_PATTERN_TYPE_RADIAL) - { - const cairo_gradient_pattern_t *gpat = (const cairo_gradient_pattern_t *)source; - cairo_rectangle_int_t extents; - - extents = surface->virtual_extents; - extents.x -= surface->base.device_transform.x0; - extents.y -= surface->base.device_transform.y0; - _cairo_rectangle_union (&extents, &surface->extents); + return _cairo_quartz_setup_pattern_state (state, extents); +} - return _cairo_quartz_setup_gradient_source (state, gpat, &extents); - } if (source->type == CAIRO_PATTERN_TYPE_SURFACE && (source->extend == CAIRO_EXTEND_NONE || (CGContextDrawTiledImagePtr && source->extend == CAIRO_EXTEND_REPEAT))) |