diff options
Diffstat (limited to 'src/cairo-gl-msaa-compositor.c')
-rw-r--r-- | src/cairo-gl-msaa-compositor.c | 112 |
1 files changed, 87 insertions, 25 deletions
diff --git a/src/cairo-gl-msaa-compositor.c b/src/cairo-gl-msaa-compositor.c index 49717f0fe..888f7da68 100644 --- a/src/cairo-gl-msaa-compositor.c +++ b/src/cairo-gl-msaa-compositor.c @@ -48,6 +48,7 @@ #include "cairo-path-private.h" #include "cairo-traps-private.h" #include "cairo-convex-fill-private.h" +#include "cairo-ttrace.h" static cairo_bool_t can_use_msaa_compositor (cairo_gl_surface_t *surface, @@ -238,15 +239,19 @@ _cairo_gl_msaa_compositor_draw_clip (cairo_gl_context_t *ctx, cairo_gl_composite_t *setup, cairo_clip_t *clip) { + CAIRO_TRACE_BEGIN (__func__); cairo_int_status_t status; cairo_traps_t traps; status = _clip_to_traps (clip, &traps); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } status = _draw_traps (ctx, setup, &traps); _cairo_traps_fini (&traps); + CAIRO_TRACE_END (__func__); return status; } @@ -484,6 +489,7 @@ static cairo_int_status_t _cairo_gl_msaa_compositor_mask_source_operator (const cairo_compositor_t *compositor, cairo_composite_rectangles_t *composite) { + CAIRO_TRACE_BEGIN (__func__); cairo_gl_composite_t setup; cairo_gl_surface_t *dst = (cairo_gl_surface_t *) composite->surface; cairo_gl_context_t *ctx = NULL; @@ -502,22 +508,27 @@ _cairo_gl_msaa_compositor_mask_source_operator (const cairo_compositor_t *compos status = _clip_to_traps (clip, &traps); if (unlikely (status)) { _cairo_traps_fini (&traps); + CAIRO_TRACE_END (__func__); return status; } } if (! is_pixel_aligned) { status = _blit_texture_to_renderbuffer (dst); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } } status = _cairo_gl_composite_init (&setup, CAIRO_OPERATOR_DEST_OUT, dst, FALSE /* assume_component_alpha */); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } status = _cairo_gl_composite_set_source (&setup, composite->original_mask_pattern, &composite->mask_sample_area, @@ -583,6 +594,7 @@ finish: if (clip) _cairo_traps_fini (&traps); + CAIRO_TRACE_END (__func__); return status; } @@ -590,6 +602,7 @@ static cairo_int_status_t _cairo_gl_msaa_compositor_mask (const cairo_compositor_t *compositor, cairo_composite_rectangles_t *composite) { + CAIRO_TRACE_BEGIN (__func__); cairo_gl_composite_t setup; cairo_gl_surface_t *dst = (cairo_gl_surface_t *) composite->surface; cairo_gl_context_t *ctx = NULL; @@ -598,12 +611,16 @@ _cairo_gl_msaa_compositor_mask (const cairo_compositor_t *compositor, cairo_clip_t *clip = composite->clip; cairo_bool_t is_pixel_aligned = FALSE; - if (! can_use_msaa_compositor (dst, CAIRO_ANTIALIAS_DEFAULT)) + if (! can_use_msaa_compositor (dst, CAIRO_ANTIALIAS_DEFAULT)) { + CAIRO_TRACE_END (__func__); return CAIRO_INT_STATUS_UNSUPPORTED; + } if (composite->op == CAIRO_OPERATOR_CLEAR && - composite->original_mask_pattern != NULL) + composite->original_mask_pattern != NULL) { + CAIRO_TRACE_END (__func__); return CAIRO_INT_STATUS_UNSUPPORTED; + } /* GL compositing operators cannot properly represent a mask operation using the SOURCE compositing operator in one pass. This only matters if @@ -616,6 +633,7 @@ _cairo_gl_msaa_compositor_mask (const cairo_compositor_t *compositor, if (! _cairo_pattern_is_opaque (&composite->source_pattern.base, &composite->source_sample_area)) { + CAIRO_TRACE_END (__func__); return _cairo_gl_msaa_compositor_mask_source_operator (compositor, composite); } @@ -626,8 +644,10 @@ _cairo_gl_msaa_compositor_mask (const cairo_compositor_t *compositor, if (_should_use_unbounded_surface (composite)) { cairo_surface_t* surface = _prepare_unbounded_surface (dst); - if (unlikely (surface == NULL)) + if (unlikely (surface == NULL)) { + CAIRO_TRACE_END (__func__); return CAIRO_INT_STATUS_UNSUPPORTED; + } /* This may be a paint operation. */ if (composite->original_mask_pattern == NULL) { @@ -645,9 +665,11 @@ _cairo_gl_msaa_compositor_mask (const cairo_compositor_t *compositor, if (unlikely (status)) { cairo_surface_destroy (surface); + CAIRO_TRACE_END (__func__); return status; } + CAIRO_TRACE_END (__func__); return _paint_back_unbounded_surface (compositor, composite, surface); } @@ -658,16 +680,20 @@ _cairo_gl_msaa_compositor_mask (const cairo_compositor_t *compositor, if (! is_pixel_aligned) { status = _blit_texture_to_renderbuffer (dst); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } } status = _cairo_gl_composite_init (&setup, op, dst, FALSE /* assume_component_alpha */); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } status = _cairo_gl_composite_set_source (&setup, composite->original_source_pattern, @@ -719,7 +745,7 @@ _cairo_gl_msaa_compositor_mask (const cairo_compositor_t *compositor, if (clip) { cairo_clip_t *clip_copy = _cairo_clip_copy (clip); - + clip_copy = _cairo_clip_intersect_rectangle (clip_copy, &rect); status = _cairo_gl_msaa_compositor_draw_clip (ctx, &setup, clip_copy); @@ -740,6 +766,7 @@ finish: if (ctx) status = _cairo_gl_context_release (ctx, status); + CAIRO_TRACE_END (__func__); return status; } @@ -963,24 +990,28 @@ _cairo_gl_msaa_compositor_stroke (const cairo_compositor_t *compositor, double tolerance, cairo_antialias_t antialias) { + CAIRO_TRACE_BEGIN (__func__); cairo_int_status_t status; cairo_gl_surface_t *dst = (cairo_gl_surface_t *) composite->surface; struct _tristrip_composite_info info; cairo_bool_t use_color_attribute; cairo_rectangle_int_t stroke_extents; - if (! can_use_msaa_compositor (dst, antialias)) + if (! can_use_msaa_compositor (dst, antialias)) { + CAIRO_TRACE_END (__func__); return CAIRO_INT_STATUS_UNSUPPORTED; + } if (! _cairo_path_fixed_stroke_is_rectilinear (path)) { _cairo_path_fixed_approximate_fill_extents (path, &stroke_extents); if (stroke_extents.width != 0 && stroke_extents.height != 0) { - if ((stroke_extents.width / stroke_extents.height > 10 && + if ((stroke_extents.width / stroke_extents.height > 10 && stroke_extents.height < 10) || - (stroke_extents.height / stroke_extents.width > 10 && + (stroke_extents.height / stroke_extents.width > 10 && stroke_extents.width < 10)) { + CAIRO_TRACE_END (__func__); return CAIRO_INT_STATUS_UNSUPPORTED; } } @@ -989,8 +1020,10 @@ _cairo_gl_msaa_compositor_stroke (const cairo_compositor_t *compositor, if (composite->is_bounded == FALSE) { cairo_surface_t* surface = _prepare_unbounded_surface (dst); - if (unlikely (surface == NULL)) + if (unlikely (surface == NULL)) { + CAIRO_TRACE_END (__func__); return CAIRO_INT_STATUS_UNSUPPORTED; + } status = _cairo_compositor_stroke (compositor, surface, CAIRO_OPERATOR_SOURCE, @@ -999,24 +1032,30 @@ _cairo_gl_msaa_compositor_stroke (const cairo_compositor_t *compositor, tolerance, antialias, NULL); if (unlikely (status)) { cairo_surface_destroy (surface); + CAIRO_TRACE_END (__func__); return status; } + CAIRO_TRACE_END (__func__); return _paint_back_unbounded_surface (compositor, composite, surface); } if (antialias != CAIRO_ANTIALIAS_NONE) { status = _blit_texture_to_renderbuffer (dst); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } } status = _cairo_gl_composite_init (&info.setup, composite->op, dst, FALSE /* assume_component_alpha */); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } info.ctx = NULL; use_color_attribute = _cairo_gl_hairline_style_is_hairline (style, ctm); @@ -1102,6 +1141,7 @@ finish: if (info.ctx) status = _cairo_gl_context_release (info.ctx, status); + CAIRO_TRACE_END (__func__); return status; } @@ -1136,6 +1176,7 @@ _cairo_gl_msaa_compositor_fill (const cairo_compositor_t *compositor, double tolerance, cairo_antialias_t antialias) { + CAIRO_TRACE_BEGIN (__func__); cairo_gl_composite_t setup; cairo_gl_surface_t *dst = (cairo_gl_surface_t *) composite->surface; cairo_gl_context_t *ctx = NULL; @@ -1145,17 +1186,20 @@ _cairo_gl_msaa_compositor_fill (const cairo_compositor_t *compositor, cairo_rectangle_int_t fill_extents; struct _tristrip_composite_info info; - if (! can_use_msaa_compositor (dst, antialias)) + if (! can_use_msaa_compositor (dst, antialias)) { + CAIRO_TRACE_END (__func__); return CAIRO_INT_STATUS_UNSUPPORTED; + } if (! _cairo_path_fixed_fill_is_rectilinear (path)) { _cairo_path_fixed_approximate_fill_extents (path, &fill_extents); if (fill_extents.width != 0 && fill_extents.height != 0) { - if ((fill_extents.width / fill_extents.height > 10 && + if ((fill_extents.width / fill_extents.height > 10 && fill_extents.height < 10) || - (fill_extents.height / fill_extents.width > 10 && + (fill_extents.height / fill_extents.width > 10 && fill_extents.width < 10)) { + CAIRO_TRACE_END (__func__); return CAIRO_INT_STATUS_UNSUPPORTED; } } @@ -1164,8 +1208,10 @@ _cairo_gl_msaa_compositor_fill (const cairo_compositor_t *compositor, if (composite->is_bounded == FALSE) { cairo_surface_t* surface = _prepare_unbounded_surface (dst); - if (unlikely (surface == NULL)) + if (unlikely (surface == NULL)) { + CAIRO_TRACE_END (__func__); return CAIRO_INT_STATUS_UNSUPPORTED; + } status = _cairo_compositor_fill (compositor, surface, @@ -1176,16 +1222,20 @@ _cairo_gl_msaa_compositor_fill (const cairo_compositor_t *compositor, if (unlikely (status)) { cairo_surface_destroy (surface); + CAIRO_TRACE_END (__func__); return status; } + CAIRO_TRACE_END (__func__); return _paint_back_unbounded_surface (compositor, composite, surface); } if (antialias != CAIRO_ANTIALIAS_NONE) { status = _blit_texture_to_renderbuffer (dst); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } } draw_path_with_traps = ! _cairo_path_fixed_is_simple_quad (path); @@ -1208,7 +1258,7 @@ _cairo_gl_msaa_compositor_fill (const cairo_compositor_t *compositor, _cairo_gl_msaa_compositor_set_clip (composite, &setup); if (antialias != CAIRO_ANTIALIAS_NONE) _cairo_gl_composite_set_multisample (&setup); - + status = _cairo_gl_composite_begin (&setup, &ctx); if (unlikely (status)) goto cleanup_setup; @@ -1261,6 +1311,7 @@ cleanup_traps: if (draw_path_with_traps && !path->is_convex) _cairo_traps_fini (&traps); + CAIRO_TRACE_END (__func__); return status; } @@ -1272,6 +1323,7 @@ _cairo_gl_msaa_compositor_glyphs (const cairo_compositor_t *compositor, int num_glyphs, cairo_bool_t overlap) { + CAIRO_TRACE_BEGIN (__func__); cairo_int_status_t status; cairo_surface_t *src = NULL; int src_x, src_y; @@ -1280,17 +1332,23 @@ _cairo_gl_msaa_compositor_glyphs (const cairo_compositor_t *compositor, cairo_gl_surface_t *dst = (cairo_gl_surface_t *) composite->surface; query_surface_capabilities (dst); - if (! dst->supports_stencil) + if (! dst->supports_stencil) { + CAIRO_TRACE_END (__func__); return CAIRO_INT_STATUS_UNSUPPORTED; + } - if (composite->op == CAIRO_OPERATOR_CLEAR) + if (composite->op == CAIRO_OPERATOR_CLEAR) { + CAIRO_TRACE_END (__func__); return CAIRO_INT_STATUS_UNSUPPORTED; + } if (composite->is_bounded == FALSE) { cairo_surface_t* surface = _prepare_unbounded_surface (dst); - if (unlikely (surface == NULL)) + if (unlikely (surface == NULL)) { + CAIRO_TRACE_END (__func__); return CAIRO_INT_STATUS_UNSUPPORTED; + } status = _cairo_compositor_glyphs (compositor, surface, CAIRO_OPERATOR_SOURCE, @@ -1300,9 +1358,11 @@ _cairo_gl_msaa_compositor_glyphs (const cairo_compositor_t *compositor, if (unlikely (status)) { cairo_surface_destroy (surface); + CAIRO_TRACE_END (__func__); return status; } + CAIRO_TRACE_END (__func__); return _paint_back_unbounded_surface (compositor, composite, surface); } /* @@ -1351,7 +1411,7 @@ _cairo_gl_msaa_compositor_glyphs (const cairo_compositor_t *compositor, finish: if (src) cairo_surface_destroy (src); - + CAIRO_TRACE_END (__func__); return status; } @@ -1359,6 +1419,7 @@ static void _cairo_gl_msaa_compositor_init (cairo_compositor_t *compositor, const cairo_compositor_t *delegate) { + CAIRO_TRACE_BEGIN (__func__); compositor->delegate = delegate; compositor->lazy_init = TRUE; compositor->paint = _cairo_gl_msaa_compositor_paint; @@ -1366,6 +1427,7 @@ _cairo_gl_msaa_compositor_init (cairo_compositor_t *compositor, compositor->fill = _cairo_gl_msaa_compositor_fill; compositor->stroke = _cairo_gl_msaa_compositor_stroke; compositor->glyphs = _cairo_gl_msaa_compositor_glyphs; + CAIRO_TRACE_END (__func__); } const cairo_compositor_t * |