001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.commons.imaging.color;
018
019/**
020 * Represents a color in the HSV color space.
021 *
022 * <p>Contains the constant values for black, white, red,
023 * green, blue, cyan, magenta, and yellow.</p>
024 *
025 * @see <a href="https://en.wikipedia.org/wiki/HSL_and_HSV">https://en.wikipedia.org/wiki/HSL_and_HSV</a>
026 * @since 1.0-alpha1
027 */
028public final class ColorHsv {
029
030    /**
031     * A constant for color black. Color components are:
032     * <pre>
033     *     Hue:        0
034     *     Saturation: 0
035     *     Value:      0
036     * </pre>
037     */
038    public static final ColorHsv BLACK = new ColorHsv(0, 0, 0);
039
040    /**
041     * A constant for color white. Color components are:
042     * <pre>
043     *     Hue:        0
044     *     Saturation: 0
045     *     Value:      100
046     * </pre>
047     */
048    public static final ColorHsv WHITE = new ColorHsv(0, 0, 100);
049
050    /**
051     * A constant for color red. Color components are:
052     * <pre>
053     *     Hue:        0
054     *     Saturation: 100
055     *     Value:      100
056     * </pre>
057     */
058    public static final ColorHsv RED = new ColorHsv(0, 100, 100);
059
060    /**
061     * A constant for color green. Color components are:
062     * <pre>
063     *     Hue:        120
064     *     Saturation: 100
065     *     Value:      100
066     * </pre>
067     */
068    public static final ColorHsv GREEN = new ColorHsv(120, 100, 100);
069
070    /**
071     * A constant for color blue. Color components are:
072     * <pre>
073     *     Hue:        240
074     *     Saturation: 100
075     *     Value:      100
076     * </pre>
077     */
078    public static final ColorHsv BLUE = new ColorHsv(240, 100, 100);
079
080    public final double H;
081    public final double S;
082    public final double V;
083
084    public ColorHsv(final double H, final double S, final double V) {
085        this.H = H;
086        this.S = S;
087        this.V = V;
088    }
089
090    @Override
091    public String toString() {
092        return "{H: " + H + ", S: " + S + ", V: " + V + "}";
093    }
094
095    @Override
096    public boolean equals(final Object o) {
097        if (this == o) {
098            return true;
099        }
100        if (o == null || getClass() != o.getClass()) {
101            return false;
102        }
103
104        final ColorHsv colorHsv = (ColorHsv) o;
105        if (Double.compare(colorHsv.H, H) != 0) {
106            return false;
107        }
108        if (Double.compare(colorHsv.S, S) != 0) {
109            return false;
110        }
111        if (Double.compare(colorHsv.V, V) != 0) {
112            return false;
113        }
114
115        return true;
116    }
117
118    @Override
119    public int hashCode() {
120        int result;
121        long temp;
122        temp = Double.doubleToLongBits(H);
123        result = (int) (temp ^ (temp >>> 32));
124        temp = Double.doubleToLongBits(S);
125        result = 31 * result + (int) (temp ^ (temp >>> 32));
126        temp = Double.doubleToLongBits(V);
127        result = 31 * result + (int) (temp ^ (temp >>> 32));
128        return result;
129    }
130}