package jalview.util;
import java.awt.Color;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Random;
public class ColorUtils
{
+ private static final int MAX_CACHE_SIZE = 1729;
+ /*
+ * a cache for colours generated from text strings
+ */
+ static Map<String, Color> myColours = new HashMap<>();
/**
* Generates a random color, will mix with input color. Code taken from
* prop = proportion of the way value is from minValue to maxValue
*/
float prop = (value - minValue) / (maxValue - minValue);
- float r = minColour.getRed() + prop
- * (maxColour.getRed() - minColour.getRed());
- float g = minColour.getGreen() + prop
- * (maxColour.getGreen() - minColour.getGreen());
- float b = minColour.getBlue() + prop
- * (maxColour.getBlue() - minColour.getBlue());
+ float r = minColour.getRed()
+ + prop * (maxColour.getRed() - minColour.getRed());
+ float g = minColour.getGreen()
+ + prop * (maxColour.getGreen() - minColour.getGreen());
+ float b = minColour.getBlue()
+ + prop * (maxColour.getBlue() - minColour.getBlue());
return new Color(r / 255, g / 255, b / 255);
}
}
}
+ public static int bleachColourInt(int colour, float bleachFactor)
+ {
+ if (bleachFactor >= 1f)
+ {
+ return -1;// Color.WHITE;
+ }
+ if (bleachFactor <= -1f)
+ {
+ return 0xFF000000;// Color.BLACK;
+ }
+ if (bleachFactor == 0f)
+ {
+ return colour;
+ }
+
+ int red = (colour >> 16) & 0xFF;// getRed();
+ int green = (colour >> 8) & 0xFF;// colour.getGreen();
+ int blue = colour & 0xFF;// .getBlue();
+
+ if (bleachFactor > 0)
+ {
+ red += (255 - red) * bleachFactor;
+ green += (255 - green) * bleachFactor;
+ blue += (255 - blue) * bleachFactor;
+ }
+ else
+ {
+ float factor = 1 + bleachFactor;
+ red *= factor;
+ green *= factor;
+ blue *= factor;
+ }
+ return 0xFF000000 | (red << 16) | (green << 8) | blue;// new Color(red,
+ // green, blue);
+ }
+
/**
* Parses a string into a Color, where the accepted formats are
* <ul>
return null;
}
colour = colour.trim();
-
+
Color col = null;
try
{
col = new Color(value);
} catch (NumberFormatException ex)
{
+ col = Platform.getColorFromName(colour);
}
-
+
if (col == null)
{
col = ColorUtils.getAWTColorFromName(colour);
}
-
+
if (col == null)
{
try
// non-numeric token or out of 0-255 range
}
}
-
+
return col;
}
*/
public static Color createColourFromName(String name)
{
+ if (name == null)
+ {
+ return Color.white;
+ }
+ if (myColours.containsKey(name))
+ {
+ return myColours.get(name);
+ }
int lsize = name.length();
int start = 0;
int end = lsize / 3;
-
- int rgbOffset = Math.abs(name.hashCode() % 10) * 15;
-
+
+ int rgbOffset = Math.abs(name.hashCode() % 10) * 15; // 0-135
+
/*
* red: first third
*/
- int r = Math.abs(name.substring(start, end).hashCode() + rgbOffset) % 210 + 20;
+ int r = Math.abs(name.substring(start, end).hashCode() + rgbOffset)
+ % 210 + 20;
start = end;
end += lsize / 3;
if (end > lsize)
{
end = lsize;
}
-
+
/*
* green: second third
*/
- int g = Math.abs(name.substring(start, end).hashCode() + rgbOffset) % 210 + 20;
-
+ int g = Math.abs(name.substring(start, end).hashCode() + rgbOffset)
+ % 210 + 20;
+
/*
* blue: third third
*/
int b = Math.abs(name.substring(end).hashCode() + rgbOffset) % 210 + 20;
-
+
Color color = new Color(r, g, b);
-
+
+ if (myColours.size() < MAX_CACHE_SIZE)
+ {
+ myColours.put(name, color);
+ }
+
return color;
}
*/
public static Color getAWTColorFromName(String name)
{
- if (name == null)
- {
- return null;
- }
- Color col = null;
- name = name.toLowerCase();
-
- // or make a static map; or use reflection on the field name
- switch (name)
- {
- case "black":
- col = Color.black;
- break;
- case "blue":
- col = Color.blue;
- break;
- case "cyan":
- col = Color.cyan;
- break;
- case "darkgray":
- col = Color.darkGray;
- break;
- case "gray":
- col = Color.gray;
- break;
- case "green":
- col = Color.green;
- break;
- case "lightgray":
- col = Color.lightGray;
- break;
- case "magenta":
- col = Color.magenta;
- break;
- case "orange":
- col = Color.orange;
- break;
- case "pink":
- col = Color.pink;
- break;
- case "red":
- col = Color.red;
- break;
- case "white":
- col = Color.white;
- break;
- case "yellow":
- col = Color.yellow;
- break;
- }
-
- return col;
+ return Platform.getColorFromName(name); // BH 2019 -- allows for wide range
+ // of JavaScript colors (for
+ // JavaScript only)
}
}