package org.lobobrowser.html.svgimpl;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.GeneralPath;
import java.awt.geom.Point2D;
import java.util.StringTokenizer;
import org.lobobrowser.html.info.SVGInfo;
import org.lobobrowser.html.style.CSSValuesProperties;
import org.lobobrowser.html.style.HtmlValues;
import org.lobobrowser.util.gui.FontFactory;
import org.lobobrowser.util.gui.LAFSettings;
import org.lobobrowser.w3c.svg.SVGLength;
import org.lobobrowser.w3c.svg.SVGLengthList;
import org.lobobrowser.w3c.svg.SVGPoint;
import org.lobobrowser.w3c.svg.SVGPointList;
import org.lobobrowser.w3c.svg.SVGTransformList;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class SVGUtility {
public static String SCALE = "scale";
public static String TRANSLATE = "translate";
public static String MATRIX = "matrix";
public static String ROTATE = "rotate";
public static String SKEW_X = "skewX";
public static String SKEW_Y= "skewY";
public static SVGPointList constructPointList(String pointString) {
SVGPointListImpl points = new SVGPointListImpl();
StringTokenizer st = new StringTokenizer(pointString, " ,", false);
while (st.hasMoreTokens()) {
float x = Float.parseFloat(st.nextToken());
float y = Float.parseFloat(st.nextToken());
SVGPoint point = new SVGPointImpl(x, y);
points.appendItem(point);
}
return points;
}
public static SVGLengthList constructLengthList(String lengthString) {
SVGLengthListImpl lengthList = new SVGLengthListImpl();
if(lengthString == null)
return lengthList;
StringTokenizer st = new StringTokenizer(lengthString, " ", false);
while (st.hasMoreTokens()) {
int length = Integer.parseInt(st.nextToken());
SVGLength lnt = new SVGLengthImpl(length);
lengthList.appendItem(lnt);
}
return lengthList;
}
public static SVGTransformList createTransformList(String transformString) {
if (transformString == null)
return null;
transformString = transformString.trim();
SVGTransformListImpl transformList = new SVGTransformListImpl();
StringTokenizer st = new StringTokenizer(transformString, "()", false);
while (st.hasMoreTokens()) {
String transformType = st.nextToken().trim();
if (!st.hasMoreTokens()){
break;
}
String transformArgs = st.nextToken().trim();
if (transformType.equals(MATRIX)) {
StringTokenizer st1 = new StringTokenizer(transformArgs, ", ", false);
int numArgs = st1.countTokens();
if (numArgs == 6) {
float a = Float.parseFloat(st1.nextToken());
float b = Float.parseFloat(st1.nextToken());
float c = Float.parseFloat(st1.nextToken());
float d = Float.parseFloat(st1.nextToken());
float e = Float.parseFloat(st1.nextToken());
float f = Float.parseFloat(st1.nextToken());
SVGTransformImpl transform = new SVGTransformImpl(SVGTransformImpl.SVG_TRANSFORM_MATRIX);
SVGMatrixImpl matrix = new SVGMatrixImpl(a,b,c,d,e,f);
transform.setMatrix(matrix);
transformList.appendItem(transform);
}
} else if (transformType.equals(TRANSLATE)) {
StringTokenizer st1 = new StringTokenizer(transformArgs, ", ", false);
int numArgs = st1.countTokens();
float tx = 0;
float ty = 0;
if (numArgs == 1) {
tx = Float.parseFloat(st1.nextToken());
} else if (numArgs == 2) {
tx = Float.parseFloat(st1.nextToken());
ty = Float.parseFloat(st1.nextToken());
} else {
if (numArgs > 2) {
tx = Float.parseFloat(st1.nextToken());
ty = Float.parseFloat(st1.nextToken());
}
}
SVGTransformImpl transform = new SVGTransformImpl(SVGTransformImpl.SVG_TRANSFORM_TRANSLATE);
transform.setTranslate(tx, ty);
transformList.appendItem(transform);
} else if (transformType.equals(SCALE)) {
StringTokenizer st1 = new StringTokenizer(transformArgs, ", ", false);
int numArgs = st1.countTokens();
float sx = 0;
float sy = 0;
if (numArgs == 1) {
sx = Float.parseFloat(st1.nextToken());
sy = sx;
} else if (numArgs == 2) {
sx = Float.parseFloat(st1.nextToken());
sy = Float.parseFloat(st1.nextToken());
} else {
if (numArgs > 2) {
sx = Float.parseFloat(st1.nextToken());
sy = Float.parseFloat(st1.nextToken());
}
}
SVGTransformImpl transform = new SVGTransformImpl(SVGTransformImpl.SVG_TRANSFORM_SCALE);
transform.setScale(sx, sy);
transformList.appendItem(transform);
} else if (transformType.equals(ROTATE)) {
StringTokenizer st1 = new StringTokenizer(transformArgs, ", ", false);
int numArgs = st1.countTokens();
float angle = 0;
float cx = 0;
float cy = 0;
if (numArgs == 1) {
angle = Float.parseFloat(st1.nextToken());
} else if (numArgs == 3) {
angle = Float.parseFloat(st1.nextToken());
cx = Float.parseFloat(st1.nextToken());
cy = Float.parseFloat(st1.nextToken());
} else {
if (numArgs == 2) {
angle = Float.parseFloat(st1.nextToken());
} else if (numArgs > 3) {
angle = Float.parseFloat(st1.nextToken());
cx = Float.parseFloat(st1.nextToken());
cy = Float.parseFloat(st1.nextToken());
}
}
SVGTransformImpl transform = new SVGTransformImpl(SVGTransformImpl.SVG_TRANSFORM_ROTATE);
transform.setRotate(angle, cx, cy);
transformList.appendItem(transform);
} else if (transformType.equals(SKEW_X)) {
float skewAngle = Float.parseFloat(transformArgs);
SVGTransformImpl transform = new SVGTransformImpl(SVGTransformImpl.SVG_TRANSFORM_SKEWX);
transform.setSkewX(skewAngle);
transformList.appendItem(transform);
} else if (transformType.equals(SKEW_Y)) {
float skewAngle = Float.parseFloat(transformArgs);
SVGTransformImpl transform = new SVGTransformImpl(SVGTransformImpl.SVG_TRANSFORM_SKEWY);
transform.setSkewY(skewAngle);
transformList.appendItem(transform);
}
}
return transformList;
}
public static Font getFontValue(String ff, String fs) {
float fontSize = LAFSettings.getInstance().getFontSize();
String fontStyle = CSSValuesProperties.ITALIC;
String fontVariant = CSSValuesProperties.SMALL_CAPS;
String fontFamily = Font.SANS_SERIF;
String fontWeight = CSSValuesProperties.BOLD;
if (fs != null) {
fontSize = HtmlValues.getFontSize(fs, null);
}
if (ff != null) {
fontFamily = ff;
}
return FontFactory.getInstance().getFont(fontFamily, fontStyle, fontVariant, fontWeight, fontSize, null, null,0,false,0);
}
public static String getText(Node n) {
String text = "";
NodeList children = n.getChildNodes();
int numChildren = children.getLength();
for (int i = 0; i < numChildren; i++) {
Node child = children.item(i);
if (child.getNodeType() == Node.TEXT_NODE) { // it is #PCDATA
String nodeValue = child.getNodeValue();
nodeValue = nodeValue.replace('\n', ' ');
nodeValue = nodeValue.replace('\r', ' ');
nodeValue = nodeValue.replace('\t', ' ');
text = nodeValue;;
}
}
return text.trim();
}
public static Point2D.Float calcTextPos(SVGInfo svgi, Graphics2D graphics) {
FontMetrics metrics = graphics.getFontMetrics();
float x = svgi.getX();
float y = svgi.getY();
y = y + metrics.getLeading() + metrics.getAscent();
return new Point2D.Float(x, y);
}
public static void getTextAnchor(String textAnchor, GeneralPath path) {
if (textAnchor != null) {
if (textAnchor.equals("middle")) {
double swidth = path.getBounds2D().getWidth();
path.transform(AffineTransform.getTranslateInstance(-swidth / 2.0, 0));
} else if (textAnchor.equals("end")) {
double swidth = path.getBounds2D().getWidth();
path.transform(AffineTransform.getTranslateInstance(-swidth, 0));
}
}
}
}