summaryrefslogtreecommitdiff
path: root/src/cairo-surface-fallback.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-02-12 12:20:35 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2010-02-12 12:24:01 +0000
commit5390df961f6dff8e25e5aac21062026a81710d88 (patch)
tree93f8fb3c7616d8b315e6fec8ca8c8f49c9b9f0e8 /src/cairo-surface-fallback.c
parent51047483f462a905567b42275ae061ead4df0a07 (diff)
downloadcairo-5390df961f6dff8e25e5aac21062026a81710d88.tar.gz
clip: Restrict composite extents to clip extents
Fixes test/clip-rectangle-twice.
Diffstat (limited to 'src/cairo-surface-fallback.c')
-rw-r--r--src/cairo-surface-fallback.c71
1 files changed, 3 insertions, 68 deletions
diff --git a/src/cairo-surface-fallback.c b/src/cairo-surface-fallback.c
index 904778749..232e15e95 100644
--- a/src/cairo-surface-fallback.c
+++ b/src/cairo-surface-fallback.c
@@ -139,9 +139,6 @@ _create_composite_mask_pattern (cairo_surface_pattern_t *mask_pattern,
assert (status != CAIRO_INT_STATUS_NOTHING_TO_DO);
clip_surface = status == CAIRO_INT_STATUS_UNSUPPORTED;
-
- if (clip_region && cairo_region_num_rectangles (clip_region) == 1)
- clip_region = NULL;
}
/* We need to use solid here, because to use CAIRO_OPERATOR_SOURCE with
@@ -337,10 +334,6 @@ _clip_and_composite_source (cairo_clip_t *clip,
assert (! _cairo_status_is_error (status));
if (unlikely (status == CAIRO_INT_STATUS_NOTHING_TO_DO))
return CAIRO_STATUS_SUCCESS;
-
- /* a solitary clip rectangle is already accommodated by extents */
- if (clip_region && cairo_region_num_rectangles (clip_region) == 1)
- clip_region = NULL;
}
@@ -456,10 +449,6 @@ _clip_and_composite (cairo_clip_t *clip,
dst, extents);
}
} else {
- /* a solitary clip rectangle is already accommodated by extents */
- if (clip_region && cairo_region_num_rectangles (clip_region) == 1)
- clip_region = NULL;
-
status = draw_func (draw_closure, op,
src, dst,
0, 0,
@@ -506,10 +495,6 @@ _composite_trap_region (cairo_clip_t *clip,
mask = &mask_pattern.base;
}
- /* reduce a solitary clipping region to the extents */
- if (cairo_region_num_rectangles (trap_region) == 1)
- trap_region = NULL;
-
status = _cairo_surface_composite (op, src, mask, dst,
extents->x, extents->y,
mask_x, mask_y,
@@ -892,56 +877,6 @@ _composite_spans_draw_func (void *closure,
clip_region);
}
-static cairo_bool_t
-box_is_aligned (const cairo_box_t *box)
-{
- return
- _cairo_fixed_is_integer (box->p1.x) &&
- _cairo_fixed_is_integer (box->p1.y) &&
- _cairo_fixed_is_integer (box->p2.x) &&
- _cairo_fixed_is_integer (box->p2.y);
-}
-
-static inline cairo_status_t
-_clip_to_boxes (cairo_clip_t **clip,
- const cairo_composite_rectangles_t *extents,
- cairo_box_t **boxes,
- int *num_boxes)
-{
- cairo_status_t status;
- const cairo_rectangle_int_t *rect;
-
- rect = extents->is_bounded ? &extents->bounded : &extents->unbounded;
-
- if (*clip == NULL)
- goto EXTENTS;
-
- status = _cairo_clip_rectangle (*clip, rect);
- if (unlikely (status))
- return status;
-
- status = _cairo_clip_get_boxes (*clip, boxes, num_boxes);
- switch ((int) status) {
- case CAIRO_STATUS_SUCCESS:
- if (extents->is_bounded || (*num_boxes == 1 && box_is_aligned (*boxes)))
- *clip = NULL;
- goto DONE;
-
- case CAIRO_INT_STATUS_UNSUPPORTED:
- goto EXTENTS;
-
- default:
- return status;
- }
-
- EXTENTS:
- status = CAIRO_STATUS_SUCCESS;
- _cairo_box_from_rectangle (&(*boxes)[0], rect);
- *num_boxes = 1;
- DONE:
- return status;
-}
-
cairo_status_t
_cairo_surface_fallback_paint (cairo_surface_t *surface,
cairo_operator_t op,
@@ -971,7 +906,7 @@ _cairo_surface_fallback_paint (cairo_surface_t *surface,
if (_cairo_clip_contains_rectangle (clip, &extents))
clip = NULL;
- status = _clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes);
+ status = _cairo_clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes);
if (unlikely (status))
return status;
@@ -1110,7 +1045,7 @@ _cairo_surface_fallback_stroke (cairo_surface_t *surface,
if (_cairo_clip_contains_rectangle (clip, &extents))
clip = NULL;
- status = _clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes);
+ status = _cairo_clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes);
if (unlikely (status))
return status;
@@ -1215,7 +1150,7 @@ _cairo_surface_fallback_fill (cairo_surface_t *surface,
if (_cairo_clip_contains_rectangle (clip, &extents))
clip = NULL;
- status = _clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes);
+ status = _cairo_clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes);
if (unlikely (status))
return status;