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 CMYK 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/CMYK_color_model">https://en.wikipedia.org/wiki/CMYK_color_model</a>
026 * @since 1.0-alpha1
027 */
028public final class ColorCmyk {
029
030    /**
031     * A constant for color cyan. Color components are:
032     * <pre>
033     *     cyan:    100
034     *     magenta: 0
035     *     yellow:  0
036     *     key:     0
037     * </pre>
038     */
039    public static final ColorCmyk CYAN = new ColorCmyk(100, 0, 0, 0);
040
041    /**
042     * A constant for color magenta. Color components are:
043     * <pre>
044     *     cyan:    0
045     *     magenta: 100
046     *     yellow:  0
047     *     key:     0
048     * </pre>
049     */
050    public static final ColorCmyk MAGENTA = new ColorCmyk(0, 100, 0, 0);
051
052    /**
053     * A constant for color yellow. Color components are:
054     * <pre>
055     *     cyan:    0
056     *     magenta: 0
057     *     yellow:  100
058     *     key:     0
059     * </pre>
060     */
061    public static final ColorCmyk YELLOW = new ColorCmyk(0, 0, 100, 0);
062
063    /**
064     * A constant for color black. Color components are:
065     * <pre>
066     *     cyan:    0
067     *     magenta: 0
068     *     yellow:  0
069     *     key:     100
070     * </pre>
071     */
072    public static final ColorCmyk BLACK = new ColorCmyk(0, 0, 0, 100);
073
074    /**
075     * A constant for color white. Color components are:
076     * <pre>
077     *     cyan:    0
078     *     magenta: 0
079     *     yellow:  0
080     *     key:     0
081     * </pre>
082     */
083    public static final ColorCmyk WHITE = new ColorCmyk(0, 0, 0, 0);
084
085    /**
086     * A constant for color red. Color components are:
087     * <pre>
088     *     cyan:    0
089     *     magenta: 100
090     *     yellow:  100
091     *     key:     0
092     * </pre>
093     */
094    public static final ColorCmyk RED = new ColorCmyk(0, 100, 100, 0);
095
096    /**
097     * A constant for color green. Color components are:
098     * <pre>
099     *     cyan:    100
100     *     magenta: 0
101     *     yellow:  100
102     *     key:     0
103     * </pre>
104     */
105    public static final ColorCmyk GREEN = new ColorCmyk(100, 0, 100, 0);
106
107    /**
108     * A constant for color blue. Color components are:
109     * <pre>
110     *     cyan:    100
111     *     magenta: 100
112     *     yellow:  0
113     *     key:     0
114     * </pre>
115     */
116    public static final ColorCmyk BLUE = new ColorCmyk(100, 100, 0, 0);
117
118    public final double C;
119    public final double M;
120    public final double Y;
121    public final double K;
122
123    public ColorCmyk(final double C, final double M, final double Y, final double K) {
124        this.C = C;
125        this.M = M;
126        this.Y = Y;
127        this.K = K;
128    }
129
130    @Override
131    public String toString() {
132        return "{C: " + C + ", M: " + M + ", Y: " + Y + ", K: " + K + "}";
133    }
134
135    @Override
136    public boolean equals(final Object o) {
137        if (this == o) {
138            return true;
139        }
140        if (o == null || getClass() != o.getClass()) {
141            return false;
142        }
143
144        final ColorCmyk colorCmyk = (ColorCmyk) o;
145        if (Double.compare(colorCmyk.C, C) != 0) {
146            return false;
147        }
148        if (Double.compare(colorCmyk.K, K) != 0) {
149            return false;
150        }
151        if (Double.compare(colorCmyk.M, M) != 0) {
152            return false;
153        }
154        if (Double.compare(colorCmyk.Y, Y) != 0) {
155            return false;
156        }
157
158        return true;
159    }
160
161    @Override
162    public int hashCode() {
163        int result;
164        long temp;
165        temp = Double.doubleToLongBits(C);
166        result = (int) (temp ^ (temp >>> 32));
167        temp = Double.doubleToLongBits(M);
168        result = 31 * result + (int) (temp ^ (temp >>> 32));
169        temp = Double.doubleToLongBits(Y);
170        result = 31 * result + (int) (temp ^ (temp >>> 32));
171        temp = Double.doubleToLongBits(K);
172        result = 31 * result + (int) (temp ^ (temp >>> 32));
173        return result;
174    }
175}