package org.newdawn.slick.svg; import org.newdawn.slick.geom.Line; import org.newdawn.slick.geom.Shape; import org.newdawn.slick.geom.TexCoordGenerator; import org.newdawn.slick.geom.Transform; import org.newdawn.slick.geom.Vector2f; /** * A filler for shapes that applys SVG linear gradients * * @author kevin */ public class LinearGradientFill implements TexCoordGenerator { /** The start position of the gradient line */ private Vector2f start; /** The ends position of the gradient line */ private Vector2f end; /** The gradient being applied */ private Gradient gradient; /** The line of the gradient */ private Line line; /** The shape being filled with gradient */ private Shape shape; /** * Create a new fill for gradients * * @param shape The shape being filled * @param trans The transform given for the shape * @param gradient The gradient to apply */ public LinearGradientFill(Shape shape, Transform trans, Gradient gradient) { this.gradient = gradient; float x = gradient.getX1(); float y = gradient.getY1(); float mx = gradient.getX2(); float my = gradient.getY2(); float h = my - y; float w = mx - x; float[] s = new float[] {x,y+(h/2)}; gradient.getTransform().transform(s, 0, s, 0, 1); trans.transform(s, 0, s, 0, 1); float[] e = new float[] {x+w,y+(h/2)}; gradient.getTransform().transform(e, 0, e, 0, 1); trans.transform(e, 0, e, 0, 1); start = new Vector2f(s[0],s[1]); end = new Vector2f(e[0],e[1]); line = new Line(start, end); } /** * @see org.newdawn.slick.geom.TexCoordGenerator#getCoordFor(float, float) */ public Vector2f getCoordFor(float x, float y) { Vector2f result = new Vector2f(); line.getClosestPoint(new Vector2f(x,y), result); float u = result.distance(start); u /= line.length(); return new Vector2f(u,0); } }