2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 * @author Oleg V. Khaschansky
21 package java.awt.color;
23 import java.io.Serializable;
25 import org.apache.harmony.awt.gl.color.LUTColorConverter;
26 import org.apache.harmony.awt.internal.nls.Messages;
29 * The ColorSpace class defines a color space type for a Color and provides
30 * methods for arrays of color component operations.
34 public abstract class ColorSpace implements Serializable {
36 /** The Constant serialVersionUID. */
37 private static final long serialVersionUID = -409452704308689724L;
40 * The Constant TYPE_XYZ indicates XYZ color space type.
42 public static final int TYPE_XYZ = 0;
45 * The Constant TYPE_Lab indicates Lab color space type.
47 public static final int TYPE_Lab = 1;
50 * The Constant TYPE_Luv indicates Luv color space type.
52 public static final int TYPE_Luv = 2;
55 * The Constant TYPE_YCbCr indicates YCbCr color space type.
57 public static final int TYPE_YCbCr = 3;
60 * The Constant TYPE_Yxy indicates Yxy color space type.
62 public static final int TYPE_Yxy = 4;
65 * The Constant TYPE_RGB indicates RGB color space type.
67 public static final int TYPE_RGB = 5;
70 * The Constant TYPE_GRAY indicates Gray color space type.
72 public static final int TYPE_GRAY = 6;
75 * The Constant TYPE_HSV indicates HSV color space type.
77 public static final int TYPE_HSV = 7;
80 * The Constant TYPE_HLS indicates HLS color space type.
82 public static final int TYPE_HLS = 8;
85 * The Constant TYPE_CMYK indicates CMYK color space type.
87 public static final int TYPE_CMYK = 9;
90 * The Constant TYPE_CMY indicates CMY color space type.
92 public static final int TYPE_CMY = 11;
95 * The Constant TYPE_2CLR indicates color spaces with 2 components.
97 public static final int TYPE_2CLR = 12;
100 * The Constant TYPE_3CLR indicates color spaces with 3 components.
102 public static final int TYPE_3CLR = 13;
105 * The Constant TYPE_4CLR indicates color spaces with 4 components.
107 public static final int TYPE_4CLR = 14;
110 * The Constant TYPE_5CLR indicates color spaces with 5 components.
112 public static final int TYPE_5CLR = 15;
115 * The Constant TYPE_6CLR indicates color spaces with 6 components.
117 public static final int TYPE_6CLR = 16;
120 * The Constant TYPE_7CLR indicates color spaces with 7 components.
122 public static final int TYPE_7CLR = 17;
125 * The Constant TYPE_8CLR indicates color spaces with 8 components.
127 public static final int TYPE_8CLR = 18;
130 * The Constant TYPE_9CLR indicates color spaces with 9 components.
132 public static final int TYPE_9CLR = 19;
135 * The Constant TYPE_ACLR indicates color spaces with 10 components.
137 public static final int TYPE_ACLR = 20;
140 * The Constant TYPE_BCLR indicates color spaces with 11 components.
142 public static final int TYPE_BCLR = 21;
145 * The Constant TYPE_CCLR indicates color spaces with 12 components.
147 public static final int TYPE_CCLR = 22;
150 * The Constant TYPE_DCLR indicates color spaces with 13 components.
152 public static final int TYPE_DCLR = 23;
155 * The Constant TYPE_ECLR indicates color spaces with 14 components.
157 public static final int TYPE_ECLR = 24;
160 * The Constant TYPE_FCLR indicates color spaces with 15 components.
162 public static final int TYPE_FCLR = 25;
165 * The Constant CS_sRGB indicates standard RGB color space.
167 public static final int CS_sRGB = 1000;
170 * The Constant CS_LINEAR_RGB indicates linear RGB color space.
172 public static final int CS_LINEAR_RGB = 1004;
175 * The Constant CS_CIEXYZ indicates CIEXYZ conversion color space.
177 public static final int CS_CIEXYZ = 1001;
180 * The Constant CS_PYCC indicates Photo YCC conversion color space.
182 public static final int CS_PYCC = 1002;
185 * The Constant CS_GRAY indicates linear gray scale color space.
187 public static final int CS_GRAY = 1003;
192 private static ColorSpace cs_Gray = null;
197 private static ColorSpace cs_PYCC = null;
202 private static ColorSpace cs_CIEXYZ = null;
207 private static ColorSpace cs_LRGB = null;
212 private static ColorSpace cs_sRGB = null;
220 * The num components.
222 private int numComponents;
225 * Instantiates a ColorSpace with the specified ColorSpace type and number
229 * the type of color space.
230 * @param numcomponents
231 * the number of components.
233 protected ColorSpace(int type, int numcomponents) {
234 this.numComponents = numcomponents;
239 * Gets the name of the component for the specified component index.
242 * the index of the component.
243 * @return the name of the component.
245 public String getName(int idx) {
246 if (idx < 0 || idx > numComponents - 1) {
247 // awt.16A=Invalid component index: {0}
248 throw new IllegalArgumentException(Messages.getString("awt.16A", idx)); //$NON-NLS-1$
251 return "Unnamed color component #" + idx; //$NON-NLS-1$
255 * Performs the transformation of a color from this ColorSpace into the RGB
259 * the color value in this ColorSpace.
260 * @return the float array with color components in the RGB color space.
262 public abstract float[] toRGB(float[] colorvalue);
265 * Performs the transformation of a color from this ColorSpace into the
266 * CS_CIEXYZ color space.
269 * the color value in this ColorSpace.
270 * @return the float array with color components in the CS_CIEXYZ color
273 public abstract float[] toCIEXYZ(float[] colorvalue);
276 * Performs the transformation of a color from the RGB color space into this
280 * the float array representing a color in the RGB color space.
281 * @return the float array with the transformed color components.
283 public abstract float[] fromRGB(float[] rgbvalue);
286 * Performs the transformation of a color from the CS_CIEXYZ color space
287 * into this ColorSpace.
290 * the float array representing a color in the CS_CIEXYZ color
292 * @return the float array with the transformed color components.
294 public abstract float[] fromCIEXYZ(float[] colorvalue);
297 * Gets the minimum normalized color component value for the specified
301 * the component to determine the minimum value.
302 * @return the minimum normalized value of the component.
304 public float getMinValue(int component) {
305 if (component < 0 || component > numComponents - 1) {
306 // awt.16A=Invalid component index: {0}
307 throw new IllegalArgumentException(Messages.getString("awt.16A", component)); //$NON-NLS-1$
313 * Gets the maximum normalized color component value for the specified
317 * the component to determine the maximum value.
318 * @return the maximum normalized value of the component.
320 public float getMaxValue(int component) {
321 if (component < 0 || component > numComponents - 1) {
322 // awt.16A=Invalid component index: {0}
323 throw new IllegalArgumentException(Messages.getString("awt.16A", component)); //$NON-NLS-1$
329 * Checks if this ColorSpace has CS_sRGB type or not.
331 * @return true, if this ColorSpace has CS_sRGB type, false otherwise.
333 public boolean isCS_sRGB() {
334 // If our color space is sRGB, then cs_sRGB
335 // is already initialized
336 return (this == cs_sRGB);
340 * Gets the type of the ColorSpace.
342 * @return the type of the ColorSpace.
344 public int getType() {
349 * Gets the number of components for this ColorSpace.
351 * @return the number of components.
353 public int getNumComponents() {
354 return numComponents;
359 * Gets the single instance of ColorSpace with the specified ColorSpace:
360 * CS_sRGB, CS_LINEAR_RGB, CS_CIEXYZ, CS_GRAY, or CS_PYCC.
363 * the identifier of the specified Colorspace.
364 * @return the single instance of the desired ColorSpace.
366 public static ColorSpace getInstance(int colorspace) {
367 switch (colorspace) {
369 if (cs_sRGB == null) {
370 cs_sRGB = new ICC_ColorSpace(
371 new ICC_ProfileStub(CS_sRGB));
372 LUTColorConverter.sRGB_CS = cs_sRGB;
373 //ICC_Profile.getInstance (CS_sRGB));
377 if (cs_CIEXYZ == null) {
378 cs_CIEXYZ = new ICC_ColorSpace(
379 new ICC_ProfileStub(CS_CIEXYZ));
380 //ICC_Profile.getInstance (CS_CIEXYZ));
384 if (cs_Gray == null) {
385 cs_Gray = new ICC_ColorSpace(
386 new ICC_ProfileStub(CS_GRAY));
387 LUTColorConverter.LINEAR_GRAY_CS = cs_Gray;
388 //ICC_Profile.getInstance (CS_GRAY));
392 if (cs_PYCC == null) {
393 cs_PYCC = new ICC_ColorSpace(
394 new ICC_ProfileStub(CS_PYCC));
395 //ICC_Profile.getInstance (CS_PYCC));
399 if (cs_LRGB == null) {
400 cs_LRGB = new ICC_ColorSpace(
401 new ICC_ProfileStub(CS_LINEAR_RGB));
402 LUTColorConverter.LINEAR_GRAY_CS = cs_Gray;
403 //ICC_Profile.getInstance (CS_LINEAR_RGB));
409 // Unknown argument passed
410 // awt.16B=Not a predefined colorspace
411 throw new IllegalArgumentException(Messages.getString("Not a predefined colorspace")); //$NON-NLS-1$