diff options
Diffstat (limited to 'src/cairo-surface.c')
-rw-r--r-- | src/cairo-surface.c | 384 |
1 files changed, 293 insertions, 91 deletions
diff --git a/src/cairo-surface.c b/src/cairo-surface.c index 24ad24901..2c5bcf7f7 100644 --- a/src/cairo-surface.c +++ b/src/cairo-surface.c @@ -50,6 +50,7 @@ #include "cairo-region-private.h" #include "cairo-surface-inline.h" #include "cairo-tee-surface-private.h" +#include "cairo-ttrace.h" /** * SECTION:cairo-surface @@ -490,22 +491,32 @@ cairo_surface_create_similar (cairo_surface_t *other, int width, int height) { + CAIRO_TRACE_BEGIN (__func__); cairo_surface_t *surface; cairo_status_t status; cairo_solid_pattern_t pattern; - if (unlikely (other->status)) + if (unlikely (other->status)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_create_in_error (other->status); - if (unlikely (other->finished)) + } + if (unlikely (other->finished)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_create_in_error (CAIRO_STATUS_SURFACE_FINISHED); - if (unlikely (width < 0 || height < 0)) + } + if (unlikely (width < 0 || height < 0)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_create_in_error (CAIRO_STATUS_INVALID_SIZE); + } - if (unlikely (! CAIRO_CONTENT_VALID (content))) + if (unlikely (! CAIRO_CONTENT_VALID (content))) { + CAIRO_TRACE_END (__func__); return _cairo_surface_create_in_error (CAIRO_STATUS_INVALID_CONTENT); - - if (unlikely (other->status)) + } + if (unlikely (other->status)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_create_in_error (other->status); + } /* We inherit the device scale, so create a larger surface */ width = width * other->device_transform.xx; @@ -519,16 +530,20 @@ cairo_surface_create_similar (cairo_surface_t *other, _cairo_format_from_content (content), width, height); - if (unlikely (surface->status)) + if (unlikely (surface->status)) { + CAIRO_TRACE_END (__func__); return surface; + } _cairo_surface_copy_similar_properties (surface, other); cairo_surface_set_device_scale (surface, other->device_transform.xx, other->device_transform.yy); - if (unlikely (surface->status)) + if (unlikely (surface->status)){ + CAIRO_TRACE_END (__func__); return surface; + } _cairo_pattern_init_solid (&pattern, CAIRO_COLOR_TRANSPARENT); status = _cairo_surface_paint (surface, @@ -541,6 +556,7 @@ cairo_surface_create_similar (cairo_surface_t *other, assert (surface->is_clear); + CAIRO_TRACE_END (__func__); return surface; } @@ -576,17 +592,26 @@ cairo_surface_create_similar_image (cairo_surface_t *other, int width, int height) { + CAIRO_TRACE_BEGIN (__func__); cairo_surface_t *image; - if (unlikely (other->status)) + if (unlikely (other->status)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_create_in_error (other->status); - if (unlikely (other->finished)) + } + if (unlikely (other->finished)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_create_in_error (CAIRO_STATUS_SURFACE_FINISHED); + } - if (unlikely (width < 0 || height < 0)) + if (unlikely (width < 0 || height < 0)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_create_in_error (CAIRO_STATUS_INVALID_SIZE); - if (unlikely (! CAIRO_FORMAT_VALID (format))) + } + if (unlikely (! CAIRO_FORMAT_VALID (format))) { + CAIRO_TRACE_END (__func__); return _cairo_surface_create_in_error (CAIRO_STATUS_INVALID_FORMAT); + } image = NULL; if (other->backend->create_similar_image) @@ -597,6 +622,7 @@ cairo_surface_create_similar_image (cairo_surface_t *other, assert (image->is_clear); + CAIRO_TRACE_END (__func__); return image; } slim_hidden_def (cairo_surface_create_similar_image); @@ -635,6 +661,7 @@ cairo_image_surface_t * _cairo_surface_map_to_image (cairo_surface_t *surface, const cairo_rectangle_int_t *extents) { + CAIRO_TRACE_BEGIN (__func__); cairo_image_surface_t *image = NULL; assert (extents != NULL); @@ -646,6 +673,7 @@ _cairo_surface_map_to_image (cairo_surface_t *surface, if (image == NULL) image = _cairo_image_surface_clone_subimage (surface, extents); + CAIRO_TRACE_END (__func__); return image; } @@ -674,6 +702,7 @@ cairo_int_status_t _cairo_surface_unmap_image (cairo_surface_t *surface, cairo_image_surface_t *image) { + CAIRO_TRACE_BEGIN (__func__); cairo_surface_pattern_t pattern; cairo_rectangle_int_t extents; cairo_clip_t *clip; @@ -696,8 +725,10 @@ _cairo_surface_unmap_image (cairo_surface_t *surface, ! _cairo_image_surface_is_clone (image)) { status = surface->backend->unmap_image (surface, image); - if (status != CAIRO_INT_STATUS_UNSUPPORTED) + if (status != CAIRO_INT_STATUS_UNSUPPORTED) { + CAIRO_TRACE_END (__func__); return status; + } } _cairo_pattern_init_for_surface (&pattern, &image->base); @@ -727,6 +758,7 @@ destroy: cairo_surface_finish (&image->base); cairo_surface_destroy (&image->base); + CAIRO_TRACE_END (__func__); return status; } @@ -762,19 +794,25 @@ cairo_surface_t * cairo_surface_map_to_image (cairo_surface_t *surface, const cairo_rectangle_int_t *extents) { + CAIRO_TRACE_BEGIN (__func__); cairo_rectangle_int_t rect; cairo_image_surface_t *image; cairo_status_t status; - if (unlikely (surface->status)) + if (unlikely (surface->status)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_create_in_error (surface->status); - if (unlikely (surface->finished)) + } + if (unlikely (surface->finished)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_create_in_error (CAIRO_STATUS_SURFACE_FINISHED); + } if (extents == NULL) { - if (unlikely (! surface->backend->get_extents (surface, &rect))) + if (unlikely (! surface->backend->get_extents (surface, &rect))) { + CAIRO_TRACE_END (__func__); return _cairo_surface_create_in_error (CAIRO_STATUS_INVALID_SIZE); - + } extents = ▭ } else { cairo_rectangle_int_t surface_extents; @@ -782,8 +820,10 @@ cairo_surface_map_to_image (cairo_surface_t *surface, /* If this surface is bounded, we can't map parts * that are outside of it. */ if (likely (surface->backend->get_extents (surface, &surface_extents))) { - if (unlikely (! _cairo_rectangle_contains_rectangle (&surface_extents, extents))) + if (unlikely (! _cairo_rectangle_contains_rectangle (&surface_extents, extents))) { + CAIRO_TRACE_END (__func__); return _cairo_surface_create_in_error (CAIRO_STATUS_INVALID_SIZE); + } } } @@ -792,6 +832,7 @@ cairo_surface_map_to_image (cairo_surface_t *surface, status = image->base.status; if (unlikely (status)) { cairo_surface_destroy (&image->base); + CAIRO_TRACE_END (__func__); return _cairo_surface_create_in_error (status); } @@ -800,6 +841,7 @@ cairo_surface_map_to_image (cairo_surface_t *surface, image = _cairo_image_surface_clone_subimage (surface, extents); } + CAIRO_TRACE_END (__func__); return &image->base; } @@ -822,6 +864,7 @@ void cairo_surface_unmap_image (cairo_surface_t *surface, cairo_surface_t *image) { + CAIRO_TRACE_BEGIN (__func__); cairo_int_status_t status = CAIRO_STATUS_SUCCESS; if (unlikely (surface->status)) { @@ -850,12 +893,14 @@ cairo_surface_unmap_image (cairo_surface_t *surface, if (unlikely (status)) _cairo_surface_set_error (surface, status); + CAIRO_TRACE_END (__func__); return; error: _cairo_surface_set_error (surface, status); cairo_surface_finish (image); cairo_surface_destroy (image); + CAIRO_TRACE_END (__func__); } cairo_surface_t * @@ -865,12 +910,15 @@ _cairo_surface_create_scratch (cairo_surface_t *other, int height, const cairo_color_t *color) { + CAIRO_TRACE_BEGIN (__func__); cairo_surface_t *surface; cairo_status_t status; cairo_solid_pattern_t pattern; - if (unlikely (other->status)) + if (unlikely (other->status)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_create_in_error (other->status); + } surface = NULL; if (other->backend->create_similar) @@ -880,13 +928,17 @@ _cairo_surface_create_scratch (cairo_surface_t *other, _cairo_format_from_content (content), width, height); - if (unlikely (surface->status)) + if (unlikely (surface->status)) { + CAIRO_TRACE_END (__func__); return surface; + } _cairo_surface_copy_similar_properties (surface, other); - if (unlikely (surface->status)) + if (unlikely (surface->status)){ + CAIRO_TRACE_END (__func__); return surface; + } if (color) { _cairo_pattern_init_solid (&pattern, color); @@ -900,6 +952,7 @@ _cairo_surface_create_scratch (cairo_surface_t *other, } } + CAIRO_TRACE_END (__func__); return surface; } @@ -974,14 +1027,19 @@ slim_hidden_def (cairo_surface_reference); void cairo_surface_destroy (cairo_surface_t *surface) { + CAIRO_TRACE_BEGIN (__func__); if (surface == NULL || - CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) + CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) { + CAIRO_TRACE_END (__func__); return; + } assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&surface->ref_count)); - if (! _cairo_reference_count_dec_and_test (&surface->ref_count)) + if (! _cairo_reference_count_dec_and_test (&surface->ref_count)) { + CAIRO_TRACE_END (__func__); return; + } assert (surface->snapshot_of == NULL); @@ -990,8 +1048,10 @@ cairo_surface_destroy (cairo_surface_t *surface) /* We may have been referenced by a snapshot prior to have * detaching it with the copy-on-write. */ - if (CAIRO_REFERENCE_COUNT_GET_VALUE (&surface->ref_count)) + if (CAIRO_REFERENCE_COUNT_GET_VALUE (&surface->ref_count)) { + CAIRO_TRACE_END (__func__); return; + } _cairo_surface_finish (surface); } @@ -1011,6 +1071,7 @@ cairo_surface_destroy (cairo_surface_t *surface) assert (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&surface->ref_count)); free (surface); + CAIRO_TRACE_END (__func__); } slim_hidden_def(cairo_surface_destroy); @@ -1088,14 +1149,21 @@ _cairo_surface_finish (cairo_surface_t *surface) void cairo_surface_finish (cairo_surface_t *surface) { - if (surface == NULL) + CAIRO_TRACE_BEGIN (__func__); + if (surface == NULL) { + CAIRO_TRACE_END (__func__); return; + } - if (CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) + if (CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) { + CAIRO_TRACE_END (__func__); return; + } - if (surface->finished) + if (surface->finished) { + CAIRO_TRACE_END (__func__); return; + } /* We have to be careful when decoupling potential reference cycles */ cairo_surface_reference (surface); @@ -1105,6 +1173,7 @@ cairo_surface_finish (cairo_surface_t *surface) _cairo_surface_finish (surface); cairo_surface_destroy (surface); + CAIRO_TRACE_END (__func__); } slim_hidden_def (cairo_surface_finish); @@ -1207,6 +1276,7 @@ cairo_surface_get_mime_data (cairo_surface_t *surface, const unsigned char **data, unsigned long *length) { + CAIRO_TRACE_BEGIN (__func__); cairo_user_data_slot_t *slots; int i, num_slots; @@ -1214,8 +1284,10 @@ cairo_surface_get_mime_data (cairo_surface_t *surface, *length = 0; /* Prevent reads of the array during teardown */ - if (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&surface->ref_count)) + if (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&surface->ref_count)) { + CAIRO_TRACE_END (__func__); return; + } /* The number of mime-types attached to a surface is usually small, * typically zero. Therefore it is quicker to do a strcmp() against @@ -1230,9 +1302,11 @@ cairo_surface_get_mime_data (cairo_surface_t *surface, *data = mime_data->data; *length = mime_data->length; + CAIRO_TRACE_END (__func__); return; } } + CAIRO_TRACE_END (__func__); } slim_hidden_def (cairo_surface_get_mime_data); @@ -1370,28 +1444,41 @@ cairo_surface_set_mime_data (cairo_surface_t *surface, cairo_destroy_func_t destroy, void *closure) { + CAIRO_TRACE_BEGIN (__func__); cairo_status_t status; cairo_mime_data_t *mime_data; - if (CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) + if (CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) { + CAIRO_TRACE_END (__func__); return surface->status; + } - if (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&surface->ref_count)) + if (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&surface->ref_count)) { + CAIRO_TRACE_END (__func__); return _cairo_error (CAIRO_STATUS_SURFACE_FINISHED); + } - if (unlikely (surface->status)) + if (unlikely (surface->status)) { + CAIRO_TRACE_END (__func__); return surface->status; - if (unlikely (surface->finished)) + } + if (unlikely (surface->finished)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + } status = _cairo_intern_string (&mime_type, -1); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_set_error (surface, status); + } if (data != NULL) { mime_data = malloc (sizeof (cairo_mime_data_t)); - if (unlikely (mime_data == NULL)) + if (unlikely (mime_data == NULL)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_NO_MEMORY)); + } CAIRO_REFERENCE_COUNT_INIT (&mime_data->ref_count, 1); @@ -1408,10 +1495,10 @@ cairo_surface_set_mime_data (cairo_surface_t *surface, _cairo_mime_data_destroy); if (unlikely (status)) { free (mime_data); - + CAIRO_TRACE_END (__func__); return _cairo_surface_set_error (surface, status); } - + CAIRO_TRACE_END (__func__); return CAIRO_STATUS_SUCCESS; } slim_hidden_def (cairo_surface_set_mime_data); @@ -1468,24 +1555,32 @@ cairo_status_t _cairo_surface_copy_mime_data (cairo_surface_t *dst, cairo_surface_t *src) { + CAIRO_TRACE_BEGIN (__func__); cairo_status_t status; - if (dst->status) + if (dst->status) { + CAIRO_TRACE_END (__func__); return dst->status; + } - if (src->status) + if (src->status) { + CAIRO_TRACE_END (__func__); return _cairo_surface_set_error (dst, src->status); + } /* first copy the mime-data, discarding any already set on dst */ status = _cairo_user_data_array_copy (&dst->mime_data, &src->mime_data); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_set_error (dst, status); + } /* now increment the reference counters for the copies */ _cairo_user_data_array_foreach (&dst->mime_data, _cairo_mime_data_reference, NULL); + CAIRO_TRACE_END (__func__); return CAIRO_STATUS_SUCCESS; } @@ -1594,17 +1689,23 @@ _cairo_surface_flush (cairo_surface_t *surface, unsigned flags) void cairo_surface_flush (cairo_surface_t *surface) { + CAIRO_TRACE_BEGIN (__func__); cairo_status_t status; - if (surface->status) + if (surface->status) { + CAIRO_TRACE_END (__func__); return; + } - if (surface->finished) + if (surface->finished) { + CAIRO_TRACE_END (__func__); return; + } status = _cairo_surface_flush (surface, 0); if (unlikely (status)) _cairo_surface_set_error (surface, status); + CAIRO_TRACE_END (__func__); } slim_hidden_def (cairo_surface_flush); @@ -1988,23 +2089,31 @@ _cairo_surface_acquire_source_image (cairo_surface_t *surface, cairo_image_surface_t **image_out, void **image_extra) { + CAIRO_TRACE_BEGIN (__func__); cairo_status_t status; - if (unlikely (surface->status)) + if (unlikely (surface->status)) { + CAIRO_TRACE_END (__func__); return surface->status; + } assert (!surface->finished); - if (surface->backend->acquire_source_image == NULL) + if (surface->backend->acquire_source_image == NULL) { + CAIRO_TRACE_END (__func__); return CAIRO_INT_STATUS_UNSUPPORTED; + } status = surface->backend->acquire_source_image (surface, image_out, image_extra); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_set_error (surface, status); + } _cairo_debug_check_image_surface_is_defined (&(*image_out)->base); + CAIRO_TRACE_END (__func__); return CAIRO_STATUS_SUCCESS; } @@ -2013,14 +2122,18 @@ _cairo_surface_default_acquire_source_image (void *_surface, cairo_image_surface_t **image_out, void **image_extra) { + CAIRO_TRACE_BEGIN (__func__); cairo_surface_t *surface = _surface; cairo_rectangle_int_t extents; - if (unlikely (! surface->backend->get_extents (surface, &extents))) + if (unlikely (! surface->backend->get_extents (surface, &extents))) { + CAIRO_TRACE_END (__func__); return _cairo_error (CAIRO_STATUS_INVALID_SIZE); + } *image_out = _cairo_surface_map_to_image (surface, &extents); *image_extra = NULL; + CAIRO_TRACE_END (__func__); return (*image_out)->base.status; } @@ -2120,27 +2233,40 @@ _cairo_surface_paint (cairo_surface_t *surface, const cairo_pattern_t *source, const cairo_clip_t *clip) { + CAIRO_TRACE_BEGIN (__func__); cairo_int_status_t status; TRACE ((stderr, "%s\n", __FUNCTION__)); - if (unlikely (surface->status)) + if (unlikely (surface->status)) { + CAIRO_TRACE_END (__func__); return surface->status; - if (unlikely (surface->finished)) + } + if (unlikely (surface->finished)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + } - if (_cairo_clip_is_all_clipped (clip)) + if (_cairo_clip_is_all_clipped (clip)) { + CAIRO_TRACE_END (__func__); return CAIRO_STATUS_SUCCESS; + } status = _pattern_has_error (source); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } - if (nothing_to_do (surface, op, source)) + if (nothing_to_do (surface, op, source)) { + CAIRO_TRACE_END (__func__); return CAIRO_STATUS_SUCCESS; + } status = _cairo_surface_begin_modification (surface); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } status = surface->backend->paint (surface, op, source, clip); if (status != CAIRO_INT_STATUS_NOTHING_TO_DO) { @@ -2148,6 +2274,7 @@ _cairo_surface_paint (cairo_surface_t *surface, surface->serial++; } + CAIRO_TRACE_END (__func__); return _cairo_surface_set_error (surface, status); } @@ -2158,38 +2285,54 @@ _cairo_surface_mask (cairo_surface_t *surface, const cairo_pattern_t *mask, const cairo_clip_t *clip) { + CAIRO_TRACE_BEGIN (__func__); cairo_int_status_t status; TRACE ((stderr, "%s\n", __FUNCTION__)); - if (unlikely (surface->status)) + if (unlikely (surface->status)) { + CAIRO_TRACE_END (__func__); return surface->status; - if (unlikely (surface->finished)) + } + if (unlikely (surface->finished)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + } - if (_cairo_clip_is_all_clipped (clip)) + if (_cairo_clip_is_all_clipped (clip)) { + CAIRO_TRACE_END (__func__); return CAIRO_STATUS_SUCCESS; + } /* If the mask is blank, this is just an expensive no-op */ if (_cairo_pattern_is_clear (mask) && _cairo_operator_bounded_by_mask (op)) { + CAIRO_TRACE_END (__func__); return CAIRO_STATUS_SUCCESS; } status = _pattern_has_error (source); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } status = _pattern_has_error (mask); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } - if (nothing_to_do (surface, op, source)) + if (nothing_to_do (surface, op, source)) { + CAIRO_TRACE_END (__func__); return CAIRO_STATUS_SUCCESS; + } status = _cairo_surface_begin_modification (surface); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } status = surface->backend->mask (surface, op, source, mask, clip); if (status != CAIRO_INT_STATUS_NOTHING_TO_DO) { @@ -2197,6 +2340,7 @@ _cairo_surface_mask (cairo_surface_t *surface, surface->serial++; } + CAIRO_TRACE_END (__func__); return _cairo_surface_set_error (surface, status); } @@ -2217,35 +2361,50 @@ _cairo_surface_fill_stroke (cairo_surface_t *surface, cairo_antialias_t stroke_antialias, const cairo_clip_t *clip) { + CAIRO_TRACE_BEGIN (__func__); cairo_int_status_t status; TRACE ((stderr, "%s\n", __FUNCTION__)); - if (unlikely (surface->status)) + if (unlikely (surface->status)) { + CAIRO_TRACE_END (__func__); return surface->status; - if (unlikely (surface->finished)) - return _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); - - if (_cairo_clip_is_all_clipped (clip)) - return CAIRO_STATUS_SUCCESS; + } - if (surface->is_clear && - fill_op == CAIRO_OPERATOR_CLEAR && - stroke_op == CAIRO_OPERATOR_CLEAR) - { - return CAIRO_STATUS_SUCCESS; - } + if (unlikely (surface->finished)) { + if (unlikely (surface->status)) { + CAIRO_TRACE_END (__func__); + return _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + } + if (_cairo_clip_is_all_clipped (clip)) { + CAIRO_TRACE_END (__func__); + return CAIRO_STATUS_SUCCESS; + } + + if (surface->is_clear && + fill_op == CAIRO_OPERATOR_CLEAR && + stroke_op == CAIRO_OPERATOR_CLEAR) { + CAIRO_TRACE_END (__func__); + return CAIRO_STATUS_SUCCESS; + } + } - status = _pattern_has_error (fill_source); - if (unlikely (status)) + status = _pattern_has_error (fill_source); + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } status = _pattern_has_error (stroke_source); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } status = _cairo_surface_begin_modification (surface); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } if (surface->backend->fill_stroke) { cairo_matrix_t dev_ctm = *stroke_ctm; @@ -2284,6 +2443,7 @@ _cairo_surface_fill_stroke (cairo_surface_t *surface, surface->serial++; } + CAIRO_TRACE_END (__func__); return _cairo_surface_set_error (surface, status); } @@ -2299,27 +2459,40 @@ _cairo_surface_stroke (cairo_surface_t *surface, cairo_antialias_t antialias, const cairo_clip_t *clip) { + CAIRO_TRACE_BEGIN (__func__); cairo_int_status_t status; TRACE ((stderr, "%s\n", __FUNCTION__)); - if (unlikely (surface->status)) + if (unlikely (surface->status)) { + CAIRO_TRACE_END (__func__); return surface->status; - if (unlikely (surface->finished)) + } + if (unlikely (surface->finished)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); + } - if (_cairo_clip_is_all_clipped (clip)) + if (_cairo_clip_is_all_clipped (clip)) { + CAIRO_TRACE_END (__func__); return CAIRO_STATUS_SUCCESS; + } status = _pattern_has_error (source); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } - if (nothing_to_do (surface, op, source)) + if (nothing_to_do (surface, op, source)) { + CAIRO_TRACE_END (__func__); return CAIRO_STATUS_SUCCESS; + } status = _cairo_surface_begin_modification (surface); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } status = surface->backend->stroke (surface, op, source, path, stroke_style, @@ -2331,6 +2504,7 @@ _cairo_surface_stroke (cairo_surface_t *surface, surface->serial++; } + CAIRO_TRACE_END (__func__); return _cairo_surface_set_error (surface, status); } @@ -2344,27 +2518,39 @@ _cairo_surface_fill (cairo_surface_t *surface, cairo_antialias_t antialias, const cairo_clip_t *clip) { + CAIRO_TRACE_BEGIN (__func__); cairo_int_status_t status; TRACE ((stderr, "%s\n", __FUNCTION__)); - if (unlikely (surface->status)) + if (unlikely (surface->status)) { + CAIRO_TRACE_END (__func__); return surface->status; - if (unlikely (surface->finished)) + } + if (unlikely (surface->finished)) { + CAIRO_TRACE_END (__func__); return _cairo_surface_set_error (surface, _cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); - - if (_cairo_clip_is_all_clipped (clip)) + } + if (_cairo_clip_is_all_clipped (clip)) { + CAIRO_TRACE_END (__func__); return CAIRO_STATUS_SUCCESS; + } status = _pattern_has_error (source); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } - if (nothing_to_do (surface, op, source)) + if (nothing_to_do (surface, op, source)) { + CAIRO_TRACE_END (__func__); return CAIRO_STATUS_SUCCESS; + } status = _cairo_surface_begin_modification (surface); - if (unlikely (status)) + if (unlikely (status)) { + CAIRO_TRACE_END (__func__); return status; + } status = surface->backend->fill (surface, op, source, path, fill_rule, @@ -2375,6 +2561,7 @@ _cairo_surface_fill (cairo_surface_t *surface, surface->serial++; } + CAIRO_TRACE_END (__func__); return _cairo_surface_set_error (surface, status); } @@ -2395,20 +2582,27 @@ _cairo_surface_fill (cairo_surface_t *surface, void cairo_surface_copy_page (cairo_surface_t *surface) { - if (unlikely (surface->status)) + CAIRO_TRACE_BEGIN (__func__); + if (unlikely (surface->status)) { + CAIRO_TRACE_END (__func__); return; + } assert (surface->snapshot_of == NULL); if (unlikely (surface->finished)) { _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED); + CAIRO_TRACE_END (__func__); return; } /* It's fine if some backends don't implement copy_page */ - if (surface->backend->copy_page == NULL) + if (surface->backend->copy_page == NULL) { + CAIRO_TRACE_END (__func__); return; + } + CAIRO_TRACE_END (__func__); _cairo_surface_set_error (surface, surface->backend->copy_page (surface)); } slim_hidden_def (cairo_surface_copy_page); @@ -2428,26 +2622,34 @@ slim_hidden_def (cairo_surface_copy_page); void cairo_surface_show_page (cairo_surface_t *surface) { + CAIRO_TRACE_BEGIN (__func__); cairo_status_t status; - if (unlikely (surface->status)) + if (unlikely (surface->status)) { + CAIRO_TRACE_END (__func__); return; + } if (unlikely (surface->finished)) { _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED); + CAIRO_TRACE_END (__func__); return; } status = _cairo_surface_begin_modification (surface); if (unlikely (status)) { _cairo_surface_set_error (surface, status); + CAIRO_TRACE_END (__func__); return; } /* It's fine if some backends don't implement show_page */ - if (surface->backend->show_page == NULL) + if (surface->backend->show_page == NULL) { + CAIRO_TRACE_END (__func__); return; + } + CAIRO_TRACE_END (__func__); _cairo_surface_set_error (surface, surface->backend->show_page (surface)); } slim_hidden_def (cairo_surface_show_page); |