package statalign.postprocess.gui;
import java.awt.Color;
import java.util.Arrays;
/**
*
* @author Michael Golden
*/
public class ColorGradient {
public Color[] colours;
public float[] positions;
public ColorGradient(Color c1, Color c2) {
colours = new Color[2];
colours[0] = c1;
colours[1] = c2;
positions = new float[2];
positions[0] = 0;
positions[1] = 1;
}
public ColorGradient(Color c1, Color c2, Color c3) {
colours = new Color[3];
colours[0] = c1;
colours[1] = c2;
colours[2] = c3;
positions = new float[3];
positions[0] = 0f;
positions[1] = 0.5f;
positions[2] = 1f;
}
public ColorGradient(Color[] colours) {
this.colours = colours;
positions = new float[colours.length];
for (int i = 0; i < colours.length; i++) {
positions[i] = i / ((float) (colours.length - 1));
}
}
public void distributeColors() {
for (int i = 0; i < colours.length; i++) {
positions[i] = i / ((float) (colours.length - 1));
}
}
public void reverseOrder()
{
Color [] tempColors = new Color[colours.length];
for(int i = 0 ; i < tempColors.length ; i++)
{
tempColors[colours.length-1-i] = colours[i];
}
float [] tempPositions = new float[positions.length];
for(int i = 0 ; i < tempPositions.length ; i++)
{
tempPositions[positions.length-1-i] = 1-positions[i];
}
colours = tempColors;
positions = tempPositions;
}
public ColorGradient(Color[] colours, float[] positions) {
this.colours = colours;
this.positions = positions;
}
public Color getColor(float val) {
if (val > 1) {
return colours[colours.length - 1];
} else if (val < 0) {
return colours[0];
}
int c1 = 0;
int c2 = colours.length - 1;
float lower = 0;
float upper = 1;
int pos = 0;
for (int i = 1; i < positions.length; i++) {
lower = positions[i - 1];
upper = positions[i];
if (lower <= val && val <= upper) {
pos = i;
break;
}
}
c1 = Math.max(pos - 1, 0);
c2 = pos;
if (val > positions[positions.length - 1]) {
c1 = positions.length - 1;
c2 = positions.length - 1;
}
float perc = (val - lower) / (upper - lower);
int r = colours[c1].getRed() + ((int) (perc * (colours[c2].getRed() - colours[c1].getRed())));
int g = colours[c1].getGreen() + ((int) (perc * (colours[c2].getGreen() - colours[c1].getGreen())));
int b = colours[c1].getBlue() + ((int) (perc * (colours[c2].getBlue() - colours[c1].getBlue())));
int a = colours[c1].getAlpha() + +((int) (perc * (colours[c2].getAlpha() - colours[c1].getAlpha())));
return new Color(r, g, b, a);
}
public String toString() {
String ret = "";
for (int i = 0; i < colours.length; i++) {
ret += "rgba(" + colours[i].getRed() + "," + colours[i].getGreen() + "," + colours[i].getBlue() + "," + colours[i].getAlpha() + "):"+positions[i];
ret += ";";
}
return ret;
}
public static ColorGradient getValue(String fromString) {
String[] colorSplit = fromString.split(";");
Color[] colors = new Color[colorSplit.length];
float[] positions = new float[colorSplit.length];
for (int i = 0; i < colors.length; i++) {
String [] colorSplit2 = colorSplit[i].split(":");
if(colorSplit2.length >= 1)
{
String[] rgba = colorSplit2[0].replaceAll("([^0-9,])+", "").split(",");
colors[i] = new Color(Integer.parseInt(rgba[0]), Integer.parseInt(rgba[1]), Integer.parseInt(rgba[2]), Integer.parseInt(rgba[3]));
}
if(colorSplit2.length >= 2)
{
positions[i] = Float.parseFloat(colorSplit2[1]);
}
else
{
positions[i] = i / ((float) (colors.length - 1));
}
}
return new ColorGradient(colors, positions);
}
public ColorGradient clone ()
{
return new ColorGradient(Arrays.copyOf(colours, colours.length), Arrays.copyOf(positions, positions.length));
}
public static void main(String[] args) {
Color[] colours = {Color.green, Color.white, Color.blue};
System.out.println((new ColorGradient(colours)).getColor(0.99f));
}
}