diff options
author | Uli Schlachter <psychon@znc.in> | 2012-09-15 15:43:16 +0200 |
---|---|---|
committer | Uli Schlachter <psychon@znc.in> | 2012-09-24 09:44:10 +0200 |
commit | de31018bdd1cc78fd54cf9fd7b220117008c33a8 (patch) | |
tree | 36dc399f0725c7d33557fda312f09dc3ed71e032 | |
parent | 6300579a8b2c0e38a0c1abae89675bf6cb769902 (diff) |
xcb: Switch to compositor architecture
This commit removes the hand-written code in cairo-xcb-surface.c and instead
makes use of cairo_compositor_t. Surprisingly, this doesn't break a single test
case. :-)
Signed-off-by: Uli Schlachter <psychon@znc.in>
-rw-r--r-- | src/cairo-xcb-private.h | 59 | ||||
-rw-r--r-- | src/cairo-xcb-surface-render.c | 75 | ||||
-rw-r--r-- | src/cairo-xcb-surface.c | 277 |
3 files changed, 197 insertions, 214 deletions
diff --git a/src/cairo-xcb-private.h b/src/cairo-xcb-private.h index 35b50ad8..f6cb34ec 100644 --- a/src/cairo-xcb-private.h +++ b/src/cairo-xcb-private.h @@ -386,49 +386,38 @@ _cairo_xcb_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *extents); cairo_private cairo_int_status_t -_cairo_xcb_surface_render_paint (cairo_xcb_surface_t *surface, - cairo_operator_t op, - const cairo_pattern_t *source, - cairo_composite_rectangles_t *composite); +_cairo_xcb_render_compositor_paint (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents); cairo_private cairo_int_status_t -_cairo_xcb_surface_render_mask (cairo_xcb_surface_t *surface, - cairo_operator_t op, - const cairo_pattern_t *source, - const cairo_pattern_t *mask, - cairo_composite_rectangles_t *composite); +_cairo_xcb_render_compositor_mask (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents); cairo_private cairo_int_status_t -_cairo_xcb_surface_render_stroke (cairo_xcb_surface_t *surface, - cairo_operator_t op, - const cairo_pattern_t *source, - const cairo_path_fixed_t *path, - const cairo_stroke_style_t *style, - const cairo_matrix_t *ctm, - const cairo_matrix_t *ctm_inverse, - double tolerance, - cairo_antialias_t antialias, - cairo_composite_rectangles_t *composite); +_cairo_xcb_render_compositor_stroke (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias); cairo_private cairo_int_status_t -_cairo_xcb_surface_render_fill (cairo_xcb_surface_t *surface, - cairo_operator_t op, - const cairo_pattern_t *source, - const cairo_path_fixed_t*path, - cairo_fill_rule_t fill_rule, - double tolerance, - cairo_antialias_t antialias, - cairo_composite_rectangles_t *composite); +_cairo_xcb_render_compositor_fill (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias); cairo_private cairo_int_status_t -_cairo_xcb_surface_render_glyphs (cairo_xcb_surface_t *surface, - cairo_operator_t op, - const cairo_pattern_t *source, - cairo_scaled_font_t *scaled_font, - cairo_glyph_t *glyphs, - int num_glyphs, - cairo_composite_rectangles_t *composite, - cairo_bool_t overlap); +_cairo_xcb_render_compositor_glyphs (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap); cairo_private void _cairo_xcb_surface_scaled_font_fini (cairo_scaled_font_t *scaled_font); diff --git a/src/cairo-xcb-surface-render.c b/src/cairo-xcb-surface-render.c index adbf0dfb..959d3800 100644 --- a/src/cairo-xcb-surface-render.c +++ b/src/cairo-xcb-surface-render.c @@ -3505,11 +3505,12 @@ _composite_opacity_boxes (void *closure, /* high level rasteriser -> compositor */ cairo_int_status_t -_cairo_xcb_surface_render_paint (cairo_xcb_surface_t *surface, - cairo_operator_t op, - const cairo_pattern_t *source, - cairo_composite_rectangles_t *composite) +_cairo_xcb_render_compositor_paint (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite) { + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) composite->surface; + cairo_operator_t op = composite->op; + cairo_pattern_t *source = &composite->source_pattern.base; cairo_boxes_t boxes; cairo_status_t status; @@ -3542,12 +3543,13 @@ _cairo_xcb_surface_render_paint (cairo_xcb_surface_t *surface, } cairo_int_status_t -_cairo_xcb_surface_render_mask (cairo_xcb_surface_t *surface, - cairo_operator_t op, - const cairo_pattern_t *source, - const cairo_pattern_t *mask, - cairo_composite_rectangles_t *composite) +_cairo_xcb_render_compositor_mask (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite) { + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) composite->surface; + cairo_operator_t op = composite->op; + cairo_pattern_t *source = &composite->source_pattern.base; + cairo_pattern_t *mask = &composite->mask_pattern.base; cairo_status_t status; if (unlikely (! _operator_is_supported (surface->connection->flags, op))) @@ -3673,17 +3675,18 @@ _cairo_xcb_surface_render_stroke_via_mask (cairo_xcb_surface_t *dst, } cairo_int_status_t -_cairo_xcb_surface_render_stroke (cairo_xcb_surface_t *surface, - cairo_operator_t op, - const cairo_pattern_t *source, - const cairo_path_fixed_t *path, - const cairo_stroke_style_t *style, - const cairo_matrix_t *ctm, - const cairo_matrix_t *ctm_inverse, - double tolerance, - cairo_antialias_t antialias, - cairo_composite_rectangles_t *composite) +_cairo_xcb_render_compositor_stroke (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias) { + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) composite->surface; + cairo_operator_t op = composite->op; + cairo_pattern_t *source = &composite->source_pattern.base; cairo_int_status_t status; if (unlikely (! _operator_is_supported (surface->connection->flags, op))) @@ -3813,15 +3816,16 @@ _cairo_xcb_surface_render_fill_via_mask (cairo_xcb_surface_t *dst, } cairo_int_status_t -_cairo_xcb_surface_render_fill (cairo_xcb_surface_t *surface, - cairo_operator_t op, - const cairo_pattern_t *source, - const cairo_path_fixed_t *path, - cairo_fill_rule_t fill_rule, - double tolerance, - cairo_antialias_t antialias, - cairo_composite_rectangles_t *composite) +_cairo_xcb_render_compositor_fill (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) { + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) composite->surface; + cairo_operator_t op = composite->op; + cairo_pattern_t *source = &composite->source_pattern.base; cairo_int_status_t status; if (unlikely (! _operator_is_supported (surface->connection->flags, op))) @@ -4802,15 +4806,16 @@ _composite_glyphs (void *closure, } cairo_int_status_t -_cairo_xcb_surface_render_glyphs (cairo_xcb_surface_t *surface, - cairo_operator_t op, - const cairo_pattern_t *source, - cairo_scaled_font_t *scaled_font, - cairo_glyph_t *glyphs, - int num_glyphs, - cairo_composite_rectangles_t *composite, - cairo_bool_t overlap) +_cairo_xcb_render_compositor_glyphs (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *composite, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap) { + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) composite->surface; + cairo_operator_t op = composite->op; + cairo_pattern_t *source = &composite->source_pattern.base; cairo_int_status_t status; if (unlikely (! _operator_is_supported (surface->connection->flags, op))) diff --git a/src/cairo-xcb-surface.c b/src/cairo-xcb-surface.c index d74d6fad..bde03ffd 100644 --- a/src/cairo-xcb-surface.c +++ b/src/cairo-xcb-surface.c @@ -48,6 +48,7 @@ #include "cairo-image-surface-inline.h" #include "cairo-list-inline.h" #include "cairo-surface-backend-private.h" +#include "cairo-compositor-private.h" #if CAIRO_HAS_XLIB_XCB_FUNCTIONS slim_hidden_proto (cairo_xcb_surface_create); @@ -846,36 +847,126 @@ _cairo_xcb_surface_fallback (cairo_xcb_surface_t *surface, } static cairo_int_status_t -_cairo_xcb_surface_paint (void *abstract_surface, - cairo_operator_t op, - const cairo_pattern_t *source, - const cairo_clip_t *clip) +_cairo_xcb_fallback_compositor_paint (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents) { - cairo_xcb_surface_t *surface = abstract_surface; - cairo_composite_rectangles_t composite; - cairo_int_status_t status; + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) extents->surface; + cairo_surface_t *fallback = _cairo_xcb_surface_fallback (surface, extents); - status = _cairo_composite_rectangles_init_for_paint (&composite, - &surface->base, - op, source, - clip); - if (unlikely (status)) - return status; + return _cairo_surface_paint (fallback, extents->op, + &extents->source_pattern.base, + extents->clip); +} + +static cairo_int_status_t +_cairo_xcb_fallback_compositor_mask (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents) +{ + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) extents->surface; + cairo_surface_t *fallback = _cairo_xcb_surface_fallback (surface, extents); + + return _cairo_surface_mask (fallback, extents->op, + &extents->source_pattern.base, + &extents->mask_pattern.base, + extents->clip); +} + +static cairo_int_status_t +_cairo_xcb_fallback_compositor_stroke (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + const cairo_stroke_style_t *style, + const cairo_matrix_t *ctm, + const cairo_matrix_t *ctm_inverse, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) extents->surface; + cairo_surface_t *fallback = _cairo_xcb_surface_fallback (surface, extents); - if (surface->fallback == NULL) { - status = _cairo_xcb_surface_render_paint (surface, op, source, - &composite); - if (status != CAIRO_INT_STATUS_UNSUPPORTED) - goto done; + return _cairo_surface_stroke (fallback, extents->op, + &extents->source_pattern.base, + path, style, ctm, ctm_inverse, + tolerance, antialias, + extents->clip); +} + +static cairo_int_status_t +_cairo_xcb_fallback_compositor_fill (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + const cairo_path_fixed_t *path, + cairo_fill_rule_t fill_rule, + double tolerance, + cairo_antialias_t antialias) +{ + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) extents->surface; + cairo_surface_t *fallback = _cairo_xcb_surface_fallback (surface, extents); + + return _cairo_surface_fill (fallback, extents->op, + &extents->source_pattern.base, + path, fill_rule, tolerance, + antialias, extents->clip); +} + +static cairo_int_status_t +_cairo_xcb_fallback_compositor_glyphs (const cairo_compositor_t *compositor, + cairo_composite_rectangles_t *extents, + cairo_scaled_font_t *scaled_font, + cairo_glyph_t *glyphs, + int num_glyphs, + cairo_bool_t overlap) +{ + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) extents->surface; + cairo_surface_t *fallback = _cairo_xcb_surface_fallback (surface, extents); + + return _cairo_surface_show_text_glyphs (fallback, extents->op, + &extents->source_pattern.base, + NULL, 0, glyphs, num_glyphs, + NULL, 0, 0, + scaled_font, extents->clip); +} + +static const cairo_compositor_t _cairo_xcb_fallback_compositor = { + &__cairo_no_compositor, + + _cairo_xcb_fallback_compositor_paint, + _cairo_xcb_fallback_compositor_mask, + _cairo_xcb_fallback_compositor_stroke, + _cairo_xcb_fallback_compositor_fill, + _cairo_xcb_fallback_compositor_glyphs, +}; + +static const cairo_compositor_t _cairo_xcb_render_compositor = { + &_cairo_xcb_fallback_compositor, + + _cairo_xcb_render_compositor_paint, + _cairo_xcb_render_compositor_mask, + _cairo_xcb_render_compositor_stroke, + _cairo_xcb_render_compositor_fill, + _cairo_xcb_render_compositor_glyphs, +}; + +static inline const cairo_compositor_t * +get_compositor (cairo_surface_t **s) +{ + cairo_xcb_surface_t *surface = (cairo_xcb_surface_t * )*s; + if (surface->fallback) { + *s = &surface->fallback->base; + return ((cairo_image_surface_t *) *s)->compositor; } - status = _cairo_surface_paint (_cairo_xcb_surface_fallback (surface, - &composite), - op, source, clip); + return &_cairo_xcb_render_compositor; +} -done: - _cairo_composite_rectangles_fini (&composite); - return status; +static cairo_int_status_t +_cairo_xcb_surface_paint (void *abstract_surface, + cairo_operator_t op, + const cairo_pattern_t *source, + const cairo_clip_t *clip) +{ + cairo_surface_t *surface = abstract_surface; + const cairo_compositor_t *compositor = get_compositor (&surface); + return _cairo_compositor_paint (compositor, surface, op, source, clip); } static cairo_int_status_t @@ -885,30 +976,9 @@ _cairo_xcb_surface_mask (void *abstract_surface, const cairo_pattern_t *mask, const cairo_clip_t *clip) { - cairo_xcb_surface_t *surface = abstract_surface; - cairo_composite_rectangles_t composite; - cairo_int_status_t status; - - status = _cairo_composite_rectangles_init_for_mask (&composite, - &surface->base, - op, source, mask, clip); - if (unlikely (status)) - return status; - - if (surface->fallback == NULL) { - status = _cairo_xcb_surface_render_mask (surface, - op, source, mask, &composite); - if (status != CAIRO_INT_STATUS_UNSUPPORTED) - goto done; - } - - status = _cairo_surface_mask (_cairo_xcb_surface_fallback (surface, - &composite), - op, source, mask, - clip); -done: - _cairo_composite_rectangles_fini (&composite); - return status; + cairo_surface_t *surface = abstract_surface; + const cairo_compositor_t *compositor = get_compositor (&surface); + return _cairo_compositor_mask (compositor, surface, op, source, mask, clip); } static cairo_int_status_t @@ -923,39 +993,11 @@ _cairo_xcb_surface_stroke (void *abstract_surface, cairo_antialias_t antialias, const cairo_clip_t *clip) { - cairo_xcb_surface_t *surface = abstract_surface; - cairo_composite_rectangles_t composite; - cairo_int_status_t status; - - status = _cairo_composite_rectangles_init_for_stroke (&composite, - &surface->base, - op, source, - path, style, ctm, - clip); - if (unlikely (status)) - return status; - - if (surface->fallback == NULL) { - status = _cairo_xcb_surface_render_stroke (surface, op, source, - path, style, - ctm, ctm_inverse, - tolerance, antialias, - &composite); - - if (status != CAIRO_INT_STATUS_UNSUPPORTED) - goto done; - } - - status = _cairo_surface_stroke (_cairo_xcb_surface_fallback (surface, - &composite), - op, source, - path, style, - ctm, ctm_inverse, - tolerance, antialias, - clip); -done: - _cairo_composite_rectangles_fini (&composite); - return status; + cairo_surface_t *surface = abstract_surface; + const cairo_compositor_t *compositor = get_compositor (&surface); + return _cairo_compositor_stroke (compositor, surface, op, source, + path, style, ctm, ctm_inverse, + tolerance, antialias, clip); } static cairo_int_status_t @@ -968,35 +1010,11 @@ _cairo_xcb_surface_fill (void *abstract_surface, cairo_antialias_t antialias, const cairo_clip_t *clip) { - cairo_xcb_surface_t *surface = abstract_surface; - cairo_composite_rectangles_t composite; - cairo_int_status_t status; - - status = _cairo_composite_rectangles_init_for_fill (&composite, - &surface->base, - op, source, path, - clip); - if (unlikely (status)) - return status; - - if (surface->fallback == NULL) { - status = _cairo_xcb_surface_render_fill (surface, op, source, - path, fill_rule, - tolerance, antialias, - &composite); - if (status != CAIRO_INT_STATUS_UNSUPPORTED) - goto done; - } - - status = _cairo_surface_fill (_cairo_xcb_surface_fallback (surface, - &composite), - op, source, - path, fill_rule, - tolerance, antialias, - clip); -done: - _cairo_composite_rectangles_fini (&composite); - return status; + cairo_surface_t *surface = abstract_surface; + const cairo_compositor_t *compositor = get_compositor (&surface); + return _cairo_compositor_fill (compositor, surface, op, + source, path, fill_rule, + tolerance, antialias, clip); } static cairo_int_status_t @@ -1008,40 +1026,11 @@ _cairo_xcb_surface_glyphs (void *abstract_surface, cairo_scaled_font_t *scaled_font, const cairo_clip_t *clip) { - cairo_xcb_surface_t *surface = abstract_surface; - cairo_composite_rectangles_t composite; - cairo_int_status_t status; - cairo_bool_t overlap; - - status = _cairo_composite_rectangles_init_for_glyphs (&composite, - &surface->base, - op, source, - scaled_font, - glyphs, num_glyphs, - clip, &overlap); - if (unlikely (status)) - return status; - - if (surface->fallback == NULL) { - status = _cairo_xcb_surface_render_glyphs (surface, - op, source, - scaled_font, glyphs, num_glyphs, - &composite, overlap); - if (status != CAIRO_INT_STATUS_UNSUPPORTED) - goto done; - } - - status = _cairo_surface_show_text_glyphs (_cairo_xcb_surface_fallback (surface, - &composite), - op, source, - NULL, 0, - glyphs, num_glyphs, - NULL, 0, 0, - scaled_font, - clip); -done: - _cairo_composite_rectangles_fini (&composite); - return status; + cairo_surface_t *surface = abstract_surface; + const cairo_compositor_t *compositor = get_compositor (&surface); + return _cairo_compositor_glyphs (compositor, surface, op, + source, glyphs, num_glyphs, + scaled_font, clip); } const cairo_surface_backend_t _cairo_xcb_surface_backend = { |