X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Futil%2FColorUtils.java;h=d7829dfdc01507e022ea430ab57c59cb033b0559;hb=136c0793b90b72b928c4d77dc109dd5c644e00d3;hp=525bfdbce880941c4c9276d63d9bdff1e3dbac04;hpb=8677e6e34e291edc58c1da2fc9c958473754143f;p=jalview.git diff --git a/src/jalview/util/ColorUtils.java b/src/jalview/util/ColorUtils.java index 525bfdb..d7829df 100644 --- a/src/jalview/util/ColorUtils.java +++ b/src/jalview/util/ColorUtils.java @@ -191,4 +191,167 @@ public class ColorUtils return new Color(red, green, blue); } } + + /** + * Parses a string into a Color, where the accepted formats are + * + * + * @param colour + * @return the parsed colour, or null if parsing fails + */ + public static Color parseColourString(String colour) + { + if (colour == null) + { + return null; + } + colour = colour.trim(); + + Color col = null; + try + { + int value = Integer.parseInt(colour, 16); + col = new Color(value); + } catch (NumberFormatException ex) + { + } + + if (col == null) + { + col = ColorUtils.getAWTColorFromName(colour); + } + + if (col == null) + { + try + { + String[] tokens = colour.split(","); + if (tokens.length == 3) + { + int r = Integer.parseInt(tokens[0].trim()); + int g = Integer.parseInt(tokens[1].trim()); + int b = Integer.parseInt(tokens[2].trim()); + col = new Color(r, g, b); + } + } catch (Exception ex) + { + // non-numeric token or out of 0-255 range + } + } + + return col; + } + + /** + * Constructs a colour from a text string. The hashcode of the whole string is + * scaled to the range 0-135. This is added to RGB values made from the + * hashcode of each third of the string, and scaled to the range 20-229. + * + * @param name + * @return + */ + public static Color createColourFromName(String name) + { + if (name == null) + { + return Color.white; + } + int lsize = name.length(); + int start = 0; + int end = lsize / 3; + + 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; + 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; + + /* + * blue: third third + */ + int b = Math.abs(name.substring(end).hashCode() + rgbOffset) % 210 + 20; + + Color color = new Color(r, g, b); + + return color; + } + + /** + * Returns the Color constant for a given colour name e.g. "pink", or null if + * the name is not recognised + * + * @param name + * @return + */ + 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; + } }