diff options
author | Carl Worth <cworth@cworth.org> | 2008-04-07 15:50:22 -0700 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2008-04-07 15:56:26 -0700 |
commit | 164e9c195c16fbed08539b859a06cc6f042fb5d9 (patch) | |
tree | 1379610f575d757a523380808bce1b3bbb7aafbc | |
parent | 8aa306ec08dcf0ae8803cdb1bda0fb31658f9e83 (diff) |
SVG: Fix generation of mask_id identifiers
In tests such as smask-mask (and others) the cairo_mask operation
is used in the construction of a mask. In this case, the single
document->mask_id value was being incremented at inappropriate
times.
We fix this by adding a new _cairo_svg_document_allocate_mask_id
that returns the current value and increments it. That way,
callers can hold onto this reliable value for the desired lifetime
that the code needs the identifier.
-rw-r--r-- | src/cairo-svg-surface.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index a900c245..df5253df 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -135,6 +135,9 @@ _cairo_svg_document_finish (cairo_svg_document_t *document); static cairo_svg_document_t * _cairo_svg_document_reference (cairo_svg_document_t *document); +static unsigned int +_cairo_svg_document_allocate_mask_id (cairo_svg_document_t *document); + static cairo_surface_t * _cairo_svg_surface_create_for_document (cairo_svg_document_t *document, cairo_content_t content, @@ -2036,6 +2039,7 @@ _cairo_svg_surface_mask (void *abstract_surface, cairo_output_stream_t *mask_stream; char buffer[64]; cairo_bool_t discard_filter = FALSE; + unsigned int mask_id; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return _cairo_svg_surface_analyze_operation (surface, op, source); @@ -2059,10 +2063,12 @@ _cairo_svg_surface_mask (void *abstract_surface, if (_cairo_output_stream_get_status (mask_stream)) return _cairo_output_stream_destroy (mask_stream); + mask_id = _cairo_svg_document_allocate_mask_id (document); + _cairo_output_stream_printf (mask_stream, "<mask id=\"mask%d\">\n" "%s", - document->mask_id, + mask_id, discard_filter ? "" : " <g filter=\"url(#alpha)\">\n"); status = _cairo_svg_surface_emit_paint (mask_stream, surface, op, mask, NULL); if (status) { @@ -2082,13 +2088,11 @@ _cairo_svg_surface_mask (void *abstract_surface, return status; snprintf (buffer, sizeof buffer, "mask=\"url(#mask%d)\"", - document->mask_id); + mask_id); status = _cairo_svg_surface_emit_paint (surface->xml_node, surface, op, source, buffer); if (status) return status; - document->mask_id++; - return CAIRO_STATUS_SUCCESS; } @@ -2378,6 +2382,12 @@ _cairo_svg_document_reference (cairo_svg_document_t *document) return document; } +static unsigned int +_cairo_svg_document_allocate_mask_id (cairo_svg_document_t *document) +{ + return document->mask_id++; +} + static cairo_status_t _cairo_svg_document_destroy (cairo_svg_document_t *document) { |