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         * @param type
084         * @param numcomponents
085         */
086        public HSVColorSpace() {
087                super(ColorSpace.TYPE_HSV, 3);
088        }
089
090        /**
091         * @param ciexyzvalue The color components in CIEXYZ colorspace
092         * @return the equivalent HSV components
093         * @see java.awt.color.ColorSpace#fromCIEXYZ(float[])
094         */
095        @Override
096        public float[] fromCIEXYZ(float[] ciexyzvalue) {
097                ColorSpace CIEXYZcs = ColorSpace.getInstance(CS_CIEXYZ);
098                float[] rgb = CIEXYZcs.toRGB(ciexyzvalue);
099                return this.fromRGB(rgb);
100        }
101
102        /**
103         * @param rgbvalue
104         * @return
105         * @see java.awt.color.ColorSpace#fromRGB(float[])
106         */
107        @Override
108        public float[] fromRGB(float[] rgbvalue) {
109                assert(rgbvalue.length==3);
110                Color rgbColor = new Color(rgbvalue[0], rgbvalue[1], rgbvalue[2]);
111                return Color.RGBtoHSB(rgbColor.getRed(),rgbColor.getGreen(),rgbColor.getBlue(), null);
112        }
113
114        /**
115         * @param hsv
116         * @return
117         * @see java.awt.color.ColorSpace#toCIEXYZ(float[])
118         */
119        @Override
120        public float[] toCIEXYZ(float[] hsv) {
121                float[] rgb = this.toRGB(hsv);
122                ColorSpace CIEXYZcs = ColorSpace.getInstance(CS_CIEXYZ);
123                return CIEXYZcs.fromRGB(rgb);
124        }
125
126        /**
127         * @param hsv 3-component array specifying hue, saturation, value
128         * @return equivalent red,green,blue components
129         * @see java.awt.color.ColorSpace#toRGB(float[])
130         */
131        @Override
132        public float[] toRGB(float[] hsv) {
133                int rgb = Color.HSBtoRGB(hsv[0], hsv[1], hsv[2]);
134                Color rgbColor = new Color(rgb);
135                return rgbColor.getColorComponents(null);
136        }
137
138        private static HSVColorSpace hsvSpace;
139        /**
140         * The HSV color space
141         */
142        public static final int CS_HSV = 1007;
143        public static ColorSpace getInstance(int colorspace) {
144                ColorSpace theColorSpace;
145                switch( colorspace ) {
146                case CS_HSV:
147                        synchronized(HSVColorSpace.class) {
148                                if(hsvSpace == null) {
149                                        hsvSpace = new HSVColorSpace();
150                                }
151                                theColorSpace = hsvSpace;
152                        }
153                        break;
154                default:
155                        theColorSpace = ColorSpace.getInstance(colorspace);
156                }
157
158                return theColorSpace;
159        }
160
161        public static ColorSpace getHSVColorSpace() {
162                return HSVColorSpace.getInstance(CS_HSV);
163        }
164
165}