/**************************************************************************** * Copyright (c) 2008, 2009 Jeremy Dowdall * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Jeremy Dowdall <jeremyd@aspencloud.com> - initial API and implementation *****************************************************************************/ package org.eclipse.nebula.cwt.svg; import static java.lang.Math.cos; import static java.lang.Math.sin; import static java.lang.Math.toRadians; class SvgTransform { enum Type { Matrix, Translate, Scale, Rotate, SkewX, SkewY } SvgTransform next; float[] data; SvgTransform() { data = new float[] { 1, 0, 0, 1, 0, 0 }; } float[] apply(float x, float y) { float[] v = new float[2]; v[0] = data[0] * x + data[2] * y + data[4]; v[1] = data[1] * x + data[3] * y + data[5]; return v; } boolean isIdentity() { return data.length == 6 && data[0] == 1 && data[1] == 0 && data[2] == 0 && data[3] == 1 && data[4] == 0 && data[5] == 0; } void scale(float s) { scale(s, s); } void scale(float x, float y) { data[0] = x; data[3] = y; } void setData(Type type, String[] sa) { data = new float[] { 1, 0, 0, 1, 0, 0 }; switch (type) { case Matrix: { for (int i = 0; i < sa.length; i++) { data[i] = Float.parseFloat(sa[i]); } break; } case Translate: { data[4] = Float.parseFloat(sa[0]); if (sa.length > 1) { data[5] = Float.parseFloat(sa[1]); } break; } case Scale: { if (sa.length == 1) { scale(Float.parseFloat(sa[0])); } else if (sa.length == 2) { scale(Float.parseFloat(sa[0]), Float.parseFloat(sa[1])); } break; } case Rotate: { float angle = Float.parseFloat(sa[0]); data[0] = (float) cos(toRadians(angle)); data[1] = (float) sin(toRadians(angle)); data[2] = (float) -sin(toRadians(angle)); data[3] = (float) cos(toRadians(angle)); if (sa.length > 1) { data[4] = Float.parseFloat(sa[1]); data[5] = Float.parseFloat(sa[2]); } break; } case SkewX: { data[2] = Float.parseFloat(sa[0]); break; } case SkewY: { data[1] = Float.parseFloat(sa[0]); break; } } } void skew(float x, float y) { data[2] = x; data[1] = y; } void translate(float x, float y) { data[4] = x; data[5] = y; } }