summaryrefslogtreecommitdiff
path: root/src/cairo-surface-fallback.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cairo-surface-fallback.c')
-rw-r--r--src/cairo-surface-fallback.c48
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);