Home | History | Annotate | Download | only in color
      1 /*
      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
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     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.
     16  */
     17 /**
     18  * @author Oleg V. Khaschansky
     19  * @version $Revision$
     20  */
     21 package java.awt.color;
     22 
     23 import java.io.Serializable;
     24 
     25 import org.apache.harmony.awt.gl.color.LUTColorConverter;
     26 import org.apache.harmony.awt.internal.nls.Messages;
     27 
     28 /**
     29  * The ColorSpace class defines a color space type for a Color and provides
     30  * methods for arrays of color component operations.
     31  *
     32  * @since Android 1.0
     33  */
     34 public abstract class ColorSpace implements Serializable {
     35 
     36     /** The Constant serialVersionUID. */
     37     private static final long serialVersionUID = -409452704308689724L;
     38 
     39     /**
     40      * The Constant TYPE_XYZ indicates XYZ color space type.
     41      */
     42     public static final int TYPE_XYZ = 0;
     43 
     44     /**
     45      * The Constant TYPE_Lab indicates Lab color space type.
     46      */
     47     public static final int TYPE_Lab = 1;
     48 
     49     /**
     50      * The Constant TYPE_Luv indicates Luv color space type.
     51      */
     52     public static final int TYPE_Luv = 2;
     53 
     54     /**
     55      * The Constant TYPE_YCbCr indicates YCbCr color space type.
     56      */
     57     public static final int TYPE_YCbCr = 3;
     58 
     59     /**
     60      * The Constant TYPE_Yxy indicates Yxy color space type.
     61      */
     62     public static final int TYPE_Yxy = 4;
     63 
     64     /**
     65      * The Constant TYPE_RGB indicates RGB color space type.
     66      */
     67     public static final int TYPE_RGB = 5;
     68 
     69     /**
     70      * The Constant TYPE_GRAY indicates Gray color space type.
     71      */
     72     public static final int TYPE_GRAY = 6;
     73 
     74     /**
     75      * The Constant TYPE_HSV indicates HSV color space type.
     76      */
     77     public static final int TYPE_HSV = 7;
     78 
     79     /**
     80      * The Constant TYPE_HLS indicates HLS color space type.
     81      */
     82     public static final int TYPE_HLS = 8;
     83 
     84     /**
     85      * The Constant TYPE_CMYK indicates CMYK color space type.
     86      */
     87     public static final int TYPE_CMYK = 9;
     88 
     89     /**
     90      * The Constant TYPE_CMY indicates CMY color space type.
     91      */
     92     public static final int TYPE_CMY = 11;
     93 
     94     /**
     95      * The Constant TYPE_2CLR indicates color spaces with 2 components.
     96      */
     97     public static final int TYPE_2CLR = 12;
     98 
     99     /**
    100      * The Constant TYPE_3CLR indicates color spaces with 3 components.
    101      */
    102     public static final int TYPE_3CLR = 13;
    103 
    104     /**
    105      * The Constant TYPE_4CLR indicates color spaces with 4 components.
    106      */
    107     public static final int TYPE_4CLR = 14;
    108 
    109     /**
    110      * The Constant TYPE_5CLR indicates color spaces with 5 components.
    111      */
    112     public static final int TYPE_5CLR = 15;
    113 
    114     /**
    115      * The Constant TYPE_6CLR indicates color spaces with 6 components.
    116      */
    117     public static final int TYPE_6CLR = 16;
    118 
    119     /**
    120      * The Constant TYPE_7CLR indicates color spaces with 7 components.
    121      */
    122     public static final int TYPE_7CLR = 17;
    123 
    124     /**
    125      * The Constant TYPE_8CLR indicates color spaces with 8 components.
    126      */
    127     public static final int TYPE_8CLR = 18;
    128 
    129     /**
    130      * The Constant TYPE_9CLR indicates color spaces with 9 components.
    131      */
    132     public static final int TYPE_9CLR = 19;
    133 
    134     /**
    135      * The Constant TYPE_ACLR indicates color spaces with 10 components.
    136      */
    137     public static final int TYPE_ACLR = 20;
    138 
    139     /**
    140      * The Constant TYPE_BCLR indicates color spaces with 11 components.
    141      */
    142     public static final int TYPE_BCLR = 21;
    143 
    144     /**
    145      * The Constant TYPE_CCLR indicates color spaces with 12 components.
    146      */
    147     public static final int TYPE_CCLR = 22;
    148 
    149     /**
    150      * The Constant TYPE_DCLR indicates color spaces with 13 components.
    151      */
    152     public static final int TYPE_DCLR = 23;
    153 
    154     /**
    155      * The Constant TYPE_ECLR indicates color spaces with 14 components.
    156      */
    157     public static final int TYPE_ECLR = 24;
    158 
    159     /**
    160      * The Constant TYPE_FCLR indicates color spaces with 15 components.
    161      */
    162     public static final int TYPE_FCLR = 25;
    163 
    164     /**
    165      * The Constant CS_sRGB indicates standard RGB color space.
    166      */
    167     public static final int CS_sRGB = 1000;
    168 
    169     /**
    170      * The Constant CS_LINEAR_RGB indicates linear RGB color space.
    171      */
    172     public static final int CS_LINEAR_RGB = 1004;
    173 
    174     /**
    175      * The Constant CS_CIEXYZ indicates CIEXYZ conversion color space.
    176      */
    177     public static final int CS_CIEXYZ = 1001;
    178 
    179     /**
    180      * The Constant CS_PYCC indicates Photo YCC conversion color space.
    181      */
    182     public static final int CS_PYCC = 1002;
    183 
    184     /**
    185      * The Constant CS_GRAY indicates linear gray scale color space.
    186      */
    187     public static final int CS_GRAY = 1003;
    188 
    189     /**
    190      * The cs_ gray.
    191      */
    192     private static ColorSpace cs_Gray = null;
    193 
    194     /**
    195      * The cs_ pycc.
    196      */
    197     private static ColorSpace cs_PYCC = null;
    198 
    199     /**
    200      * The cs_ ciexyz.
    201      */
    202     private static ColorSpace cs_CIEXYZ = null;
    203 
    204     /**
    205      * The cs_ lrgb.
    206      */
    207     private static ColorSpace cs_LRGB = null;
    208 
    209     /**
    210      * The cs_s rgb.
    211      */
    212     private static ColorSpace cs_sRGB = null;
    213 
    214     /**
    215      * The type.
    216      */
    217     private int type;
    218 
    219     /**
    220      * The num components.
    221      */
    222     private int numComponents;
    223 
    224     /**
    225      * Instantiates a ColorSpace with the specified ColorSpace type and number
    226      * of components.
    227      *
    228      * @param type
    229      *            the type of color space.
    230      * @param numcomponents
    231      *            the number of components.
    232      */
    233     protected ColorSpace(int type, int numcomponents) {
    234         this.numComponents = numcomponents;
    235         this.type = type;
    236     }
    237 
    238     /**
    239      * Gets the name of the component for the specified component index.
    240      *
    241      * @param idx
    242      *            the index of the component.
    243      * @return the name of the component.
    244      */
    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$
    249         }
    250 
    251       return "Unnamed color component #" + idx; //$NON-NLS-1$
    252     }
    253 
    254     /**
    255      * Performs the transformation of a color from this ColorSpace into the RGB
    256      * color space.
    257      *
    258      * @param colorvalue
    259      *            the color value in this ColorSpace.
    260      * @return the float array with color components in the RGB color space.
    261      */
    262     public abstract float[] toRGB(float[] colorvalue);
    263 
    264     /**
    265      * Performs the transformation of a color from this ColorSpace into the
    266      * CS_CIEXYZ color space.
    267      *
    268      * @param colorvalue
    269      *            the color value in this ColorSpace.
    270      * @return the float array with color components in the CS_CIEXYZ color
    271      *         space.
    272      */
    273     public abstract float[] toCIEXYZ(float[] colorvalue);
    274 
    275     /**
    276      * Performs the transformation of a color from the RGB color space into this
    277      * ColorSpace.
    278      *
    279      * @param rgbvalue
    280      *            the float array representing a color in the RGB color space.
    281      * @return the float array with the transformed color components.
    282      */
    283     public abstract float[] fromRGB(float[] rgbvalue);
    284 
    285     /**
    286      * Performs the transformation of a color from the CS_CIEXYZ color space
    287      * into this ColorSpace.
    288      *
    289      * @param colorvalue
    290      *            the float array representing a color in the CS_CIEXYZ color
    291      *            space.
    292      * @return the float array with the transformed color components.
    293      */
    294     public abstract float[] fromCIEXYZ(float[] colorvalue);
    295 
    296     /**
    297      * Gets the minimum normalized color component value for the specified
    298      * component.
    299      *
    300      * @param component
    301      *            the component to determine the minimum value.
    302      * @return the minimum normalized value of the component.
    303      */
    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$
    308         }
    309         return 0;
    310     }
    311 
    312     /**
    313      * Gets the maximum normalized color component value for the specified
    314      * component.
    315      *
    316      * @param component
    317      *            the component to determine the maximum value.
    318      * @return the maximum normalized value of the component.
    319      */
    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$
    324         }
    325         return 1;
    326     }
    327 
    328     /**
    329      * Checks if this ColorSpace has CS_sRGB type or not.
    330      *
    331      * @return true, if this ColorSpace has CS_sRGB type, false otherwise.
    332      */
    333     public boolean isCS_sRGB() {
    334         // If our color space is sRGB, then cs_sRGB
    335         // is already initialized
    336         return (this == cs_sRGB);
    337     }
    338 
    339     /**
    340      * Gets the type of the ColorSpace.
    341      *
    342      * @return the type of the ColorSpace.
    343      */
    344     public int getType() {
    345         return type;
    346     }
    347 
    348     /**
    349      * Gets the number of components for this ColorSpace.
    350      *
    351      * @return the number of components.
    352      */
    353     public int getNumComponents() {
    354         return numComponents;
    355     }
    356 
    357 
    358     /**
    359      * Gets the single instance of ColorSpace with the specified ColorSpace:
    360      * CS_sRGB, CS_LINEAR_RGB, CS_CIEXYZ, CS_GRAY, or CS_PYCC.
    361      *
    362      * @param colorspace
    363      *            the identifier of the specified Colorspace.
    364      * @return the single instance of the desired ColorSpace.
    365      */
    366     public static ColorSpace getInstance(int colorspace) {
    367         switch (colorspace) {
    368             case CS_sRGB:
    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));
    374                 }
    375                 return cs_sRGB;
    376             case CS_CIEXYZ:
    377                 if (cs_CIEXYZ == null) {
    378                     cs_CIEXYZ = new ICC_ColorSpace(
    379                             new ICC_ProfileStub(CS_CIEXYZ));
    380                             //ICC_Profile.getInstance (CS_CIEXYZ));
    381                 }
    382                 return cs_CIEXYZ;
    383             case CS_GRAY:
    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));
    389                 }
    390                 return cs_Gray;
    391             case CS_PYCC:
    392                 if (cs_PYCC == null) {
    393                     cs_PYCC = new ICC_ColorSpace(
    394                             new ICC_ProfileStub(CS_PYCC));
    395                             //ICC_Profile.getInstance (CS_PYCC));
    396                 }
    397                 return cs_PYCC;
    398             case CS_LINEAR_RGB:
    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));
    404                 }
    405                 return cs_LRGB;
    406             default:
    407         }
    408 
    409         // Unknown argument passed
    410         // awt.16B=Not a predefined colorspace
    411         throw new IllegalArgumentException(Messages.getString("Not a predefined colorspace")); //$NON-NLS-1$
    412     }
    413 
    414 }