package org.newdawn.slick.svg.inkscape;
import java.util.ArrayList;
import org.newdawn.slick.Color;
import org.newdawn.slick.geom.Transform;
import org.newdawn.slick.svg.Diagram;
import org.newdawn.slick.svg.Gradient;
import org.newdawn.slick.svg.Loader;
import org.newdawn.slick.svg.ParsingException;
import org.newdawn.slick.util.Log;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/**
* A processor for the defs node
*
* @author kevin
*/
public class DefsProcessor implements ElementProcessor {
/**
* @see org.newdawn.slick.svg.inkscape.ElementProcessor#handles(org.w3c.dom.Element)
*/
public boolean handles(Element element) {
if (element.getNodeName().equals("defs")) {
return true;
}
return false;
}
/**
* @see org.newdawn.slick.svg.inkscape.ElementProcessor#process(org.newdawn.slick.svg.Loader, org.w3c.dom.Element, org.newdawn.slick.svg.Diagram, org.newdawn.slick.geom.Transform)
*/
public void process(Loader loader, Element element, Diagram diagram, Transform transform) throws ParsingException {
NodeList patterns = element.getElementsByTagName("pattern");
for (int i=0;i<patterns.getLength();i++) {
Element pattern = (Element) patterns.item(i);
NodeList list = pattern.getElementsByTagName("image");
if (list.getLength() == 0) {
Log.warn("Pattern 1981 does not specify an image. Only image patterns are supported.");
continue;
}
Element image = (Element) list.item(0);
String patternName = pattern.getAttribute("id");
String ref = image.getAttributeNS(Util.XLINK, "href");
diagram.addPatternDef(patternName, ref);
}
NodeList linear = element.getElementsByTagName("linearGradient");
ArrayList toResolve = new ArrayList();
for (int i=0;i<linear.getLength();i++) {
Element lin = (Element) linear.item(i);
String name = lin.getAttribute("id");
Gradient gradient = new Gradient(name, false);
gradient.setTransform(Util.getTransform(lin, "gradientTransform"));
if (stringLength(lin.getAttribute("x1")) > 0) {
gradient.setX1(Float.parseFloat(lin.getAttribute("x1")));
}
if (stringLength(lin.getAttribute("x2")) > 0) {
gradient.setX2(Float.parseFloat(lin.getAttribute("x2")));
}
if (stringLength(lin.getAttribute("y1")) > 0) {
gradient.setY1(Float.parseFloat(lin.getAttribute("y1")));
}
if (stringLength(lin.getAttribute("y2")) > 0) {
gradient.setY2(Float.parseFloat(lin.getAttribute("y2")));
}
String ref = lin.getAttributeNS("http://www.w3.org/1999/xlink", "href");
if (stringLength(ref) > 0) {
gradient.reference(ref.substring(1));
toResolve.add(gradient);
} else {
NodeList steps = lin.getElementsByTagName("stop");
for (int j=0;j<steps.getLength();j++) {
Element s = (Element) steps.item(j);
float offset = Float.parseFloat(s.getAttribute("offset"));
String colInt = Util.extractStyle(s.getAttribute("style"),"stop-color");
String opaInt = Util.extractStyle(s.getAttribute("style"),"stop-opacity");
int col = Integer.parseInt(colInt.substring(1), 16);
Color stopColor = new Color(col);
stopColor.a = Float.parseFloat(opaInt);
gradient.addStep(offset, stopColor);
}
gradient.getImage();
}
diagram.addGradient(name, gradient);
}
NodeList radial = element.getElementsByTagName("radialGradient");
for (int i=0;i<radial.getLength();i++) {
Element rad = (Element) radial.item(i);
String name = rad.getAttribute("id");
Gradient gradient = new Gradient(name, true);
gradient.setTransform(Util.getTransform(rad, "gradientTransform"));
if (stringLength(rad.getAttribute("cx")) > 0) {
gradient.setX1(Float.parseFloat(rad.getAttribute("cx")));
}
if (stringLength(rad.getAttribute("cy")) > 0) {
gradient.setY1(Float.parseFloat(rad.getAttribute("cy")));
}
if (stringLength(rad.getAttribute("fx")) > 0) {
gradient.setX2(Float.parseFloat(rad.getAttribute("fx")));
}
if (stringLength(rad.getAttribute("fy")) > 0) {
gradient.setY2(Float.parseFloat(rad.getAttribute("fy")));
}
if (stringLength(rad.getAttribute("r")) > 0) {
gradient.setR(Float.parseFloat(rad.getAttribute("r")));
}
String ref = rad.getAttributeNS("http://www.w3.org/1999/xlink", "href");
if (stringLength(ref) > 0) {
gradient.reference(ref.substring(1));
toResolve.add(gradient);
} else {
NodeList steps = rad.getElementsByTagName("stop");
for (int j=0;j<steps.getLength();j++) {
Element s = (Element) steps.item(j);
float offset = Float.parseFloat(s.getAttribute("offset"));
String colInt = Util.extractStyle(s.getAttribute("style"),"stop-color");
String opaInt = Util.extractStyle(s.getAttribute("style"),"stop-opacity");
int col = Integer.parseInt(colInt.substring(1), 16);
Color stopColor = new Color(col);
stopColor.a = Float.parseFloat(opaInt);
gradient.addStep(offset, stopColor);
}
gradient.getImage();
}
diagram.addGradient(name, gradient);
}
for (int i=0;i<toResolve.size();i++) {
((Gradient) toResolve.get(i)).resolve(diagram);
((Gradient) toResolve.get(i)).getImage();
}
}
/**
* Utility to cope with null values
*
* @param value The value to get the length of
* @return The length of the string
*/
private int stringLength(String value) {
if (value == null) {
return 0;
}
return value.length();
}
}