summaryrefslogtreecommitdiff
path: root/src/cairo-traps-compositor.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-09-13 09:39:42 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2011-09-13 12:31:14 +0100
commit3e655f081921c8caa0b6d2bedfbe5f6174e999a1 (patch)
treeb2644dfe7c89f853eb2de6d408c69000d70461e1 /src/cairo-traps-compositor.c
parent05a73434fc5ce8157af70b4950ca9de4c6dd7a46 (diff)
downloadcairo-3e655f081921c8caa0b6d2bedfbe5f6174e999a1.tar.gz
traps: Send unaligned boxes as trapezoids
According to the little fishies this performs significantly better. As a bonus, it did not handle overlapping boxes correctly... Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/cairo-traps-compositor.c')
-rw-r--r--src/cairo-traps-compositor.c32
1 files changed, 12 insertions, 20 deletions
diff --git a/src/cairo-traps-compositor.c b/src/cairo-traps-compositor.c
index 92c8665a8..5b22fd746 100644
--- a/src/cairo-traps-compositor.c
+++ b/src/cairo-traps-compositor.c
@@ -1458,29 +1458,21 @@ composite_boxes (const cairo_traps_compositor_t *compositor,
const cairo_rectangle_int_t *extents,
cairo_clip_t *clip)
{
- const cairo_boxes_t *boxes = closure;
- const struct _cairo_boxes_chunk *chunk;
- struct composite_opacity_info info;
- int i;
-
- info.compositor = compositor;
- info.op = op;
- info.dst = dst;
-
- info.src = src;
- info.src_x = src_x;
- info.src_y = src_y;
+ cairo_traps_t traps;
+ cairo_status_t status;
- info.opacity = 1. / (double) 0xffff;
+ status = _cairo_traps_init_boxes (&traps, closure);
+ if (unlikely (status))
+ return status;
- /* XXX for lots of boxes create a clip region for the fully opaque areas */
- for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) {
- for (i = 0; i < chunk->count; i++)
- do_unaligned_box(composite_opacity, &info,
- &chunk->base[i], dst_x, dst_y);
- }
+ status = compositor->composite_traps (dst, op, src,
+ src_x - dst_x, src_y - dst_y,
+ dst_x, dst_y,
+ extents,
+ CAIRO_ANTIALIAS_DEFAULT, &traps);
+ _cairo_traps_fini (&traps);
- return CAIRO_STATUS_SUCCESS;
+ return status;
}
static cairo_status_t