diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-09-13 09:39:42 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-09-13 12:31:14 +0100 |
commit | 3e655f081921c8caa0b6d2bedfbe5f6174e999a1 (patch) | |
tree | b2644dfe7c89f853eb2de6d408c69000d70461e1 /src/cairo-traps-compositor.c | |
parent | 05a73434fc5ce8157af70b4950ca9de4c6dd7a46 (diff) | |
download | cairo-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.c | 32 |
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 |