summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrea Canciani <ranma42@gmail.com>2012-05-20 07:32:36 +0200
committerAndrea Canciani <ranma42@gmail.com>2012-05-20 07:33:53 +0200
commit298c2c7deff1f4d6651878d164c051875b9edbf5 (patch)
tree6aaa3064aa256dd924770956c922abfac2d01ccc
parent70458a75d76d3a1ef913723be9ddf9f9f1ca6850 (diff)
-rw-r--r--src/cairo-quartz-surface.c100
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)))