-package javajs.util;
-
-import java.util.Hashtable;
-import java.util.Map;
-
-import javajs.api.GenericColor;
-
-/**
- * ColorUtility
- *
- */
-
-public class CU {
-
- public static String toRGBHexString(GenericColor c) {
- int rgb = c.getRGB();
- if (rgb == 0)
- return "000000";
- String r = "00" + Integer.toHexString((rgb >> 16) & 0xFF);
- r = r.substring(r.length() - 2);
- String g = "00" + Integer.toHexString((rgb >> 8) & 0xFF);
- g = g.substring(g.length() - 2);
- String b = "00" + Integer.toHexString(rgb & 0xFF);
- b = b.substring(b.length() - 2);
- return r + g + b;
- }
-
- public static String toCSSString(GenericColor c) {
- int opacity = c.getOpacity255();
- if (opacity == 255)
- return "#" + toRGBHexString(c);
- int rgb = c.getRGB();
- return "rgba(" + ((rgb>>16)&0xFF) + "," + ((rgb>>8)&0xff) + "," + (rgb&0xff) + "," + opacity/255f + ")";
- }
-
- private final static String[] colorNames = {
- "black", // 000000
- "pewhite", // ffffff
- "pecyan", // 00ffff
- "pepurple", // d020ff
- "pegreen", // 00ff00
- "peblue", // 6060ff
- "peviolet", // ff80c0
- "pebrown", // a42028
- "pepink", // ffd8d8
- "peyellow", // ffff00
- "pedarkgreen", // 00c000
- "peorange", // ffb000
- "pelightblue", // b0b0ff
- "pedarkcyan", // 00a0a0
- "pedarkgray", // 606060
-
- "aliceblue", // F0F8FF
- "antiquewhite", // FAEBD7
- "aqua", // 00FFFF
- "aquamarine", // 7FFFD4
- "azure", // F0FFFF
- "beige", // F5F5DC
- "bisque", // FFE4C4
- "blanchedalmond", // FFEBCD
- "blue", // 0000FF
- "blueviolet", // 8A2BE2
- "brown", // A52A2A
- "burlywood", // DEB887
- "cadetblue", // 5F9EA0
- "chartreuse", // 7FFF00
- "chocolate", // D2691E
- "coral", // FF7F50
- "cornflowerblue", // 6495ED
- "cornsilk", // FFF8DC
- "crimson", // DC143C
- "cyan", // 00FFFF
- "darkblue", // 00008B
- "darkcyan", // 008B8B
- "darkgoldenrod", // B8860B
- "darkgray", // A9A9A9
- "darkgreen", // 006400
- "darkkhaki", // BDB76B
- "darkmagenta", // 8B008B
- "darkolivegreen", // 556B2F
- "darkorange", // FF8C00
- "darkorchid", // 9932CC
- "darkred", // 8B0000
- "darksalmon", // E9967A
- "darkseagreen", // 8FBC8F
- "darkslateblue", // 483D8B
- "darkslategray", // 2F4F4F
- "darkturquoise", // 00CED1
- "darkviolet", // 9400D3
- "deeppink", // FF1493
- "deepskyblue", // 00BFFF
- "dimgray", // 696969
- "dodgerblue", // 1E90FF
- "firebrick", // B22222
- "floralwhite", // FFFAF0 16775920
- "forestgreen", // 228B22
- "fuchsia", // FF00FF
- "gainsboro", // DCDCDC
- "ghostwhite", // F8F8FF
- "gold", // FFD700
- "goldenrod", // DAA520
- "gray", // 808080
- "green", // 008000
- "greenyellow", // ADFF2F
- "honeydew", // F0FFF0
- "hotpink", // FF69B4
- "indianred", // CD5C5C
- "indigo", // 4B0082
- "ivory", // FFFFF0
- "khaki", // F0E68C
- "lavender", // E6E6FA
- "lavenderblush", // FFF0F5
- "lawngreen", // 7CFC00
- "lemonchiffon", // FFFACD
- "lightblue", // ADD8E6
- "lightcoral", // F08080
- "lightcyan", // E0FFFF
- "lightgoldenrodyellow", // FAFAD2
- "lightgreen", // 90EE90
- "lightgrey", // D3D3D3
- "lightgray", // D3D3D3
- "lightpink", // FFB6C1
- "lightsalmon", // FFA07A
- "lightseagreen", // 20B2AA
- "lightskyblue", // 87CEFA
- "lightslategray", // 778899
- "lightsteelblue", // B0C4DE
- "lightyellow", // FFFFE0
- "lime", // 00FF00
- "limegreen", // 32CD32
- "linen", // FAF0E6
- "magenta", // FF00FF
- "maroon", // 800000
- "mediumaquamarine", // 66CDAA
- "mediumblue", // 0000CD
- "mediumorchid", // BA55D3
- "mediumpurple", // 9370DB
- "mediumseagreen", // 3CB371
- "mediumslateblue", // 7B68EE
- "mediumspringgreen", // 00FA9A
- "mediumturquoise", // 48D1CC
- "mediumvioletred", // C71585
- "midnightblue", // 191970
- "mintcream", // F5FFFA
- "mistyrose", // FFE4E1
- "moccasin", // FFE4B5
- "navajowhite", // FFDEAD
- "navy", // 000080
- "oldlace", // FDF5E6
- "olive", // 808000
- "olivedrab", // 6B8E23
- "orange", // FFA500
- "orangered", // FF4500
- "orchid", // DA70D6
- "palegoldenrod", // EEE8AA
- "palegreen", // 98FB98
- "paleturquoise", // AFEEEE
- "palevioletred", // DB7093
- "papayawhip", // FFEFD5
- "peachpuff", // FFDAB9
- "peru", // CD853F
- "pink", // FFC0CB
- "plum", // DDA0DD
- "powderblue", // B0E0E6
- "purple", // 800080
- "red", // FF0000
- "rosybrown", // BC8F8F
- "royalblue", // 4169E1
- "saddlebrown", // 8B4513
- "salmon", // FA8072
- "sandybrown", // F4A460
- "seagreen", // 2E8B57
- "seashell", // FFF5EE
- "sienna", // A0522D
- "silver", // C0C0C0
- "skyblue", // 87CEEB
- "slateblue", // 6A5ACD
- "slategray", // 708090
- "snow", // FFFAFA 16775930
- "springgreen", // 00FF7F
- "steelblue", // 4682B4
- "tan", // D2B48C
- "teal", // 008080
- "thistle", // D8BFD8
- "tomato", // FF6347
- "turquoise", // 40E0D0
- "violet", // EE82EE
- "wheat", // F5DEB3
- "white", // FFFFFF 16777215
- "whitesmoke", // F5F5F5
- "yellow", // FFFF00
- "yellowgreen", // 9ACD32
- // plus a few rasmol names/values
- "bluetint", // AFD7FF
- "greenblue", // 2E8B57
- "greentint", // 98FFB3
- "grey", // 808080
- "gray",
- "pinktint", // FFABBB
- "redorange", // FF4500
- "yellowtint", // F6F675
- };
-
- private final static int[] colorArgbs = {
- //#FFFFC3 hover
- 0xFF000000, // black
- // plus the PE chain colors
- 0xFFffffff, // pewhite
- 0xFF00ffff, // pecyan
- 0xFFd020ff, // pepurple
- 0xFF00ff00, // pegreen
- 0xFF6060ff, // peblue
- 0xFFff80c0, // peviolet
- 0xFFa42028, // pebrown
- 0xFFffd8d8, // pepink
- 0xFFffff00, // peyellow
- 0xFF00c000, // pedarkgreen
- 0xFFffb000, // peorange
- 0xFFb0b0ff, // pelightblue
- 0xFF00a0a0, // pedarkcyan
- 0xFF606060, // pedarkgray
- // standard JavaScript
- 0xFFF0F8FF, // aliceblue
- 0xFFFAEBD7, // antiquewhite
- 0xFF00FFFF, // aqua
- 0xFF7FFFD4, // aquamarine
- 0xFFF0FFFF, // azure
- 0xFFF5F5DC, // beige
- 0xFFFFE4C4, // bisque
- 0xFFFFEBCD, // blanchedalmond
- 0xFF0000FF, // blue
- 0xFF8A2BE2, // blueviolet
- 0xFFA52A2A, // brown
- 0xFFDEB887, // burlywood
- 0xFF5F9EA0, // cadetblue
- 0xFF7FFF00, // chartreuse
- 0xFFD2691E, // chocolate
- 0xFFFF7F50, // coral
- 0xFF6495ED, // cornflowerblue
- 0xFFFFF8DC, // cornsilk
- 0xFFDC143C, // crimson
- 0xFF00FFFF, // cyan
- 0xFF00008B, // darkblue
- 0xFF008B8B, // darkcyan
- 0xFFB8860B, // darkgoldenrod
- 0xFFA9A9A9, // darkgray
- 0xFF006400, // darkgreen
-
- 0xFFBDB76B, // darkkhaki
- 0xFF8B008B, // darkmagenta
- 0xFF556B2F, // darkolivegreen
- 0xFFFF8C00, // darkorange
- 0xFF9932CC, // darkorchid
- 0xFF8B0000, // darkred
- 0xFFE9967A, // darksalmon
- 0xFF8FBC8F, // darkseagreen
- 0xFF483D8B, // darkslateblue
- 0xFF2F4F4F, // darkslategray
- 0xFF00CED1, // darkturquoise
- 0xFF9400D3, // darkviolet
- 0xFFFF1493, // deeppink
- 0xFF00BFFF, // deepskyblue
- 0xFF696969, // dimgray
- 0xFF1E90FF, // dodgerblue
- 0xFFB22222, // firebrick
- 0xFFFFFAF0, // floralwhite
- 0xFF228B22, // forestgreen
- 0xFFFF00FF, // fuchsia
- 0xFFDCDCDC, // gainsboro
- 0xFFF8F8FF, // ghostwhite
- 0xFFFFD700, // gold
- 0xFFDAA520, // goldenrod
- 0xFF808080, // gray
- 0xFF008000, // green
- 0xFFADFF2F, // greenyellow
- 0xFFF0FFF0, // honeydew
- 0xFFFF69B4, // hotpink
- 0xFFCD5C5C, // indianred
- 0xFF4B0082, // indigo
- 0xFFFFFFF0, // ivory
- 0xFFF0E68C, // khaki
- 0xFFE6E6FA, // lavender
- 0xFFFFF0F5, // lavenderblush
- 0xFF7CFC00, // lawngreen
- 0xFFFFFACD, // lemonchiffon
- 0xFFADD8E6, // lightblue
- 0xFFF08080, // lightcoral
- 0xFFE0FFFF, // lightcyan
- 0xFFFAFAD2, // lightgoldenrodyellow
- 0xFF90EE90, // lightgreen
- 0xFFD3D3D3, // lightgrey
- 0xFFD3D3D3, // lightgray
- 0xFFFFB6C1, // lightpink
- 0xFFFFA07A, // lightsalmon
- 0xFF20B2AA, // lightseagreen
- 0xFF87CEFA, // lightskyblue
- 0xFF778899, // lightslategray
- 0xFFB0C4DE, // lightsteelblue
- 0xFFFFFFE0, // lightyellow
- 0xFF00FF00, // lime
- 0xFF32CD32, // limegreen
- 0xFFFAF0E6, // linen
- 0xFFFF00FF, // magenta
- 0xFF800000, // maroon
- 0xFF66CDAA, // mediumaquamarine
- 0xFF0000CD, // mediumblue
- 0xFFBA55D3, // mediumorchid
- 0xFF9370DB, // mediumpurple
- 0xFF3CB371, // mediumseagreen
- 0xFF7B68EE, // mediumslateblue
- 0xFF00FA9A, // mediumspringgreen
- 0xFF48D1CC, // mediumturquoise
- 0xFFC71585, // mediumvioletred
- 0xFF191970, // midnightblue
- 0xFFF5FFFA, // mintcream
- 0xFFFFE4E1, // mistyrose
- 0xFFFFE4B5, // moccasin
- 0xFFFFDEAD, // navajowhite
- 0xFF000080, // navy
- 0xFFFDF5E6, // oldlace
- 0xFF808000, // olive
- 0xFF6B8E23, // olivedrab
- 0xFFFFA500, // orange
- 0xFFFF4500, // orangered
- 0xFFDA70D6, // orchid
- 0xFFEEE8AA, // palegoldenrod
- 0xFF98FB98, // palegreen
- 0xFFAFEEEE, // paleturquoise
- 0xFFDB7093, // palevioletred
- 0xFFFFEFD5, // papayawhip
- 0xFFFFDAB9, // peachpuff
- 0xFFCD853F, // peru
- 0xFFFFC0CB, // pink
- 0xFFDDA0DD, // plum
- 0xFFB0E0E6, // powderblue
- 0xFF800080, // purple
- 0xFFFF0000, // red
- 0xFFBC8F8F, // rosybrown
- 0xFF4169E1, // royalblue
- 0xFF8B4513, // saddlebrown
- 0xFFFA8072, // salmon
- 0xFFF4A460, // sandybrown
- 0xFF2E8B57, // seagreen
- 0xFFFFF5EE, // seashell
- 0xFFA0522D, // sienna
- 0xFFC0C0C0, // silver
- 0xFF87CEEB, // skyblue
- 0xFF6A5ACD, // slateblue
- 0xFF708090, // slategray
- 0xFFFFFAFA, // snow
- 0xFF00FF7F, // springgreen
- 0xFF4682B4, // steelblue
- 0xFFD2B48C, // tan
- 0xFF008080, // teal
- 0xFFD8BFD8, // thistle
- 0xFFFF6347, // tomato
- 0xFF40E0D0, // turquoise
- 0xFFEE82EE, // violet
- 0xFFF5DEB3, // wheat
- 0xFFFFFFFF, // white
- 0xFFF5F5F5, // whitesmoke
- 0xFFFFFF00, // yellow
- 0xFF9ACD32, // yellowgreen
- // plus a few rasmol names/values
- 0xFFAFD7FF, // bluetint
- 0xFF2E8B57, // greenblue
- 0xFF98FFB3, // greentint
- 0xFF808080, // grey
- 0xFF808080, // gray
- 0xFFFFABBB, // pinktint
- 0xFFFF4500, // redorange
- 0xFFF6F675, // yellowtint
- };
-
- private static final Map<String, Integer> mapJavaScriptColors = new Hashtable<String, Integer>();
-
- static {
- for (int i = colorNames.length; --i >= 0; )
- mapJavaScriptColors.put(colorNames[i], Integer.valueOf(colorArgbs[i]));
- }
-
- /**
- * accepts [xRRGGBB] or [0xRRGGBB] or [0xFFRRGGBB] or #RRGGBB or
- * [red,green,blue] or a valid JavaScript color
- *
- * @param strColor
- * @return 0 if invalid or integer color
- */
- public static int getArgbFromString(String strColor) {
- int len = 0;
- if (strColor == null || (len = strColor.length()) == 0)
- return 0;
- strColor = strColor.toLowerCase();
- if (strColor.charAt(0) == '[' && strColor.charAt(len - 1) == ']') {
- String check;
- if (strColor.indexOf(",") >= 0) {
- String[] tokens = PT.split(strColor.substring(1, strColor
- .length() - 1), ",");
- if (tokens.length != 3)
- return 0;
- float red = PT.parseFloat(tokens[0]);
- float grn = PT.parseFloat(tokens[1]);
- float blu = PT.parseFloat(tokens[2]);
- return colorTriadToFFRGB(red, grn, blu);
- }
- switch (len) {
- case 9:
- check = "x";
- break;
- case 10:
- check = "0x";
- break;
- default:
- return 0;
- }
- if (strColor.indexOf(check) != 1)
- return 0;
- strColor = "#" + strColor.substring(len - 7, len - 1);
- len = 7;
- }
- if (len == 7 && strColor.charAt(0) == '#') {
- try {
- return PT.parseIntRadix(strColor.substring(1, 7), 16) | 0xFF000000;
- } catch (Exception e) {
- return 0;
- }
- }
- Integer boxedArgb = mapJavaScriptColors.get(strColor);
- return (boxedArgb == null ? 0 : boxedArgb.intValue());
- }
-
- public static int colorTriadToFFRGB(float x, float y, float z) {
- if (x <= 1 && y <= 1 && z <= 1) {
- if (x > 0)
- x = x * 256 - 1;
- if (y > 0)
- y = y * 256 - 1;
- if (z > 0)
- z = z * 256 - 1;
- }
- return rgb((int) x, (int) y, (int) z);
- }
-
- public static int rgb(int red, int grn, int blu) {
- return 0xFF000000 | (red << 16) | (grn << 8) | blu;
- }
-
- public final static P3 colorPtFromString(String colorName) {
- return colorPtFromInt(getArgbFromString(colorName), null);
- }
-
- public final static P3 colorPtFromInt(int color, P3 pt) {
- if (pt == null)
- pt = new P3();
- pt.set((color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF);
- return pt;
- }
-
- public static int colorPtToFFRGB(T3 pt) {
- return colorTriadToFFRGB(pt.x, pt.y, pt.z);
- }
-
- public static void toRGB3f(int c, float[] f) {
- f[0] = ((c >> 16) & 0xFF) / 255f; // red
- f[1] = ((c >> 8) & 0xFF) / 255f;
- f[2] = (c & 0xFF) / 255f;
- }
-
- /**
- * Return a greyscale rgb value 0-FF using NTSC color lightness algorithm
- *<p>
- * the alpha component is set to 0xFF. If you want a value in the
- * range 0-255 then & the result with 0xFF;
- *
- * @param rgb the rgb value
- * @return a grayscale value in the range 0 - 255 decimal
- */
- public static int toFFGGGfromRGB(int rgb) {
- int grey = (((2989 * ((rgb >> 16) & 0xFF)) +
- (5870 * ((rgb >> 8) & 0xFF)) +
- (1140 * (rgb & 0xFF)) + 5000) / 10000) & 0xFFFFFF;
- return rgb(grey, grey, grey);
- }
-
-
- /**
- * Convert RGB values to HSL (hue/saturation/lightness)
- *
- * @param rgb
- * range 255 255 255
- * @param doRound
- * set to false when just using this for
- * for RGB -- HSL -- HSL' -- RGB' conversion
- *
- * @return the HSL as P3 range 360 100 100
- * @author hansonr
- */
-
- public static P3 rgbToHSL(P3 rgb, boolean doRound) {
- // adapted from http://tips4java.wordpress.com/2009/07/05/hsl-color/
- // see http://en.wikipedia.org/wiki/HSL_color_space
- float r = rgb.x / 255;
- float g = rgb.y / 255;
- float b = rgb.z / 255;
- float min = Math.min(r, Math.min(g, b));
- float max = Math.max(r, Math.max(g, b));
-
- // lightness is just p * 50
-
- float p = (max + min);
- float q = (max - min);
-
- float h = (60 * ((q == 0 ? 0 : max == r ? ((g - b) / q + 6)
- : max == g ? (b - r) / q + 2 : (r - g) / q + 4))) % 360;
-
- float s = q / (q == 0 ? 1 : p <= 1 ? p : 2 - p);
-
- // we round to tenths for HSL so that we can return enough
- // precision to get back 1-255 in RGB
- return (doRound ? P3.new3(Math.round(h*10)/10f, Math.round(s * 1000)/10f,
- Math.round(p * 500)/10f) : P3.new3(h, s * 100, p * 50));
- }
-
- /**
- * Convert HSL (hue/saturation/luninance) values to RGB
- *
- * @param hsl in the range 360, 100, 100
- * @return the RGB as P3 range 0 to 255
- * @author hansonr
- */
- public static P3 hslToRGB(P3 hsl) {
- // adapted from http://tips4java.wordpress.com/2009/07/05/hsl-color/
- // see http://en.wikipedia.org/wiki/HSL_color_space
-
- // highly condensed
-
- float h = Math.max(0, Math.min(360, hsl.x)) / 60;
- float s = Math.max(0, Math.min(100, hsl.y)) / 100;
- float l = Math.max(0, Math.min(100, hsl.z)) / 100;
-
- float p = l - (l < 0.5 ? l : 1 - l) * s;
- float q = 2 * (l - p);
-
- float r = toRGB(p, q, h + 2);
- float g = toRGB(p, q, h);
- float b = toRGB(p, q, h - 2);
- return P3.new3(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255));
- }
-
- private static float toRGB(float p, float q, float h) {
- return ((h = (h + (h < 0 ? 6 : h > 6 ? -6 : 0))) < 1 ? p + q * h
- : h < 3 ? p + q : h < 4 ? p + q * (4 - h) : p);
- }
-
-}