Color.java :  » Game » foogamelib » org » newdawn » slick » Java Open Source

Java Open Source » Game » foogamelib 
foogamelib » org » newdawn » slick » Color.java
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);
  /** The fixed colour dark orange */
    public final static Color orange   = new Color(255, 200, 0);
  /** The fixed colour dark magenta */
    public final static Color magenta  = new Color(255, 0, 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 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)
   * @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 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)
   * @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
   * 
   * @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 += 255;
    }
    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;
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.