summaryrefslogtreecommitdiffstats
path: root/awt/java/awt/image/ComponentColorModel.java
diff options
context:
space:
mode:
Diffstat (limited to 'awt/java/awt/image/ComponentColorModel.java')
-rw-r--r--awt/java/awt/image/ComponentColorModel.java1482
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$
- }
- }
-
-}