summaryrefslogtreecommitdiff
path: root/src/cairo-gl-msaa-compositor.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cairo-gl-msaa-compositor.c')
-rw-r--r--src/cairo-gl-msaa-compositor.c112
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 *