home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1998 February / VPR9802A.ISO / APP_DEMO / VC / MAIN.BIN / Color.java < prev    next >
Text File  |  1997-10-27  |  13KB  |  465 lines

  1. /*
  2.  * @(#)Color.java    1.29 97/02/17
  3.  * 
  4.  * Copyright (c) 1995, 1996 Sun Microsystems, Inc. All Rights Reserved.
  5.  * 
  6.  * This software is the confidential and proprietary information of Sun
  7.  * Microsystems, Inc. ("Confidential Information").  You shall not
  8.  * disclose such Confidential Information and shall use it only in
  9.  * accordance with the terms of the license agreement you entered into
  10.  * with Sun.
  11.  * 
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  15.  * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
  16.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
  17.  * THIS SOFTWARE OR ITS DERIVATIVES.
  18.  * 
  19.  * CopyrightVersion 1.1_beta
  20.  * 
  21.  */
  22. package java.awt;
  23.  
  24. import java.io.*;
  25. import java.lang.*;
  26.  
  27. /**
  28.  * A class to encapsulate RGB Colors.
  29.  *
  30.  * @version     1.29, 02/17/97
  31.  * @author     Sami Shaio
  32.  * @author     Arthur van Hoff
  33.  */
  34. public class Color implements java.io.Serializable {
  35.     
  36.     /**
  37.      * The color white.
  38.      */
  39.     public final static Color white     = new Color(255, 255, 255);
  40.  
  41.     /**
  42.      * The color light gray.
  43.      */
  44.     public final static Color lightGray = new Color(192, 192, 192);
  45.  
  46.     /**
  47.      * The color gray.
  48.      */
  49.     public final static Color gray     = new Color(128, 128, 128);
  50.  
  51.     /**
  52.      * The color dark gray.
  53.      */
  54.     public final static Color darkGray     = new Color(64, 64, 64);
  55.  
  56.     /**
  57.      * The color black.
  58.      */
  59.     public final static Color black     = new Color(0, 0, 0);
  60.     
  61.     /**
  62.      * The color red.
  63.      */
  64.     public final static Color red     = new Color(255, 0, 0);
  65.  
  66.     /**
  67.      * The color pink.
  68.      */
  69.     public final static Color pink     = new Color(255, 175, 175);
  70.  
  71.     /**
  72.      * The color orange.
  73.      */
  74.     public final static Color orange     = new Color(255, 200, 0);
  75.  
  76.     /**
  77.      * The color yellow.
  78.      */
  79.     public final static Color yellow     = new Color(255, 255, 0);
  80.  
  81.     /**
  82.      * The color green.
  83.      */
  84.     public final static Color green     = new Color(0, 255, 0);
  85.  
  86.     /**
  87.      * The color magneta.
  88.      */
  89.     public final static Color magenta    = new Color(255, 0, 255);
  90.  
  91.     /**
  92.      * The color cyan.
  93.      */
  94.     public final static Color cyan     = new Color(0, 255, 255);
  95.  
  96.     /**
  97.      * The color blue.
  98.      */
  99.     public final static Color blue     = new Color(0, 0, 255);
  100.  
  101.     /**
  102.      * Private data.
  103.      */
  104.     transient private int pData;
  105.  
  106.     /**
  107.      * The color value.
  108.      */
  109.     int value;
  110.  
  111.     /*
  112.      * JDK 1.1 serialVersionUID 
  113.      */
  114.      private static final long serialVersionUID = 118526816881161077L;
  115.  
  116.     /**
  117.      * Checks the color integer components supplied for validity.
  118.      * Throws an IllegalArgumentException if the value is out of range.
  119.      * @param r the Red component
  120.      * @param g the Green component
  121.      * @param b the Blue component
  122.      **/
  123.     private static void testColorValueRange(int r, int g, int b) {
  124.         boolean rangeError = false;
  125.     String badComponentString = "";
  126.     if ( r < 0 || r > 255) {
  127.         rangeError = true;
  128.         badComponentString = badComponentString + " Red";
  129.     }
  130.     if ( g < 0 || g > 255) {
  131.         rangeError = true;
  132.         badComponentString = badComponentString + " Green";
  133.     }
  134.     if ( b < 0 || b > 255) {
  135.         rangeError = true;
  136.         badComponentString = badComponentString + " Blue";
  137.     }
  138.     if ( rangeError == true ) {
  139.     throw new IllegalArgumentException("Color parameter outside of expected range:"
  140.                        + badComponentString);
  141.     }
  142.     }
  143.  
  144.     /**
  145.      * Checks the color float components supplied for validity.
  146.      * Throws an IllegalArgumentException if the value is out of range.
  147.      * @param r the Red component
  148.      * @param g the Green component
  149.      * @param b the Blue component
  150.      **/
  151.     private static void testColorValueRange(float r, float g, float b) {
  152.         boolean rangeError = false;
  153.     String badComponentString = "";
  154.     if ( r < 0.0 || r > 1.0) {
  155.         rangeError = true;
  156.         badComponentString = badComponentString + " Red";
  157.     }
  158.     if ( g < 0.0 || g > 1.0) {
  159.         rangeError = true;
  160.         badComponentString = badComponentString + " Green";
  161.     }
  162.     if ( b < 0.0 || b > 1.0) {
  163.         rangeError = true;
  164.         badComponentString = badComponentString + " Blue";
  165.     }
  166.     if ( rangeError == true ) {
  167.     throw new IllegalArgumentException("Color parameter outside of expected range:"
  168.                        + badComponentString);
  169.     }
  170.     }
  171.  
  172.     /**
  173.      * Creates a color with the specified red, green, and blue values in
  174.      * the range (0 - 255).  The actual color used in rendering will depend
  175.      * on finding the best match given the color space available for a
  176.      * given output device.
  177.      * @param r the red component
  178.      * @param g the green component
  179.      * @param b the blue component
  180.      * @see #getRed
  181.      * @see #getGreen
  182.      * @see #getBlue
  183.      * @see #getRGB
  184.      */
  185.     public Color(int r, int g, int b) {
  186.         this(((r & 0xFF) << 16) | ((g & 0xFF) << 8) | ((b & 0xFF) << 0));
  187.     testColorValueRange(r,g,b);
  188.     }
  189.  
  190.     /**
  191.      * Creates a color with the specified combined RGB value consisting of
  192.      * the red component in bits 16-23, the green component in bits 8-15,
  193.      * and the blue component in bits 0-7.  The actual color used in
  194.      * rendering will depend on finding the best match given the color space
  195.      * available for a given output device.
  196.      * @param rgb the combined RGB components
  197.      * @see java.awt.image.ColorModel#getRGBdefault
  198.      * @see #getRed
  199.      * @see #getGreen
  200.      * @see #getBlue
  201.      * @see #getRGB
  202.      */
  203.     public Color(int rgb) {
  204.       value = 0xff000000 | rgb;
  205.     }
  206.  
  207.     /**
  208.      * Creates a color with the specified red, green, and blue values in the
  209.      * range (0.0 - 1.0). The actual color
  210.      * used in rendering will depend on finding the best match given the
  211.      * color space available for a given output device.
  212.      * @param r the red component
  213.      * @param g the red component
  214.      * @param b the red component
  215.      * @see #getRed
  216.      * @see #getGreen
  217.      * @see #getBlue
  218.      * @see #getRGB
  219.      */
  220.     public Color(float r, float g, float b) {
  221.       this( (int) (r * 255), (int) (g * 255), (int) (b * 255));
  222.       testColorValueRange(r,g,b);
  223.     }
  224.  
  225.     /**
  226.      * Gets the red component.
  227.      * @see #getRGB
  228.      */
  229.     public int getRed() {
  230.     return (getRGB() >> 16) & 0xFF;
  231.     }
  232.  
  233.     /**
  234.      * Gets the green component.
  235.      * @see #getRGB
  236.      */
  237.     public int getGreen() {
  238.     return (getRGB() >> 8) & 0xFF;
  239.     }
  240.  
  241.     /**
  242.      * Gets the blue component.
  243.      * @see #getRGB
  244.      */
  245.     public int getBlue() {
  246.     return (getRGB() >> 0) & 0xFF;
  247.     }
  248.  
  249.     /**
  250.      * Gets the RGB value representing the color in the default RGB ColorModel.
  251.      * (Bits 24-31 are 0xff, 16-23 are red, 8-15 are green, 0-7 are blue).
  252.      * @see java.awt.image.ColorModel#getRGBdefault
  253.      * @see #getRed
  254.      * @see #getGreen
  255.      * @see #getBlue
  256.      */
  257.     public int getRGB() {
  258.     return value;
  259.     }
  260.  
  261.     private static final double FACTOR = 0.7;
  262.  
  263.     /**
  264.      * Returns a brighter version of this color.
  265.      */
  266.     public Color brighter() {
  267.     return new Color(Math.min((int)(getRed()  *(1/FACTOR)), 255), 
  268.              Math.min((int)(getGreen()*(1/FACTOR)), 255),
  269.              Math.min((int)(getBlue() *(1/FACTOR)), 255));
  270.     }
  271.  
  272.     /**
  273.      * Returns a darker version of this color.
  274.      */
  275.     public Color darker() {
  276.     return new Color(Math.max((int)(getRed()  *FACTOR), 0), 
  277.              Math.max((int)(getGreen()*FACTOR), 0),
  278.              Math.max((int)(getBlue() *FACTOR), 0));
  279.     }
  280.  
  281.     /**
  282.      * Computes the hash code.
  283.      */
  284.     public int hashCode() {
  285.     return value;
  286.     }
  287.  
  288.     /**
  289.      * Compares this object against the specified object.
  290.      * @param obj the object to compare with.
  291.      * @return true if the objects are the same; false otherwise.
  292.      */
  293.     public boolean equals(Object obj) {
  294.         return obj instanceof Color && ((Color)obj).value == this.value;
  295.     }
  296.  
  297.     /**
  298.      * Returns the String representation of this Color's values.
  299.      */
  300.     public String toString() {
  301.         return getClass().getName() + "[r=" + getRed() + ",g=" + getGreen() + ",b=" + getBlue() + "]";
  302.     }
  303.  
  304.     /**
  305.      * Gets the specified Color.
  306.      * @param nm representation of the color as a 24-bit integer
  307.      * @return the new color
  308.      */
  309.     public static Color decode(String nm) throws NumberFormatException {
  310.     Integer intval = Integer.decode(nm);
  311.     int i = intval.intValue();
  312.     return new Color((i >> 16) & 0xFF, (i >> 8) & 0xFF, i & 0xFF);
  313.     }
  314.  
  315.     /**
  316.      * Gets the specified Color property.
  317.      * @param nm the name of the color property
  318.      */
  319.     public static Color getColor(String nm) {
  320.     return getColor(nm, null);
  321.     }
  322.  
  323.     /**
  324.      * Gets the specified Color property of the specified Color.
  325.      * @param nm the name of the color property
  326.      * @param v the specified color
  327.      * @return the new color.
  328.      */
  329.     public static Color getColor(String nm, Color v) {
  330.     Integer intval = Integer.getInteger(nm);
  331.     if (intval == null) {
  332.         return v;
  333.     }
  334.     int i = intval.intValue();
  335.     return new Color((i >> 16) & 0xFF, (i >> 8) & 0xFF, i & 0xFF);
  336.     }
  337.  
  338.     /**
  339.      * Gets the specified Color property of the color value.
  340.      * @param nm the name of the color property
  341.      * @param v the color value
  342.      * @return the new color.
  343.      */
  344.     public static Color getColor(String nm, int v) {
  345.     Integer intval = Integer.getInteger(nm);
  346.     int i = (intval != null) ? intval.intValue() : v;
  347.     return new Color((i >> 16) & 0xFF, (i >> 8) & 0xFF, (i >> 0) & 0xFF);
  348.     }
  349.  
  350.     /**
  351.      * Returns the RGB value defined by the default RGB ColorModel, of
  352.      * the color corresponding to the given HSB color components.
  353.      * @param hue the hue component of the color
  354.      * @param saturation the saturation of the color
  355.      * @param brightness the brightness of the color
  356.      * @see java.awt.image.ColorModel#getRGBdefault
  357.      * @see #getRGB
  358.      */
  359.     public static int HSBtoRGB(float hue, float saturation, float brightness) {
  360.     int r = 0, g = 0, b = 0;
  361.         if (saturation == 0) {
  362.         r = g = b = (int) (brightness * 255);
  363.     } else {
  364.         double h = (hue - Math.floor(hue)) * 6.0;
  365.         double f = h - java.lang.Math.floor(h);
  366.         double p = brightness * (1.0 - saturation);
  367.         double q = brightness * (1.0 - saturation * f);
  368.         double t = brightness * (1.0 - (saturation * (1.0 - f)));
  369.         switch ((int) h) {
  370.         case 0:
  371.         r = (int) (brightness * 255);
  372.         g = (int) (t * 255);
  373.         b = (int) (p * 255);
  374.         break;
  375.         case 1:
  376.         r = (int) (q * 255);
  377.         g = (int) (brightness * 255);
  378.         b = (int) (p * 255);
  379.         break;
  380.         case 2:
  381.         r = (int) (p * 255);
  382.         g = (int) (brightness * 255);
  383.         b = (int) (t * 255);
  384.         break;
  385.         case 3:
  386.         r = (int) (p * 255);
  387.         g = (int) (q * 255);
  388.         b = (int) (brightness * 255);
  389.         break;
  390.         case 4:
  391.         r = (int) (t * 255);
  392.         g = (int) (p * 255);
  393.         b = (int) (brightness * 255);
  394.         break;
  395.         case 5:
  396.         r = (int) (brightness * 255);
  397.         g = (int) (p * 255);
  398.         b = (int) (q * 255);
  399.         break;
  400.         }
  401.     }
  402.     return 0xff000000 | (r << 16) | (g << 8) | (b << 0);
  403.     }
  404.  
  405.     /**
  406.      * Returns the HSB values corresponding to the color defined by the
  407.      * red, green, and blue components.
  408.      * @param r the red component of the color
  409.      * @param g the green component of the color
  410.      * @param b the blue component of the color
  411.      * @param hsbvals the array to be used to return the 3 HSB values, or null
  412.      * @return the array used to store the results [hue, saturation, brightness]
  413.      * @see java.awt.image.ColorModel#getRGBdefault
  414.      * @see #getRGB
  415.      */
  416.     public static float[] RGBtoHSB(int r, int g, int b, float[] hsbvals) {
  417.     float hue, saturation, brightness;
  418.     if (hsbvals == null) {
  419.         hsbvals = new float[3];
  420.     }
  421.         int cmax = (r > g) ? r : g;
  422.     if (b > cmax) cmax = b;
  423.     int cmin = (r < g) ? r : g;
  424.     if (b < cmin) cmin = b;
  425.  
  426.     brightness = ((float) cmax) / 255.0f;
  427.     if (cmax != 0)
  428.         saturation = ((float) (cmax - cmin)) / ((float) cmax);
  429.     else
  430.         saturation = 0;
  431.     if (saturation == 0)
  432.         hue = 0;
  433.     else {
  434.         float redc = ((float) (cmax - r)) / ((float) (cmax - cmin));
  435.         float greenc = ((float) (cmax - g)) / ((float) (cmax - cmin));
  436.         float bluec = ((float) (cmax - b)) / ((float) (cmax - cmin));
  437.         if (r == cmax)
  438.         hue = bluec - greenc;
  439.         else if (g == cmax)
  440.             hue = 2.0f + redc - bluec;
  441.             else
  442.         hue = 4.0f + greenc - redc;
  443.         hue = hue / 6.0f;
  444.         if (hue < 0)
  445.         hue = hue + 1.0f;
  446.     }
  447.     hsbvals[0] = hue;
  448.     hsbvals[1] = saturation;
  449.     hsbvals[2] = brightness;
  450.     return hsbvals;
  451.     }
  452.  
  453.     /**
  454.      * A static Color factory for generating a Color object from HSB
  455.      * values.
  456.      * @param h the hue component
  457.      * @param s the saturation of the color
  458.      * @param b the brightness of the color
  459.      * @return the Color object for the corresponding RGB color
  460.      */
  461.     public static Color getHSBColor(float h, float s, float b) {
  462.     return new Color(HSBtoRGB(h, s, b));
  463.     }
  464. }
  465.