mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			534 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			534 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* Color.java -- Class representing a color in Java
 | |
|    Copyright (C) 1999, 2002 Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GNU Classpath.
 | |
| 
 | |
| GNU Classpath is free software; you can redistribute it and/or modify
 | |
| it under the terms of the GNU General Public License as published by
 | |
| the Free Software Foundation; either version 2, or (at your option)
 | |
| any later version.
 | |
| 
 | |
| GNU Classpath is distributed in the hope that it will be useful, but
 | |
| WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
| General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License
 | |
| along with GNU Classpath; see the file COPYING.  If not, write to the
 | |
| Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 | |
| 02111-1307 USA.
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version. */
 | |
| 
 | |
| 
 | |
| package java.awt;
 | |
| 
 | |
| /**
 | |
|   * This class represents a color value in the AWT system.
 | |
|   *
 | |
|   * @author Aaron M. Renn (arenn@urbanophile.com)
 | |
|   */
 | |
| public class Color implements java.io.Serializable
 | |
| {
 | |
| 
 | |
| /*
 | |
|  * Static Variables
 | |
|  */
 | |
| 
 | |
| /**
 | |
|   * Constant for the color white
 | |
|   */
 | |
| public static final Color white = new Color(255,255,255,255);
 | |
| 
 | |
| /**
 | |
|   * Constant for the color light gray
 | |
|   */
 | |
| public static final Color lightGray = new Color(192,192,192,255);
 | |
| 
 | |
| /**
 | |
|   * Constant for the color gray
 | |
|   */
 | |
| public static final Color gray = new Color(128,128,128,255);
 | |
| 
 | |
| /**
 | |
|   * Constant for the color dark gray
 | |
|   */
 | |
| public static final Color darkGray = new Color(64,64,64,255);
 | |
| 
 | |
| /**
 | |
|   * Constant for the color black
 | |
|   */
 | |
| public static final Color black = new Color(0,0,0,255);
 | |
| 
 | |
| /**
 | |
|   * Constant for the color red
 | |
|   */
 | |
| public static final Color red = new Color(255,0,0,255);
 | |
| 
 | |
| /**
 | |
|   * Constant for the color pink
 | |
|   */
 | |
| public static final Color pink = new Color(255, 175, 175,255);
 | |
| 
 | |
| /**
 | |
|   * Constant for the color orange
 | |
|   */
 | |
| public static final Color orange = new Color(255, 200, 0,255);
 | |
| 
 | |
| /**
 | |
|   * Constant for the color yellow
 | |
|   */
 | |
| public static final Color yellow = new Color(255,255,0,255);
 | |
| 
 | |
| /**
 | |
|   * Constant for the color green
 | |
|   */
 | |
| public static final Color green = new Color(0,255,0,255);
 | |
| 
 | |
| /**
 | |
|   * Constant for the color magenta
 | |
|   */
 | |
| public static final Color magenta = new Color(255,0,255,255);
 | |
| 
 | |
| /**
 | |
|   * Constant for the color cyan
 | |
|   */
 | |
| public static final Color cyan = new Color(0,255,255,255);
 | |
| 
 | |
| /**
 | |
|   * Constant for the color blue
 | |
|   */
 | |
| public static final Color blue = new Color(0,0,255,255);
 | |
| 
 | |
| // Serialization Constant
 | |
| private static final long serialVersionUID = 118526816881161077L;
 | |
| 
 | |
| // Masks for individual color components
 | |
| private static final int redmask = 255 << 16;
 | |
| private static final int greenmask = 255 << 8;
 | |
| private static final int bluemask = 255;
 | |
| private static final int alphamask = 255 << 24;
 | |
| 
 | |
| private static final int BRIGHT_STEP = 0x30;
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * Instance Variables
 | |
|  */
 | |
| 
 | |
| /**
 | |
|   * @serial The RGB value of the color.
 | |
|   */
 | |
| private int value = 0xFFFFFFFF;
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * Static Methods
 | |
|  */
 | |
| 
 | |
| /**
 | |
|   * Converts the specified string to a number and creates a new instance
 | |
|   * of <code>Color</code> from the value.
 | |
|   *
 | |
|   * @param str The numeric color string.
 | |
|   *
 | |
|   * @return A new instance of <code>Color</code> for the string.
 | |
|   *
 | |
|   * @exception NumberFormatException If the string cannot be parsed.
 | |
|   */
 | |
| public static Color
 | |
| decode(String str) throws NumberFormatException
 | |
| {
 | |
|   Integer i = Integer.decode(str);
 | |
|   return(new Color(i.intValue()));
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /**
 | |
|   * Returns a new instance of <code>Color</code> from the value of
 | |
|   * the system property named by the specified string.  If the property
 | |
|   * does not exist, or cannot be parsed, then <code>null</code> will be
 | |
|   * returned.
 | |
|   *
 | |
|   * @param prop The system property to retrieve.
 | |
|   */
 | |
| public static Color
 | |
| getColor(String prop)
 | |
| {
 | |
|   return(getColor(prop, null));
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /**
 | |
|   * Returns a new instance of <code>Color</code> from the value of the
 | |
|   * system property named by the specified string.  If the property does
 | |
|   * not exist, or cannot be parsed, then the default RGB value will be
 | |
|   * used to create a return value.
 | |
|   *
 | |
|   * @param prop The system property to retrieve.
 | |
|   * @param defrgb The default RGB value.
 | |
|   */
 | |
| public static Color
 | |
| getColor(String prop, int defrgb)
 | |
| {
 | |
|   return(getColor(prop, new Color(defrgb)));
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /**
 | |
|   * Returns a new instance of <code>Color</code> from the value of the
 | |
|   * system property named by the specified string.  If the property does
 | |
|   * not exist, or cannot be parsed, then the default color value will be
 | |
|   * returned
 | |
|   *
 | |
|   * @param prop The system property to retrieve.
 | |
|   * @param defcolor The default color
 | |
|   */
 | |
| public static Color
 | |
| getColor(String prop, Color defcolor)
 | |
| {
 | |
|   String val = System.getProperty(prop);
 | |
|   if (val == null)
 | |
|     return(defcolor);
 | |
| 
 | |
|   try
 | |
|     {
 | |
|       return(decode(val));
 | |
|     }
 | |
|   catch(NumberFormatException e)
 | |
|     {
 | |
|       return(defcolor);
 | |
|     }
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /**
 | |
|   * Converts from the HSB (hue, saturation, brightness) color model to
 | |
|   * the RGB (red, green, blue) color model.
 | |
|   *
 | |
|   * @param hue The hue of the HSB value.
 | |
|   * @param saturation The saturation of the HSB value.
 | |
|   * @param brightness The brightness of the HSB value.
 | |
|   *
 | |
|   * @return The RGB value.
 | |
|   */
 | |
| public static int
 | |
| HSBtoRGB(float hue, float saturation, float brightness)
 | |
| {
 | |
|   // FIXME: Implement
 | |
|   throw new RuntimeException("Not implemented yet");
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /**
 | |
|   * Converts from the RGB (red, green, blue) color model to the HSB
 | |
|   * (hue, saturation, brightness) color model.
 | |
|   *
 | |
|   * @param red The red part of the RGB value.
 | |
|   * @param green The green part of the RGB value.
 | |
|   * @param blue The blue part of the RGB value.
 | |
|   * @param hsbvals An array of three floats used for storing the HSB values,
 | |
|   * or <code>null</code> if this return mechanism is not used.
 | |
|   *
 | |
|   * @return The HSB value.
 | |
|   */
 | |
| public static float[]
 | |
| RGBtoHSB(int red, int green, int blue, float hsbvals[])
 | |
| {
 | |
|   // FIXME: Implement
 | |
|   throw new RuntimeException("Not implemented yet");
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /**
 | |
|   * Returns a new instance of <code>Color</code> based on the specified
 | |
|   * HSB values.
 | |
|   *
 | |
|   * @param hue The hue of the HSB value.
 | |
|   * @param saturation The saturation of the HSB value.
 | |
|   * @param brightness The brightness of the HSB value.
 | |
|   *
 | |
|   * @return The new <code>Color</code> object.
 | |
|   */
 | |
| public static Color
 | |
| getHSBColor(float hue, float saturation, float brightness)
 | |
| {
 | |
|   return(new Color(HSBtoRGB(hue, saturation, brightness)));
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * Constructors
 | |
|  */
 | |
| 
 | |
| /**
 | |
|   * Initializes a new instance of <code>Color</code> using the specified
 | |
|   * red, green, and blue values, which must be given as integers in the
 | |
|   * range of 0-255.
 | |
|   *
 | |
|   * @param red The red component of the RGB value.
 | |
|   * @param green The green component of the RGB value.
 | |
|   * @param blue The blue component of the RGB value.
 | |
|   *
 | |
|   * @exception IllegalArgumentException If the values are out of range.
 | |
|   */
 | |
| public
 | |
| Color(int red, int green, int blue)
 | |
| {
 | |
|   if ((red < 0) || (red > 255) || (green < 0) || (green > 255) ||
 | |
|       (blue < 0) || (blue > 255))
 | |
|     throw new IllegalArgumentException("Bad RGB values");
 | |
| 
 | |
|   value = blue + (green << 8) + (red << 16);
 | |
| }
 | |
| 
 | |
| public
 | |
| Color(int red, int green, int blue, int alpha)
 | |
| {
 | |
|   if ((red < 0) || (red > 255) || (green < 0) || (green > 255) ||
 | |
|       (blue < 0) || (blue > 255))
 | |
|     throw new IllegalArgumentException("Bad RGB values");
 | |
| 
 | |
|   value = blue + (green << 8) + (red << 16) + (alpha << 24);
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /**
 | |
|   * Initializes a new instance of <code>Color</code> using the specified
 | |
|   * RGB value.  The blue value is in bits 0-7, green in bits 8-15, and 
 | |
|   * red in bits 16-23.  The other bits are ignored.
 | |
|   *
 | |
|   * @param value The RGB value
 | |
|   */
 | |
| public
 | |
| Color(int value)
 | |
| {
 | |
|   this.value = value;
 | |
| }
 | |
| 
 | |
| public
 | |
| Color(int value, boolean hasalpha)
 | |
| {
 | |
|   this.value = value;
 | |
|   if (! hasalpha)
 | |
|     this.value |= 0xFF000000;
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /**
 | |
|   * Initializes a new instance of <code>Color</code> using the specified
 | |
|   * RGB values.  These must be in the range of 0.0-1.0.
 | |
|   *
 | |
|   * @param red The red component of the RGB value.
 | |
|   * @param green The green component of the RGB value.
 | |
|   * @param blue The blue component of the RGB value.
 | |
|   *
 | |
|   * @exception IllegalArgumentException If the values are out of range.
 | |
|   */
 | |
| public
 | |
| Color(float red, float green, float blue)
 | |
| {
 | |
|   if ((red < 0.0) || (red > 1.0) || (green < 0.0) || (green > 1.0) ||
 | |
|       (blue < 0.0) || (blue > 1.0))
 | |
|     throw new IllegalArgumentException("Bad RGB values");
 | |
| 
 | |
|   int redval = (int)(255 * red);
 | |
|   int greenval = (int)(255 * green);
 | |
|   int blueval = (int)(255 * blue);
 | |
| 
 | |
|   value = blueval + (greenval << 8) + (redval << 16);
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * Instance Methods
 | |
|  */
 | |
| 
 | |
| /**
 | |
|   * Returns the red value for this color.
 | |
|   *
 | |
|   * @return The red value for this color.
 | |
|   */
 | |
| public int
 | |
| getRed()
 | |
| {
 | |
|   int redval = (value & redmask) >> 16;
 | |
| 
 | |
|   return(redval);
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /**
 | |
|   * Returns the green value for this color.
 | |
|   *
 | |
|   * @return The green value for this color.
 | |
|   */
 | |
| public int
 | |
| getGreen()
 | |
| {
 | |
|   int greenval = (value & greenmask) >> 8;
 | |
| 
 | |
|   return(greenval);
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /**
 | |
|   * Returns the blue value for this color.
 | |
|   *
 | |
|   * @return The blue value for this color.
 | |
|   */
 | |
| public int
 | |
| getBlue()
 | |
| {
 | |
|   int blueval = (value & bluemask);
 | |
| 
 | |
|   return(blueval);
 | |
| }
 | |
| 
 | |
| public int
 | |
| getAlpha()
 | |
| {
 | |
|   int alphaval = (value & alphamask);
 | |
| 
 | |
|   return(alphaval);
 | |
| }
 | |
| 
 | |
| public int
 | |
| getTransparency()
 | |
| {
 | |
|   if (getAlpha() == 0xFF)
 | |
|     return Transparency.OPAQUE;
 | |
|   else
 | |
|     return Transparency.TRANSLUCENT;
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /**
 | |
|   * Returns the RGB value for this color.  The blue value will be in bits
 | |
|   * 0-7, green in 8-15, and red in 6-23.  The upper bits should be ignored.
 | |
|   *
 | |
|   * @return The RGB value for this color.
 | |
|   */
 | |
| public int
 | |
| getRGB()
 | |
| {
 | |
|   return(value);
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /**
 | |
|   * Returns a brighter version of this color.  This is done by increasing
 | |
|   * the RGB values by an arbitrary scale factor.  Note that this method
 | |
|   * and the <code>darker()</code> method are not necessarily inverses.
 | |
|   *
 | |
|   * @return A brighter version of this color.
 | |
|   */
 | |
| public Color
 | |
| brighter()
 | |
| {
 | |
|   return new Color(Math.min(255, getRed()   + BRIGHT_STEP),
 | |
| 		   Math.min(255, getGreen() + BRIGHT_STEP),
 | |
| 		   Math.min(255, getBlue()  + BRIGHT_STEP),
 | |
| 		   getAlpha());
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /**
 | |
|   * Returns a darker version of this color.  This is done by decreasing
 | |
|   * the RGB values by an arbitrary scale factor.  Note that this method
 | |
|   * and the <code>brighter()</code> method are not necessarily inverses.
 | |
|   *
 | |
|   * @return A darker version of this color.
 | |
|   */
 | |
| public Color
 | |
| darker()
 | |
| {
 | |
|   return new Color(Math.max(0, getRed()   - BRIGHT_STEP),
 | |
| 		   Math.max(0, getGreen() - BRIGHT_STEP),
 | |
| 		   Math.max(0, getBlue()  - BRIGHT_STEP),
 | |
| 		   getAlpha());
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /**
 | |
|   * Returns a hash value for this color.
 | |
|   *
 | |
|   * @return A hash value for this color.
 | |
|   */
 | |
| public int
 | |
| hashCode()
 | |
| {
 | |
|   return(value);
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /**
 | |
|   * Tests this object for equality against the specified object.  This will
 | |
|   * be true if and only if the specified object is an instance of
 | |
|   * <code>Color</code> and has the same red, green, and blue values as
 | |
|   * this object.
 | |
|   *
 | |
|   * @return <code>true</code> if the specified object is equal to this one,
 | |
|   * <code>false</code> otherwise.
 | |
|   */
 | |
| public boolean
 | |
| equals(Object obj)
 | |
| {
 | |
|   if (!(obj instanceof Color))
 | |
|     return(false);
 | |
| 
 | |
|   Color c = (Color)obj;
 | |
|   return value == c.value;
 | |
| }
 | |
| 
 | |
| /*************************************************************************/
 | |
| 
 | |
| /**
 | |
|   * Returns a string representation of this object.
 | |
|   * 
 | |
|   * @return A string representation of this object.
 | |
|   */
 | |
| public String
 | |
| toString()
 | |
| {
 | |
|   return(getClass().getName() + "(red=" + getRed() + ",green=" + getGreen() +
 | |
|          ",blue=" + getBlue() + ")");
 | |
| }
 | |
| 
 | |
| } // class Color
 | |
| 
 |