SVG: Support CAIRO_EXTEND_NONE for radial gradients.

This is as simple as adding transparent color stops on either end.
This commit is contained in:
Carl Worth 2007-03-01 15:17:19 -08:00
parent fe68e8aa32
commit 97dbbae621

View file

@ -1280,11 +1280,14 @@ emit_radial_pattern (cairo_svg_surface_t *surface,
/* SVG doesn't have a start radius, so computing now SVG focal coordinates
* and emulating start radius by translating color stops.
* FIXME: We also need to emulate cairo behaviour inside start circle when
* extend != CAIRO_EXTEND_NONE.
* FIXME: Handle radius1 <= radius0 */
fx = (r1 * x0 - r0 * x1) / (r1 - r0);
fy = (r1 * y0 - r0 * y1) / (r1 - r0);
if (pattern->base.base.extend == CAIRO_EXTEND_NONE) {
fx = x0;
fy = y0;
} else {
fx = (r1 * x0 - r0 * x1) / (r1 - r0);
fy = (r1 * y0 - r0 * y1) / (r1 - r0);
}
_cairo_output_stream_printf (document->xml_node_defs,
"<radialGradient id=\"radial%d\" "
@ -1300,7 +1303,27 @@ emit_radial_pattern (cairo_svg_surface_t *surface,
cairo_matrix_invert (&p2u);
emit_transform (document->xml_node_defs, "gradientTransform", ">\n", &p2u);
/* To support cairo's EXTEND_NONE, (for which SVG has no similar
* notion), we add transparent color stops on either end of the
* user-provided stops. */
if (pattern->base.base.extend == CAIRO_EXTEND_NONE) {
_cairo_output_stream_printf (document->xml_node_defs,
"<stop offset=\"0\" style=\""
"stop-color: rgb(0%%,0%%,0%%); "
"stop-opacity: 0;\"/>\n");
if (r0 != 0.0)
_cairo_output_stream_printf (document->xml_node_defs,
"<stop offset=\"%f\" style=\""
"stop-color: rgb(0%%,0%%,0%%); "
"stop-opacity: 0;\"/>\n",
r0 / r1);
}
emit_pattern_stops (document->xml_node_defs, &pattern->base, r0 / r1);
if (pattern->base.base.extend == CAIRO_EXTEND_NONE)
_cairo_output_stream_printf (document->xml_node_defs,
"<stop offset=\"1.0\" style=\""
"stop-color: rgb(0%%,0%%,0%%); "
"stop-opacity: 0;\"/>\n");
_cairo_output_stream_printf (document->xml_node_defs,
"</radialGradient>\n");