jdk/src/share/classes/java/awt/image/ColorConvertOp.java
author prr
Thu, 10 Apr 2008 16:28:45 -0700
changeset 539 7952521a4ad3
child 715 f16baef3a20e
permissions -rw-r--r--
6662775: Move imaging and color classes from closed to open Reviewed-by: tdv, campbell
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
539
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
     1
/*
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
     2
 * Portions Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
     4
 *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Sun designates this
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
     9
 * by Sun in the LICENSE file that accompanied this code.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    10
 *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    15
 * accompanied this code).
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    16
 *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    20
 *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    21
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    22
 * CA 95054 USA or visit www.sun.com if you need additional information or
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    23
 * have any questions.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    24
 */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    25
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    26
/**********************************************************************
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    27
 **********************************************************************
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    28
 **********************************************************************
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    29
 *** COPYRIGHT (c) Eastman Kodak Company, 1997                      ***
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    30
 *** As  an unpublished  work pursuant to Title 17 of the United    ***
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    31
 *** States Code.  All rights reserved.                             ***
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    32
 **********************************************************************
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    33
 **********************************************************************
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    34
 **********************************************************************/
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    35
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    36
package java.awt.image;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    37
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    38
import java.awt.Point;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    39
import java.awt.Graphics2D;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    40
import java.awt.color.*;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    41
import sun.java2d.cmm.ColorTransform;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    42
import sun.java2d.cmm.CMSManager;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    43
import sun.java2d.cmm.ProfileDeferralMgr;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    44
import sun.java2d.cmm.PCMM;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    45
import java.awt.geom.Rectangle2D;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    46
import java.awt.geom.Point2D;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    47
import java.awt.RenderingHints;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    48
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    49
/**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    50
 * This class performs a pixel-by-pixel color conversion of the data in
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    51
 * the source image.  The resulting color values are scaled to the precision
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    52
 * of the destination image.  Color conversion can be specified
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    53
 * via an array of ColorSpace objects or an array of ICC_Profile objects.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    54
 * <p>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    55
 * If the source is a BufferedImage with premultiplied alpha, the
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    56
 * color components are divided by the alpha component before color conversion.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    57
 * If the destination is a BufferedImage with premultiplied alpha, the
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    58
 * color components are multiplied by the alpha component after conversion.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    59
 * Rasters are treated as having no alpha channel, i.e. all bands are
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    60
 * color bands.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    61
 * <p>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    62
 * If a RenderingHints object is specified in the constructor, the
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    63
 * color rendering hint and the dithering hint may be used to control
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    64
 * color conversion.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    65
 * <p>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    66
 * Note that Source and Destination may be the same object.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    67
 * <p>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    68
 * @see java.awt.RenderingHints#KEY_COLOR_RENDERING
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    69
 * @see java.awt.RenderingHints#KEY_DITHERING
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    70
 */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    71
public class ColorConvertOp implements BufferedImageOp, RasterOp {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    72
    ICC_Profile[]    profileList;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    73
    ColorSpace[]     CSList;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    74
    ColorTransform    thisTransform, thisRasterTransform;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    75
    ICC_Profile      thisSrcProfile, thisDestProfile;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    76
    RenderingHints   hints;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    77
    boolean          gotProfiles;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    78
    float[]          srcMinVals, srcMaxVals, dstMinVals, dstMaxVals;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    79
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    80
    /* the class initializer */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    81
    static {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    82
        if (ProfileDeferralMgr.deferring) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    83
            ProfileDeferralMgr.activateProfiles();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    84
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    85
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    86
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    87
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    88
     * Constructs a new ColorConvertOp which will convert
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    89
     * from a source color space to a destination color space.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    90
     * The RenderingHints argument may be null.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    91
     * This Op can be used only with BufferedImages, and will convert
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    92
     * directly from the ColorSpace of the source image to that of the
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    93
     * destination.  The destination argument of the filter method
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    94
     * cannot be specified as null.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    95
     * @param hints the <code>RenderingHints</code> object used to control
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    96
     *        the color conversion, or <code>null</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    97
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    98
    public ColorConvertOp (RenderingHints hints)
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    99
    {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   100
        profileList = new ICC_Profile [0];    /* 0 length list */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   101
        this.hints  = hints;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   102
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   103
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   104
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   105
     * Constructs a new ColorConvertOp from a ColorSpace object.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   106
     * The RenderingHints argument may be null.  This
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   107
     * Op can be used only with BufferedImages, and is primarily useful
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   108
     * when the {@link #filter(BufferedImage, BufferedImage) filter}
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   109
     * method is invoked with a destination argument of null.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   110
     * In that case, the ColorSpace defines the destination color space
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   111
     * for the destination created by the filter method.  Otherwise, the
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   112
     * ColorSpace defines an intermediate space to which the source is
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   113
     * converted before being converted to the destination space.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   114
     * @param cspace defines the destination <code>ColorSpace</code> or an
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   115
     *        intermediate <code>ColorSpace</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   116
     * @param hints the <code>RenderingHints</code> object used to control
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   117
     *        the color conversion, or <code>null</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   118
     * @throws NullPointerException if cspace is null
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   119
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   120
    public ColorConvertOp (ColorSpace cspace, RenderingHints hints)
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   121
    {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   122
        if (cspace == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   123
            throw new NullPointerException("ColorSpace cannot be null");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   124
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   125
        if (cspace instanceof ICC_ColorSpace) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   126
            profileList = new ICC_Profile [1];    /* 1 profile in the list */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   127
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   128
            profileList [0] = ((ICC_ColorSpace) cspace).getProfile();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   129
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   130
        else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   131
            CSList = new ColorSpace[1]; /* non-ICC case: 1 ColorSpace in list */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   132
            CSList[0] = cspace;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   133
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   134
        this.hints  = hints;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   135
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   136
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   137
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   138
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   139
     * Constructs a new ColorConvertOp from two ColorSpace objects.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   140
     * The RenderingHints argument may be null.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   141
     * This Op is primarily useful for calling the filter method on
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   142
     * Rasters, in which case the two ColorSpaces define the operation
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   143
     * to be performed on the Rasters.  In that case, the number of bands
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   144
     * in the source Raster must match the number of components in
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   145
     * srcCspace, and the number of bands in the destination Raster
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   146
     * must match the number of components in dstCspace.  For BufferedImages,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   147
     * the two ColorSpaces define intermediate spaces through which the
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   148
     * source is converted before being converted to the destination space.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   149
     * @param srcCspace the source <code>ColorSpace</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   150
     * @param dstCspace the destination <code>ColorSpace</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   151
     * @param hints the <code>RenderingHints</code> object used to control
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   152
     *        the color conversion, or <code>null</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   153
     * @throws NullPointerException if either srcCspace or dstCspace is null
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   154
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   155
    public ColorConvertOp(ColorSpace srcCspace, ColorSpace dstCspace,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   156
                           RenderingHints hints)
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   157
    {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   158
        if ((srcCspace == null) || (dstCspace == null)) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   159
            throw new NullPointerException("ColorSpaces cannot be null");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   160
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   161
        if ((srcCspace instanceof ICC_ColorSpace) &&
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   162
            (dstCspace instanceof ICC_ColorSpace)) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   163
            profileList = new ICC_Profile [2];    /* 2 profiles in the list */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   164
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   165
            profileList [0] = ((ICC_ColorSpace) srcCspace).getProfile();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   166
            profileList [1] = ((ICC_ColorSpace) dstCspace).getProfile();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   167
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   168
            getMinMaxValsFromColorSpaces(srcCspace, dstCspace);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   169
        } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   170
            /* non-ICC case: 2 ColorSpaces in list */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   171
            CSList = new ColorSpace[2];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   172
            CSList[0] = srcCspace;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   173
            CSList[1] = dstCspace;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   174
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   175
        this.hints  = hints;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   176
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   177
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   178
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   179
     /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   180
     * Constructs a new ColorConvertOp from an array of ICC_Profiles.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   181
     * The RenderingHints argument may be null.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   182
     * The sequence of profiles may include profiles that represent color
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   183
     * spaces, profiles that represent effects, etc.  If the whole sequence
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   184
     * does not represent a well-defined color conversion, an exception is
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   185
     * thrown.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   186
     * <p>For BufferedImages, if the ColorSpace
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   187
     * of the source BufferedImage does not match the requirements of the
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   188
     * first profile in the array,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   189
     * the first conversion is to an appropriate ColorSpace.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   190
     * If the requirements of the last profile in the array are not met
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   191
     * by the ColorSpace of the destination BufferedImage,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   192
     * the last conversion is to the destination's ColorSpace.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   193
     * <p>For Rasters, the number of bands in the source Raster must match
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   194
     * the requirements of the first profile in the array, and the
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   195
     * number of bands in the destination Raster must match the requirements
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   196
     * of the last profile in the array.  The array must have at least two
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   197
     * elements or calling the filter method for Rasters will throw an
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   198
     * IllegalArgumentException.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   199
     * @param profiles the array of <code>ICC_Profile</code> objects
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   200
     * @param hints the <code>RenderingHints</code> object used to control
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   201
     *        the color conversion, or <code>null</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   202
     * @exception IllegalArgumentException when the profile sequence does not
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   203
     *             specify a well-defined color conversion
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   204
     * @exception NullPointerException if profiles is null
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   205
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   206
    public ColorConvertOp (ICC_Profile[] profiles, RenderingHints hints)
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   207
    {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   208
        if (profiles == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   209
            throw new NullPointerException("Profiles cannot be null");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   210
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   211
        gotProfiles = true;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   212
        profileList = new ICC_Profile[profiles.length];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   213
        for (int i1 = 0; i1 < profiles.length; i1++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   214
            profileList[i1] = profiles[i1];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   215
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   216
        this.hints  = hints;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   217
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   218
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   219
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   220
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   221
     * Returns the array of ICC_Profiles used to construct this ColorConvertOp.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   222
     * Returns null if the ColorConvertOp was not constructed from such an
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   223
     * array.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   224
     * @return the array of <code>ICC_Profile</code> objects of this
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   225
     *         <code>ColorConvertOp</code>, or <code>null</code> if this
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   226
     *         <code>ColorConvertOp</code> was not constructed with an
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   227
     *         array of <code>ICC_Profile</code> objects.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   228
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   229
    public final ICC_Profile[] getICC_Profiles() {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   230
        if (gotProfiles) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   231
            ICC_Profile[] profiles = new ICC_Profile[profileList.length];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   232
            for (int i1 = 0; i1 < profileList.length; i1++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   233
                profiles[i1] = profileList[i1];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   234
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   235
            return profiles;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   236
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   237
        return null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   238
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   239
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   240
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   241
     * ColorConverts the source BufferedImage.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   242
     * If the destination image is null,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   243
     * a BufferedImage will be created with an appropriate ColorModel.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   244
     * @param src the source <code>BufferedImage</code> to be converted
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   245
     * @param dest the destination <code>BufferedImage</code>,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   246
     *        or <code>null</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   247
     * @return <code>dest</code> color converted from <code>src</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   248
     *         or a new, converted <code>BufferedImage</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   249
     *         if <code>dest</code> is <code>null</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   250
     * @exception IllegalArgumentException if dest is null and this op was
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   251
     *             constructed using the constructor which takes only a
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   252
     *             RenderingHints argument, since the operation is ill defined.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   253
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   254
    public final BufferedImage filter(BufferedImage src, BufferedImage dest) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   255
        ColorSpace srcColorSpace, destColorSpace;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   256
        BufferedImage savdest = null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   257
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   258
        if (src.getColorModel() instanceof IndexColorModel) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   259
            IndexColorModel icm = (IndexColorModel) src.getColorModel();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   260
            src = icm.convertToIntDiscrete(src.getRaster(), true);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   261
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   262
        srcColorSpace = src.getColorModel().getColorSpace();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   263
        if (dest != null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   264
            if (dest.getColorModel() instanceof IndexColorModel) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   265
                savdest = dest;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   266
                dest = null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   267
                destColorSpace = null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   268
            } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   269
                destColorSpace = dest.getColorModel().getColorSpace();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   270
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   271
        } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   272
            destColorSpace = null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   273
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   274
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   275
        if ((CSList != null) ||
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   276
            (!(srcColorSpace instanceof ICC_ColorSpace)) ||
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   277
            ((dest != null) &&
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   278
             (!(destColorSpace instanceof ICC_ColorSpace)))) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   279
            /* non-ICC case */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   280
            dest = nonICCBIFilter(src, srcColorSpace, dest, destColorSpace);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   281
        } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   282
            dest = ICCBIFilter(src, srcColorSpace, dest, destColorSpace);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   283
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   284
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   285
        if (savdest != null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   286
            Graphics2D big = savdest.createGraphics();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   287
            try {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   288
                big.drawImage(dest, 0, 0, null);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   289
            } finally {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   290
                big.dispose();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   291
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   292
            return savdest;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   293
        } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   294
            return dest;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   295
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   296
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   297
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   298
    private final BufferedImage ICCBIFilter(BufferedImage src,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   299
                                            ColorSpace srcColorSpace,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   300
                                            BufferedImage dest,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   301
                                            ColorSpace destColorSpace) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   302
    int              nProfiles = profileList.length;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   303
    ICC_Profile      srcProfile = null, destProfile = null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   304
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   305
        srcProfile = ((ICC_ColorSpace) srcColorSpace).getProfile();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   306
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   307
        if (dest == null) {        /* last profile in the list defines
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   308
                                      the output color space */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   309
            if (nProfiles == 0) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   310
                throw new IllegalArgumentException(
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   311
                    "Destination ColorSpace is undefined");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   312
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   313
            destProfile = profileList [nProfiles - 1];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   314
            dest = createCompatibleDestImage(src, null);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   315
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   316
        else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   317
            if (src.getHeight() != dest.getHeight() ||
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   318
                src.getWidth() != dest.getWidth()) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   319
                throw new IllegalArgumentException(
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   320
                    "Width or height of BufferedImages do not match");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   321
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   322
            destProfile = ((ICC_ColorSpace) destColorSpace).getProfile();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   323
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   324
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   325
        /* Checking if all profiles in the transform sequence are the same.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   326
         * If so, performing just copying the data.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   327
         */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   328
        if (srcProfile == destProfile) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   329
            boolean noTrans = true;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   330
            for (int i = 0; i < nProfiles; i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   331
                if (srcProfile != profileList[i]) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   332
                    noTrans = false;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   333
                    break;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   334
                }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   335
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   336
            if (noTrans) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   337
                Graphics2D g = dest.createGraphics();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   338
                try {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   339
                    g.drawImage(src, 0, 0, null);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   340
                } finally {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   341
                    g.dispose();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   342
                }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   343
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   344
                return dest;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   345
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   346
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   347
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   348
        /* make a new transform if needed */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   349
        if ((thisTransform == null) || (thisSrcProfile != srcProfile) ||
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   350
            (thisDestProfile != destProfile) ) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   351
            updateBITransform(srcProfile, destProfile);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   352
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   353
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   354
        /* color convert the image */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   355
        thisTransform.colorConvert(src, dest);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   356
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   357
        return dest;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   358
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   359
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   360
    private void updateBITransform(ICC_Profile srcProfile,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   361
                                   ICC_Profile destProfile) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   362
        ICC_Profile[]    theProfiles;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   363
        int              i1, nProfiles, nTransforms, whichTrans, renderState;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   364
        ColorTransform[]  theTransforms;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   365
        boolean          useSrc = false, useDest = false;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   366
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   367
        nProfiles = profileList.length;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   368
        nTransforms = nProfiles;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   369
        if ((nProfiles == 0) || (srcProfile != profileList[0])) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   370
            nTransforms += 1;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   371
            useSrc = true;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   372
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   373
        if ((nProfiles == 0) || (destProfile != profileList[nProfiles - 1]) ||
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   374
            (nTransforms < 2)) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   375
            nTransforms += 1;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   376
            useDest = true;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   377
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   378
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   379
        /* make the profile list */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   380
        theProfiles = new ICC_Profile[nTransforms]; /* the list of profiles
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   381
                                                       for this Op */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   382
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   383
        int idx = 0;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   384
        if (useSrc) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   385
            /* insert source as first profile */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   386
            theProfiles[idx++] = srcProfile;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   387
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   388
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   389
        for (i1 = 0; i1 < nProfiles; i1++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   390
                                   /* insert profiles defined in this Op */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   391
            theProfiles[idx++] = profileList [i1];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   392
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   393
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   394
        if (useDest) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   395
            /* insert dest as last profile */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   396
            theProfiles[idx] = destProfile;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   397
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   398
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   399
        /* make the transform list */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   400
        theTransforms = new ColorTransform [nTransforms];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   401
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   402
        /* initialize transform get loop */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   403
        if (theProfiles[0].getProfileClass() == ICC_Profile.CLASS_OUTPUT) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   404
                                        /* if first profile is a printer
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   405
                                           render as colorimetric */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   406
            renderState = ICC_Profile.icRelativeColorimetric;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   407
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   408
        else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   409
            renderState = ICC_Profile.icPerceptual; /* render any other
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   410
                                                       class perceptually */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   411
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   412
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   413
        whichTrans = ColorTransform.In;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   414
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   415
        PCMM mdl = CMSManager.getModule();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   416
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   417
        /* get the transforms from each profile */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   418
        for (i1 = 0; i1 < nTransforms; i1++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   419
            if (i1 == nTransforms -1) {         /* last profile? */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   420
                whichTrans = ColorTransform.Out; /* get output transform */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   421
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   422
            else {      /* check for abstract profile */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   423
                if ((whichTrans == ColorTransform.Simulation) &&
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   424
                    (theProfiles[i1].getProfileClass () ==
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   425
                     ICC_Profile.CLASS_ABSTRACT)) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   426
                renderState = ICC_Profile.icPerceptual;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   427
                    whichTrans = ColorTransform.In;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   428
                }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   429
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   430
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   431
            theTransforms[i1] = mdl.createTransform (
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   432
                theProfiles[i1], renderState, whichTrans);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   433
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   434
            /* get this profile's rendering intent to select transform
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   435
               from next profile */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   436
            renderState = getRenderingIntent(theProfiles[i1]);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   437
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   438
            /* "middle" profiles use simulation transform */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   439
            whichTrans = ColorTransform.Simulation;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   440
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   441
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   442
        /* make the net transform */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   443
        thisTransform = mdl.createTransform(theTransforms);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   444
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   445
        /* update corresponding source and dest profiles */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   446
        thisSrcProfile = srcProfile;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   447
        thisDestProfile = destProfile;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   448
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   449
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   450
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   451
     * ColorConverts the image data in the source Raster.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   452
     * If the destination Raster is null, a new Raster will be created.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   453
     * The number of bands in the source and destination Rasters must
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   454
     * meet the requirements explained above.  The constructor used to
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   455
     * create this ColorConvertOp must have provided enough information
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   456
     * to define both source and destination color spaces.  See above.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   457
     * Otherwise, an exception is thrown.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   458
     * @param src the source <code>Raster</code> to be converted
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   459
     * @param dest the destination <code>WritableRaster</code>,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   460
     *        or <code>null</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   461
     * @return <code>dest</code> color converted from <code>src</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   462
     *         or a new, converted <code>WritableRaster</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   463
     *         if <code>dest</code> is <code>null</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   464
     * @exception IllegalArgumentException if the number of source or
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   465
     *             destination bands is incorrect, the source or destination
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   466
     *             color spaces are undefined, or this op was constructed
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   467
     *             with one of the constructors that applies only to
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   468
     *             operations on BufferedImages.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   469
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   470
    public final WritableRaster filter (Raster src, WritableRaster dest)  {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   471
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   472
        if (CSList != null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   473
            /* non-ICC case */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   474
            return nonICCRasterFilter(src, dest);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   475
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   476
        int nProfiles = profileList.length;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   477
        if (nProfiles < 2) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   478
            throw new IllegalArgumentException(
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   479
                "Source or Destination ColorSpace is undefined");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   480
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   481
        if (src.getNumBands() != profileList[0].getNumComponents()) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   482
            throw new IllegalArgumentException(
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   483
                "Numbers of source Raster bands and source color space " +
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   484
                "components do not match");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   485
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   486
        if (dest == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   487
            dest = createCompatibleDestRaster(src);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   488
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   489
        else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   490
            if (src.getHeight() != dest.getHeight() ||
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   491
                src.getWidth() != dest.getWidth()) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   492
                throw new IllegalArgumentException(
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   493
                    "Width or height of Rasters do not match");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   494
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   495
            if (dest.getNumBands() !=
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   496
                profileList[nProfiles-1].getNumComponents()) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   497
                throw new IllegalArgumentException(
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   498
                    "Numbers of destination Raster bands and destination " +
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   499
                    "color space components do not match");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   500
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   501
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   502
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   503
        /* make a new transform if needed */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   504
        if (thisRasterTransform == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   505
            int              i1, whichTrans, renderState;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   506
            ColorTransform[]  theTransforms;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   507
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   508
            /* make the transform list */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   509
            theTransforms = new ColorTransform [nProfiles];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   510
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   511
            /* initialize transform get loop */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   512
            if (profileList[0].getProfileClass() == ICC_Profile.CLASS_OUTPUT) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   513
                                            /* if first profile is a printer
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   514
                                               render as colorimetric */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   515
                renderState = ICC_Profile.icRelativeColorimetric;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   516
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   517
            else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   518
                renderState = ICC_Profile.icPerceptual; /* render any other
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   519
                                                           class perceptually */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   520
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   521
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   522
            whichTrans = ColorTransform.In;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   523
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   524
            PCMM mdl = CMSManager.getModule();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   525
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   526
            /* get the transforms from each profile */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   527
            for (i1 = 0; i1 < nProfiles; i1++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   528
                if (i1 == nProfiles -1) {         /* last profile? */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   529
                    whichTrans = ColorTransform.Out; /* get output transform */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   530
                }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   531
                else {  /* check for abstract profile */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   532
                    if ((whichTrans == ColorTransform.Simulation) &&
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   533
                        (profileList[i1].getProfileClass () ==
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   534
                         ICC_Profile.CLASS_ABSTRACT)) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   535
                        renderState = ICC_Profile.icPerceptual;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   536
                        whichTrans = ColorTransform.In;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   537
                    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   538
                }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   539
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   540
                theTransforms[i1] = mdl.createTransform (
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   541
                    profileList[i1], renderState, whichTrans);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   542
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   543
                /* get this profile's rendering intent to select transform
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   544
                   from next profile */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   545
                renderState = getRenderingIntent(profileList[i1]);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   546
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   547
                /* "middle" profiles use simulation transform */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   548
                whichTrans = ColorTransform.Simulation;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   549
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   550
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   551
            /* make the net transform */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   552
            thisRasterTransform = mdl.createTransform(theTransforms);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   553
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   554
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   555
        int srcTransferType = src.getTransferType();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   556
        int dstTransferType = dest.getTransferType();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   557
        if ((srcTransferType == DataBuffer.TYPE_FLOAT) ||
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   558
            (srcTransferType == DataBuffer.TYPE_DOUBLE) ||
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   559
            (dstTransferType == DataBuffer.TYPE_FLOAT) ||
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   560
            (dstTransferType == DataBuffer.TYPE_DOUBLE)) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   561
            if (srcMinVals == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   562
                getMinMaxValsFromProfiles(profileList[0],
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   563
                                          profileList[nProfiles-1]);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   564
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   565
            /* color convert the raster */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   566
            thisRasterTransform.colorConvert(src, dest,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   567
                                             srcMinVals, srcMaxVals,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   568
                                             dstMinVals, dstMaxVals);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   569
        } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   570
            /* color convert the raster */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   571
            thisRasterTransform.colorConvert(src, dest);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   572
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   573
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   574
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   575
        return dest;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   576
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   577
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   578
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   579
     * Returns the bounding box of the destination, given this source.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   580
     * Note that this will be the same as the the bounding box of the
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   581
     * source.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   582
     * @param src the source <code>BufferedImage</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   583
     * @return a <code>Rectangle2D</code> that is the bounding box
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   584
     *         of the destination, given the specified <code>src</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   585
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   586
    public final Rectangle2D getBounds2D (BufferedImage src) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   587
        return getBounds2D(src.getRaster());
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   588
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   589
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   590
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   591
     * Returns the bounding box of the destination, given this source.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   592
     * Note that this will be the same as the the bounding box of the
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   593
     * source.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   594
     * @param src the source <code>Raster</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   595
     * @return a <code>Rectangle2D</code> that is the bounding box
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   596
     *         of the destination, given the specified <code>src</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   597
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   598
    public final Rectangle2D getBounds2D (Raster src) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   599
        /*        return new Rectangle (src.getXOffset(),
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   600
                              src.getYOffset(),
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   601
                              src.getWidth(), src.getHeight()); */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   602
        return src.getBounds();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   603
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   604
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   605
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   606
     * Creates a zeroed destination image with the correct size and number of
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   607
     * bands, given this source.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   608
     * @param src       Source image for the filter operation.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   609
     * @param destCM    ColorModel of the destination.  If null, an
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   610
     *                  appropriate ColorModel will be used.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   611
     * @return a <code>BufferedImage</code> with the correct size and
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   612
     * number of bands from the specified <code>src</code>.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   613
     * @throws IllegalArgumentException if <code>destCM</code> is
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   614
     *         <code>null</code> and this <code>ColorConvertOp</code> was
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   615
     *         created without any <code>ICC_Profile</code> or
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   616
     *         <code>ColorSpace</code> defined for the destination
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   617
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   618
    public BufferedImage createCompatibleDestImage (BufferedImage src,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   619
                                                    ColorModel destCM) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   620
        ColorSpace cs = null;;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   621
        if (destCM == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   622
            if (CSList == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   623
                /* ICC case */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   624
                int nProfiles = profileList.length;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   625
                if (nProfiles == 0) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   626
                    throw new IllegalArgumentException(
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   627
                        "Destination ColorSpace is undefined");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   628
                }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   629
                ICC_Profile destProfile = profileList[nProfiles - 1];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   630
                cs = new ICC_ColorSpace(destProfile);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   631
            } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   632
                /* non-ICC case */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   633
                int nSpaces = CSList.length;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   634
                cs = CSList[nSpaces - 1];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   635
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   636
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   637
        return createCompatibleDestImage(src, destCM, cs);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   638
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   639
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   640
    private BufferedImage createCompatibleDestImage(BufferedImage src,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   641
                                                    ColorModel destCM,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   642
                                                    ColorSpace destCS) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   643
        BufferedImage image;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   644
        if (destCM == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   645
            ColorModel srcCM = src.getColorModel();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   646
            int nbands = destCS.getNumComponents();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   647
            boolean hasAlpha = srcCM.hasAlpha();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   648
            if (hasAlpha) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   649
               nbands += 1;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   650
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   651
            int[] nbits = new int[nbands];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   652
            for (int i = 0; i < nbands; i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   653
                nbits[i] = 8;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   654
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   655
            destCM = new ComponentColorModel(destCS, nbits, hasAlpha,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   656
                                             srcCM.isAlphaPremultiplied(),
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   657
                                             srcCM.getTransparency(),
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   658
                                             DataBuffer.TYPE_BYTE);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   659
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   660
        int w = src.getWidth();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   661
        int h = src.getHeight();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   662
        image = new BufferedImage(destCM,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   663
                                  destCM.createCompatibleWritableRaster(w, h),
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   664
                                  destCM.isAlphaPremultiplied(), null);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   665
        return image;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   666
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   667
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   668
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   669
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   670
     * Creates a zeroed destination Raster with the correct size and number of
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   671
     * bands, given this source.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   672
     * @param src the specified <code>Raster</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   673
     * @return a <code>WritableRaster</code> with the correct size and number
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   674
     *         of bands from the specified <code>src</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   675
     * @throws IllegalArgumentException if this <code>ColorConvertOp</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   676
     *         was created without sufficient information to define the
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   677
     *         <code>dst</code> and <code>src</code> color spaces
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   678
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   679
    public WritableRaster createCompatibleDestRaster (Raster src) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   680
        int ncomponents;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   681
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   682
        if (CSList != null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   683
            /* non-ICC case */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   684
            if (CSList.length != 2) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   685
                throw new IllegalArgumentException(
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   686
                    "Destination ColorSpace is undefined");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   687
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   688
            ncomponents = CSList[1].getNumComponents();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   689
        } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   690
            /* ICC case */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   691
            int nProfiles = profileList.length;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   692
            if (nProfiles < 2) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   693
                throw new IllegalArgumentException(
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   694
                    "Destination ColorSpace is undefined");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   695
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   696
            ncomponents = profileList[nProfiles-1].getNumComponents();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   697
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   698
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   699
        WritableRaster dest =
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   700
            Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   701
                                  src.getWidth(),
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   702
                                  src.getHeight(),
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   703
                                  ncomponents,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   704
                                  new Point(src.getMinX(), src.getMinY()));
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   705
        return dest;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   706
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   707
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   708
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   709
     * Returns the location of the destination point given a
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   710
     * point in the source.  If <code>dstPt</code> is non-null,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   711
     * it will be used to hold the return value.  Note that
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   712
     * for this class, the destination point will be the same
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   713
     * as the source point.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   714
     * @param srcPt the specified source <code>Point2D</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   715
     * @param dstPt the destination <code>Point2D</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   716
     * @return <code>dstPt</code> after setting its location to be
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   717
     *         the same as <code>srcPt</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   718
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   719
    public final Point2D getPoint2D (Point2D srcPt, Point2D dstPt) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   720
        if (dstPt == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   721
            dstPt = new Point2D.Float();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   722
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   723
        dstPt.setLocation(srcPt.getX(), srcPt.getY());
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   724
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   725
        return dstPt;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   726
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   727
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   728
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   729
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   730
     * Returns the RenderingIntent from the specified ICC Profile.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   731
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   732
    private int getRenderingIntent (ICC_Profile profile) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   733
        byte[] header = profile.getData(ICC_Profile.icSigHead);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   734
        int index = ICC_Profile.icHdrRenderingIntent;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   735
        return (((header[index]   & 0xff) << 24) |
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   736
                ((header[index+1] & 0xff) << 16) |
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   737
                ((header[index+2] & 0xff) <<  8) |
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   738
                 (header[index+3] & 0xff));
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   739
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   740
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   741
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   742
     * Returns the rendering hints used by this op.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   743
     * @return the <code>RenderingHints</code> object of this
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   744
     *         <code>ColorConvertOp</code>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   745
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   746
    public final RenderingHints getRenderingHints() {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   747
        return hints;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   748
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   749
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   750
    private final BufferedImage nonICCBIFilter(BufferedImage src,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   751
                                               ColorSpace srcColorSpace,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   752
                                               BufferedImage dst,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   753
                                               ColorSpace dstColorSpace) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   754
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   755
        int w = src.getWidth();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   756
        int h = src.getHeight();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   757
        ICC_ColorSpace ciespace =
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   758
            (ICC_ColorSpace) ColorSpace.getInstance(ColorSpace.CS_CIEXYZ);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   759
        if (dst == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   760
            dst = createCompatibleDestImage(src, null);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   761
            dstColorSpace = dst.getColorModel().getColorSpace();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   762
        } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   763
            if ((h != dst.getHeight()) || (w != dst.getWidth())) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   764
                throw new IllegalArgumentException(
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   765
                    "Width or height of BufferedImages do not match");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   766
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   767
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   768
        Raster srcRas = src.getRaster();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   769
        WritableRaster dstRas = dst.getRaster();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   770
        ColorModel srcCM = src.getColorModel();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   771
        ColorModel dstCM = dst.getColorModel();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   772
        int srcNumComp = srcCM.getNumColorComponents();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   773
        int dstNumComp = dstCM.getNumColorComponents();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   774
        boolean dstHasAlpha = dstCM.hasAlpha();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   775
        boolean needSrcAlpha = srcCM.hasAlpha() && dstHasAlpha;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   776
        ColorSpace[] list;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   777
        if ((CSList == null) && (profileList.length != 0)) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   778
            /* possible non-ICC src, some profiles, possible non-ICC dst */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   779
            boolean nonICCSrc, nonICCDst;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   780
            ICC_Profile srcProfile, dstProfile;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   781
            if (!(srcColorSpace instanceof ICC_ColorSpace)) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   782
                nonICCSrc = true;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   783
                srcProfile = ciespace.getProfile();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   784
            } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   785
                nonICCSrc = false;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   786
                srcProfile = ((ICC_ColorSpace) srcColorSpace).getProfile();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   787
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   788
            if (!(dstColorSpace instanceof ICC_ColorSpace)) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   789
                nonICCDst = true;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   790
                dstProfile = ciespace.getProfile();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   791
            } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   792
                nonICCDst = false;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   793
                dstProfile = ((ICC_ColorSpace) dstColorSpace).getProfile();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   794
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   795
            /* make a new transform if needed */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   796
            if ((thisTransform == null) || (thisSrcProfile != srcProfile) ||
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   797
                (thisDestProfile != dstProfile) ) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   798
                updateBITransform(srcProfile, dstProfile);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   799
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   800
            // process per scanline
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   801
            float maxNum = 65535.0f; // use 16-bit precision in CMM
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   802
            ColorSpace cs;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   803
            int iccSrcNumComp;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   804
            if (nonICCSrc) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   805
                cs = ciespace;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   806
                iccSrcNumComp = 3;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   807
            } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   808
                cs = srcColorSpace;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   809
                iccSrcNumComp = srcNumComp;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   810
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   811
            float[] srcMinVal = new float[iccSrcNumComp];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   812
            float[] srcInvDiffMinMax = new float[iccSrcNumComp];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   813
            for (int i = 0; i < srcNumComp; i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   814
                srcMinVal[i] = cs.getMinValue(i);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   815
                srcInvDiffMinMax[i] = maxNum / (cs.getMaxValue(i) - srcMinVal[i]);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   816
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   817
            int iccDstNumComp;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   818
            if (nonICCDst) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   819
                cs = ciespace;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   820
                iccDstNumComp = 3;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   821
            } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   822
                cs = dstColorSpace;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   823
                iccDstNumComp = dstNumComp;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   824
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   825
            float[] dstMinVal = new float[iccDstNumComp];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   826
            float[] dstDiffMinMax = new float[iccDstNumComp];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   827
            for (int i = 0; i < dstNumComp; i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   828
                dstMinVal[i] = cs.getMinValue(i);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   829
                dstDiffMinMax[i] = (cs.getMaxValue(i) - dstMinVal[i]) / maxNum;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   830
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   831
            float[] dstColor;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   832
            if (dstHasAlpha) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   833
                int size = ((dstNumComp + 1) > 3) ? (dstNumComp + 1) : 3;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   834
                dstColor = new float[size];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   835
            } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   836
                int size = (dstNumComp  > 3) ? dstNumComp : 3;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   837
                dstColor = new float[size];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   838
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   839
            short[] srcLine = new short[w * iccSrcNumComp];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   840
            short[] dstLine = new short[w * iccDstNumComp];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   841
            Object pixel;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   842
            float[] color;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   843
            float[] alpha = null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   844
            if (needSrcAlpha) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   845
                alpha = new float[w];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   846
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   847
            int idx;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   848
            // process each scanline
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   849
            for (int y = 0; y < h; y++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   850
                // convert src scanline
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   851
                pixel = null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   852
                color = null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   853
                idx = 0;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   854
                for (int x = 0; x < w; x++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   855
                    pixel = srcRas.getDataElements(x, y, pixel);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   856
                    color = srcCM.getNormalizedComponents(pixel, color, 0);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   857
                    if (needSrcAlpha) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   858
                        alpha[x] = color[srcNumComp];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   859
                    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   860
                    if (nonICCSrc) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   861
                        color = srcColorSpace.toCIEXYZ(color);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   862
                    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   863
                    for (int i = 0; i < iccSrcNumComp; i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   864
                        srcLine[idx++] = (short)
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   865
                            ((color[i] - srcMinVal[i]) * srcInvDiffMinMax[i] +
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   866
                             0.5f);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   867
                    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   868
                }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   869
                // color convert srcLine to dstLine
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   870
                thisTransform.colorConvert(srcLine, dstLine);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   871
                // convert dst scanline
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   872
                pixel = null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   873
                idx = 0;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   874
                for (int x = 0; x < w; x++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   875
                    for (int i = 0; i < iccDstNumComp; i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   876
                        dstColor[i] = ((float) (dstLine[idx++] & 0xffff)) *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   877
                                      dstDiffMinMax[i] + dstMinVal[i];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   878
                    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   879
                    if (nonICCDst) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   880
                        color = srcColorSpace.fromCIEXYZ(dstColor);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   881
                        for (int i = 0; i < dstNumComp; i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   882
                            dstColor[i] = color[i];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   883
                        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   884
                    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   885
                    if (needSrcAlpha) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   886
                        dstColor[dstNumComp] = alpha[x];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   887
                    } else if (dstHasAlpha) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   888
                        dstColor[dstNumComp] = 1.0f;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   889
                    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   890
                    pixel = dstCM.getDataElements(dstColor, 0, pixel);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   891
                    dstRas.setDataElements(x, y, pixel);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   892
                }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   893
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   894
        } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   895
            /* possible non-ICC src, possible CSList, possible non-ICC dst */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   896
            // process per pixel
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   897
            int numCS;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   898
            if (CSList == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   899
                numCS = 0;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   900
            } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   901
                numCS = CSList.length;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   902
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   903
            float[] dstColor;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   904
            if (dstHasAlpha) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   905
                dstColor = new float[dstNumComp + 1];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   906
            } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   907
                dstColor = new float[dstNumComp];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   908
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   909
            Object spixel = null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   910
            Object dpixel = null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   911
            float[] color = null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   912
            float[] tmpColor;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   913
            // process each pixel
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   914
            for (int y = 0; y < h; y++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   915
                for (int x = 0; x < w; x++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   916
                    spixel = srcRas.getDataElements(x, y, spixel);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   917
                    color = srcCM.getNormalizedComponents(spixel, color, 0);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   918
                    tmpColor = srcColorSpace.toCIEXYZ(color);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   919
                    for (int i = 0; i < numCS; i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   920
                        tmpColor = CSList[i].fromCIEXYZ(tmpColor);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   921
                        tmpColor = CSList[i].toCIEXYZ(tmpColor);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   922
                    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   923
                    tmpColor = dstColorSpace.fromCIEXYZ(tmpColor);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   924
                    for (int i = 0; i < dstNumComp; i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   925
                        dstColor[i] = tmpColor[i];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   926
                    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   927
                    if (needSrcAlpha) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   928
                        dstColor[dstNumComp] = color[srcNumComp];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   929
                    } else if (dstHasAlpha) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   930
                        dstColor[dstNumComp] = 1.0f;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   931
                    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   932
                    dpixel = dstCM.getDataElements(dstColor, 0, dpixel);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   933
                    dstRas.setDataElements(x, y, dpixel);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   934
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   935
                }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   936
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   937
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   938
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   939
        return dst;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   940
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   941
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   942
    /* color convert a Raster - handles byte, ushort, int, short, float,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   943
       or double transferTypes */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   944
    private final WritableRaster nonICCRasterFilter(Raster src,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   945
                                                    WritableRaster dst)  {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   946
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   947
        if (CSList.length != 2) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   948
            throw new IllegalArgumentException(
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   949
                "Destination ColorSpace is undefined");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   950
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   951
        if (src.getNumBands() != CSList[0].getNumComponents()) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   952
            throw new IllegalArgumentException(
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   953
                "Numbers of source Raster bands and source color space " +
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   954
                "components do not match");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   955
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   956
        if (dst == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   957
            dst = createCompatibleDestRaster(src);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   958
        } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   959
            if (src.getHeight() != dst.getHeight() ||
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   960
                src.getWidth() != dst.getWidth()) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   961
                throw new IllegalArgumentException(
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   962
                    "Width or height of Rasters do not match");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   963
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   964
            if (dst.getNumBands() != CSList[1].getNumComponents()) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   965
                throw new IllegalArgumentException(
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   966
                    "Numbers of destination Raster bands and destination " +
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   967
                    "color space components do not match");
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   968
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   969
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   970
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   971
        if (srcMinVals == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   972
            getMinMaxValsFromColorSpaces(CSList[0], CSList[1]);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   973
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   974
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   975
        SampleModel srcSM = src.getSampleModel();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   976
        SampleModel dstSM = dst.getSampleModel();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   977
        boolean srcIsFloat, dstIsFloat;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   978
        int srcTransferType = src.getTransferType();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   979
        int dstTransferType = dst.getTransferType();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   980
        if ((srcTransferType == DataBuffer.TYPE_FLOAT) ||
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   981
            (srcTransferType == DataBuffer.TYPE_DOUBLE)) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   982
            srcIsFloat = true;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   983
        } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   984
            srcIsFloat = false;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   985
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   986
        if ((dstTransferType == DataBuffer.TYPE_FLOAT) ||
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   987
            (dstTransferType == DataBuffer.TYPE_DOUBLE)) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   988
            dstIsFloat = true;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   989
        } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   990
            dstIsFloat = false;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   991
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   992
        int w = src.getWidth();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   993
        int h = src.getHeight();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   994
        int srcNumBands = src.getNumBands();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   995
        int dstNumBands = dst.getNumBands();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   996
        float[] srcScaleFactor = null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   997
        float[] dstScaleFactor = null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   998
        if (!srcIsFloat) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   999
            srcScaleFactor = new float[srcNumBands];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1000
            for (int i = 0; i < srcNumBands; i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1001
                if (srcTransferType == DataBuffer.TYPE_SHORT) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1002
                    srcScaleFactor[i] = (srcMaxVals[i] - srcMinVals[i]) /
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1003
                                        32767.0f;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1004
                } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1005
                    srcScaleFactor[i] = (srcMaxVals[i] - srcMinVals[i]) /
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1006
                        ((float) ((1 << srcSM.getSampleSize(i)) - 1));
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1007
                }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1008
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1009
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1010
        if (!dstIsFloat) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1011
            dstScaleFactor = new float[dstNumBands];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1012
            for (int i = 0; i < dstNumBands; i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1013
                if (dstTransferType == DataBuffer.TYPE_SHORT) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1014
                    dstScaleFactor[i] = 32767.0f /
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1015
                                        (dstMaxVals[i] - dstMinVals[i]);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1016
                } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1017
                    dstScaleFactor[i] =
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1018
                        ((float) ((1 << dstSM.getSampleSize(i)) - 1)) /
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1019
                        (dstMaxVals[i] - dstMinVals[i]);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1020
                }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1021
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1022
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1023
        int ys = src.getMinY();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1024
        int yd = dst.getMinY();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1025
        int xs, xd;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1026
        float sample;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1027
        float[] color = new float[srcNumBands];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1028
        float[] tmpColor;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1029
        ColorSpace srcColorSpace = CSList[0];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1030
        ColorSpace dstColorSpace = CSList[1];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1031
        // process each pixel
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1032
        for (int y = 0; y < h; y++, ys++, yd++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1033
            // get src scanline
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1034
            xs = src.getMinX();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1035
            xd = dst.getMinX();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1036
            for (int x = 0; x < w; x++, xs++, xd++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1037
                for (int i = 0; i < srcNumBands; i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1038
                    sample = src.getSampleFloat(xs, ys, i);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1039
                    if (!srcIsFloat) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1040
                        sample = sample * srcScaleFactor[i] + srcMinVals[i];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1041
                    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1042
                    color[i] = sample;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1043
                }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1044
                tmpColor = srcColorSpace.toCIEXYZ(color);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1045
                tmpColor = dstColorSpace.fromCIEXYZ(tmpColor);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1046
                for (int i = 0; i < dstNumBands; i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1047
                    sample = tmpColor[i];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1048
                    if (!dstIsFloat) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1049
                        sample = (sample - dstMinVals[i]) * dstScaleFactor[i];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1050
                    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1051
                    dst.setSample(xd, yd, i, sample);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1052
                }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1053
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1054
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1055
        return dst;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1056
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1057
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1058
    private void getMinMaxValsFromProfiles(ICC_Profile srcProfile,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1059
                                           ICC_Profile dstProfile) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1060
        int type = srcProfile.getColorSpaceType();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1061
        int nc = srcProfile.getNumComponents();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1062
        srcMinVals = new float[nc];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1063
        srcMaxVals = new float[nc];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1064
        setMinMax(type, nc, srcMinVals, srcMaxVals);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1065
        type = dstProfile.getColorSpaceType();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1066
        nc = dstProfile.getNumComponents();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1067
        dstMinVals = new float[nc];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1068
        dstMaxVals = new float[nc];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1069
        setMinMax(type, nc, dstMinVals, dstMaxVals);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1070
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1071
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1072
    private void setMinMax(int type, int nc, float[] minVals, float[] maxVals) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1073
        if (type == ColorSpace.TYPE_Lab) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1074
            minVals[0] = 0.0f;    // L
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1075
            maxVals[0] = 100.0f;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1076
            minVals[1] = -128.0f; // a
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1077
            maxVals[1] = 127.0f;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1078
            minVals[2] = -128.0f; // b
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1079
            maxVals[2] = 127.0f;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1080
        } else if (type == ColorSpace.TYPE_XYZ) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1081
            minVals[0] = minVals[1] = minVals[2] = 0.0f; // X, Y, Z
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1082
            maxVals[0] = maxVals[1] = maxVals[2] = 1.0f + (32767.0f/ 32768.0f);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1083
        } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1084
            for (int i = 0; i < nc; i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1085
                minVals[i] = 0.0f;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1086
                maxVals[i] = 1.0f;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1087
            }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1088
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1089
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1090
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1091
    private void getMinMaxValsFromColorSpaces(ColorSpace srcCspace,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1092
                                              ColorSpace dstCspace) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1093
        int nc = srcCspace.getNumComponents();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1094
        srcMinVals = new float[nc];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1095
        srcMaxVals = new float[nc];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1096
        for (int i = 0; i < nc; i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1097
            srcMinVals[i] = srcCspace.getMinValue(i);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1098
            srcMaxVals[i] = srcCspace.getMaxValue(i);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1099
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1100
        nc = dstCspace.getNumComponents();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1101
        dstMinVals = new float[nc];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1102
        dstMaxVals = new float[nc];
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1103
        for (int i = 0; i < nc; i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1104
            dstMinVals[i] = dstCspace.getMinValue(i);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1105
            dstMaxVals[i] = dstCspace.getMaxValue(i);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1106
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1107
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1108
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
  1109
}