summaryrefslogtreecommitdiffstats
path: root/awt/java/awt/image/ColorConvertOp.java
diff options
context:
space:
mode:
Diffstat (limited to 'awt/java/awt/image/ColorConvertOp.java')
-rw-r--r--awt/java/awt/image/ColorConvertOp.java710
1 files changed, 0 insertions, 710 deletions
diff --git a/awt/java/awt/image/ColorConvertOp.java b/awt/java/awt/image/ColorConvertOp.java
deleted file mode 100644
index 1a1700b..0000000
--- a/awt/java/awt/image/ColorConvertOp.java
+++ /dev/null
@@ -1,710 +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 Oleg V. Khaschansky
- * @version $Revision$
- */
-
-package java.awt.image;
-
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.RenderingHints;
-import java.awt.color.ColorSpace;
-import java.awt.color.ICC_ColorSpace;
-import java.awt.color.ICC_Profile;
-import java.awt.geom.Point2D;
-import java.awt.geom.Rectangle2D;
-import java.util.ArrayList;
-
-import org.apache.harmony.awt.gl.color.ColorConverter;
-import org.apache.harmony.awt.gl.color.ColorScaler;
-import org.apache.harmony.awt.gl.color.ICC_Transform;
-import org.apache.harmony.awt.internal.nls.Messages;
-
-/**
- * The ColorConvertOp class converts the pixels of the data in the source image
- * with the specified ColorSpace objects or an array of ICC_Profile objects. The
- * result pixels are scaled to the precision of the destination image.
- *
- * @since Android 1.0
- */
-public class ColorConvertOp implements BufferedImageOp, RasterOp {
- // Unused but required by interfaces
- /**
- * The rendering hints.
- */
- RenderingHints renderingHints;
-
- // Sequence consisting of ColorSpace and ICC_Profile elements
- /**
- * The conversion sequence.
- */
- Object conversionSequence[] = new ICC_Profile[0]; // To eliminate checks for
-
- // null
-
- // Not null if ColorConvertOp is constructed from the array of ICC profiles
- /**
- * The mid profiles.
- */
- private ICC_Profile midProfiles[];
-
- /**
- * The cc.
- */
- private final ColorConverter cc = new ColorConverter();
-
- /**
- * The t creator.
- */
- private final ICC_TransfomCreator tCreator = new ICC_TransfomCreator();
-
- /**
- * The is icc.
- */
- private boolean isICC = true;
-
- // Cached ICC_Transform
- /**
- * The Class ICC_TransfomCreator.
- */
- private class ICC_TransfomCreator {
-
- /**
- * The transform.
- */
- private ICC_Transform transform;
-
- /**
- * The max components.
- */
- private int maxComponents;
-
- /**
- * For the full ICC case.
- *
- * @param src
- * the src.
- * @param dst
- * the dst.
- * @param convSeq
- * the conv seq.
- * @return the transform.
- */
- public ICC_Transform getTransform(ICC_Profile src, ICC_Profile dst, ICC_Profile convSeq[]) {
- if (transform != null && src == transform.getSrc() && dst == transform.getDst()) {
- return transform;
- }
-
- int length = convSeq.length;
- int srcFlg = 0, dstFlg = 0;
-
- if (length == 0 || src != convSeq[0]) {
- if (src != null) {
- srcFlg = 1; // need src profile
- }
- }
- if (length == 0 || dst != convSeq[length - 1]) {
- if (dst != null) {
- dstFlg = 1; // need dst profile
- }
- }
-
- ICC_Profile profiles[];
- int nProfiles = length + srcFlg + dstFlg;
- if (nProfiles == length) {
- profiles = convSeq;
- } else {
- profiles = new ICC_Profile[nProfiles];
- int pos = 0;
- if (srcFlg != 0) {
- profiles[pos++] = src;
- }
- for (int i = 0; i < length; i++) {
- profiles[pos++] = convSeq[i];
- }
- if (dstFlg != 0) {
- profiles[pos++] = dst;
- }
- }
-
- return transform = new ICC_Transform(profiles);
- }
-
- /**
- * Used only when there are non-ICC color spaces. Returns sequence of
- * non-ICC color spaces and ICC transforms made from src, dst and
- * conversionSequence.
- *
- * @param src
- * the src.
- * @param dst
- * the dst.
- * @return the sequence.
- */
- public Object[] getSequence(Object src, Object dst) {
- ArrayList<Object> profiles = new ArrayList<Object>(10);
- ArrayList<Object> sequence = new ArrayList<Object>(10);
-
- // We need this profile anyway
- ICC_Profile xyzProfile = ICC_Profile.getInstance(ColorSpace.CS_CIEXYZ);
-
- Object conversionFirst = null, conversionLast = null;
- int conversionLength = conversionSequence.length;
- if (conversionLength > 0) {
- conversionFirst = conversionSequence[0];
- conversionLast = conversionSequence[conversionLength - 1];
- }
-
- boolean iccSequenceStarted = false;
-
- if (src != conversionFirst && src != null) {
- if (src instanceof ICC_Profile) {
- profiles.add(src);
- iccSequenceStarted = true;
- } else {
- profiles.add(xyzProfile);
- sequence.add(src); // Add non-ICC color space to the
- // sequence
- }
- } else {
- profiles.add(xyzProfile);
- }
-
- for (int i = 0; i < conversionLength; i++) {
- if (conversionSequence[i] instanceof ICC_Profile) {
- profiles.add(conversionSequence[i]);
- iccSequenceStarted = true;
- } else if (iccSequenceStarted) {
- profiles.add(xyzProfile);
-
- // Eliminate same profiles if there are any
- // (e.g. xyzProfile may occur several times)
- Object prev = profiles.get(0);
- for (int k = 1; k < profiles.size(); k++) {
- if (prev == profiles.get(k)) {
- k--;
- profiles.remove(k);
- }
- prev = profiles.get(k);
- }
-
- // If only one profile left we skip the transform -
- // it can be only CIEXYZ
- if (profiles.size() > 1) {
- sequence.add(new ICC_Transform(profiles.toArray(new ICC_Profile[0])));
-
- // Add non-ICC color space to the sequence
- sequence.add(conversionSequence[i]);
- }
-
- profiles.clear();
- profiles.add(xyzProfile);
- iccSequenceStarted = false; // Sequence of ICC profiles is
- // processed
- } else { // Add non-ICC color space to the sequence
- sequence.add(conversionSequence[i]);
- }
- }
-
- if (dst != conversionLast && dst != null) { // Add last profile if
- // needed
- if (dst instanceof ICC_Profile) {
- profiles.add(dst);
- iccSequenceStarted = true;
- } else if (iccSequenceStarted) {
- profiles.add(xyzProfile);
- } else {
- sequence.add(dst); // Add last non-ICC color space to the
- // sequence
- }
- }
-
- if (iccSequenceStarted) { // Make last transform if needed
- sequence.add(new ICC_Transform(profiles.toArray(new ICC_Profile[0])));
- if (dst != null && !(dst instanceof ICC_Profile)) {
- sequence.add(dst); // Add last non-ICC color space to the
- // sequence
- }
- }
-
- // Calculate max number of components
- // This number will be used for memory allocation
- maxComponents = 0;
- Object o;
- for (int i = 0, size = sequence.size(); i < size; i++) {
- o = sequence.get(i);
- if (o instanceof ICC_Transform) {
- ICC_Transform t = (ICC_Transform)o;
- maxComponents = (maxComponents > t.getNumInputChannels() + 1) ? maxComponents
- : t.getNumInputChannels() + 1;
- maxComponents = (maxComponents > t.getNumOutputChannels() + 1) ? maxComponents
- : t.getNumOutputChannels() + 1;
- } else {
- ColorSpace cs = (ColorSpace)o;
- maxComponents = (maxComponents > cs.getNumComponents() + 1) ? maxComponents
- : cs.getNumComponents() + 1;
- }
- }
-
- return sequence.toArray();
- }
- }
-
- /**
- * Instantiates a new ColorConvertOp object using two specified ColorSpace
- * objects.
- *
- * @param srcCS
- * the source ColorSpace.
- * @param dstCS
- * the destination ColorSpace.
- * @param hints
- * the RenderingHints object used for the color conversion, or
- * null.
- */
- public ColorConvertOp(ColorSpace srcCS, ColorSpace dstCS, RenderingHints hints) {
- if (srcCS == null || dstCS == null) {
- throw new NullPointerException(Messages.getString("awt.25B")); //$NON-NLS-1$
- }
-
- renderingHints = hints;
-
- boolean srcICC = srcCS instanceof ICC_ColorSpace;
- boolean dstICC = dstCS instanceof ICC_ColorSpace;
-
- if (srcICC && dstICC) {
- conversionSequence = new ICC_Profile[2];
- } else {
- conversionSequence = new Object[2];
- isICC = false;
- }
-
- if (srcICC) {
- conversionSequence[0] = ((ICC_ColorSpace)srcCS).getProfile();
- } else {
- conversionSequence[0] = srcCS;
- }
-
- if (dstICC) {
- conversionSequence[1] = ((ICC_ColorSpace)dstCS).getProfile();
- } else {
- conversionSequence[1] = dstCS;
- }
- }
-
- /**
- * Instantiates a new ColorConvertOp object from the specified ICC_Profile
- * objects.
- *
- * @param profiles
- * the array of ICC_Profile objects.
- * @param hints
- * the RenderingHints object used for the color conversion, or
- * null.
- */
- public ColorConvertOp(ICC_Profile profiles[], RenderingHints hints) {
- if (profiles == null) {
- throw new NullPointerException(Messages.getString("awt.25C")); //$NON-NLS-1$
- }
-
- renderingHints = hints;
-
- // This array is not used in the program logic, so don't need to copy it
- // Store it only to return back
- midProfiles = profiles;
-
- conversionSequence = new ICC_Profile[midProfiles.length];
-
- // Add profiles to the conversion sequence
- for (int i = 0, length = midProfiles.length; i < length; i++) {
- conversionSequence[i] = midProfiles[i];
- }
- }
-
- /**
- * Instantiates a new ColorConvertOp object using the specified ColorSpace
- * object.
- *
- * @param cs
- * the destination ColorSpace or an intermediate ColorSpace.
- * @param hints
- * the RenderingHints object used for the color conversion, or
- * null.
- */
- public ColorConvertOp(ColorSpace cs, RenderingHints hints) {
- if (cs == null) {
- throw new NullPointerException(Messages.getString("awt.25B")); //$NON-NLS-1$
- }
-
- renderingHints = hints;
-
- if (cs instanceof ICC_ColorSpace) {
- conversionSequence = new ICC_Profile[1];
- conversionSequence[0] = ((ICC_ColorSpace)cs).getProfile();
- } else {
- conversionSequence = new Object[1];
- conversionSequence[0] = cs;
- isICC = false;
- }
- }
-
- /**
- * Instantiates a new ColorConvertOp object which converts from a source
- * color space to a destination color space.
- *
- * @param hints
- * the RenderingHints object used for the color conversion, or
- * null.
- */
- public ColorConvertOp(RenderingHints hints) {
- renderingHints = hints;
- }
-
- public final WritableRaster filter(Raster src, WritableRaster dst) {
- if (conversionSequence.length < 2) {
- throw new IllegalArgumentException(Messages.getString("awt.25D")); //$NON-NLS-1$
- }
-
- ICC_Profile srcPf = null, dstPf = null; // unused if isICC is false
- int nSrcColorComps, nDstColorComps;
- Object first = conversionSequence[0];
- Object last = conversionSequence[conversionSequence.length - 1];
-
- // Get the number of input/output color components
- if (isICC) {
- srcPf = (ICC_Profile)first;
- dstPf = (ICC_Profile)last;
- nSrcColorComps = srcPf.getNumComponents();
- nDstColorComps = dstPf.getNumComponents();
- } else {
- if (first instanceof ICC_Profile) {
- srcPf = (ICC_Profile)first;
- nSrcColorComps = srcPf.getNumComponents();
- } else {
- nSrcColorComps = ((ColorSpace)first).getNumComponents();
- }
-
- if (last instanceof ICC_Profile) {
- dstPf = (ICC_Profile)last;
- nDstColorComps = dstPf.getNumComponents();
- } else {
- nDstColorComps = ((ColorSpace)last).getNumComponents();
- }
- }
-
- // Check that source and destination rasters are compatible with
- // transforms and with each other
- if (src.getNumBands() != nSrcColorComps) {
- // awt.25E=Incorrect number of source raster bands. Should be equal
- // to the number of color components of source colorspace.
- throw new IllegalArgumentException(Messages.getString("awt.25E")); //$NON-NLS-1$
- }
-
- if (dst != null) { // Check destination raster
- if (dst.getNumBands() != nDstColorComps) {
- // awt.25F=Incorrect number of destination raster bands. Should
- // be equal to the number of color components of destination
- // colorspace.
- throw new IllegalArgumentException(Messages.getString("awt.25F")); //$NON-NLS-1$
- }
-
- if (src.getWidth() != dst.getWidth() || src.getHeight() != dst.getHeight()) {
- throw new IllegalArgumentException(Messages.getString("awt.260")); //$NON-NLS-1$
- }
-
- } else {
- dst = createCompatibleDestRaster(src);
- }
-
- if (isICC) {
- // Create transform
- ICC_Transform t = tCreator
- .getTransform(srcPf, dstPf, (ICC_Profile[])conversionSequence);
- cc.translateColor(t, src, dst);
- } else {
- Object[] sequence = tCreator.getSequence(null, null);
-
- // Get data from the source raster
- ColorScaler scaler = new ColorScaler();
- scaler.loadScalingData(src, null);
- float tmpData[][] = scaler.scaleNormalize(src);
-
- // Get source and destination color spaces
- ColorSpace srcCS = (srcPf == null) ? (ColorSpace)first : new ICC_ColorSpace(srcPf);
- ColorSpace dstCS = (dstPf == null) ? (ColorSpace)last : new ICC_ColorSpace(dstPf);
-
- applySequence(sequence, tmpData, srcCS, dstCS);
-
- scaler.loadScalingData(dst, null);
- scaler.unscaleNormalized(dst, tmpData);
- }
-
- return dst;
- }
-
- public BufferedImage createCompatibleDestImage(BufferedImage src, ColorModel destCM) {
- // If destination color model is passed only one line needed
- if (destCM != null) {
- return new BufferedImage(destCM, destCM.createCompatibleWritableRaster(src.getWidth(),
- src.getHeight()), destCM.isAlphaPremultiplied(), null);
- }
-
- int nSpaces = conversionSequence.length;
-
- if (nSpaces < 1) {
- throw new IllegalArgumentException(Messages.getString("awt.261")); //$NON-NLS-1$
- }
-
- // Get destination color space
- Object destination = conversionSequence[nSpaces - 1];
- ColorSpace dstCS = (destination instanceof ColorSpace) ? (ColorSpace)destination
- : new ICC_ColorSpace((ICC_Profile)destination);
-
- ColorModel srcCM = src.getColorModel();
- ColorModel dstCM = new ComponentColorModel(dstCS, srcCM.hasAlpha(), srcCM
- .isAlphaPremultiplied(), srcCM.getTransparency(), srcCM.getTransferType());
-
- return new BufferedImage(dstCM, destCM.createCompatibleWritableRaster(src.getWidth(), src
- .getHeight()), destCM.isAlphaPremultiplied(), null);
- }
-
- public final BufferedImage filter(BufferedImage src, BufferedImage dst) {
- if (dst == null && conversionSequence.length < 1) {
- throw new IllegalArgumentException(Messages.getString("awt.262")); //$NON-NLS-1$
- }
-
- ColorModel srcCM = src.getColorModel();
- // First handle index color model
- if (srcCM instanceof IndexColorModel) {
- src = ((IndexColorModel)srcCM).convertToIntDiscrete(src.getRaster(), false);
- }
- ColorSpace srcCS = srcCM.getColorSpace();
-
- BufferedImage res;
- boolean isDstIndex = false;
- if (dst != null) {
-
- if (src.getWidth() != dst.getWidth() || src.getHeight() != dst.getHeight()) {
- throw new IllegalArgumentException(Messages.getString("awt.263")); //$NON-NLS-1$
- }
-
- if (dst.getColorModel() instanceof IndexColorModel) {
- isDstIndex = true;
- res = createCompatibleDestImage(src, null);
- } else {
- res = dst;
- }
- } else {
- res = createCompatibleDestImage(src, null);
- }
- ColorModel dstCM = res.getColorModel();
- ColorSpace dstCS = dstCM.getColorSpace();
-
- ICC_Profile srcPf = null, dstPf = null;
- if (srcCS instanceof ICC_ColorSpace) {
- srcPf = ((ICC_ColorSpace)srcCS).getProfile();
- }
- if (dstCS instanceof ICC_ColorSpace) {
- dstPf = ((ICC_ColorSpace)dstCS).getProfile();
- }
-
- boolean isFullICC = isICC && srcPf != null && dstPf != null;
-
- if (isFullICC) {
- ICC_Transform t = tCreator
- .getTransform(srcPf, dstPf, (ICC_Profile[])conversionSequence);
- cc.translateColor(t, src, res);
- } else { // Perform non-ICC transform
- Object sequence[] = tCreator.getSequence(srcPf == null ? (Object)srcCS : srcPf,
- dstPf == null ? (Object)dstCS : dstPf);
-
- int srcW = src.getWidth();
- int srcH = src.getHeight();
- int numPixels = srcW * srcH;
-
- // Load all pixel data into array tmpData
- float tmpData[][] = new float[numPixels][tCreator.maxComponents];
- for (int row = 0, dataPos = 0; row < srcW; row++) {
- for (int col = 0; col < srcH; col++) {
- tmpData[dataPos] = srcCM.getNormalizedComponents(src.getRaster()
- .getDataElements(row, col, null), tmpData[dataPos], 0);
- dataPos++;
- }
- }
-
- // Copy alpha channel if needed
- float alpha[] = null;
- int alphaIdx = srcCM.numComponents - 1;
- if (srcCM.hasAlpha() && dstCM.hasAlpha()) {
- alpha = new float[numPixels];
- for (int i = 0; i < numPixels; i++) {
- alpha[i] = tmpData[i][alphaIdx];
- }
- }
-
- // Translate colors
- applySequence(sequence, tmpData, srcCS, dstCS);
-
- // Copy alpha if needed
- if (dstCM.hasAlpha()) {
- alphaIdx = dstCM.numComponents - 1;
- if (alpha != null) {
- for (int i = 0; i < numPixels; i++) {
- tmpData[i][alphaIdx] = alpha[i];
- }
- } else {
- for (int i = 0; i < numPixels; i++) {
- tmpData[i][alphaIdx] = 1f;
- }
- }
- }
-
- // Store data back to the image
- for (int row = 0, dataPos = 0; row < srcW; row++) {
- for (int col = 0; col < srcH; col++) {
- res.getRaster().setDataElements(row, col,
- dstCM.getDataElements(tmpData[dataPos++], 0, null));
- }
- }
- }
-
- if (isDstIndex) { // Convert image into indexed color
- Graphics2D g2d = dst.createGraphics();
- g2d.drawImage(res, 0, 0, null);
- g2d.dispose();
- return dst;
- }
-
- return res;
- }
-
- /**
- * Apply sequence.
- *
- * @param sequence
- * the sequence.
- * @param tmpData
- * the tmp data.
- * @param srcCS
- * the src cs.
- * @param dstCS
- * the dst cs.
- */
- private void applySequence(Object sequence[], float tmpData[][], ColorSpace srcCS,
- ColorSpace dstCS) {
- ColorSpace xyzCS = ColorSpace.getInstance(ColorSpace.CS_CIEXYZ);
-
- int numPixels = tmpData.length;
-
- // First transform...
- if (sequence[0] instanceof ICC_Transform) { // ICC
- ICC_Transform t = (ICC_Transform)sequence[0];
- cc.translateColor(t, tmpData, srcCS, xyzCS, numPixels);
- } else { // non ICC
- for (int k = 0; k < numPixels; k++) {
- tmpData[k] = srcCS.toCIEXYZ(tmpData[k]);
- }
- cc.loadScalingData(xyzCS); // prepare for scaling XYZ
- }
-
- for (Object element : sequence) {
- if (element instanceof ICC_Transform) {
- ICC_Transform t = (ICC_Transform)element;
- cc.translateColor(t, tmpData, null, null, numPixels);
- } else {
- ColorSpace cs = (ColorSpace)element;
- for (int k = 0; k < numPixels; k++) {
- tmpData[k] = cs.fromCIEXYZ(tmpData[k]);
- tmpData[k] = cs.toCIEXYZ(tmpData[k]);
- }
- }
- }
-
- // Last transform...
- if (sequence[sequence.length - 1] instanceof ICC_Transform) { // ICC
- ICC_Transform t = (ICC_Transform)sequence[sequence.length - 1];
- cc.translateColor(t, tmpData, xyzCS, dstCS, numPixels);
- } else { // non ICC
- for (int k = 0; k < numPixels; k++) {
- tmpData[k] = dstCS.fromCIEXYZ(tmpData[k]);
- }
- }
- }
-
- public final Point2D getPoint2D(Point2D srcPt, Point2D dstPt) {
- if (dstPt != null) {
- dstPt.setLocation(srcPt);
- return dstPt;
- }
- return new Point2D.Float((float)srcPt.getX(), (float)srcPt.getY());
- }
-
- public WritableRaster createCompatibleDestRaster(Raster src) {
- int nComps = 0;
- int nSpaces = conversionSequence.length;
-
- if (nSpaces < 2) {
- throw new IllegalArgumentException(Messages.getString("awt.261")); //$NON-NLS-1$
- }
-
- Object lastCS = conversionSequence[nSpaces - 1];
- if (lastCS instanceof ColorSpace) {
- nComps = ((ColorSpace)lastCS).getNumComponents();
- } else {
- nComps = ((ICC_Profile)lastCS).getNumComponents();
- }
-
- // Calculate correct data type
- int dstDataType = src.getDataBuffer().getDataType();
- if (dstDataType != DataBuffer.TYPE_BYTE && dstDataType != DataBuffer.TYPE_SHORT) {
- dstDataType = DataBuffer.TYPE_SHORT;
- }
-
- return Raster.createInterleavedRaster(dstDataType, src.getWidth(), src.getHeight(), nComps,
- new Point(src.getMinX(), src.getMinY()));
- }
-
- public final Rectangle2D getBounds2D(Raster src) {
- return src.getBounds();
- }
-
- public final Rectangle2D getBounds2D(BufferedImage src) {
- return src.getRaster().getBounds();
- }
-
- /**
- * Gets an array of ICC_Profiles objects which constructs this
- * ColorConvertOp object or returns null if this ColorConvertOp is not
- * constructed from array of ICC_Profiles.
- *
- * @return an array of ICC_Profiles objects which constructs this
- * ColorConvertOp object or returns null if this ColorConvertOp is
- * not constructed from array of ICC_Profiles.
- */
- public final ICC_Profile[] getICC_Profiles() {
- if (midProfiles != null) {
- return midProfiles;
- }
- return null;
- }
-
- public final RenderingHints getRenderingHints() {
- return renderingHints;
- }
-}