/************************************************************************** * Copyright (c) 2001, 2002, 2003 by Punch Telematix. All rights reserved. * * * * Redistribution and use in source and binary forms, with or without * * modification, are permitted provided that the following conditions * * are met: * * 1. Redistributions of source code must retain the above copyright * * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * * notice, this list of conditions and the following disclaimer in the * * documentation and/or other materials provided with the distribution. * * 3. Neither the name of Punch Telematix nor the names of * * other contributors may be used to endorse or promote products * * derived from this software without specific prior written permission.* * * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * * IN NO EVENT SHALL PUNCH TELEMATIX OR OTHER CONTRIBUTORS BE LIABLE * * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ package java.awt; public class Color implements java.io.Serializable { private static final long serialVersionUID = 118526816881161077L; /******************************/ /** * Definitions * @status Complient with java specs * @remark Complient with java specs */ public final static Color lightGray = new Color(192, 192, 192); public final static Color gray = new Color(128, 128, 128); public final static Color darkGray = new Color(64, 64, 64); public final static Color black = new Color(0, 0, 0); public final static Color red = new Color(255, 0, 0); public final static Color pink = new Color(255, 175, 175); public final static Color orange = new Color(255, 200, 0); public final static Color yellow = new Color(255, 255, 0); public final static Color green = new Color(0, 255, 0); public final static Color magenta = new Color(255, 0, 255); public final static Color cyan = new Color(0, 255, 255); public final static Color blue = new Color(0, 0, 255); public final static Color white = new Color(255, 255, 255); private static final double FILTER = 0.7; /******************************/ /** * variable */ int value; /******************************/ /** * Constructors * @status Constructors present are compliant with specs, though several constructors are missing * @remark Complient with java specs */ public Color(int r, int g, int b) { this(r, g, b, 255); } public Color(int r, int g, int b, int a) { value = ((a & 0xFF) << 24) | ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | ((b & 0xFF) << 0); } public Color(int rgb) { value = 0xff000000 | rgb; } public Color(int rgb, boolean hasAlpha) { value = (hasAlpha ? 0 : 0xff000000) | rgb; } public Color(float r, float g, float b) { this((int)(r * 255 + 0.5), (int)(g * 255 + 0.5), (int)(b * 255 + 0.5)); } /******************************/ /** * get color components * @status Implemented * @remark Complient with java specs */ public int getRed() { return (getRGB() >> 16) & 0xFF; } public int getGreen() { return (getRGB() >> 8) & 0xFF; } public int getBlue() { return (getRGB() >> 0) & 0xFF; } public int getAlpha() { return (getRGB() >> 24) & 0xFF; } public int getRGB() { return value; } /******************************/ /** * Color brighter/darker * @status Implemented * @remark Complient with java specs */ public Color brighter() { int r = getRed(); int g = getGreen(); int b = getBlue(); int i = (int)(1.0 / (1.0 - FILTER)); if (r == 0 && g == 0 && b == 0) { return new Color(i, i, i); } if (r > 0 && r < i) r = i; if (g > 0 && g < i) g = i; if (b > 0 && b < i) b = i; return new Color(Math.min((int)(r / FILTER), 255), Math.min((int)(g / FILTER), 255), Math.min((int)(b / FILTER), 255)); } public Color darker() { return new Color(Math.max((int)(getRed() * FILTER), 0), Math.max((int)(getGreen() * FILTER), 0), Math.max((int)(getBlue() * FILTER), 0)); } /******************************/ /** * System color */ public static Color getColor(String propertyname) { String colorstr = System.getProperty( propertyname, null); if(colorstr != null) { return new Color(Integer.parseInt(colorstr)); } else { return null; } } public static Color getColor(String propertyname, Color defaultcolor) { String colorstr = System.getProperty( propertyname, null); if(colorstr != null) { return new Color(Integer.parseInt(colorstr)); } else { return defaultcolor; } } public static Color getColor(String propertyname, int defaultcolorint) { String colorstr = System.getProperty( propertyname, null); if(colorstr != null) { return new Color(Integer.parseInt(colorstr)); } else { return new Color(defaultcolorint); } } /******************************/ /** * RGB to HSB (HSL) * / */ public static float[] RGBtoHSB(int r, int g, int b, float hsb[]) { float min, max, delta; float h, s, v; float r2 = (float)r / 255; float g2 = (float)g / 255; float b2 = (float)b / 255; if(hsb == null) hsb = new float[3]; min = Math.min(Math.min(r2, g2), b2); max = Math.max(Math.max(r2, g2), b2); v = max; delta = max - min; if(max != 0) s = delta / max; else { // r = g = b = 0 // s = 0, v is undefined hsb[0] = 0; hsb[1] = 0; hsb[2] = 0; return hsb; } if(r2 == max) h = (g2 - b2) / delta; // between yellow & magenta else if(g2 == max) h = 2 + (b2 - r2) / delta; // between cyan & yellow else h = 4 + (r2 - g2) / delta; // between magenta & cyan if( h < 0 ) h += 6; h /= 6; // 0.0 - 1.0 hsb[0] = h; hsb[1] = s; hsb[2] = v; return hsb; } public static int HSBtoRGB(float h, float s, float v) { int i; float f, p, q, t; float r, g, b; if(s == 0) { // achromatic (grey) r = g = b = v; return (255 << 24) | ((int)(r*255) << 16) | ((int)(g*255) << 8) | (int)(b*255); } h *= 6; // sector 0 to 5 i = (int)Math.floor(h); f = h - i; // factorial part of h p = v * (1 - s); q = v * (1 - s * f); t = v * (1 - s * (1 - f)); switch(i) { case 0: r = v; g = t; b = p; break; case 1: r = q; g = v; b = p; break; case 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; case 4: r = t; g = p; b = v; break; default: r = v; g = p; b = q; break; } return (255 << 24) | ((int)(r*255) << 16) | ((int)(g*255) << 8) | (int)(b*255); } public static Color getHSBColor(float hue, float saturation, float brightness){ return new Color(HSBtoRGB(hue,saturation,brightness)); } /** * @status implemented * @remark Currently, not compliant with SUN specs. Beside string representations of * one decimal, one hexadecimal or one octal number, it accepts strings representing * three decimal, three hexadecimal or three octal numbers separated by commas. <br> * Such strings cause a 'NumberFormatException' being thrown by sun's jdk1.2.2 implementation. * Accoding to the specs, wonka accepts '0x' and '0X' for hexadecimal radix. */ public static Color decode(String nm) throws NumberFormatException { int idx = nm.indexOf(','); if (idx != -1) { int idx2 = nm.indexOf(',', idx+1); if (idx2 == -1){ throw new NumberFormatException("String '"+nm+"' has the wrong number of commas to be a valid color"); } int r = Integer.decode(nm.substring(0,idx)).intValue(); int g = Integer.decode(nm.substring(idx+1,idx2)).intValue(); int b = Integer.decode(nm.substring(idx2+1)).intValue(); return new Color(r, g, b); } else { return new Color(Integer.decode(nm).intValue()); } } /******************************/ /** * Equals & hashcode * @status Implemented * @remark Complient with java specs */ public boolean equals(Object object) { if (!(object instanceof Color)) return false; else { Color c = (Color)object; return (this.getRed()==c.getRed() && this.getGreen()==c.getGreen() && this.getBlue()==c.getBlue()); } } public int hashCode() { return value; } /******************************/ /** * Diagnostics */ public String toString() { return getClass().getName() + "[r=" + getRed() + ",g=" + getGreen() + ",b=" + getBlue() + "]"; } protected String paramString() { return getClass().getName() + "(" + getRed() + ", " + getGreen() + ", " + getBlue() + ",alfa "+getAlpha()+")"; } }