--- src/cairo-svg-surface.c	2010-12-25 09:21:34.000000000 -0500
+++ src.patch/cairo-svg-surface.c	2011-02-07 13:08:03.389794002 -0500
@@ -81,6 +81,7 @@ static const cairo_svg_version_t _cairo_
 };
 
 #define CAIRO_SVG_VERSION_LAST ARRAY_LENGTH (_cairo_svg_versions)
+#define CAIRO_SVG_ID_LENGTH 16
 
 static void
 _cairo_svg_surface_emit_path (cairo_output_stream_t	*output,
@@ -123,6 +124,8 @@ struct cairo_svg_document {
     cairo_output_stream_t *xml_node_defs;
     cairo_output_stream_t *xml_node_glyphs;
 
+    char id_string[CAIRO_SVG_ID_LENGTH];
+
     unsigned int linear_pattern_id;
     unsigned int radial_pattern_id;
     unsigned int pattern_id;
@@ -156,6 +159,9 @@ _cairo_svg_document_reference (cairo_svg
 static unsigned int
 _cairo_svg_document_allocate_mask_id (cairo_svg_document_t *document);
 
+static void
+_cairo_svg_document_generate_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,
@@ -428,8 +434,9 @@ _cairo_svg_surface_clipper_intersect_cli
 	return CAIRO_STATUS_SUCCESS;
 
     _cairo_output_stream_printf (document->xml_node_defs,
-				 "<clipPath id=\"clip%d\">\n"
+				 "<clipPath id=\"clip%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d\">\n"
 				 "  <path ",
+				 document->id_string,
 				 document->clip_id);
     _cairo_svg_surface_emit_path (document->xml_node_defs, path, NULL);
 
@@ -438,8 +445,9 @@ _cairo_svg_surface_clipper_intersect_cli
 				 "</clipPath>\n");
 
     _cairo_output_stream_printf (surface->xml_node,
-				 "<g clip-path=\"url(#clip%d)\" "
+				 "<g clip-path=\"url(#clip%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d)\" "
 				 "clip-rule=\"%s\">\n",
+				 document->id_string,
 				 document->clip_id,
 				 fill_rule == CAIRO_FILL_RULE_EVEN_ODD ?
 				 "evenodd" : "nonzero");
@@ -555,6 +563,9 @@ _cairo_svg_surface_create_for_stream_int
     /* the ref count should be 2 at this point */
     assert (status == CAIRO_STATUS_SUCCESS);
 
+    /* attach a hopefully unique printable string as an identifier */
+    _cairo_svg_document_generate_id (document);
+
     return surface;
 }
 
@@ -736,6 +747,16 @@ _cairo_svg_surface_emit_path (cairo_outp
     _cairo_output_stream_printf (output, "\"");
 }
 
+static void
+_cairo_svg_document_generate_id (cairo_svg_document_t	*document)
+{
+    unsigned char i;
+
+    for (i=0; i<CAIRO_SVG_ID_LENGTH; i++) {
+	document->id_string[i] = (rand() % ('z'-'a')) + 'a';
+    }
+}
+
 static cairo_int_status_t
 _cairo_svg_document_emit_outline_glyph_data (cairo_svg_document_t	*document,
 					     cairo_scaled_font_t	*scaled_font,
@@ -824,7 +845,8 @@ _cairo_svg_document_emit_glyph (cairo_sv
     cairo_status_t	     status;
 
     _cairo_output_stream_printf (document->xml_node_glyphs,
-				 "<symbol overflow=\"visible\" id=\"glyph%d-%d\">\n",
+				 "<symbol overflow=\"visible\" id=\"glyph%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d-%d\">\n",
+				 document->id_string,
 				 font_id,
 				 subset_glyph_index);
 
@@ -1007,14 +1029,15 @@ _cairo_svg_surface_emit_alpha_filter (ca
 	return;
 
     _cairo_output_stream_printf (document->xml_node_defs,
-				 "<filter id=\"alpha\" "
+				 "<filter id=\"alpha%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s\" "
 				 "filterUnits=\"objectBoundingBox\" "
 				 "x=\"0%%\" y=\"0%%\" "
 				 "width=\"100%%\" height=\"100%%\">\n"
 				 "  <feColorMatrix type=\"matrix\" "
 				 "in=\"SourceGraphic\" "
 				 "values=\"0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0\"/>\n"
-				 "</filter>\n");
+				 "</filter>\n",
+				 document->id_string);
 
     document->alpha_filter = TRUE;
 }
@@ -1278,7 +1301,8 @@ _cairo_svg_surface_emit_surface (cairo_s
     assert (is_bounded);
 
     _cairo_output_stream_printf (document->xml_node_defs,
-				 "<image id=\"image%d\" width=\"%d\" height=\"%d\"",
+				 "<image id=\"image%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d\" width=\"%d\" height=\"%d\"",
+				 document->id_string,
 				 surface->unique_id,
 				 extents.width, extents.height);
 
@@ -1334,9 +1358,10 @@ _cairo_svg_surface_emit_composite_surfac
 	assert (is_bounded);
 
 	_cairo_output_stream_printf (output,
-				     "<pattern id=\"pattern%d\" "
+				     "<pattern id=\"pattern%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d\" "
 				     "patternUnits=\"userSpaceOnUse\" "
 				     "width=\"%d\" height=\"%d\" ",
+				     svg_surface->document->id_string,
 				     pattern_id,
 				     extents.width, extents.height);
 	_cairo_svg_surface_emit_transform (output,
@@ -1346,7 +1371,8 @@ _cairo_svg_surface_emit_composite_surfac
     }
 
     _cairo_output_stream_printf (output,
-				 "<use xlink:href=\"#image%d\"",
+				 "<use xlink:href=\"#image%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d\"",
+				 svg_surface->document->id_string,
 				 pattern->surface->unique_id);
     if (extra_attributes)
 	_cairo_output_stream_printf (output, " %s", extra_attributes);
@@ -1415,9 +1441,10 @@ _cairo_svg_surface_emit_recording_surfac
     if (! svg_surface->is_base_clip_emitted) {
 	svg_surface->is_base_clip_emitted = TRUE;
 	_cairo_output_stream_printf (document->xml_node_defs,
-				     "<clipPath id=\"clip%d\">\n"
+				     "<clipPath id=\"clip%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d\">\n"
 				     "  <rect width=\"%f\" height=\"%f\"/>\n"
 				     "</clipPath>\n",
+				     document->id_string,
 				     svg_surface->base_clip,
 				     svg_surface->width,
 				     svg_surface->height);
@@ -1426,16 +1453,21 @@ _cairo_svg_surface_emit_recording_surfac
     if (source->content == CAIRO_CONTENT_ALPHA) {
 	_cairo_svg_surface_emit_alpha_filter (document);
 	_cairo_output_stream_printf (document->xml_node_defs,
-				     "<g id=\"surface%d\" "
-				     "clip-path=\"url(#clip%d)\" "
-				     "filter=\"url(#alpha)\">\n",
+				     "<g id=\"surface%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d\" "
+				     "clip-path=\"url(#clip%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d)\" "
+				     "filter=\"url(#alpha%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s)\">\n",
+				     document->id_string,
 				     source->base.unique_id,
-				     svg_surface->base_clip);
+				     document->id_string,
+				     svg_surface->base_clip,
+				     document->id_string);
     } else {
 	_cairo_output_stream_printf (document->xml_node_defs,
-				     "<g id=\"surface%d\" "
-				     "clip-path=\"url(#clip%d)\">\n",
+				     "<g id=\"surface%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d\" "
+				     "clip-path=\"url(#clip%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d)\">\n",
+				     document->id_string,
 				     source->base.unique_id,
+				     document->id_string,
 				     svg_surface->base_clip);
     }
 
@@ -1496,9 +1528,10 @@ _cairo_svg_surface_emit_composite_record
 
     if (pattern_id != invalid_pattern_id) {
 	_cairo_output_stream_printf (output,
-				     "<pattern id=\"pattern%d\" "
+				     "<pattern id=\"pattern%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d\" "
 				     "patternUnits=\"userSpaceOnUse\" "
 				     "width=\"%d\" height=\"%d\"",
+				     document->id_string,
 				     pattern_id,
 				     recording_surface->extents.width,
 				     recording_surface->extents.height);
@@ -1507,7 +1540,8 @@ _cairo_svg_surface_emit_composite_record
     }
 
     _cairo_output_stream_printf (output,
-				 "<use xlink:href=\"#surface%d\"",
+				 "<use xlink:href=\"#surface%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d\"",
+				 document->id_string,
 				 recording_surface->base.unique_id);
 
     if (pattern_id == invalid_pattern_id) {
@@ -1587,8 +1621,9 @@ _cairo_svg_surface_emit_surface_pattern 
 	return status;
 
     _cairo_output_stream_printf (style,
-				 "%s:url(#pattern%d);",
+				 "%s:url(#pattern%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d);",
 				 is_stroke ? "stroke" : "fill",
+				 document->id_string,
 				 pattern_id);
 
     return CAIRO_STATUS_SUCCESS;
@@ -1797,9 +1832,10 @@ _cairo_svg_surface_emit_linear_pattern (
     y1 = _cairo_fixed_to_double (pattern->p2.y);
 
     _cairo_output_stream_printf (document->xml_node_defs,
-				 "<linearGradient id=\"linear%d\" "
+				 "<linearGradient id=\"linear%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d\" "
 				 "gradientUnits=\"userSpaceOnUse\" "
 				 "x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" ",
+				 document->id_string,
 				 document->linear_pattern_id,
 				 x0, y0, x1, y1);
 
@@ -1817,7 +1853,8 @@ _cairo_svg_surface_emit_linear_pattern (
 				 "</linearGradient>\n");
 
     _cairo_output_stream_printf (style,
-				 "%s:url(#linear%d);",
+				 "%s:url(#linear%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d);",
+				 document->id_string,
 				 is_stroke ? "stroke" : "fill",
 				 document->linear_pattern_id);
 
@@ -1875,10 +1912,11 @@ _cairo_svg_surface_emit_radial_pattern (
 	unsigned int n_stops = pattern->base.n_stops;
 
 	_cairo_output_stream_printf (document->xml_node_defs,
-				     "<radialGradient id=\"radial%d\" "
+				     "<radialGradient id=\"radial%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d\" "
 				     "gradientUnits=\"userSpaceOnUse\" "
 				     "cx=\"%f\" cy=\"%f\" "
 				     "fx=\"%f\" fy=\"%f\" r=\"%f\" ",
+				     document->id_string,
 				     document->radial_pattern_id,
 				     x1, y1,
 				     x1, y1, r1);
@@ -1956,10 +1994,11 @@ _cairo_svg_surface_emit_radial_pattern (
 	}
 
 	_cairo_output_stream_printf (document->xml_node_defs,
-				     "<radialGradient id=\"radial%d\" "
+				     "<radialGradient id=\"radial%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d\" "
 				     "gradientUnits=\"userSpaceOnUse\" "
 				     "cx=\"%f\" cy=\"%f\" "
 				     "fx=\"%f\" fy=\"%f\" r=\"%f\" ",
+				     document->id_string,
 				     document->radial_pattern_id,
 				     x1, y1,
 				     fx, fy, r1);
@@ -2004,8 +2043,9 @@ _cairo_svg_surface_emit_radial_pattern (
 				 "</radialGradient>\n");
 
     _cairo_output_stream_printf (style,
-				 "%s:url(#radial%d);",
+				 "%s:url(#radial%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d);",
 				 is_stroke ? "stroke" : "fill",
+				 document->id_string,
 				 document->radial_pattern_id);
 
     document->radial_pattern_id++;
@@ -2399,11 +2439,15 @@ _cairo_svg_surface_mask (void		    *abst
 
     mask_id = _cairo_svg_document_allocate_mask_id (document);
 
+    snprintf (buffer, sizeof buffer, "  <g filter=\"url(#alpha%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s)\">\n",
+	      document->id_string);
+
     _cairo_output_stream_printf (mask_stream,
-				 "<mask id=\"mask%d\">\n"
+				 "<mask id=\"mask%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d\">\n"
 				 "%s",
+				 document->id_string,
 				 mask_id,
-				 discard_filter ? "" : "  <g filter=\"url(#alpha)\">\n");
+				 discard_filter ? "" : buffer);
     status = _cairo_svg_surface_emit_paint (mask_stream, surface, CAIRO_OPERATOR_OVER, mask, source, NULL);
     if (unlikely (status)) {
 	cairo_status_t ignore = _cairo_output_stream_destroy (mask_stream);
@@ -2421,7 +2465,8 @@ _cairo_svg_surface_mask (void		    *abst
     if (unlikely (status))
 	return status;
 
-    snprintf (buffer, sizeof buffer, "mask=\"url(#mask%d)\"",
+    snprintf (buffer, sizeof buffer, "mask=\"url(#mask%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d)\"",
+	      document->id_string,
 	      mask_id);
     status = _cairo_svg_surface_emit_paint (surface->xml_node, surface, op, source, 0, buffer);
     if (unlikely (status))
@@ -2532,8 +2577,9 @@ _cairo_svg_surface_show_glyphs (void			*
 	    return status;
 
 	_cairo_output_stream_printf (surface->xml_node,
-				     "  <use xlink:href=\"#glyph%d-%d\" "
+				     "  <use xlink:href=\"#glyph%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d-%d\" "
 				     "x=\"%f\" y=\"%f\"/>\n",
+				     document->id_string,
 				     subset_glyph.font_id,
                                      subset_glyph.subset_glyph_index,
 				     glyphs[i].x, glyphs[i].y);
@@ -2780,7 +2826,8 @@ _cairo_svg_document_finish (cairo_svg_do
 		page = _cairo_array_index (&surface->page_set, i);
 		_cairo_output_stream_printf (output, "<page>\n");
 		_cairo_output_stream_printf (output,
-					     "<g id=\"surface%d\">\n",
+					     "<g id=\"surface%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d\">\n",
+					     document->id_string,
 					     page->surface_id);
 		_cairo_memory_stream_copy (page->xml_node, output);
 		_cairo_output_stream_printf (output, "</g>\n</page>\n");
@@ -2789,7 +2836,8 @@ _cairo_svg_document_finish (cairo_svg_do
 	} else if (surface->page_set.num_elements > 0) {
 	    page = _cairo_array_index (&surface->page_set, surface->page_set.num_elements - 1);
 	    _cairo_output_stream_printf (output,
-					 "<g id=\"surface%d\">\n",
+					 "<g id=\"surface%" STRINGIFY(CAIRO_SVG_ID_LENGTH) "s%d\">\n",
+					 document->id_string,
 					 page->surface_id);
 	    _cairo_memory_stream_copy (page->xml_node, output);
 	    _cairo_output_stream_printf (output, "</g>\n");
