001/*
002 *                  BioJava development code
003 *
004 * This code may be freely distributed and modified under the
005 * terms of the GNU Lesser General Public Licence.  This should
006 * be distributed with the code.  If you do not have a copy,
007 * see:
008 *
009 *      http://www.gnu.org/copyleft/lesser.html
010 *
011 * Copyright for this code is held jointly by the individual
012 * authors.  These should be listed in @author doc comments.
013 *
014 * For more information on the BioJava project and its aims,
015 * or to join the biojava-l mailing list, visit the home page
016 * at:
017 *
018 *      http://www.biojava.org/
019 *
020 * Created on Aug 3, 2007
021 */
022package org.biojava.nbio.structure.gui.util.color;
023
024import java.awt.*;
025import java.awt.color.ColorSpace;
026
027/**
028 * @author Spencer Bliven
029 *
030 */
031public class HSVColorSpace extends ColorSpace {
032
033        private static final long serialVersionUID = 8324413992279510075L;
034
035        public static void main(String[] args) {
036                HSVColorSpace csHSV = new HSVColorSpace();
037                ColorSpace csRGB = ColorSpace.getInstance(CS_sRGB);
038                Color c;
039                float[] rgbComp;
040                float[] hsvComp;
041
042                c = Color.RED;
043                rgbComp = c.getColorComponents(csRGB,null);
044                hsvComp = c.getColorComponents(csHSV, null);
045                assert(rgbComp.length == 3);
046                assert(hsvComp.length == 3);
047                System.out.format("RED\tRGB[%f %f %f] HSV[%f %f %f]\n",
048                                rgbComp[0], rgbComp[1], rgbComp[2],
049                                hsvComp[0], hsvComp[1], hsvComp[2] );
050
051
052                c = Color.WHITE;
053                rgbComp = c.getColorComponents(csRGB,null);
054                hsvComp = c.getColorComponents(csHSV, null);
055                System.out.format("WHITE\tRGB[%f %f %f] HSV[%f %f %f]\n",
056                                rgbComp[0], rgbComp[1], rgbComp[2],
057                                hsvComp[0], hsvComp[1], hsvComp[2] );
058
059                c = Color.BLACK;
060                rgbComp = c.getColorComponents(csRGB,null);
061                hsvComp = c.getColorComponents(csHSV, null);
062                System.out.format("BLACK\tRGB[%f %f %f] HSV[%f %f %f]\n",
063                                rgbComp[0], rgbComp[1], rgbComp[2],
064                                hsvComp[0], hsvComp[1], hsvComp[2] );
065
066                c = Color.GRAY;
067                rgbComp = c.getColorComponents(csRGB,null);
068                hsvComp = c.getColorComponents(csHSV, null);
069                System.out.format("GRAY\tRGB[%f %f %f] HSV[%f %f %f]\n",
070                                rgbComp[0], rgbComp[1], rgbComp[2],
071                                hsvComp[0], hsvComp[1], hsvComp[2] );
072
073                c = Color.CYAN;
074                rgbComp = c.getColorComponents(csRGB,null);
075                hsvComp = c.getColorComponents(csHSV, null);
076                System.out.format("CYAN\tRGB[%f %f %f] HSV[%f %f %f]\n",
077                                rgbComp[0], rgbComp[1], rgbComp[2],
078                                hsvComp[0], hsvComp[1], hsvComp[2] );
079
080
081        }
082
083        /**
084         */
085        public HSVColorSpace() {
086                super(ColorSpace.TYPE_HSV, 3);
087        }
088
089        /**
090         * @param ciexyzvalue The color components in CIEXYZ colorspace
091         * @return the equivalent HSV components
092         * @see java.awt.color.ColorSpace#fromCIEXYZ(float[])
093         */
094        @Override
095        public float[] fromCIEXYZ(float[] ciexyzvalue) {
096                ColorSpace CIEXYZcs = ColorSpace.getInstance(CS_CIEXYZ);
097                float[] rgb = CIEXYZcs.toRGB(ciexyzvalue);
098                return this.fromRGB(rgb);
099        }
100
101        /**
102         * @param rgbvalue
103         * @return
104         * @see java.awt.color.ColorSpace#fromRGB(float[])
105         */
106        @Override
107        public float[] fromRGB(float[] rgbvalue) {
108                assert(rgbvalue.length==3);
109                Color rgbColor = new Color(rgbvalue[0], rgbvalue[1], rgbvalue[2]);
110                return Color.RGBtoHSB(rgbColor.getRed(),rgbColor.getGreen(),rgbColor.getBlue(), null);
111        }
112
113        /**
114         * @param hsv
115         * @return
116         * @see java.awt.color.ColorSpace#toCIEXYZ(float[])
117         */
118        @Override
119        public float[] toCIEXYZ(float[] hsv) {
120                float[] rgb = this.toRGB(hsv);
121                ColorSpace CIEXYZcs = ColorSpace.getInstance(CS_CIEXYZ);
122                return CIEXYZcs.fromRGB(rgb);
123        }
124
125        /**
126         * @param hsv 3-component array specifying hue, saturation, value
127         * @return equivalent red,green,blue components
128         * @see java.awt.color.ColorSpace#toRGB(float[])
129         */
130        @Override
131        public float[] toRGB(float[] hsv) {
132                int rgb = Color.HSBtoRGB(hsv[0], hsv[1], hsv[2]);
133                Color rgbColor = new Color(rgb);
134                return rgbColor.getColorComponents(null);
135        }
136
137        private static HSVColorSpace hsvSpace;
138        /**
139         * The HSV color space
140         */
141        public static final int CS_HSV = 1007;
142        public static ColorSpace getInstance(int colorspace) {
143                ColorSpace theColorSpace;
144                switch( colorspace ) {
145                case CS_HSV:
146                        synchronized(HSVColorSpace.class) {
147                                if(hsvSpace == null) {
148                                        hsvSpace = new HSVColorSpace();
149                                }
150                                theColorSpace = hsvSpace;
151                        }
152                        break;
153                default:
154                        theColorSpace = ColorSpace.getInstance(colorspace);
155                }
156
157                return theColorSpace;
158        }
159
160        public static ColorSpace getHSVColorSpace() {
161                return HSVColorSpace.getInstance(CS_HSV);
162        }
163
164}