jdk/src/share/classes/java/awt/image/renderable/RenderableImageOp.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 1998-2000 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.renderable;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    37
import java.awt.geom.AffineTransform;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    38
import java.awt.geom.Rectangle2D;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    39
import java.awt.image.RenderedImage;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    40
import java.awt.RenderingHints;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    41
import java.util.Hashtable;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    42
import java.util.Vector;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    43
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    44
/**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    45
 * This class handles the renderable aspects of an operation with help
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    46
 * from its associated instance of a ContextualRenderedImageFactory.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    47
 */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    48
public class RenderableImageOp implements RenderableImage {
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
    /** A ParameterBlock containing source and parameters. */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    51
    ParameterBlock paramBlock;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    52
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    53
    /** The associated ContextualRenderedImageFactory. */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    54
    ContextualRenderedImageFactory myCRIF;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    55
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    56
    /** The bounding box of the results of this RenderableImageOp. */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    57
    Rectangle2D boundingBox;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    58
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    59
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    60
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    61
     * Constructs a RenderedImageOp given a
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    62
     * ContextualRenderedImageFactory object, and
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    63
     * a ParameterBlock containing RenderableImage sources and other
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    64
     * parameters.  Any RenderedImage sources referenced by the
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    65
     * ParameterBlock will be ignored.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    66
     *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    67
     * @param CRIF a ContextualRenderedImageFactory object
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    68
     * @param paramBlock a ParameterBlock containing this operation's source
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    69
     *        images and other parameters necessary for the operation
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    70
     *        to run.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    71
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    72
    public RenderableImageOp(ContextualRenderedImageFactory CRIF,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    73
                             ParameterBlock paramBlock) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    74
        this.myCRIF = CRIF;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    75
        this.paramBlock = (ParameterBlock) paramBlock.clone();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    76
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    77
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    78
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    79
     * Returns a vector of RenderableImages that are the sources of
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    80
     * image data for this RenderableImage. Note that this method may
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    81
     * return an empty vector, to indicate that the image has no sources,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    82
     * or null, to indicate that no information is available.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    83
     *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    84
     * @return a (possibly empty) Vector of RenderableImages, or null.
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
    public Vector<RenderableImage> getSources() {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    87
        return getRenderableSources();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    88
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    89
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    90
    private Vector getRenderableSources() {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    91
        Vector sources = null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    92
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    93
        if (paramBlock.getNumSources() > 0) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    94
            sources = new Vector();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    95
            int i = 0;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    96
            while (i < paramBlock.getNumSources()) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    97
                Object o = paramBlock.getSource(i);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    98
                if (o instanceof RenderableImage) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
    99
                    sources.add((RenderableImage)o);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   100
                    i++;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   101
                } else {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   102
                    break;
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
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   106
        return sources;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   107
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   108
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   109
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   110
     * Gets a property from the property set of this image.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   111
     * If the property name is not recognized, java.awt.Image.UndefinedProperty
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   112
     * will be returned.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   113
     *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   114
     * @param name the name of the property to get, as a String.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   115
     * @return a reference to the property Object, or the value
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   116
     *         java.awt.Image.UndefinedProperty.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   117
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   118
    public Object getProperty(String name) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   119
        return myCRIF.getProperty(paramBlock, name);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   120
    }
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
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   123
     * Return a list of names recognized by getProperty.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   124
     * @return a list of property names.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   125
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   126
    public String[] getPropertyNames() {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   127
        return myCRIF.getPropertyNames();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   128
    }
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
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   131
     * Returns true if successive renderings (that is, calls to
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   132
     * createRendering() or createScaledRendering()) with the same arguments
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   133
     * may produce different results.  This method may be used to
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   134
     * determine whether an existing rendering may be cached and
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   135
     * reused.  The CRIF's isDynamic method will be called.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   136
     * @return <code>true</code> if successive renderings with the
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   137
     *         same arguments might produce different results;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   138
     *         <code>false</code> otherwise.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   139
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   140
    public boolean isDynamic() {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   141
        return myCRIF.isDynamic();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   142
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   143
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   144
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   145
     * Gets the width in user coordinate space.  By convention, the
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   146
     * usual width of a RenderableImage is equal to the image's aspect
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   147
     * ratio (width divided by height).
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   148
     *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   149
     * @return the width of the image in user coordinates.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   150
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   151
    public float getWidth() {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   152
        if (boundingBox == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   153
            boundingBox = myCRIF.getBounds2D(paramBlock);
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
        return (float)boundingBox.getWidth();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   156
    }
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
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   159
     * Gets the height in user coordinate space.  By convention, the
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   160
     * usual height of a RenderedImage is equal to 1.0F.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   161
     *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   162
     * @return the height of the image in user coordinates.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   163
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   164
    public float getHeight() {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   165
        if (boundingBox == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   166
            boundingBox = myCRIF.getBounds2D(paramBlock);
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
        return (float)boundingBox.getHeight();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   169
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   170
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   171
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   172
     * Gets the minimum X coordinate of the rendering-independent image data.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   173
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   174
    public float getMinX() {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   175
        if (boundingBox == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   176
            boundingBox = myCRIF.getBounds2D(paramBlock);
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
        return (float)boundingBox.getMinX();
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
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   181
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   182
     * Gets the minimum Y coordinate of the rendering-independent image data.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   183
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   184
    public float getMinY() {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   185
        if (boundingBox == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   186
            boundingBox = myCRIF.getBounds2D(paramBlock);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   187
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   188
        return (float)boundingBox.getMinY();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   189
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   190
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   191
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   192
     * Change the current ParameterBlock of the operation, allowing
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   193
     * editing of image rendering chains.  The effects of such a
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   194
     * change will be visible when a new rendering is created from
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   195
     * this RenderableImageOp or any dependent RenderableImageOp.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   196
     *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   197
     * @param paramBlock the new ParameterBlock.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   198
     * @return the old ParameterBlock.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   199
     * @see #getParameterBlock
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   200
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   201
    public ParameterBlock setParameterBlock(ParameterBlock paramBlock) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   202
        ParameterBlock oldParamBlock = this.paramBlock;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   203
        this.paramBlock = (ParameterBlock)paramBlock.clone();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   204
        return oldParamBlock;
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
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
     * Returns a reference to the current parameter block.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   209
     * @return the <code>ParameterBlock</code> of this
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   210
     *         <code>RenderableImageOp</code>.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   211
     * @see #setParameterBlock(ParameterBlock)
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   212
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   213
    public ParameterBlock getParameterBlock() {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   214
        return paramBlock;
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
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
     * Creates a RenderedImage instance of this image with width w, and
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   219
     * height h in pixels.  The RenderContext is built automatically
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   220
     * with an appropriate usr2dev transform and an area of interest
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   221
     * of the full image.  All the rendering hints come from hints
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   222
     * passed in.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   223
     *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   224
     * <p> If w == 0, it will be taken to equal
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   225
     * Math.round(h*(getWidth()/getHeight())).
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   226
     * Similarly, if h == 0, it will be taken to equal
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   227
     * Math.round(w*(getHeight()/getWidth())).  One of
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   228
     * w or h must be non-zero or else an IllegalArgumentException
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   229
     * will be thrown.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   230
     *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   231
     * <p> The created RenderedImage may have a property identified
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   232
     * by the String HINTS_OBSERVED to indicate which RenderingHints
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   233
     * were used to create the image.  In addition any RenderedImages
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   234
     * that are obtained via the getSources() method on the created
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   235
     * RenderedImage may have such a property.
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
     * @param w the width of rendered image in pixels, or 0.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   238
     * @param h the height of rendered image in pixels, or 0.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   239
     * @param hints a RenderingHints object containg hints.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   240
     * @return a RenderedImage containing the rendered data.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   241
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   242
    public RenderedImage createScaledRendering(int w, int h,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   243
                                               RenderingHints hints) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   244
        // DSR -- code to try to get a unit scale
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   245
        double sx = (double)w/getWidth();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   246
        double sy = (double)h/getHeight();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   247
        if (Math.abs(sx/sy - 1.0) < 0.01) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   248
            sx = sy;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   249
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   250
        AffineTransform usr2dev = AffineTransform.getScaleInstance(sx, sy);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   251
        RenderContext newRC = new RenderContext(usr2dev, hints);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   252
        return createRendering(newRC);
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
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   255
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   256
     * Gets a RenderedImage instance of this image with a default
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   257
     * width and height in pixels.  The RenderContext is built
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   258
     * automatically with an appropriate usr2dev transform and an area
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   259
     * of interest of the full image.  All the rendering hints come
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   260
     * from hints passed in.  Implementors of this interface must be
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   261
     * sure that there is a defined default width and height.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   262
     *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   263
     * @return a RenderedImage containing the rendered data.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   264
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   265
    public RenderedImage createDefaultRendering() {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   266
        AffineTransform usr2dev = new AffineTransform(); // Identity
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   267
        RenderContext newRC = new RenderContext(usr2dev);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   268
        return createRendering(newRC);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   269
    }
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
    /**
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   272
     * Creates a RenderedImage which represents this
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   273
     * RenderableImageOp (including its Renderable sources) rendered
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   274
     * according to the given RenderContext.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   275
     *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   276
     * <p> This method supports chaining of either Renderable or
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   277
     * RenderedImage operations.  If sources in
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   278
     * the ParameterBlock used to construct the RenderableImageOp are
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   279
     * RenderableImages, then a three step process is followed:
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   280
     *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   281
     * <ol>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   282
     * <li> mapRenderContext() is called on the associated CRIF for
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   283
     * each RenderableImage source;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   284
     * <li> createRendering() is called on each of the RenderableImage sources
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   285
     * using the backwards-mapped RenderContexts obtained in step 1,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   286
     * resulting in a rendering of each source;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   287
     * <li> ContextualRenderedImageFactory.create() is called
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   288
     * with a new ParameterBlock containing the parameters of
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   289
     * the RenderableImageOp and the RenderedImages that were created by the
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   290
     * createRendering() calls.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   291
     * </ol>
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   292
     *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   293
     * <p> If the elements of the source Vector of
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   294
     * the ParameterBlock used to construct the RenderableImageOp are
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   295
     * instances of RenderedImage, then the CRIF.create() method is
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   296
     * called immediately using the original ParameterBlock.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   297
     * This provides a basis case for the recursion.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   298
     *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   299
     * <p> The created RenderedImage may have a property identified
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   300
     * by the String HINTS_OBSERVED to indicate which RenderingHints
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   301
     * (from the RenderContext) were used to create the image.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   302
     * In addition any RenderedImages
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   303
     * that are obtained via the getSources() method on the created
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   304
     * RenderedImage may have such a property.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   305
     *
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   306
     * @param renderContext The RenderContext to use to perform the rendering.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   307
     * @return a RenderedImage containing the desired output image.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   308
     */
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   309
    public RenderedImage createRendering(RenderContext renderContext) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   310
        RenderedImage image = null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   311
        RenderContext rcOut = null;
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
        // Clone the original ParameterBlock; if the ParameterBlock
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   314
        // contains RenderableImage sources, they will be replaced by
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   315
        // RenderedImages.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   316
        ParameterBlock renderedParamBlock = (ParameterBlock)paramBlock.clone();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   317
        Vector sources = getRenderableSources();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   318
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   319
        try {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   320
            // This assumes that if there is no renderable source, that there
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   321
            // is a rendered source in paramBlock
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   322
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   323
            if (sources != null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   324
                Vector renderedSources = new Vector();
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   325
                for (int i = 0; i < sources.size(); i++) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   326
                    rcOut = myCRIF.mapRenderContext(i, renderContext,
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   327
                                                    paramBlock, this);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   328
                    RenderedImage rdrdImage =
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   329
                       ((RenderableImage)sources.elementAt(i)).createRendering(rcOut);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   330
                    if (rdrdImage == null) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   331
                        return null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   332
                    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   333
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   334
                    // Add this rendered image to the ParameterBlock's
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   335
                    // list of RenderedImages.
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   336
                    renderedSources.addElement(rdrdImage);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   337
                }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   338
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   339
                if (renderedSources.size() > 0) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   340
                    renderedParamBlock.setSources(renderedSources);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   341
                }
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 myCRIF.create(renderContext, renderedParamBlock);
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   345
        } catch (ArrayIndexOutOfBoundsException e) {
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   346
            // This should never happen
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   347
            return null;
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   348
        }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   349
    }
7952521a4ad3 6662775: Move imaging and color classes from closed to open
prr
parents:
diff changeset
   350
}