diff options
Diffstat (limited to 'awt/java/awt/image/ComponentColorModel.java')
-rw-r--r-- | awt/java/awt/image/ComponentColorModel.java | 1482 |
1 files changed, 0 insertions, 1482 deletions
diff --git a/awt/java/awt/image/ComponentColorModel.java b/awt/java/awt/image/ComponentColorModel.java deleted file mode 100644 index 4328fd3..0000000 --- a/awt/java/awt/image/ComponentColorModel.java +++ /dev/null @@ -1,1482 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @author Igor V. Stolyarov - * @version $Revision$ - */ - -package java.awt.image; - -import java.awt.color.ColorSpace; - -import org.apache.harmony.awt.gl.color.LUTColorConverter; -import org.apache.harmony.awt.internal.nls.Messages; - -/** - * The Class ComponentColorModel represents a color model that is defined in - * terms of its components. - * - * @since Android 1.0 - */ -public class ComponentColorModel extends ColorModel { - - /** - * The signed. - */ - private boolean signed; // Pixel samples are signed. - - // Samples with TransferType DataBuffer.TYPE_BYTE, - // DataBuffer.TYPE_USHORT, DataBuffer.TYPE_INT - - // unsigned. Samples with others TransferType - - // signed. - - /** - * The integral. - */ - private boolean integral; // Pixel samples are integral. - - // Samples with TransferType DataBuffer.TYPE_BYTE, - // DataBuffer.TYPE_USHORT, DataBuffer.Short and - // DataBuffer.TYPE_INT - integral. - - /** - * The scale factors. - */ - private float scaleFactors[]; // Array of factors for reduction components - - // values into the form scaled from 0 to 255 - - /** - * The donot support unnormalized. - */ - private boolean donotSupportUnnormalized; // This Color Model don't support - - // unnormolized form - - /** - * The need alpha divide. - */ - private boolean needAlphaDivide; // hasAlpha && isAlphaPremultiplied - - /** - * The calc value. - */ - private boolean calcValue; // Value was culculated - - /** - * The need scale. - */ - private boolean needScale; // Normalized value need to scale - - /** - * The min vals. - */ - private float minVals[]; // Array of Min normalized values - - /** - * The ranges. - */ - private float ranges[]; // Array of range normalized values - - /** - * The alpha lut. - */ - private byte alphaLUT[]; // Lookup table for scale alpha value - - /** - * The color lu ts. - */ - private byte colorLUTs[][]; // Lookup tables for scale color values - - /** - * The from_ linea r_ rg b_ lut. - */ - private byte from_LINEAR_RGB_LUT[]; // Lookup table for conversion from - - // Linear RGB Color Space into sRGB - - /** - * The to_ linea r_8 rg b_ lut. - */ - private byte to_LINEAR_8RGB_LUT[]; // Lookup table for conversion from - - // sRGB Color Space into Linear RGB - // 8 bit - - /** - * The to_ linea r_16 rg b_ lut. - */ - private short to_LINEAR_16RGB_LUT[]; // Lookup table for conversion from - - // sRGB Color Space into Linear RGB - // 16 bit - - /** - * The LINEA r_ rg b_ length. - */ - private int LINEAR_RGB_Length; // Linear RGB bit length - - /** - * The factor. - */ - private float fFactor; // Scale factor - - /** - * The is_s rgb. - */ - private boolean is_sRGB; // ColorModel has sRGB ColorSpace - - /** - * The is_ linea r_ rgb. - */ - private boolean is_LINEAR_RGB; // Color Model has Linear RGB Color - - // Space - - /** - * Instantiates a new component color model. - * - * @param colorSpace - * the color space. - * @param bits - * the array of component masks. - * @param hasAlpha - * whether the color model has alpha. - * @param isAlphaPremultiplied - * whether the alpha is pre-multiplied. - * @param transparency - * the transparency strategy, @see java.awt.Transparency. - * @param transferType - * the transfer type (primitive java type to use for the - * components). - */ - public ComponentColorModel(ColorSpace colorSpace, int bits[], boolean hasAlpha, - boolean isAlphaPremultiplied, int transparency, int transferType) { - super(createPixelBits(colorSpace, hasAlpha, transferType), validateBits(bits, colorSpace, - hasAlpha, transferType), colorSpace, hasAlpha, isAlphaPremultiplied, transparency, - transferType); - - needScale = false; - switch (transferType) { - case DataBuffer.TYPE_BYTE: - case DataBuffer.TYPE_USHORT: - case DataBuffer.TYPE_INT: - signed = false; - integral = true; - donotSupportUnnormalized = false; - scaleFactors = new float[numComponents]; - for (int i = 0; i < numColorComponents; i++) { - scaleFactors[i] = 1.0f / maxValues[i]; - if (cs.getMinValue(i) != 0.0f || cs.getMaxValue(i) != 1.0f) { - donotSupportUnnormalized = true; - } - } - if (hasAlpha) { - maxValues[numColorComponents] = (1 << bits[numColorComponents]) - 1; - scaleFactors[numColorComponents] = 1.0f / maxValues[numColorComponents]; - } - break; - case DataBuffer.TYPE_SHORT: - signed = true; - integral = true; - donotSupportUnnormalized = true; - scaleFactors = new float[numComponents]; - for (int i = 0; i < numComponents; i++) { - maxValues[i] = Short.MAX_VALUE; - scaleFactors[i] = 1.0f / maxValues[i]; - if (cs.getMinValue(i) != 0.0f || cs.getMaxValue(i) != 1.0f) { - needScale = true; - } - } - if (needScale) { - minVals = new float[numColorComponents]; - ranges = new float[numColorComponents]; - for (int i = 0; i < numColorComponents; i++) { - minVals[i] = cs.getMinValue(i); - ranges[i] = cs.getMaxValue(i) - minVals[i]; - } - } - break; - case DataBuffer.TYPE_FLOAT: - case DataBuffer.TYPE_DOUBLE: - signed = true; - integral = false; - donotSupportUnnormalized = true; - break; - default: - // awt.215=transferType is not one of DataBuffer.TYPE_BYTE, - // DataBuffer.TYPE_USHORT, DataBuffer.TYPE_INT, - // DataBuffer.TYPE_SHORT, DataBuffer.TYPE_FLOAT, or - // DataBuffer.TYPE_DOUBLE - throw new IllegalArgumentException(Messages.getString("awt.215")); //$NON-NLS-1$ - } - - needAlphaDivide = hasAlpha && isAlphaPremultiplied; - initLUTs(); - } - - /** - * Instantiates a new component color model. - * - * @param colorSpace - * the color space. - * @param hasAlpha - * whether the color model has alpha. - * @param isAlphaPremultiplied - * whether the alpha is pre-multiplied. - * @param transparency - * the transparency strategy, @see java.awt.Transparency. - * @param transferType - * the transfer type (primitive java type to use for the - * components). - */ - public ComponentColorModel(ColorSpace colorSpace, boolean hasAlpha, - boolean isAlphaPremultiplied, int transparency, int transferType) { - - this(colorSpace, createPixelBitsArray(colorSpace, hasAlpha, transferType), hasAlpha, - isAlphaPremultiplied, transparency, transferType); - } - - /** - * Validate bits. - * - * @param bits - * the bits. - * @param colorSpace - * the color space. - * @param hasAlpha - * the has alpha. - * @param transferType - * the transfer type. - * @return the int[]. - */ - private static int[] validateBits(int bits[], ColorSpace colorSpace, boolean hasAlpha, - int transferType) { - if (bits != null) { - return bits; - } - - int numComponents = colorSpace.getNumComponents(); - if (hasAlpha) { - numComponents++; - } - bits = new int[numComponents]; - - int componentLength = DataBuffer.getDataTypeSize(transferType); - - for (int i = 0; i < numComponents; i++) { - bits[i] = componentLength; - } - - return bits; - } - - /** - * Creates the pixel bits. - * - * @param colorSpace - * the color space. - * @param hasAlpha - * the has alpha. - * @param transferType - * the transfer type. - * @return the int. - */ - private static int createPixelBits(ColorSpace colorSpace, boolean hasAlpha, int transferType) { - int numComponents = colorSpace.getNumComponents(); - if (hasAlpha) { - numComponents++; - } - int componentLength = DataBuffer.getDataTypeSize(transferType); - return numComponents * componentLength; - } - - /** - * Creates the pixel bits array. - * - * @param colorSpace - * the color space. - * @param hasAlpha - * the has alpha. - * @param transferType - * the transfer type. - * @return the int[]. - */ - private static int[] createPixelBitsArray(ColorSpace colorSpace, boolean hasAlpha, - int transferType) { - - int numComponents = colorSpace.getNumComponents(); - if (hasAlpha) { - numComponents++; - } - - int bits[] = new int[numComponents]; - for (int i = 0; i < numComponents; i++) { - bits[i] = DataBuffer.getDataTypeSize(transferType); - } - return bits; - } - - @Override - public Object getDataElements(int components[], int offset, Object obj) { - if (donotSupportUnnormalized) { - // awt.213=This ComponentColorModel does not support the - // unnormalized form - throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$ - } - - if (offset + numComponents > components.length) { - // awt.216=The components array is not large enough to hold all the - // color and alpha components - throw new IllegalArgumentException(Messages.getString("awt.216")); //$NON-NLS-1$ - } - - switch (transferType) { - case DataBuffer.TYPE_BYTE: - byte ba[]; - if (obj == null) { - ba = new byte[numComponents]; - } else { - ba = (byte[])obj; - } - for (int i = 0, idx = offset; i < numComponents; i++, idx++) { - ba[i] = (byte)components[idx]; - } - return ba; - case DataBuffer.TYPE_USHORT: - short sa[]; - if (obj == null) { - sa = new short[numComponents]; - } else { - sa = (short[])obj; - } - for (int i = 0, idx = offset; i < numComponents; i++, idx++) { - sa[i] = (short)components[idx]; - } - return sa; - case DataBuffer.TYPE_INT: - int ia[]; - if (obj == null) { - ia = new int[numComponents]; - } else { - ia = (int[])obj; - } - for (int i = 0, idx = offset; i < numComponents; i++, idx++) { - ia[i] = components[idx]; - } - return ia; - default: - // awt.217=The transfer type of this ComponentColorModel is not - // one - // of the following transfer types: DataBuffer.TYPE_BYTE, - // DataBuffer.TYPE_USHORT, or DataBuffer.TYPE_INT - throw new UnsupportedOperationException(Messages.getString("awt.217")); //$NON-NLS-1$ - } - } - - @Override - public Object getDataElements(float normComponents[], int normOffset, Object obj) { - if (needScale) { - for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) { - normComponents[idx] = (normComponents[idx] - minVals[i]) / ranges[i]; - } - } - - switch (transferType) { - case DataBuffer.TYPE_BYTE: - byte ba[]; - if (obj == null) { - ba = new byte[numComponents]; - } else { - ba = (byte[])obj; - } - - if (needAlphaDivide) { - float alpha = normComponents[normOffset + numColorComponents]; - for (int i = 0, idx = normOffset; i < numColorComponents; i++, idx++) { - ba[i] = (byte)(normComponents[idx] * alpha * maxValues[i] + 0.5f); - } - ba[numColorComponents] = (byte)(normComponents[normOffset + numColorComponents] - * maxValues[numColorComponents] + 0.5f); - } else { - for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { - ba[idx] = (byte)(normComponents[idx] * maxValues[i] + 0.5f); - } - } - return ba; - - case DataBuffer.TYPE_USHORT: - short usa[]; - if (obj == null) { - usa = new short[numComponents]; - } else { - usa = (short[])obj; - } - - if (needAlphaDivide) { - float alpha = normComponents[normOffset + numColorComponents]; - for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) { - usa[i] = (short)(normComponents[idx] * alpha * maxValues[i] + 0.5f); - } - usa[numColorComponents] = (short)(alpha * maxValues[numColorComponents] + 0.5f); - } else { - for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { - usa[i] = (short)(normComponents[idx] * maxValues[i] + 0.5f); - } - } - return usa; - - case DataBuffer.TYPE_INT: - int ia[]; - if (obj == null) { - ia = new int[numComponents]; - } else { - ia = (int[])obj; - } - - if (needAlphaDivide) { - float alpha = normComponents[normOffset + numColorComponents]; - for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) { - ia[i] = (int)(normComponents[idx] * alpha * maxValues[i] + 0.5f); - } - ia[numColorComponents] = (int)(alpha * maxValues[numColorComponents] + 0.5f); - } else { - for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { - ia[i] = (int)(normComponents[idx] * maxValues[i] + 0.5f); - } - } - return ia; - - case DataBuffer.TYPE_SHORT: - short sa[]; - if (obj == null) { - sa = new short[numComponents]; - } else { - sa = (short[])obj; - } - - if (needAlphaDivide) { - float alpha = normComponents[normOffset + numColorComponents]; - for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) { - sa[i] = (short)(normComponents[idx] * alpha * maxValues[i] + 0.5f); - } - sa[numColorComponents] = (short)(alpha * maxValues[numColorComponents] + 0.5f); - } else { - for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { - sa[i] = (short)(normComponents[idx] * maxValues[i] + 0.5f); - } - } - return sa; - - case DataBuffer.TYPE_FLOAT: - float fa[]; - if (obj == null) { - fa = new float[numComponents]; - } else { - fa = (float[])obj; - } - - if (needAlphaDivide) { - float alpha = normComponents[normOffset + numColorComponents]; - for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) { - fa[i] = normComponents[idx] * alpha; - } - fa[numColorComponents] = alpha; - } else { - for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { - fa[i] = normComponents[idx]; - } - } - return fa; - - case DataBuffer.TYPE_DOUBLE: - double da[]; - if (obj == null) { - da = new double[numComponents]; - } else { - da = (double[])obj; - } - - if (needAlphaDivide) { - double alpha = normComponents[normOffset + numColorComponents]; - for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) { - da[i] = normComponents[idx] * alpha; - } - da[numColorComponents] = alpha; - } else { - for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { - da[i] = normComponents[idx]; - } - } - return da; - - default: - // awt.213=This ComponentColorModel does not support the - // unnormalized form - throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$ - } - } - - @Override - public Object getDataElements(int rgb, Object pixel) { - float normComp[]; - float comp[]; - - int red = (rgb >> 16) & 0xff; - int green = (rgb >> 8) & 0xff; - int blue = rgb & 0xff; - int alpha = (rgb >> 24) & 0xff; - - comp = new float[3]; - if (is_sRGB || is_LINEAR_RGB) { - if (is_LINEAR_RGB) { - if (LINEAR_RGB_Length == 8) { - red = to_LINEAR_8RGB_LUT[red] & 0xff; - green = to_LINEAR_8RGB_LUT[green] & 0xff; - blue = to_LINEAR_8RGB_LUT[blue] & 0xff; - } else { - red = to_LINEAR_16RGB_LUT[red] & 0xffff; - green = to_LINEAR_16RGB_LUT[green] & 0xffff; - blue = to_LINEAR_16RGB_LUT[blue] & 0xffff; - } - } - comp[0] = red / fFactor; - comp[1] = green / fFactor; - comp[2] = blue / fFactor; - if (!hasAlpha) { - normComp = comp; - } else { - float normAlpha = alpha / 255.0f; - normComp = new float[numComponents]; - for (int i = 0; i < numColorComponents; i++) { - normComp[i] = comp[i]; - } - normComp[numColorComponents] = normAlpha; - } - } else { - comp[0] = red / fFactor; - comp[1] = green / fFactor; - comp[2] = blue / fFactor; - float[] defComp = cs.fromRGB(comp); - if (!hasAlpha) { - normComp = defComp; - } else { - float normAlpha = alpha / 255.0f; - normComp = new float[numComponents]; - for (int i = 0; i < numColorComponents; i++) { - normComp[i] = defComp[i]; - } - normComp[numColorComponents] = normAlpha; - } - } - if (hasAlpha && isAlphaPremultiplied) { - normComp[0] *= normComp[numColorComponents]; - normComp[1] *= normComp[numColorComponents]; - normComp[2] *= normComp[numColorComponents]; - } - - return getDataElements(normComp, 0, pixel); - } - - @Override - public WritableRaster getAlphaRaster(WritableRaster raster) { - if (!hasAlpha) { - return null; - } - - int x = raster.getMinX(); - int y = raster.getMinY(); - int bandList[] = new int[1]; - bandList[0] = raster.getNumBands() - 1; - - return raster.createWritableChild(x, y, raster.getWidth(), raster.getHeight(), x, y, - bandList); - } - - @Override - public ColorModel coerceData(WritableRaster raster, boolean isAlphaPremultiplied) { - if (!hasAlpha || this.isAlphaPremultiplied == isAlphaPremultiplied) { - return this; - } - - int minX = raster.getMinX(); - int minY = raster.getMinY(); - int w = raster.getWidth(); - int h = raster.getHeight(); - - if (isAlphaPremultiplied) { - switch (transferType) { - case DataBuffer.TYPE_BYTE: - case DataBuffer.TYPE_USHORT: - case DataBuffer.TYPE_INT: - float alphaFactor = maxValues[numColorComponents]; - int iComponents[] = null; - int iTransparentComponents[] = new int[numComponents]; - for (int i = 0; i < h; i++, minY++) { - for (int j = 0, x = minX; j < w; j++, x++) { - iComponents = raster.getPixel(x, minY, iComponents); - if (iComponents[numColorComponents] == 0) { - raster.setPixel(x, minY, iTransparentComponents); - } else { - float alpha = iComponents[numColorComponents] / alphaFactor; - for (int n = 0; n < numColorComponents; n++) { - iComponents[n] = (int)(alpha * iComponents[n] + 0.5f); - } - raster.setPixel(x, minY, iComponents); - } - } - - } - break; - - case DataBuffer.TYPE_SHORT: - float sAlphaFactor = maxValues[numColorComponents]; - short sComponents[] = null; - short sTransparentComponents[] = new short[numComponents]; - for (int i = 0; i < h; i++, minY++) { - for (int j = 0, x = minX; j < w; j++, x++) { - sComponents = (short[])raster.getDataElements(x, minY, sComponents); - if (sComponents[numColorComponents] == 0) { - raster.setDataElements(x, minY, sTransparentComponents); - } else { - float alpha = sComponents[numColorComponents] / sAlphaFactor; - for (int n = 0; n < numColorComponents; n++) { - sComponents[n] = (byte)(alpha * sComponents[n] + 0.5f); - } - raster.setDataElements(x, minY, sComponents); - } - } - - } - break; - - case DataBuffer.TYPE_FLOAT: - float fComponents[] = null; - float fTransparentComponents[] = new float[numComponents]; - for (int i = 0; i < h; i++, minY++) { - for (int j = 0, x = minX; j < w; j++, x++) { - fComponents = raster.getPixel(x, minY, fComponents); - if (fComponents[numColorComponents] == 0.0f) { - raster.setDataElements(x, minY, fTransparentComponents); - } else { - float alpha = fComponents[numColorComponents]; - for (int n = 0; n < numColorComponents; n++) { - fComponents[n] = fComponents[n] * alpha; - } - raster.setPixel(x, minY, fComponents); - } - } - - } - break; - - case DataBuffer.TYPE_DOUBLE: - double dComponents[] = null; - double dTransparentComponents[] = new double[numComponents]; - for (int i = 0; i < h; i++, minY++) { - for (int j = 0, x = minX; j < w; j++, x++) { - dComponents = raster.getPixel(x, minY, dComponents); - if (dComponents[numColorComponents] == 0.0) { - raster.setPixel(x, minY, dTransparentComponents); - } else { - double alpha = dComponents[numColorComponents]; - for (int n = 0; n < numColorComponents; n++) { - dComponents[n] = dComponents[n] * alpha; - } - raster.setPixel(x, minY, dComponents); - } - } - - } - break; - - default: - // awt.219=This transferType is not supported by this color - // model - throw new UnsupportedOperationException(Messages.getString("awt.219")); //$NON-NLS-1$ - } - } else { - switch (transferType) { - case DataBuffer.TYPE_BYTE: - case DataBuffer.TYPE_USHORT: - case DataBuffer.TYPE_INT: - float alphaFactor = maxValues[numColorComponents]; - int iComponents[] = null; - int iTransparentComponents[] = new int[numComponents]; - for (int i = 0; i < h; i++, minY++) { - for (int j = 0, x = minX; j < w; j++, x++) { - iComponents = raster.getPixel(x, minY, iComponents); - if (iComponents[numColorComponents] == 0) { - raster.setPixel(x, minY, iTransparentComponents); - } else { - float alpha = iComponents[numColorComponents] / alphaFactor; - for (int n = 0; n < numColorComponents; n++) { - iComponents[n] = (int)(iComponents[n] / alpha + 0.5f); - } - raster.setPixel(x, minY, iComponents); - } - } - - } - break; - - case DataBuffer.TYPE_SHORT: - float sAlphaFactor = maxValues[numColorComponents]; - short sComponents[] = null; - short sTransparentComponents[] = new short[numComponents]; - for (int i = 0; i < h; i++, minY++) { - for (int j = 0, x = minX; j < w; j++, x++) { - sComponents = (short[])raster.getDataElements(x, minY, sComponents); - if (sComponents[numColorComponents] == 0) { - raster.setDataElements(x, minY, sTransparentComponents); - } else { - float alpha = sComponents[numColorComponents] / sAlphaFactor; - for (int n = 0; n < numColorComponents; n++) { - sComponents[n] = (byte)(sComponents[n] / alpha + 0.5f); - } - raster.setDataElements(x, minY, sComponents); - } - } - - } - break; - - case DataBuffer.TYPE_FLOAT: - float fComponents[] = null; - float fTransparentComponents[] = new float[numComponents]; - for (int i = 0; i < h; i++, minY++) { - for (int j = 0, x = minX; j < w; j++, x++) { - fComponents = raster.getPixel(x, minY, fComponents); - if (fComponents[numColorComponents] == 0.0f) { - raster.setDataElements(x, minY, fTransparentComponents); - } else { - float alpha = fComponents[numColorComponents]; - for (int n = 0; n < numColorComponents; n++) { - fComponents[n] = fComponents[n] / alpha; - } - raster.setPixel(x, minY, fComponents); - } - } - - } - break; - - case DataBuffer.TYPE_DOUBLE: - double dComponents[] = null; - double dTransparentComponents[] = new double[numComponents]; - for (int i = 0; i < h; i++, minY++) { - for (int j = 0, x = minX; j < w; j++, x++) { - dComponents = raster.getPixel(x, minY, dComponents); - if (dComponents[numColorComponents] == 0.0) { - raster.setPixel(x, minY, dTransparentComponents); - } else { - double alpha = dComponents[numColorComponents]; - for (int n = 0; n < numColorComponents; n++) { - dComponents[n] = dComponents[n] / alpha; - } - raster.setPixel(x, minY, dComponents); - } - } - - } - break; - default: - // awt.219=This transferType is not supported by this color - // model - throw new UnsupportedOperationException(Messages.getString("awt.219")); //$NON-NLS-1$ - } - } - - if (!signed) { - return new ComponentColorModel(cs, bits, hasAlpha, isAlphaPremultiplied, transparency, - transferType); - } - - return new ComponentColorModel(cs, null, hasAlpha, isAlphaPremultiplied, transparency, - transferType); - } - - @Override - public int[] getComponents(Object pixel, int[] components, int offset) { - if (donotSupportUnnormalized) { - // awt.213=This ComponentColorModel does not support the - // unnormalized form - throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$ - } - - if (components == null) { - components = new int[offset + numComponents]; - } else if (offset + numComponents > components.length) { - // awt.218=The components array is not large enough to hold all the - // color and alpha components - throw new IllegalArgumentException(Messages.getString("awt.218")); //$NON-NLS-1$ - } - - switch (transferType) { - case DataBuffer.TYPE_BYTE: - byte ba[] = (byte[])pixel; - - for (int i = 0, idx = offset; i < numComponents; i++, idx++) { - components[idx] = ba[i] & 0xff; - } - return components; - - case DataBuffer.TYPE_USHORT: - short sa[] = (short[])pixel; - for (int i = 0, idx = offset; i < numComponents; i++, idx++) { - components[idx] = sa[i] & 0xffff; - } - return components; - - case DataBuffer.TYPE_INT: - int ia[] = (int[])pixel; - for (int i = 0, idx = offset; i < numComponents; i++, idx++) { - components[idx] = ia[i]; - } - return components; - - default: - // awt.217=The transfer type of this ComponentColorModel is not - // one - // of the following transfer types: DataBuffer.TYPE_BYTE, - // DataBuffer.TYPE_USHORT, or DataBuffer.TYPE_INT - throw new UnsupportedOperationException(Messages.getString("awt.217")); //$NON-NLS-1$ - } - - } - - @Override - public float[] getNormalizedComponents(Object pixel, float normComponents[], int normOffset) { - - if (normComponents == null) { - normComponents = new float[numComponents + normOffset]; - } - - switch (transferType) { - case DataBuffer.TYPE_BYTE: - byte ba[] = (byte[])pixel; - for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { - normComponents[idx] = (ba[i] & 0xff) * scaleFactors[i]; - } - break; - - case DataBuffer.TYPE_USHORT: - short usa[] = (short[])pixel; - for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { - normComponents[idx] = (usa[i] & 0xffff) * scaleFactors[i]; - } - break; - - case DataBuffer.TYPE_INT: - int ia[] = (int[])pixel; - for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { - normComponents[idx] = ia[i] * scaleFactors[i]; - } - break; - - case DataBuffer.TYPE_SHORT: - short sa[] = (short[])pixel; - for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { - normComponents[idx] = sa[i] * scaleFactors[i]; - } - break; - - case DataBuffer.TYPE_FLOAT: - float fa[] = (float[])pixel; - for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { - normComponents[idx] = fa[i]; - } - break; - - case DataBuffer.TYPE_DOUBLE: - double da[] = (double[])pixel; - for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { - normComponents[idx] = (float)da[i]; - } - break; - - default: - // awt.21A=This ComponentColorModel does not support this - // transferType - throw new IllegalArgumentException(Messages.getString("awt.21A")); //$NON-NLS-1$ - } - - if (needAlphaDivide) { - float alpha = normComponents[normOffset + numColorComponents]; - for (int i = 0, idx = normOffset; i < numColorComponents; i++, idx++) { - normComponents[idx] /= alpha; - } - } - - if (needScale) { - for (int i = 0, idx = normOffset; i < numColorComponents; i++, idx++) { - normComponents[idx] = minVals[i] + ranges[i] * normComponents[idx]; - } - } - return normComponents; - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof ComponentColorModel)) { - return false; - } - return super.equals(obj); - } - - @Override - public int getRed(Object inData) { - return getRGBComponent(inData, 0); - } - - @Override - public int getRGB(Object inData) { - int alpha = getAlpha(inData); - if (cs.getType() == ColorSpace.TYPE_GRAY) { - int gray = getRed(inData); - return (alpha << 24 | gray << 16 | gray << 8 | gray); - } - return (alpha << 24 | getRed(inData) << 16 | getGreen(inData) << 8 | getBlue(inData)); - } - - @Override - public int getGreen(Object inData) { - return getRGBComponent(inData, 1); - } - - @Override - public int getBlue(Object inData) { - return getRGBComponent(inData, 2); - } - - @Override - public int getAlpha(Object inData) { - if (!hasAlpha) { - return 255; - } - int alpha = 0; - - switch (transferType) { - case DataBuffer.TYPE_BYTE: { - byte ba[] = (byte[])inData; - alpha = ba[numColorComponents] & 0xff; - if (bits[numColorComponents] != 8) { - return alphaLUT[alpha] & 0xff; - } - return alpha; - } - case DataBuffer.TYPE_USHORT: { - short usa[] = (short[])inData; - alpha = usa[numColorComponents] & 0xffff; - if (bits[numColorComponents] != 8) { - return alphaLUT[alpha] & 0xff; - } - return alpha; - } - case DataBuffer.TYPE_INT: { - int ia[] = (int[])inData; - alpha = ia[numColorComponents]; - if (bits[numColorComponents] != 8) { - return alphaLUT[alpha] & 0xff; - } - return alpha; - } - case DataBuffer.TYPE_SHORT: { - short sa[] = (short[])inData; - alpha = sa[numColorComponents]; - if (bits[numColorComponents] != 8) { - return alphaLUT[alpha] & 0xff; - } - return alpha; - } - case DataBuffer.TYPE_FLOAT: { - float fa[] = (float[])inData; - return (int)(fa[numColorComponents] * 255.0f + 0.5f); - } - case DataBuffer.TYPE_DOUBLE: { - double da[] = (double[])inData; - return (int)(da[numColorComponents] * 255.0 + 0.5); - } - default: { - // awt.214=This Color Model doesn't support this transferType - throw new UnsupportedOperationException(Messages.getString("awt.214")); //$NON-NLS-1$ - } - } - } - - @Override - public WritableRaster createCompatibleWritableRaster(int w, int h) { - SampleModel sm = createCompatibleSampleModel(w, h); - DataBuffer db = sm.createDataBuffer(); - return Raster.createWritableRaster(sm, db, null); - } - - @Override - public boolean isCompatibleSampleModel(SampleModel sm) { - if (!(sm instanceof ComponentSampleModel)) { - return false; - } - if (numComponents != sm.getNumBands()) { - return false; - } - if (transferType != sm.getTransferType()) { - return false; - } - return true; - } - - @Override - public SampleModel createCompatibleSampleModel(int w, int h) { - int bandOffsets[] = new int[numComponents]; - for (int i = 0; i < numComponents; i++) { - bandOffsets[i] = i; - } - - switch (transferType) { - case DataBuffer.TYPE_BYTE: - case DataBuffer.TYPE_USHORT: - return new PixelInterleavedSampleModel(transferType, w, h, numComponents, w - * numComponents, bandOffsets); - - default: - return new ComponentSampleModel(transferType, w, h, numComponents, w - * numComponents, bandOffsets); - } - } - - @Override - public boolean isCompatibleRaster(Raster raster) { - SampleModel sm = raster.getSampleModel(); - if (!(sm instanceof ComponentSampleModel)) { - return false; - } - - if (sm.getNumBands() != numComponents) { - return false; - } - if (raster.getTransferType() != transferType) { - return false; - } - - int sampleSizes[] = sm.getSampleSize(); - for (int i = 0; i < numComponents; i++) { - if (bits[i] != sampleSizes[i]) { - return false; - } - } - return true; - } - - @Override - public float[] getNormalizedComponents(int components[], int offset, float normComponents[], - int normOffset) { - if (donotSupportUnnormalized) { - // awt.213=This ComponentColorModel does not support the - // unnormalized form - throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$ - } - - return super.getNormalizedComponents(components, offset, normComponents, normOffset); - } - - @Override - public int getDataElement(int[] components, int offset) { - if (numComponents > 1) { - // awt.212=There is more than one component in this ColorModel - throw new IllegalArgumentException(Messages.getString("awt.212")); //$NON-NLS-1$ - } - if (donotSupportUnnormalized) { - // awt.213=This ComponentColorModel does not support the - // unnormalized form - throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$ - } - return components[offset]; - } - - @Override - public int[] getUnnormalizedComponents(float[] normComponents, int normOffset, - int[] components, int offset) { - - if (donotSupportUnnormalized) { - // awt.213=This ComponentColorModel does not support the - // unnormalized form - throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$ - } - - if (normComponents.length - normOffset < numComponents) { - // awt.21B=The length of normComponents minus normOffset is less - // than numComponents - throw new IllegalArgumentException(Messages.getString("awt.21B")); //$NON-NLS-1$ - } - - return super.getUnnormalizedComponents(normComponents, normOffset, components, offset); - } - - @Override - public int getDataElement(float normComponents[], int normOffset) { - if (numComponents > 1) { - // awt.212=There is more than one component in this ColorModel - throw new IllegalArgumentException(Messages.getString("awt.212")); //$NON-NLS-1$ - } - if (signed) { - // awt.210=The component value for this ColorModel is signed - throw new IllegalArgumentException(Messages.getString("awt.210")); //$NON-NLS-1$ - } - - Object pixel = getDataElements(normComponents, normOffset, null); - - switch (transferType) { - case DataBuffer.TYPE_BYTE: - byte ba[] = (byte[])pixel; - return ba[0] & 0xff; - case DataBuffer.TYPE_USHORT: - short sa[] = (short[])pixel; - return sa[0] & 0xffff; - case DataBuffer.TYPE_INT: - int ia[] = (int[])pixel; - return ia[0]; - default: - // awt.211=Pixel values for this ColorModel are not conveniently - // representable as a single int - throw new IllegalArgumentException(Messages.getString("awt.211")); //$NON-NLS-1$ - } - } - - @Override - public int[] getComponents(int pixel, int components[], int offset) { - if (numComponents > 1) { - // awt.212=There is more than one component in this ColorModel - throw new IllegalArgumentException(Messages.getString("awt.212")); //$NON-NLS-1$ - } - if (donotSupportUnnormalized) { - // awt.213=This ComponentColorModel does not support the - // unnormalized form - throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$ - } - - if (components == null) { - components = new int[offset + 1]; - } - - components[offset] = pixel & maxValues[0]; - return components; - } - - @Override - public int getRed(int pixel) { - float rgb[] = toRGB(pixel); - return (int)(rgb[0] * 255.0f + 0.5f); - } - - @Override - public int getRGB(int pixel) { - return (getAlpha(pixel) << 24) | (getRed(pixel) << 16) | (getGreen(pixel) << 8) - | getBlue(pixel); - } - - @Override - public int getGreen(int pixel) { - float rgb[] = toRGB(pixel); - return (int)(rgb[1] * 255.0f + 0.5f); - } - - @Override - public int getBlue(int pixel) { - float rgb[] = toRGB(pixel); - return (int)(rgb[2] * 255.0f + 0.5f); - } - - @Override - public int getAlpha(int pixel) { - - // This method throw IllegalArgumentException according to - // Java API Spacification - if (signed) { - // awt.210=The component value for this ColorModel is signed - throw new IllegalArgumentException(Messages.getString("awt.210")); //$NON-NLS-1$ - } - - if (numComponents > 1) { - // awt.212=There is more than one component in this ColorModel - throw new IllegalArgumentException(Messages.getString("awt.212")); //$NON-NLS-1$ - } - - return 255; - } - - /** - * Initialization of Lookup tables. - */ - private void initLUTs() { - is_sRGB = cs.isCS_sRGB(); - is_LINEAR_RGB = (cs == LUTColorConverter.LINEAR_RGB_CS); - - if (hasAlpha && bits[numColorComponents] != 8 && integral) { - alphaLUT = new byte[maxValues[numColorComponents] + 1]; - for (int i = 0; i <= maxValues[numColorComponents]; i++) { - alphaLUT[i] = (byte)(scaleFactors[numColorComponents] * i + 0.5f); - } - } - - if (is_LINEAR_RGB) { - if (maxBitLength > 8) { - LINEAR_RGB_Length = 16; - from_LINEAR_RGB_LUT = LUTColorConverter.getFrom16lRGBtosRGB_LUT(); - to_LINEAR_16RGB_LUT = LUTColorConverter.getFromsRGBto16lRGB_LUT(); - } else { - LINEAR_RGB_Length = 8; - from_LINEAR_RGB_LUT = LUTColorConverter.getFrom8lRGBtosRGB_LUT(); - to_LINEAR_8RGB_LUT = LUTColorConverter.getFromsRGBto8lRGB_LUT(); - } - fFactor = ((1 << LINEAR_RGB_Length) - 1); - } else { - fFactor = 255.0f; - } - - if (!isAlphaPremultiplied && integral) { - colorLUTs = new byte[3][]; - - if (is_sRGB) { - for (int i = 0; i < numColorComponents; i++) { - if (bits[i] != 8) { - for (int j = 0; j < i; j++) { - if (bits[i] == bits[j]) { - colorLUTs[i] = colorLUTs[j]; - break; - } - } - colorLUTs[i] = new byte[maxValues[i] + 1]; - for (int j = 0; j <= maxValues[0]; j++) { - colorLUTs[i][j] = (byte)(scaleFactors[i] * j + 0.5f); - } - } - } - } - - if (is_LINEAR_RGB) { - - for (int i = 0; i < numColorComponents; i++) { - if (bits[i] != LINEAR_RGB_Length) { - for (int j = 0; j < i; j++) { - if (bits[i] == bits[j]) { - colorLUTs[i] = colorLUTs[j]; - break; - } - } - colorLUTs[i] = new byte[maxValues[i] + 1]; - for (int j = 0; j <= maxValues[0]; j++) { - int idx; - if (LINEAR_RGB_Length == 8) { - idx = (int)(scaleFactors[i] * j + 0.5f); - } else { - idx = (int)(scaleFactors[i] * j * 257.0f + 0.5f); - } - colorLUTs[i][j] = from_LINEAR_RGB_LUT[idx]; - } - } - } - } - - } - } - - /** - * To rgb. - * - * @param pixel - * the integer representation of the pixel. - * @return the array of normalized sRGB components. - */ - private float[] toRGB(int pixel) { - - // This method throw IllegalArgumentException according to - // Java API Spacification - if (signed) { - // awt.210=The component value for this ColorModel is signed - throw new IllegalArgumentException(Messages.getString("awt.210")); //$NON-NLS-1$ - } - - if (numComponents > 1) { - // awt.212=There is more than one component in this ColorModel - throw new IllegalArgumentException(Messages.getString("awt.212")); //$NON-NLS-1$ - } - - Object obj = null; - - switch (transferType) { - case DataBuffer.TYPE_BYTE: - byte ba[] = new byte[1]; - ba[0] = (byte)pixel; - obj = ba; - break; - - case DataBuffer.TYPE_USHORT: - short sa[] = new short[1]; - sa[0] = (short)pixel; - obj = sa; - break; - - case DataBuffer.TYPE_INT: - int ia[] = new int[1]; - ia[0] = pixel; - obj = ia; - break; - - } - - return cs.toRGB(getNormalizedComponents(obj, null, 0)); - } - - /** - * Gets the RGB component. - * - * @param pixel - * the pixel. - * @param idx - * the index of component. - * @return the RGB value from 0 to 255 pixel's component. - */ - private int getRGBComponent(Object pixel, int idx) { - if (is_sRGB) { - int comp = getDefComponent(pixel, idx); - if (calcValue || bits[idx] == 8) { - return comp; - } - return colorLUTs[idx][comp] & 0xff; - } else if (is_LINEAR_RGB) { - int comp = getDefComponent(pixel, idx); - if (calcValue || bits[idx] == LINEAR_RGB_Length) { - return from_LINEAR_RGB_LUT[comp] & 0xff; - } - return colorLUTs[idx][comp] & 0xff; - } - - float normComp[] = getNormalizedComponents(pixel, null, 0); - float rgbComp[] = cs.toRGB(normComp); - return (int)(rgbComp[idx] * 255.0f + 0.5f); - } - - /** - * Gets the def component. - * - * @param pixel - * the pixel. - * @param idx - * the index of component. - * @return the tentative value of the pixel component. - */ - private int getDefComponent(Object pixel, int idx) { - int comp = 0; - calcValue = false; - - switch (transferType) { - case DataBuffer.TYPE_BYTE: - byte ba[] = (byte[])pixel; - comp = ba[idx] & 0xff; - if (needAlphaDivide) { - int alpha = ba[numColorComponents] & 0xff; - if (alpha == 0) { - comp = 0; - } else { - float normAlpha = scaleFactors[numColorComponents] * alpha; - comp = (int)(comp * fFactor / normAlpha + 0.5f); - } - calcValue = true; - } - return comp; - - case DataBuffer.TYPE_USHORT: - short usa[] = (short[])pixel; - comp = usa[idx] & 0xffff; - if (needAlphaDivide) { - int alpha = usa[numColorComponents] & 0xffff; - if (alpha == 0) { - comp = 0; - } else { - float normAlpha = scaleFactors[numColorComponents] * alpha; - comp = (int)(comp * fFactor / normAlpha + 0.5f); - } - calcValue = true; - } - return comp; - - case DataBuffer.TYPE_INT: - int ia[] = (int[])pixel; - comp = ia[idx]; - if (needAlphaDivide) { - int alpha = ia[numColorComponents]; - if (alpha == 0) { - comp = 0; - } else { - float normAlpha = scaleFactors[numColorComponents] * alpha; - comp = (int)(comp * fFactor / normAlpha + 0.5f); - } - calcValue = true; - } - return comp; - - case DataBuffer.TYPE_SHORT: - short sa[] = (short[])pixel; - comp = sa[idx]; - if (needAlphaDivide) { - int alpha = sa[numColorComponents]; - if (alpha == 0) { - comp = 0; - } else { - float normAlpha = scaleFactors[numColorComponents] * alpha; - comp = (int)(comp * fFactor / normAlpha + 0.5f); - } - calcValue = true; - } - return comp; - - case DataBuffer.TYPE_FLOAT: - float fa[] = (float[])pixel; - if (needAlphaDivide) { - float alpha = fa[numColorComponents]; - if (fa[numColorComponents] == 0.0f) { - comp = 0; - } else { - comp = (int)(fa[idx] * fFactor / alpha + 0.5f); - } - } else { - comp = (int)(fa[idx] * fFactor + 0.5f); - } - calcValue = true; - return comp; - - case DataBuffer.TYPE_DOUBLE: - double da[] = (double[])pixel; - if (needAlphaDivide) { - if (da[numColorComponents] == 0.0) { - comp = 0; - } else { - comp = (int)(da[idx] * fFactor / da[numColorComponents] + 0.5); - } - } else { - comp = (int)(da[idx] * fFactor + 0.5); - } - calcValue = true; - return comp; - - default: - // awt.214=This Color Model doesn't support this transferType - throw new UnsupportedOperationException(Messages.getString("awt.214")); //$NON-NLS-1$ - } - } - -} |