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 Hunter Lab color space.
021 *
022 * <p>Contains the constant values for black, white, red,
023 * green, and blue.</p>
024 *
025 * @see <a href="https://en.wikipedia.org/wiki/CIELAB_color_space#Hunter_Lab">https://en.wikipedia.org/wiki/CIELAB_color_space#Hunter_Lab</a>
026 * @since 1.0-alpha1
027 */
028public final class ColorHunterLab {
029
030    /**
031     * A constant for color black. Color components are:
032     * <pre>
033     *     L: 0
034     *     a: 0
035     *     b: 0
036     * </pre>
037     */
038    public static final ColorHunterLab BLACK = new ColorHunterLab(0, 0, 0);
039
040    /**
041     * A constant for color white. Color components are:
042     * <pre>
043     *     L: 100.000
044     *     a:  -5.336
045     *     b:   5.433
046     * </pre>
047     */
048    public static final ColorHunterLab WHITE = new ColorHunterLab(100, -5.336, 5.433);
049
050    /**
051     * A constant for color red. Color components are:
052     * <pre>
053     *     L: 46.109
054     *     a: 78.962
055     *     b: 29.794
056     * </pre>
057     */
058    public static final ColorHunterLab RED = new ColorHunterLab(46.109, 78.962, 29.794);
059
060    /**
061     * A constant for color green. Color components are:
062     * <pre>
063     *     L:  84.569
064     *     a: -72.518
065     *     b:  50.842
066     * </pre>
067     */
068    public static final ColorHunterLab GREEN = new ColorHunterLab(84.569, -72.518, 50.842);
069
070    /**
071     * A constant for color blue. Color components are:
072     * <pre>
073     *     L:   26.870
074     *     a:   72.885
075     *     b: -190.923
076     * </pre>
077     */
078    public static final ColorHunterLab BLUE = new ColorHunterLab(26.870, 72.885, -190.923);
079
080    public final double L;
081    public final double a;
082    public final double b;
083
084    public ColorHunterLab(final double L, final double a, final double b) {
085        this.L = L;
086        this.a = a;
087        this.b = b;
088    }
089
090    @Override
091    public String toString() {
092        return "{L: " + L + ", a: " + a + ", b: " + b + "}";
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 ColorHunterLab that = (ColorHunterLab) o;
105        if (Double.compare(that.L, L) != 0) {
106            return false;
107        }
108        if (Double.compare(that.a, a) != 0) {
109            return false;
110        }
111        if (Double.compare(that.b, b) != 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(L);
123        result = (int) (temp ^ (temp >>> 32));
124        temp = Double.doubleToLongBits(a);
125        result = 31 * result + (int) (temp ^ (temp >>> 32));
126        temp = Double.doubleToLongBits(b);
127        result = 31 * result + (int) (temp ^ (temp >>> 32));
128        return result;
129    }
130}