summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2008-04-07 15:50:22 -0700
committerCarl Worth <cworth@cworth.org>2008-04-07 15:56:26 -0700
commit164e9c195c16fbed08539b859a06cc6f042fb5d9 (patch)
tree1379610f575d757a523380808bce1b3bbb7aafbc
parent8aa306ec08dcf0ae8803cdb1bda0fb31658f9e83 (diff)
downloadcairo-164e9c195c16fbed08539b859a06cc6f042fb5d9.tar.gz
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.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c
index a900c245d..df5253df3 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)
{