As you rightly pointed out some months ago this is not straightforward. What I ended up doing was allowing JFreeChart to work with LinearGradientPaint and adding that as a supported gradient type in SVG. The implementation below only supports basic horizontal and vertical, but it works with any number of stops and colours.
Code: Select all
private String getLinearGradientElement(String id, LinearGradientPaint paint) {
StringBuilder b = new StringBuilder("<linearGradient id=\"").append(id)
.append("\" ");
Point2D p1 = paint.getStartPoint();
Point2D p2 = paint.getEndPoint();
boolean vertical = Math.abs(p1.getY() - p2.getY()) > EPSILON;
if(vertical) {
b.append("x1=\"0\" ");
b.append("y1=\"0\" ");
b.append("x2=\"0\" ");
b.append("y2=\"1\" ");
}
b.append(">");
int size = paint.getColors().length;
for(int i = 0; i < size; i++) {
int offset = (int)Math.round(paint.getFractions()[i]*100.0);
b.append("<stop offset=\"")
.append(offset)
.append("%\" style=\"stop-color: ")
.append(getSVGColor(paint.getColors()[i]))
.append(";\"/>");
}
return b.append("</linearGradient>").toString();
}