package org.newdawn.slick; import java.io.Serializable; import java.nio.FloatBuffer; import org.newdawn.slick.opengl.renderer.Renderer; import org.newdawn.slick.opengl.renderer.SGL; /** * A simple wrapper round the values required for a colour * * @author Kevin Glass */ public class Color implements Serializable { /** The version ID for this calss */ private static final long serialVersionUID = 1393939L; /** The renderer to use for all GL operations */ protected static SGL GL = Renderer.get(); /** The fixed colour white */ public static final Color white = new Color(1.0f,1.0f,1.0f,1.0f); /** The fixed colour yellow */ public static final Color yellow = new Color(1.0f,1.0f,0,1.0f); /** The fixed colour red */ public static final Color red = new Color(1.0f,0,0,1.0f); /** The fixed colour blue */ public static final Color blue = new Color(0,0,1.0f,1.0f); /** The fixed colour green */ public static final Color green = new Color(0,1.0f,0,1.0f); /** The fixed colour black */ public static final Color black = new Color(0,0,0,1.0f); /** The fixed colour gray */ public static final Color gray = new Color(0.5f,0.5f,0.5f,1.0f); /** The fixed colour cyan */ public static final Color cyan = new Color(0,1.0f,1.0f,1.0f); /** The fixed colour dark gray */ public static final Color darkGray = new Color(0.3f,0.3f,0.3f,1.0f); /** The fixed colour light gray */ public static final Color lightGray = new Color(0.7f,0.7f,0.7f,1.0f); /** The fixed colour dark pink */ public final static Color pink = new Color(255, 175, 175, 255); /** The fixed colour dark orange */ public final static Color orange = new Color(255, 200, 0, 255); /** The fixed colour dark magenta */ public final static Color magenta = new Color(255, 0, 255, 255); /** The red component of the colour */ public float r; /** The green component of the colour */ public float g; /** The blue component of the colour */ public float b; /** The alpha component of the colour */ public float a = 1.0f; /** * Copy constructor * * @param color The color to copy into the new instance */ public Color(Color color) { r = color.r; g = color.g; b = color.b; a = color.a; } /** * Create a component based on the first 4 elements of a float buffer * * @param buffer The buffer to read the color from */ public Color(FloatBuffer buffer) { this.r = buffer.get(); this.g = buffer.get(); this.b = buffer.get(); this.a = buffer.get(); } /** * Create a 3 component colour * * @param r The red component of the colour (0.0 -> 1.0) * @param g The green component of the colour (0.0 -> 1.0) * @param b The blue component of the colour (0.0 -> 1.0) */ public Color(float r,float g,float b) { this.r = r; this.g = g; this.b = b; this.a = 1; } /** * Create a 4 component colour * * @param r The red component of the colour (0.0 -> 1.0) * @param g The green component of the colour (0.0 -> 1.0) * @param b The blue component of the colour (0.0 -> 1.0) * @param a The alpha component of the colour (0.0 -> 1.0) */ public Color(float r,float g,float b,float a) { this.r = Math.min(r, 1); this.g = Math.min(g, 1); this.b = Math.min(b, 1); this.a = Math.min(a, 1); } /** * Create a 3 component colour * * @param r The red component of the colour (0 -> 255) * @param g The green component of the colour (0 -> 255) * @param b The blue component of the colour (0 -> 255) */ public Color(int r,int g,int b) { this.r = r / 255.0f; this.g = g / 255.0f; this.b = b / 255.0f; this.a = 1; } /** * Create a 4 component colour * * @param r The red component of the colour (0 -> 255) * @param g The green component of the colour (0 -> 255) * @param b The blue component of the colour (0 -> 255) * @param a The alpha component of the colour (0 -> 255) */ public Color(int r,int g,int b,int a) { this.r = r / 255.0f; this.g = g / 255.0f; this.b = b / 255.0f; this.a = a / 255.0f; } /** * Create a colour from an evil integer packed 0xAARRGGBB. If AA * is specified as zero then it will be interpreted as unspecified * and hence a value of 255 will be recorded. * * @param value The value to interpret for the colour */ public Color(int value) { int r = (value & 0x00FF0000) >> 16; int g = (value & 0x0000FF00) >> 8; int b = (value & 0x000000FF); int a = (value & 0xFF000000) >> 24; if (a < 0) { a += 256; } if (a == 0) { a = 255; } this.r = r / 255.0f; this.g = g / 255.0f; this.b = b / 255.0f; this.a = a / 255.0f; } /** * Decode a number in a string and process it as a colour * reference. * * @param nm The number string to decode * @return The color generated from the number read */ public static Color decode(String nm) { return new Color(Integer.decode(nm).intValue()); } /** * Bind this colour to the GL context */ public void bind() { GL.glColor4f(r,g,b,a); } /** * @see java.lang.Object#hashCode() */ public int hashCode() { return ((int) (r+g+b+a)*255); } /** * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object other) { if (other instanceof Color) { Color o = (Color) other; return ((o.r == r) && (o.g == g) && (o.b == b) && (o.a == a)); } return false; } /** * @see java.lang.Object#toString() */ public String toString() { return "Color ("+r+","+g+","+b+","+a+")"; } /** * Make a darker instance of this colour * * @return The darker version of this colour */ public Color darker() { return darker(0.5f); } /** * Make a darker instance of this colour * * @param scale The scale down of RGB (i.e. if you supply 0.03 the colour will be darkened by 3%) * @return The darker version of this colour */ public Color darker(float scale) { scale = 1 - scale; Color temp = new Color(r * scale,g * scale,b * scale,a); return temp; } /** * Make a brighter instance of this colour * * @return The brighter version of this colour */ public Color brighter() { return brighter(0.2f); } /** * Get the red byte component of this colour * * @return The red component (range 0-255) */ public int getRed() { return (int) (r * 255); } /** * Get the green byte component of this colour * * @return The green component (range 0-255) */ public int getGreen() { return (int) (g * 255); } /** * Get the blue byte component of this colour * * @return The blue component (range 0-255) */ public int getBlue() { return (int) (b * 255); } /** * Get the alpha byte component of this colour * * @return The alpha component (range 0-255) */ public int getAlpha() { return (int) (a * 255); } /** * Get the red byte component of this colour * * @return The red component (range 0-255) */ public int getRedByte() { return (int) (r * 255); } /** * Get the green byte component of this colour * * @return The green component (range 0-255) */ public int getGreenByte() { return (int) (g * 255); } /** * Get the blue byte component of this colour * * @return The blue component (range 0-255) */ public int getBlueByte() { return (int) (b * 255); } /** * Get the alpha byte component of this colour * * @return The alpha component (range 0-255) */ public int getAlphaByte() { return (int) (a * 255); } /** * Make a brighter instance of this colour * * @param scale The scale up of RGB (i.e. if you supply 0.03 the colour will be brightened by 3%) * @return The brighter version of this colour */ public Color brighter(float scale) { scale += 1; Color temp = new Color(r * scale,g * scale,b * scale,a); return temp; } /** * Multiply this color by another * * @param c the other color * @return product of the two colors */ public Color multiply(Color c) { return new Color(r * c.r, g * c.g, b * c.b, a * c.a); } /** * Add another colour to this one * * @param c The colour to add */ public void add(Color c) { r += c.r; g += c.g; b += c.b; a += c.a; } /** * Scale the components of the colour by the given value * * @param value The value to scale by */ public void scale(float value) { r *= value; g *= value; b *= value; a *= value; } /** * Add another colour to this one * * @param c The colour to add * @return The copy which has had the color added to it */ public Color addToCopy(Color c) { Color copy = new Color(r,g,b,a); copy.r += c.r; copy.g += c.g; copy.b += c.b; copy.a += c.a; return copy; } /** * Scale the components of the colour by the given value * * @param value The value to scale by * @return The copy which has been scaled */ public Color scaleCopy(float value) { Color copy = new Color(r,g,b,a); copy.r *= value; copy.g *= value; copy.b *= value; copy.a *= value; return copy; } }