mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-10 22:01:52 +09:00
Former-commit-id: 1647fa32ef6894bd7db44f741f07c2f4dcdf9054 Former-commit-id: 0e5810dcfbe1fd59b13e7cabe9f1e93c5542da2d
70 lines
1.8 KiB
Java
70 lines
1.8 KiB
Java
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);
|
|
}
|
|
|
|
}
|