19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  this work for additional information regarding copyright ownership.
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  the License.  You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @author Igor V. Stolyarov
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @version $Revision$
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage java.awt.image;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.color.ColorSpace;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.gl.color.LUTColorConverter;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.internal.nls.Messages;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Class ComponentColorModel represents a color model that is defined in
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * terms of its components.
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @since Android 1.0
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ComponentColorModel extends ColorModel {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The signed.
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean signed; // Pixel samples are signed.
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Samples with TransferType DataBuffer.TYPE_BYTE,
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // DataBuffer.TYPE_USHORT, DataBuffer.TYPE_INT -
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // unsigned. Samples with others TransferType -
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // signed.
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The integral.
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean integral; // Pixel samples are integral.
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Samples with TransferType DataBuffer.TYPE_BYTE,
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // DataBuffer.TYPE_USHORT, DataBuffer.Short and
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // DataBuffer.TYPE_INT - integral.
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The scale factors.
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float scaleFactors[]; // Array of factors for reduction components
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // values into the form scaled from 0 to 255
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The donot support unnormalized.
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean donotSupportUnnormalized; // This Color Model don't support
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // unnormolized form
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The need alpha divide.
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean needAlphaDivide; // hasAlpha && isAlphaPremultiplied
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The calc value.
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean calcValue; // Value was culculated
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The need scale.
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean needScale; // Normalized value need to scale
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The min vals.
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float minVals[]; // Array of Min normalized values
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The ranges.
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float ranges[]; // Array of range normalized values
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The alpha lut.
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private byte alphaLUT[]; // Lookup table for scale alpha value
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The color lu ts.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private byte colorLUTs[][]; // Lookup tables for scale color values
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The from_ linea r_ rg b_ lut.
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private byte from_LINEAR_RGB_LUT[]; // Lookup table for conversion from
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Linear RGB Color Space into sRGB
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The to_ linea r_8 rg b_ lut.
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private byte to_LINEAR_8RGB_LUT[]; // Lookup table for conversion from
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // sRGB Color Space into Linear RGB
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // 8 bit
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The to_ linea r_16 rg b_ lut.
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private short to_LINEAR_16RGB_LUT[]; // Lookup table for conversion from
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // sRGB Color Space into Linear RGB
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // 16 bit
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The LINEA r_ rg b_ length.
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int LINEAR_RGB_Length; // Linear RGB bit length
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The factor.
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float fFactor; // Scale factor
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The is_s rgb.
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean is_sRGB; // ColorModel has sRGB ColorSpace
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The is_ linea r_ rgb.
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean is_LINEAR_RGB; // Color Model has Linear RGB Color
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Space
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Instantiates a new component color model.
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param colorSpace
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the color space.
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param bits
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the array of component masks.
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param hasAlpha
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            whether the color model has alpha.
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param isAlphaPremultiplied
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            whether the alpha is pre-multiplied.
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param transparency
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the transparency strategy, @see java.awt.Transparency.
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param transferType
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the transfer type (primitive java type to use for the
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            components).
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentColorModel(ColorSpace colorSpace, int bits[], boolean hasAlpha,
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean isAlphaPremultiplied, int transparency, int transferType) {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(createPixelBits(colorSpace, hasAlpha, transferType), validateBits(bits, colorSpace,
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                hasAlpha, transferType), colorSpace, hasAlpha, isAlphaPremultiplied, transparency,
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                transferType);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        needScale = false;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (transferType) {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_BYTE:
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_USHORT:
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_INT:
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                signed = false;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                integral = true;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                donotSupportUnnormalized = false;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                scaleFactors = new float[numComponents];
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0; i < numColorComponents; i++) {
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scaleFactors[i] = 1.0f / maxValues[i];
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (cs.getMinValue(i) != 0.0f || cs.getMaxValue(i) != 1.0f) {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        donotSupportUnnormalized = true;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (hasAlpha) {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    maxValues[numColorComponents] = (1 << bits[numColorComponents]) - 1;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scaleFactors[numColorComponents] = 1.0f / maxValues[numColorComponents];
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_SHORT:
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                signed = true;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                integral = true;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                donotSupportUnnormalized = true;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                scaleFactors = new float[numComponents];
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0; i < numComponents; i++) {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    maxValues[i] = Short.MAX_VALUE;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scaleFactors[i] = 1.0f / maxValues[i];
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (cs.getMinValue(i) != 0.0f || cs.getMaxValue(i) != 1.0f) {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        needScale = true;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (needScale) {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    minVals = new float[numColorComponents];
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ranges = new float[numColorComponents];
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0; i < numColorComponents; i++) {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        minVals[i] = cs.getMinValue(i);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ranges[i] = cs.getMaxValue(i) - minVals[i];
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_FLOAT:
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_DOUBLE:
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                signed = true;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                integral = false;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                donotSupportUnnormalized = true;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // awt.215=transferType is not one of DataBuffer.TYPE_BYTE,
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // DataBuffer.TYPE_USHORT, DataBuffer.TYPE_INT,
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // DataBuffer.TYPE_SHORT, DataBuffer.TYPE_FLOAT, or
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // DataBuffer.TYPE_DOUBLE
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalArgumentException(Messages.getString("awt.215")); //$NON-NLS-1$
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        needAlphaDivide = hasAlpha && isAlphaPremultiplied;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        initLUTs();
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Instantiates a new component color model.
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param colorSpace
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the color space.
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param hasAlpha
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            whether the color model has alpha.
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param isAlphaPremultiplied
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            whether the alpha is pre-multiplied.
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param transparency
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the transparency strategy, @see java.awt.Transparency.
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param transferType
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the transfer type (primitive java type to use for the
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            components).
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ComponentColorModel(ColorSpace colorSpace, boolean hasAlpha,
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean isAlphaPremultiplied, int transparency, int transferType) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(colorSpace, createPixelBitsArray(colorSpace, hasAlpha, transferType), hasAlpha,
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                isAlphaPremultiplied, transparency, transferType);
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Validate bits.
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param bits
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the bits.
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param colorSpace
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the color space.
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param hasAlpha
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the has alpha.
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param transferType
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the transfer type.
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the int[].
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int[] validateBits(int bits[], ColorSpace colorSpace, boolean hasAlpha,
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int transferType) {
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (bits != null) {
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return bits;
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numComponents = colorSpace.getNumComponents();
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hasAlpha) {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            numComponents++;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bits = new int[numComponents];
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int componentLength = DataBuffer.getDataTypeSize(transferType);
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numComponents; i++) {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bits[i] = componentLength;
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return bits;
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates the pixel bits.
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param colorSpace
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the color space.
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param hasAlpha
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the has alpha.
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param transferType
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the transfer type.
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the int.
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int createPixelBits(ColorSpace colorSpace, boolean hasAlpha, int transferType) {
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numComponents = colorSpace.getNumComponents();
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hasAlpha) {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            numComponents++;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int componentLength = DataBuffer.getDataTypeSize(transferType);
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return numComponents * componentLength;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates the pixel bits array.
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param colorSpace
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the color space.
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param hasAlpha
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the has alpha.
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param transferType
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the transfer type.
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the int[].
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int[] createPixelBitsArray(ColorSpace colorSpace, boolean hasAlpha,
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int transferType) {
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numComponents = colorSpace.getNumComponents();
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hasAlpha) {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            numComponents++;
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int bits[] = new int[numComponents];
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numComponents; i++) {
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bits[i] = DataBuffer.getDataTypeSize(transferType);
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return bits;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getDataElements(int components[], int offset, Object obj) {
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (donotSupportUnnormalized) {
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.213=This ComponentColorModel does not support the
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // unnormalized form
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (offset + numComponents > components.length) {
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.216=The components array is not large enough to hold all the
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // color and alpha components
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.216")); //$NON-NLS-1$
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (transferType) {
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_BYTE:
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte ba[];
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (obj == null) {
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ba = new byte[numComponents];
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ba = (byte[])obj;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0, idx = offset; i < numComponents; i++, idx++) {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ba[i] = (byte)components[idx];
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ba;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_USHORT:
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                short sa[];
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (obj == null) {
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa = new short[numComponents];
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa = (short[])obj;
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0, idx = offset; i < numComponents; i++, idx++) {
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa[i] = (short)components[idx];
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return sa;
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_INT:
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int ia[];
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (obj == null) {
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ia = new int[numComponents];
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ia = (int[])obj;
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0, idx = offset; i < numComponents; i++, idx++) {
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ia[i] = components[idx];
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ia;
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // awt.217=The transfer type of this ComponentColorModel is not
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // one
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // of the following transfer types: DataBuffer.TYPE_BYTE,
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // DataBuffer.TYPE_USHORT, or DataBuffer.TYPE_INT
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new UnsupportedOperationException(Messages.getString("awt.217")); //$NON-NLS-1$
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getDataElements(float normComponents[], int normOffset, Object obj) {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (needScale) {
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) {
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normComponents[idx] = (normComponents[idx] - minVals[i]) / ranges[i];
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (transferType) {
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_BYTE:
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte ba[];
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (obj == null) {
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ba = new byte[numComponents];
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ba = (byte[])obj;
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (needAlphaDivide) {
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float alpha = normComponents[normOffset + numColorComponents];
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0, idx = normOffset; i < numColorComponents; i++, idx++) {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ba[i] = (byte)(normComponents[idx] * alpha * maxValues[i] + 0.5f);
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ba[numColorComponents] = (byte)(normComponents[normOffset + numColorComponents]
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            * maxValues[numColorComponents] + 0.5f);
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) {
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ba[idx] = (byte)(normComponents[idx] * maxValues[i] + 0.5f);
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ba;
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_USHORT:
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                short usa[];
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (obj == null) {
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    usa = new short[numComponents];
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    usa = (short[])obj;
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (needAlphaDivide) {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float alpha = normComponents[normOffset + numColorComponents];
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) {
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        usa[i] = (short)(normComponents[idx] * alpha * maxValues[i] + 0.5f);
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    usa[numColorComponents] = (short)(alpha * maxValues[numColorComponents] + 0.5f);
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) {
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        usa[i] = (short)(normComponents[idx] * maxValues[i] + 0.5f);
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return usa;
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_INT:
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int ia[];
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (obj == null) {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ia = new int[numComponents];
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ia = (int[])obj;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (needAlphaDivide) {
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float alpha = normComponents[normOffset + numColorComponents];
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) {
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ia[i] = (int)(normComponents[idx] * alpha * maxValues[i] + 0.5f);
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ia[numColorComponents] = (int)(alpha * maxValues[numColorComponents] + 0.5f);
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) {
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ia[i] = (int)(normComponents[idx] * maxValues[i] + 0.5f);
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ia;
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_SHORT:
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                short sa[];
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (obj == null) {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa = new short[numComponents];
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa = (short[])obj;
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (needAlphaDivide) {
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float alpha = normComponents[normOffset + numColorComponents];
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) {
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sa[i] = (short)(normComponents[idx] * alpha * maxValues[i] + 0.5f);
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa[numColorComponents] = (short)(alpha * maxValues[numColorComponents] + 0.5f);
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) {
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sa[i] = (short)(normComponents[idx] * maxValues[i] + 0.5f);
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return sa;
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_FLOAT:
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                float fa[];
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (obj == null) {
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fa = new float[numComponents];
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fa = (float[])obj;
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (needAlphaDivide) {
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float alpha = normComponents[normOffset + numColorComponents];
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) {
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        fa[i] = normComponents[idx] * alpha;
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    fa[numColorComponents] = alpha;
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) {
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        fa[i] = normComponents[idx];
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return fa;
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_DOUBLE:
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                double da[];
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (obj == null) {
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    da = new double[numComponents];
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    da = (double[])obj;
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (needAlphaDivide) {
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    double alpha = normComponents[normOffset + numColorComponents];
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) {
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        da[i] = normComponents[idx] * alpha;
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    da[numColorComponents] = alpha;
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) {
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        da[i] = normComponents[idx];
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return da;
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // awt.213=This ComponentColorModel does not support the
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // unnormalized form
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getDataElements(int rgb, Object pixel) {
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float normComp[];
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float comp[];
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int red = (rgb >> 16) & 0xff;
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int green = (rgb >> 8) & 0xff;
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int blue = rgb & 0xff;
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int alpha = (rgb >> 24) & 0xff;
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        comp = new float[3];
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (is_sRGB || is_LINEAR_RGB) {
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (is_LINEAR_RGB) {
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (LINEAR_RGB_Length == 8) {
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    red = to_LINEAR_8RGB_LUT[red] & 0xff;
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    green = to_LINEAR_8RGB_LUT[green] & 0xff;
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    blue = to_LINEAR_8RGB_LUT[blue] & 0xff;
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    red = to_LINEAR_16RGB_LUT[red] & 0xffff;
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    green = to_LINEAR_16RGB_LUT[green] & 0xffff;
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    blue = to_LINEAR_16RGB_LUT[blue] & 0xffff;
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            comp[0] = red / fFactor;
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            comp[1] = green / fFactor;
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            comp[2] = blue / fFactor;
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!hasAlpha) {
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normComp = comp;
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                float normAlpha = alpha / 255.0f;
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normComp = new float[numComponents];
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0; i < numColorComponents; i++) {
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    normComp[i] = comp[i];
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normComp[numColorComponents] = normAlpha;
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            comp[0] = red / fFactor;
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            comp[1] = green / fFactor;
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            comp[2] = blue / fFactor;
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float[] defComp = cs.fromRGB(comp);
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!hasAlpha) {
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normComp = defComp;
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                float normAlpha = alpha / 255.0f;
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normComp = new float[numComponents];
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0; i < numColorComponents; i++) {
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    normComp[i] = defComp[i];
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normComp[numColorComponents] = normAlpha;
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hasAlpha && isAlphaPremultiplied) {
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            normComp[0] *= normComp[numColorComponents];
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            normComp[1] *= normComp[numColorComponents];
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            normComp[2] *= normComp[numColorComponents];
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getDataElements(normComp, 0, pixel);
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WritableRaster getAlphaRaster(WritableRaster raster) {
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!hasAlpha) {
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int x = raster.getMinX();
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int y = raster.getMinY();
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int bandList[] = new int[1];
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bandList[0] = raster.getNumBands() - 1;
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return raster.createWritableChild(x, y, raster.getWidth(), raster.getHeight(), x, y,
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bandList);
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ColorModel coerceData(WritableRaster raster, boolean isAlphaPremultiplied) {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!hasAlpha || this.isAlphaPremultiplied == isAlphaPremultiplied) {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return this;
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int minX = raster.getMinX();
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int minY = raster.getMinY();
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int w = raster.getWidth();
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int h = raster.getHeight();
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isAlphaPremultiplied) {
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (transferType) {
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DataBuffer.TYPE_BYTE:
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DataBuffer.TYPE_USHORT:
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DataBuffer.TYPE_INT:
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float alphaFactor = maxValues[numColorComponents];
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int iComponents[] = null;
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int iTransparentComponents[] = new int[numComponents];
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0; i < h; i++, minY++) {
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int j = 0, x = minX; j < w; j++, x++) {
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            iComponents = raster.getPixel(x, minY, iComponents);
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (iComponents[numColorComponents] == 0) {
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                raster.setPixel(x, minY, iTransparentComponents);
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                float alpha = iComponents[numColorComponents] / alphaFactor;
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                for (int n = 0; n < numColorComponents; n++) {
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    iComponents[n] = (int)(alpha * iComponents[n] + 0.5f);
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                raster.setPixel(x, minY, iComponents);
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DataBuffer.TYPE_SHORT:
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float sAlphaFactor = maxValues[numColorComponents];
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    short sComponents[] = null;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    short sTransparentComponents[] = new short[numComponents];
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0; i < h; i++, minY++) {
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int j = 0, x = minX; j < w; j++, x++) {
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sComponents = (short[])raster.getDataElements(x, minY, sComponents);
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (sComponents[numColorComponents] == 0) {
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                raster.setDataElements(x, minY, sTransparentComponents);
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                float alpha = sComponents[numColorComponents] / sAlphaFactor;
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                for (int n = 0; n < numColorComponents; n++) {
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    sComponents[n] = (byte)(alpha * sComponents[n] + 0.5f);
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                raster.setDataElements(x, minY, sComponents);
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DataBuffer.TYPE_FLOAT:
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float fComponents[] = null;
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float fTransparentComponents[] = new float[numComponents];
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0; i < h; i++, minY++) {
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int j = 0, x = minX; j < w; j++, x++) {
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            fComponents = raster.getPixel(x, minY, fComponents);
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (fComponents[numColorComponents] == 0.0f) {
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                raster.setDataElements(x, minY, fTransparentComponents);
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                float alpha = fComponents[numColorComponents];
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                for (int n = 0; n < numColorComponents; n++) {
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    fComponents[n] = fComponents[n] * alpha;
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                raster.setPixel(x, minY, fComponents);
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DataBuffer.TYPE_DOUBLE:
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    double dComponents[] = null;
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    double dTransparentComponents[] = new double[numComponents];
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0; i < h; i++, minY++) {
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int j = 0, x = minX; j < w; j++, x++) {
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dComponents = raster.getPixel(x, minY, dComponents);
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (dComponents[numColorComponents] == 0.0) {
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                raster.setPixel(x, minY, dTransparentComponents);
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                double alpha = dComponents[numColorComponents];
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                for (int n = 0; n < numColorComponents; n++) {
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    dComponents[n] = dComponents[n] * alpha;
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                raster.setPixel(x, minY, dComponents);
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default:
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // awt.219=This transferType is not supported by this color
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // model
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new UnsupportedOperationException(Messages.getString("awt.219")); //$NON-NLS-1$
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (transferType) {
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DataBuffer.TYPE_BYTE:
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DataBuffer.TYPE_USHORT:
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DataBuffer.TYPE_INT:
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float alphaFactor = maxValues[numColorComponents];
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int iComponents[] = null;
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int iTransparentComponents[] = new int[numComponents];
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0; i < h; i++, minY++) {
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int j = 0, x = minX; j < w; j++, x++) {
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            iComponents = raster.getPixel(x, minY, iComponents);
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (iComponents[numColorComponents] == 0) {
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                raster.setPixel(x, minY, iTransparentComponents);
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                float alpha = iComponents[numColorComponents] / alphaFactor;
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                for (int n = 0; n < numColorComponents; n++) {
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    iComponents[n] = (int)(iComponents[n] / alpha + 0.5f);
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                raster.setPixel(x, minY, iComponents);
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DataBuffer.TYPE_SHORT:
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float sAlphaFactor = maxValues[numColorComponents];
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    short sComponents[] = null;
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    short sTransparentComponents[] = new short[numComponents];
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0; i < h; i++, minY++) {
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int j = 0, x = minX; j < w; j++, x++) {
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            sComponents = (short[])raster.getDataElements(x, minY, sComponents);
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (sComponents[numColorComponents] == 0) {
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                raster.setDataElements(x, minY, sTransparentComponents);
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                float alpha = sComponents[numColorComponents] / sAlphaFactor;
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                for (int n = 0; n < numColorComponents; n++) {
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    sComponents[n] = (byte)(sComponents[n] / alpha + 0.5f);
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                raster.setDataElements(x, minY, sComponents);
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DataBuffer.TYPE_FLOAT:
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float fComponents[] = null;
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float fTransparentComponents[] = new float[numComponents];
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0; i < h; i++, minY++) {
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int j = 0, x = minX; j < w; j++, x++) {
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            fComponents = raster.getPixel(x, minY, fComponents);
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (fComponents[numColorComponents] == 0.0f) {
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                raster.setDataElements(x, minY, fTransparentComponents);
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                float alpha = fComponents[numColorComponents];
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                for (int n = 0; n < numColorComponents; n++) {
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    fComponents[n] = fComponents[n] / alpha;
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                raster.setPixel(x, minY, fComponents);
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case DataBuffer.TYPE_DOUBLE:
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    double dComponents[] = null;
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    double dTransparentComponents[] = new double[numComponents];
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0; i < h; i++, minY++) {
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int j = 0, x = minX; j < w; j++, x++) {
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            dComponents = raster.getPixel(x, minY, dComponents);
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (dComponents[numColorComponents] == 0.0) {
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                raster.setPixel(x, minY, dTransparentComponents);
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                double alpha = dComponents[numColorComponents];
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                for (int n = 0; n < numColorComponents; n++) {
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    dComponents[n] = dComponents[n] / alpha;
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                raster.setPixel(x, minY, dComponents);
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default:
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // awt.219=This transferType is not supported by this color
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // model
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new UnsupportedOperationException(Messages.getString("awt.219")); //$NON-NLS-1$
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!signed) {
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new ComponentColorModel(cs, bits, hasAlpha, isAlphaPremultiplied, transparency,
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    transferType);
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new ComponentColorModel(cs, null, hasAlpha, isAlphaPremultiplied, transparency,
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                transferType);
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int[] getComponents(Object pixel, int[] components, int offset) {
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (donotSupportUnnormalized) {
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.213=This ComponentColorModel does not support the
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // unnormalized form
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (components == null) {
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            components = new int[offset + numComponents];
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (offset + numComponents > components.length) {
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.218=The components array is not large enough to hold all the
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // color and alpha components
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.218")); //$NON-NLS-1$
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (transferType) {
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_BYTE:
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte ba[] = (byte[])pixel;
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0, idx = offset; i < numComponents; i++, idx++) {
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    components[idx] = ba[i] & 0xff;
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return components;
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_USHORT:
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                short sa[] = (short[])pixel;
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0, idx = offset; i < numComponents; i++, idx++) {
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    components[idx] = sa[i] & 0xffff;
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return components;
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_INT:
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int ia[] = (int[])pixel;
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0, idx = offset; i < numComponents; i++, idx++) {
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    components[idx] = ia[i];
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return components;
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // awt.217=The transfer type of this ComponentColorModel is not
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // one
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // of the following transfer types: DataBuffer.TYPE_BYTE,
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // DataBuffer.TYPE_USHORT, or DataBuffer.TYPE_INT
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new UnsupportedOperationException(Messages.getString("awt.217")); //$NON-NLS-1$
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float[] getNormalizedComponents(Object pixel, float normComponents[], int normOffset) {
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (normComponents == null) {
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            normComponents = new float[numComponents + normOffset];
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (transferType) {
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_BYTE:
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte ba[] = (byte[])pixel;
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) {
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    normComponents[idx] = (ba[i] & 0xff) * scaleFactors[i];
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_USHORT:
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                short usa[] = (short[])pixel;
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) {
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    normComponents[idx] = (usa[i] & 0xffff) * scaleFactors[i];
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_INT:
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int ia[] = (int[])pixel;
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) {
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    normComponents[idx] = ia[i] * scaleFactors[i];
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_SHORT:
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                short sa[] = (short[])pixel;
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) {
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    normComponents[idx] = sa[i] * scaleFactors[i];
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_FLOAT:
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                float fa[] = (float[])pixel;
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) {
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    normComponents[idx] = fa[i];
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_DOUBLE:
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                double da[] = (double[])pixel;
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) {
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    normComponents[idx] = (float)da[i];
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // awt.21A=This ComponentColorModel does not support this
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // transferType
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalArgumentException(Messages.getString("awt.21A")); //$NON-NLS-1$
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (needAlphaDivide) {
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float alpha = normComponents[normOffset + numColorComponents];
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0, idx = normOffset; i < numColorComponents; i++, idx++) {
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normComponents[idx] /= alpha;
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (needScale) {
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0, idx = normOffset; i < numColorComponents; i++, idx++) {
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normComponents[idx] = minVals[i] + ranges[i] * normComponents[idx];
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return normComponents;
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean equals(Object obj) {
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!(obj instanceof ComponentColorModel)) {
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return super.equals(obj);
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRed(Object inData) {
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getRGBComponent(inData, 0);
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRGB(Object inData) {
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int alpha = getAlpha(inData);
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cs.getType() == ColorSpace.TYPE_GRAY) {
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int gray = getRed(inData);
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (alpha << 24 | gray << 16 | gray << 8 | gray);
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (alpha << 24 | getRed(inData) << 16 | getGreen(inData) << 8 | getBlue(inData));
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getGreen(Object inData) {
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getRGBComponent(inData, 1);
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getBlue(Object inData) {
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getRGBComponent(inData, 2);
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getAlpha(Object inData) {
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!hasAlpha) {
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 255;
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int alpha = 0;
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (transferType) {
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_BYTE: {
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte ba[] = (byte[])inData;
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                alpha = ba[numColorComponents] & 0xff;
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (bits[numColorComponents] != 8) {
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return alphaLUT[alpha] & 0xff;
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return alpha;
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_USHORT: {
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                short usa[] = (short[])inData;
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                alpha = usa[numColorComponents] & 0xffff;
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (bits[numColorComponents] != 8) {
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return alphaLUT[alpha] & 0xff;
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return alpha;
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_INT: {
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int ia[] = (int[])inData;
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                alpha = ia[numColorComponents];
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (bits[numColorComponents] != 8) {
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return alphaLUT[alpha] & 0xff;
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return alpha;
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_SHORT: {
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                short sa[] = (short[])inData;
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                alpha = sa[numColorComponents];
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (bits[numColorComponents] != 8) {
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return alphaLUT[alpha] & 0xff;
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return alpha;
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_FLOAT: {
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                float fa[] = (float[])inData;
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return (int)(fa[numColorComponents] * 255.0f + 0.5f);
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_DOUBLE: {
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                double da[] = (double[])inData;
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return (int)(da[numColorComponents] * 255.0 + 0.5);
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default: {
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // awt.214=This Color Model doesn't support this transferType
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new UnsupportedOperationException(Messages.getString("awt.214")); //$NON-NLS-1$
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WritableRaster createCompatibleWritableRaster(int w, int h) {
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SampleModel sm = createCompatibleSampleModel(w, h);
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DataBuffer db = sm.createDataBuffer();
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Raster.createWritableRaster(sm, db, null);
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isCompatibleSampleModel(SampleModel sm) {
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!(sm instanceof ComponentSampleModel)) {
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (numComponents != sm.getNumBands()) {
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (transferType != sm.getTransferType()) {
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public SampleModel createCompatibleSampleModel(int w, int h) {
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int bandOffsets[] = new int[numComponents];
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numComponents; i++) {
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bandOffsets[i] = i;
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (transferType) {
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_BYTE:
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_USHORT:
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new PixelInterleavedSampleModel(transferType, w, h, numComponents, w
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        * numComponents, bandOffsets);
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new ComponentSampleModel(transferType, w, h, numComponents, w
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        * numComponents, bandOffsets);
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isCompatibleRaster(Raster raster) {
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SampleModel sm = raster.getSampleModel();
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!(sm instanceof ComponentSampleModel)) {
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sm.getNumBands() != numComponents) {
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (raster.getTransferType() != transferType) {
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int sampleSizes[] = sm.getSampleSize();
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numComponents; i++) {
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (bits[i] != sampleSizes[i]) {
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float[] getNormalizedComponents(int components[], int offset, float normComponents[],
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int normOffset) {
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (donotSupportUnnormalized) {
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.213=This ComponentColorModel does not support the
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // unnormalized form
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return super.getNormalizedComponents(components, offset, normComponents, normOffset);
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDataElement(int[] components, int offset) {
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (numComponents > 1) {
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.212=There is more than one component in this ColorModel
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.212")); //$NON-NLS-1$
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (donotSupportUnnormalized) {
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.213=This ComponentColorModel does not support the
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // unnormalized form
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return components[offset];
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int[] getUnnormalizedComponents(float[] normComponents, int normOffset,
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int[] components, int offset) {
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (donotSupportUnnormalized) {
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.213=This ComponentColorModel does not support the
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // unnormalized form
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (normComponents.length - normOffset < numComponents) {
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.21B=The length of normComponents minus normOffset is less
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // than numComponents
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.21B")); //$NON-NLS-1$
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return super.getUnnormalizedComponents(normComponents, normOffset, components, offset);
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDataElement(float normComponents[], int normOffset) {
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (numComponents > 1) {
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.212=There is more than one component in this ColorModel
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.212")); //$NON-NLS-1$
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (signed) {
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.210=The component value for this ColorModel is signed
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.210")); //$NON-NLS-1$
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object pixel = getDataElements(normComponents, normOffset, null);
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (transferType) {
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_BYTE:
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte ba[] = (byte[])pixel;
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ba[0] & 0xff;
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_USHORT:
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                short sa[] = (short[])pixel;
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return sa[0] & 0xffff;
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_INT:
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int ia[] = (int[])pixel;
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ia[0];
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // awt.211=Pixel values for this ColorModel are not conveniently
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // representable as a single int
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalArgumentException(Messages.getString("awt.211")); //$NON-NLS-1$
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int[] getComponents(int pixel, int components[], int offset) {
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (numComponents > 1) {
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.212=There is more than one component in this ColorModel
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.212")); //$NON-NLS-1$
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (donotSupportUnnormalized) {
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.213=This ComponentColorModel does not support the
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // unnormalized form
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (components == null) {
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            components = new int[offset + 1];
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        components[offset] = pixel & maxValues[0];
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return components;
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRed(int pixel) {
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float rgb[] = toRGB(pixel);
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (int)(rgb[0] * 255.0f + 0.5f);
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getRGB(int pixel) {
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (getAlpha(pixel) << 24) | (getRed(pixel) << 16) | (getGreen(pixel) << 8)
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                | getBlue(pixel);
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getGreen(int pixel) {
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float rgb[] = toRGB(pixel);
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (int)(rgb[1] * 255.0f + 0.5f);
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getBlue(int pixel) {
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float rgb[] = toRGB(pixel);
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (int)(rgb[2] * 255.0f + 0.5f);
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getAlpha(int pixel) {
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This method throw IllegalArgumentException according to
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Java API Spacification
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (signed) {
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.210=The component value for this ColorModel is signed
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.210")); //$NON-NLS-1$
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (numComponents > 1) {
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.212=There is more than one component in this ColorModel
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.212")); //$NON-NLS-1$
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 255;
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initialization of Lookup tables.
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void initLUTs() {
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        is_sRGB = cs.isCS_sRGB();
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        is_LINEAR_RGB = (cs == LUTColorConverter.LINEAR_RGB_CS);
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hasAlpha && bits[numColorComponents] != 8 && integral) {
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            alphaLUT = new byte[maxValues[numColorComponents] + 1];
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i <= maxValues[numColorComponents]; i++) {
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                alphaLUT[i] = (byte)(scaleFactors[numColorComponents] * i + 0.5f);
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (is_LINEAR_RGB) {
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (maxBitLength > 8) {
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                LINEAR_RGB_Length = 16;
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                from_LINEAR_RGB_LUT = LUTColorConverter.getFrom16lRGBtosRGB_LUT();
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                to_LINEAR_16RGB_LUT = LUTColorConverter.getFromsRGBto16lRGB_LUT();
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                LINEAR_RGB_Length = 8;
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                from_LINEAR_RGB_LUT = LUTColorConverter.getFrom8lRGBtosRGB_LUT();
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                to_LINEAR_8RGB_LUT = LUTColorConverter.getFromsRGBto8lRGB_LUT();
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fFactor = ((1 << LINEAR_RGB_Length) - 1);
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fFactor = 255.0f;
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isAlphaPremultiplied && integral) {
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            colorLUTs = new byte[3][];
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (is_sRGB) {
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0; i < numColorComponents; i++) {
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (bits[i] != 8) {
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int j = 0; j < i; j++) {
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (bits[i] == bits[j]) {
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                colorLUTs[i] = colorLUTs[j];
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                break;
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        colorLUTs[i] = new byte[maxValues[i] + 1];
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int j = 0; j <= maxValues[0]; j++) {
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            colorLUTs[i][j] = (byte)(scaleFactors[i] * j + 0.5f);
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (is_LINEAR_RGB) {
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i = 0; i < numColorComponents; i++) {
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (bits[i] != LINEAR_RGB_Length) {
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int j = 0; j < i; j++) {
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (bits[i] == bits[j]) {
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                colorLUTs[i] = colorLUTs[j];
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                break;
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        colorLUTs[i] = new byte[maxValues[i] + 1];
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int j = 0; j <= maxValues[0]; j++) {
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            int idx;
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (LINEAR_RGB_Length == 8) {
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                idx = (int)(scaleFactors[i] * j + 0.5f);
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                idx = (int)(scaleFactors[i] * j * 257.0f + 0.5f);
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            colorLUTs[i][j] = from_LINEAR_RGB_LUT[idx];
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * To rgb.
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pixel
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the integer representation of the pixel.
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the array of normalized sRGB components.
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float[] toRGB(int pixel) {
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This method throw IllegalArgumentException according to
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Java API Spacification
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (signed) {
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.210=The component value for this ColorModel is signed
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.210")); //$NON-NLS-1$
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (numComponents > 1) {
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.212=There is more than one component in this ColorModel
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.212")); //$NON-NLS-1$
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object obj = null;
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (transferType) {
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_BYTE:
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte ba[] = new byte[1];
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ba[0] = (byte)pixel;
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                obj = ba;
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_USHORT:
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                short sa[] = new short[1];
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa[0] = (short)pixel;
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                obj = sa;
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_INT:
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int ia[] = new int[1];
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ia[0] = pixel;
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                obj = ia;
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return cs.toRGB(getNormalizedComponents(obj, null, 0));
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the RGB component.
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pixel
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the pixel.
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param idx
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the index of component.
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the RGB value from 0 to 255 pixel's component.
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int getRGBComponent(Object pixel, int idx) {
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (is_sRGB) {
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int comp = getDefComponent(pixel, idx);
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (calcValue || bits[idx] == 8) {
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return comp;
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return colorLUTs[idx][comp] & 0xff;
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (is_LINEAR_RGB) {
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int comp = getDefComponent(pixel, idx);
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (calcValue || bits[idx] == LINEAR_RGB_Length) {
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return from_LINEAR_RGB_LUT[comp] & 0xff;
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return colorLUTs[idx][comp] & 0xff;
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float normComp[] = getNormalizedComponents(pixel, null, 0);
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float rgbComp[] = cs.toRGB(normComp);
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (int)(rgbComp[idx] * 255.0f + 0.5f);
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the def component.
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pixel
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the pixel.
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param idx
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the index of component.
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the tentative value of the pixel component.
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int getDefComponent(Object pixel, int idx) {
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int comp = 0;
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        calcValue = false;
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (transferType) {
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_BYTE:
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte ba[] = (byte[])pixel;
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                comp = ba[idx] & 0xff;
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (needAlphaDivide) {
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int alpha = ba[numColorComponents] & 0xff;
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (alpha == 0) {
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        comp = 0;
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        float normAlpha = scaleFactors[numColorComponents] * alpha;
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        comp = (int)(comp * fFactor / normAlpha + 0.5f);
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    calcValue = true;
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return comp;
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_USHORT:
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                short usa[] = (short[])pixel;
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                comp = usa[idx] & 0xffff;
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (needAlphaDivide) {
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int alpha = usa[numColorComponents] & 0xffff;
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (alpha == 0) {
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        comp = 0;
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        float normAlpha = scaleFactors[numColorComponents] * alpha;
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        comp = (int)(comp * fFactor / normAlpha + 0.5f);
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    calcValue = true;
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return comp;
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_INT:
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int ia[] = (int[])pixel;
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                comp = ia[idx];
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (needAlphaDivide) {
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int alpha = ia[numColorComponents];
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (alpha == 0) {
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        comp = 0;
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        float normAlpha = scaleFactors[numColorComponents] * alpha;
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        comp = (int)(comp * fFactor / normAlpha + 0.5f);
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    calcValue = true;
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return comp;
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_SHORT:
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                short sa[] = (short[])pixel;
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                comp = sa[idx];
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (needAlphaDivide) {
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int alpha = sa[numColorComponents];
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (alpha == 0) {
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        comp = 0;
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        float normAlpha = scaleFactors[numColorComponents] * alpha;
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        comp = (int)(comp * fFactor / normAlpha + 0.5f);
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    calcValue = true;
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return comp;
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_FLOAT:
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                float fa[] = (float[])pixel;
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (needAlphaDivide) {
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float alpha = fa[numColorComponents];
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (fa[numColorComponents] == 0.0f) {
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        comp = 0;
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        comp = (int)(fa[idx] * fFactor / alpha + 0.5f);
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    comp = (int)(fa[idx] * fFactor + 0.5f);
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                calcValue = true;
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return comp;
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DataBuffer.TYPE_DOUBLE:
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                double da[] = (double[])pixel;
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (needAlphaDivide) {
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (da[numColorComponents] == 0.0) {
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        comp = 0;
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        comp = (int)(da[idx] * fFactor / da[numColorComponents] + 0.5);
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    comp = (int)(da[idx] * fFactor + 0.5);
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                calcValue = true;
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return comp;
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // awt.214=This Color Model doesn't support this transferType
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new UnsupportedOperationException(Messages.getString("awt.214")); //$NON-NLS-1$
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1483