diff options
Diffstat (limited to 'src/cairo-surface-fallback.c')
-rw-r--r-- | src/cairo-surface-fallback.c | 48 |
1 files changed, 32 insertions, 16 deletions
diff --git a/src/cairo-surface-fallback.c b/src/cairo-surface-fallback.c index 2de9a9cb0..8083712b9 100644 --- a/src/cairo-surface-fallback.c +++ b/src/cairo-surface-fallback.c @@ -42,6 +42,7 @@ #include "cairo-boxes-private.h" #include "cairo-clip-private.h" +#include "cairo-color-private.h" #include "cairo-composite-rectangles-private.h" #include "cairo-error-private.h" #include "cairo-region-private.h" @@ -149,7 +150,8 @@ _create_composite_mask_pattern (cairo_surface_pattern_t *mask_pattern, CAIRO_CONTENT_ALPHA, extents->width, extents->height, - CAIRO_COLOR_CLEAR, + NULL, + CAIRO_COMPONENTS_CLEAR, TRUE); if (unlikely (mask->status)) return mask->status; @@ -606,15 +608,21 @@ _clip_and_composite_region (const cairo_pattern_t *src, if ((src->type == CAIRO_PATTERN_TYPE_SOLID || op == CAIRO_OPERATOR_CLEAR) && clip == NULL) { - const cairo_color_t *color; + cairo_color_space_t *color_space; + const cairo_color_components_t *components; - if (op == CAIRO_OPERATOR_CLEAR) - color = CAIRO_COLOR_CLEAR; - else - color = &((cairo_solid_pattern_t *)src)->color; + if (op == CAIRO_OPERATOR_CLEAR) { + color_space = NULL; + components = CAIRO_COMPONENTS_CLEAR; + } else { + const cairo_solid_pattern_t *solid = (const cairo_solid_pattern_t *) src; + + color_space = solid->color_space; + components = &solid->components; + } /* Solid rectangles special case */ - status = _cairo_surface_fill_region (dst, op, color, trap_region); + status = _cairo_surface_fill_region (dst, op, color_space, components, trap_region); } else { /* For a simple rectangle, we can just use composite(), for more * rectangles, we have to set a clip region. The cost of rasterizing @@ -639,7 +647,8 @@ _clip_and_composite_region (const cairo_pattern_t *src, if (status == CAIRO_STATUS_SUCCESS) { status = _cairo_surface_fill_region (dst, CAIRO_OPERATOR_CLEAR, - CAIRO_COLOR_CLEAR, + NULL, + CAIRO_COMPONENTS_CLEAR, &clear_region); } _cairo_region_fini (&clear_region); @@ -656,7 +665,8 @@ _fill_rectangles (cairo_surface_t *dst, cairo_traps_t *traps, cairo_clip_t *clip) { - const cairo_color_t *color; + cairo_color_space_t *color_space; + const cairo_color_components_t *components; cairo_rectangle_int_t stack_rects[CAIRO_STACK_ARRAY_LENGTH (cairo_rectangle_int_t)]; cairo_rectangle_int_t *rects = stack_rects; cairo_status_t status; @@ -716,12 +726,17 @@ _fill_rectangles (cairo_surface_t *dst, rects[i].height = y2 - y1; } - if (op == CAIRO_OPERATOR_CLEAR) - color = CAIRO_COLOR_CLEAR; - else - color = &((cairo_solid_pattern_t *)src)->color; + if (op == CAIRO_OPERATOR_CLEAR) { + color_space = NULL; + components = CAIRO_COMPONENTS_CLEAR; + } else { + const cairo_solid_pattern_t *solid = (const cairo_solid_pattern_t *) src; + + color_space = solid->color_space; + components = &solid->components; + } - status = _cairo_surface_fill_rectangles (dst, op, color, rects, i); + status = _cairo_surface_fill_rectangles (dst, op, color_space, components, rects, i); if (rects != stack_rects) free (rects); @@ -1448,7 +1463,8 @@ _cairo_surface_fallback_composite (cairo_operator_t op, cairo_status_t _cairo_surface_fallback_fill_rectangles (cairo_surface_t *surface, cairo_operator_t op, - const cairo_color_t *color, + cairo_color_space_t *color_space, + const cairo_color_components_t *components, cairo_rectangle_int_t *rects, int num_rects) { @@ -1507,7 +1523,7 @@ _cairo_surface_fallback_fill_rectangles (cairo_surface_t *surface, } status = _cairo_surface_fill_rectangles (&state.image->base, - op, color, + op, color_space, components, rects, num_rects); free (offset_rects); |