Blob Blame History Raw
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/I18N.java zzx2/src/share/classes/com/sun/media/jai/imageioimpl/I18N.java
--- jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/I18N.java	2005-02-11 00:01:54.000000000 -0500
+++ zzx2/src/share/classes/com/sun/media/jai/imageioimpl/I18N.java	1969-12-31 19:00:00.000000000 -0500
@@ -1,53 +0,0 @@
-/*
- * $RCSfile: I18N.java,v $
- *
- * 
- * Copyright (c) 2005 Sun Microsystems, Inc. All  Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met: 
- * 
- * - Redistribution of source code must retain the above copyright 
- *   notice, this  list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the
- *   distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of 
- * contributors may be used to endorse or promote products derived 
- * from this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any 
- * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 
- * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
- * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL 
- * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF 
- * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
- * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR 
- * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
- * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
- * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
- * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES. 
- * 
- * You acknowledge that this software is not designed or intended for 
- * use in the design, construction, operation or maintenance of any 
- * nuclear facility. 
- *
- * $Revision: 1.1 $
- * $Date: 2005/02/11 05:01:54 $
- * $State: Exp $
- */
-package com.sun.media.jai.imageioimpl;
-
-import com.sun.media.imageioimpl.common.I18NImpl;
-
-final class I18N extends I18NImpl {
-    static String getString(String key) {
-        return getString("com.sun.media.jai.imageioimpl.I18N", key);
-    }
-}
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/ImageIOCollectionImage.java zzx2/src/share/classes/com/sun/media/jai/imageioimpl/ImageIOCollectionImage.java
--- jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/ImageIOCollectionImage.java	2005-02-11 00:01:54.000000000 -0500
+++ zzx2/src/share/classes/com/sun/media/jai/imageioimpl/ImageIOCollectionImage.java	1969-12-31 19:00:00.000000000 -0500
@@ -1,74 +0,0 @@
-/*
- * $RCSfile: ImageIOCollectionImage.java,v $
- *
- * 
- * Copyright (c) 2005 Sun Microsystems, Inc. All  Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met: 
- * 
- * - Redistribution of source code must retain the above copyright 
- *   notice, this  list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the
- *   distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of 
- * contributors may be used to endorse or promote products derived 
- * from this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any 
- * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 
- * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
- * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL 
- * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF 
- * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
- * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR 
- * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
- * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
- * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
- * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES. 
- * 
- * You acknowledge that this software is not designed or intended for 
- * use in the design, construction, operation or maintenance of any 
- * nuclear facility. 
- *
- * $Revision: 1.1 $
- * $Date: 2005/02/11 05:01:54 $
- * $State: Exp $
- */
-package com.sun.media.jai.imageioimpl;
-
-import java.util.ArrayList;
-import javax.media.jai.CollectionImage;
-
-/**
- * A <code>CollectionImage</code> to be used as the return value from
- * <code>ImageReadCIF.create()</code> and <code>ImageWriteCIF.create()</code>.
- * The <code>imageCollection</code> instance variable is a <code>List</code>.
- */
-class ImageIOCollectionImage extends CollectionImage {
-    /**
-     * Creates an <code>ImageIOCollectionImage</code> with the specified
-     * capacity.
-     *
-     * @exception IllegalArgumentException if <code>capacity</code> is
-     * not positive.
-     */
-    ImageIOCollectionImage(int capacity) {
-        super();
-
-        if(capacity <= 0) {
-            // No message as this is not at the API level and it is
-            // the unique exception.
-            throw new IllegalArgumentException();
-        }
-
-        imageCollection = new ArrayList(capacity);
-    }
-}
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/ImageReadCIF.java zzx2/src/share/classes/com/sun/media/jai/imageioimpl/ImageReadCIF.java
--- jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/ImageReadCIF.java	2005-02-11 00:01:54.000000000 -0500
+++ zzx2/src/share/classes/com/sun/media/jai/imageioimpl/ImageReadCIF.java	1969-12-31 19:00:00.000000000 -0500
@@ -1,168 +0,0 @@
-/*
- * $RCSfile: ImageReadCIF.java,v $
- *
- * 
- * Copyright (c) 2005 Sun Microsystems, Inc. All  Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met: 
- * 
- * - Redistribution of source code must retain the above copyright 
- *   notice, this  list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the
- *   distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of 
- * contributors may be used to endorse or promote products derived 
- * from this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any 
- * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 
- * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
- * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL 
- * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF 
- * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
- * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR 
- * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
- * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
- * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
- * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES. 
- * 
- * You acknowledge that this software is not designed or intended for 
- * use in the design, construction, operation or maintenance of any 
- * nuclear facility. 
- *
- * $Revision: 1.1 $
- * $Date: 2005/02/11 05:01:54 $
- * $State: Exp $
- */
-package com.sun.media.jai.imageioimpl;
-
-import java.awt.Dimension;
-import java.awt.RenderingHints;
-import java.awt.image.renderable.ParameterBlock;
-import java.util.ArrayList;
-import java.util.List;
-import javax.imageio.ImageReader;
-import javax.media.jai.CollectionImage;
-import javax.media.jai.CollectionImageFactory;
-import javax.media.jai.CollectionOp;
-import javax.media.jai.JAI;
-import javax.media.jai.PlanarImage;
-import com.sun.media.jai.operator.ImageReadDescriptor;
-
-public class ImageReadCIF implements CollectionImageFactory {
-
-    static CollectionImage createStatic(ParameterBlock args,
-                                        RenderingHints hints) {
-
-        // Clone the ParameterBlock as the ImageChoice will be overwritten.
-        ParameterBlock renderedPB = (ParameterBlock)args.clone();
-
-        // Get the ImageChoice.
-        int[] imageIndices = (int[])args.getObjectParameter(1);
-
-        // Variables to be set in the subsequent "if" block.
-        // XXX Could probably collapse the if block into a single code seq.
-        int numSources;
-        ImageIOCollectionImage imageList = null;
-
-        if(imageIndices == null) {
-            // null-valued ImageChoice: load all images.
-
-            // Load the first image.
-            renderedPB.set(0, 1);
-            PlanarImage image = JAI.create("ImageRead", renderedPB, hints);
-
-            // Get the ImageReader property.
-            Object readerProperty =
-                image.getProperty(
-                    ImageReadDescriptor.PROPERTY_NAME_IMAGE_READER);
-
-            // Try to read the number of images.
-            if(readerProperty instanceof ImageReader) {
-                try {
-                    // XXX Really should not allow search here. If search
-                    // is disallowed and -1 is returned from getNumImages(),
-                    // then "ImageRead" should just be called until an
-                    // IndexOutOfBoundsException is caught.
-                    numSources =
-                        ((ImageReader)readerProperty).getNumImages(true);
-                } catch(Exception e) { // IOException
-                    // Default to one source.
-                    numSources = 1;
-                }
-            } else {
-                numSources = 1;
-            }
-
-            // Allocate and fill index array.
-            imageIndices = new int[numSources];
-            for(int i = 0; i < numSources; i++) {
-                imageIndices[i] = i;
-            }
-
-            // Allocate list and add first image.
-            imageList = new ImageIOCollectionImage(numSources);
-            imageList.add(image);
-        } else {
-            // Set the number of sources and create the list.
-            numSources = imageIndices.length;
-            imageList = new ImageIOCollectionImage(numSources);
-
-            // Load the first image requested.
-            renderedPB.set(imageIndices[0], 1);
-            PlanarImage image = JAI.create("ImageRead", renderedPB, hints);
-
-            // Add the first image to the list.
-            imageList.add(image);
-        }
-
-        // Read subsequent images and add to the list.
-        for(int idx = 1; idx < numSources; idx++) {
-            renderedPB.set(imageIndices[idx], 1);
-            PlanarImage image = JAI.create("ImageRead", renderedPB, hints);
-            imageList.add(image);
-        }
-
-        // Get the first image in the Collection.
-        PlanarImage firstImage = (PlanarImage)imageList.get(0);
-
-        // Transfer properties to the Collection.
-        ImageReadCRIF.copyProperty(firstImage,
-                                   imageList,
-                                   ImageReadDescriptor.PROPERTY_NAME_IMAGE_READ_PARAM);
-        ImageReadCRIF.copyProperty(firstImage,
-                                   imageList,
-                                   ImageReadDescriptor.PROPERTY_NAME_IMAGE_READER);
-        ImageReadCRIF.copyProperty(firstImage,
-                                   imageList,
-                                   ImageReadDescriptor.PROPERTY_NAME_METADATA_STREAM);
-
-        return imageList;
-    }
-
-    /** Constructor. */
-    public ImageReadCIF() {}
-
-    public CollectionImage create(ParameterBlock args,
-                                  RenderingHints hints) {
-        return createStatic(args, hints);
-    }
-
-    // Forget it.
-    public CollectionImage update(ParameterBlock oldParamBlock,
-                                  RenderingHints oldHints,
-                                  ParameterBlock newParamBlock,
-                                  RenderingHints newHints,
-                                  CollectionImage oldRendering,
-                                  CollectionOp op) {
-        return null;
-    }
-}
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/ImageReadCRIF.java zzx2/src/share/classes/com/sun/media/jai/imageioimpl/ImageReadCRIF.java
--- jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/ImageReadCRIF.java	2005-11-30 19:39:04.000000000 -0500
+++ zzx2/src/share/classes/com/sun/media/jai/imageioimpl/ImageReadCRIF.java	1969-12-31 19:00:00.000000000 -0500
@@ -1,434 +0,0 @@
-/*
- * $RCSfile: ImageReadCRIF.java,v $
- *
- * 
- * Copyright (c) 2005 Sun Microsystems, Inc. All  Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met: 
- * 
- * - Redistribution of source code must retain the above copyright 
- *   notice, this  list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the
- *   distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of 
- * contributors may be used to endorse or promote products derived 
- * from this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any 
- * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 
- * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
- * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL 
- * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF 
- * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
- * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR 
- * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
- * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
- * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
- * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES. 
- * 
- * You acknowledge that this software is not designed or intended for 
- * use in the design, construction, operation or maintenance of any 
- * nuclear facility. 
- *
- * $Revision: 1.2 $
- * $Date: 2005/12/01 00:39:04 $
- * $State: Exp $
- */
-package com.sun.media.jai.imageioimpl;
-
-import java.awt.Dimension;
-import java.awt.RenderingHints;
-import java.awt.geom.Rectangle2D;
-import java.awt.image.RenderedImage;
-import java.awt.image.renderable.ParameterBlock;
-import java.awt.image.renderable.RenderableImage;
-import java.awt.image.renderable.RenderContext;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.net.Socket;
-import java.net.URL;
-import java.nio.channels.Channel;
-import java.nio.channels.Channels;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.EventListener;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.TreeMap;
-import java.util.Vector;
-import javax.imageio.ImageIO;
-import javax.imageio.ImageReader;
-import javax.imageio.ImageReadParam;
-import javax.imageio.event.IIOReadProgressListener;
-import javax.imageio.event.IIOReadUpdateListener;
-import javax.imageio.event.IIOReadWarningListener;
-import javax.imageio.spi.ImageReaderSpi;
-import javax.imageio.stream.ImageInputStream;
-import javax.media.jai.CRIFImpl;
-import javax.media.jai.ImageLayout;
-import javax.media.jai.JAI;
-import javax.media.jai.MultiResolutionRenderableImage;
-import javax.media.jai.PropertySource;
-import javax.media.jai.WritablePropertySource;
-import com.sun.media.jai.operator.ImageReadDescriptor;
-
-public final class ImageReadCRIF extends CRIFImpl {
-    public ImageReadCRIF() {
-        super(); // Pass up the name?
-    }
-
-    /**
-     * Attempt to create an {@link ImageInputStream} for the supplied
-     * input. The following sequence is effected:
-     * <ol>
-     * <li><ul>
-     * <li>If <code>input</code> is an <code>ImageInputStream</code> it
-     * is cast and returned.</li>
-     * <li>If <code>input</code> is a <code>String</code> it is converted
-     * to a read-only <code>RandomAccessFile</code>.</li>
-     * <li>If conversion to a <code>RandomAccessFile</code> fails, the 
-     * <code>String</code> <code>input</code> is converted to an 
-     * <code>InputStream</code> by accessing it as a resource bundled 
-     * in a JAR file.</li>
-     * <li>If <code>input</code> is a <code>URL</code> it is converted
-     * to an <code>InputStream</code>.</li>
-     * <li>If <code>input</code> is a <code>Socket</code> it is converted
-     * to an <code>InputStream</code>.</li>
-     * </ul></li>
-     * <li><code>ImageIO.createImageInputStream()</code> is invoked
-     * with parameter set to the (possibly converted) input and the
-     * value it returns (which could be <code>null</code>) is returned
-     * to the caller.</li>
-     * </ol>
-     *
-     * @param input An <code>Object</code> to be used as the source,
-     * such as a <code>String</code>, <code>URL</code>, <code>File</code>,
-     * readable <code>RandomAccessFile</code>, <code>InputStream</code>,
-     * readable <code>Socket</code>, or readable <code>Channel</code>.
-     * 
-     * @return An <code>ImageInputStream</code> or <code>null</code>.
-     */
-    private static ImageInputStream getImageInputStream(Object input) {
-        // The value to be returned.
-        ImageInputStream stream = null;
-
-        // If already an ImageInputStream cast and return.
-        if(input instanceof ImageInputStream) {
-            stream = (ImageInputStream)input;
-        } else {
-            // If the input is a String replace it with a RandomAccessFile.
-            if(input instanceof String) {
-                try {
-                    // 'input' is conditionally checked for readability
-                    // in the OperationDescriptor.
-                    input = new RandomAccessFile((String)input, "r");
-                } catch(Exception e) {
-		    // Try to get the file as an InputStream resource. This 
-		    // would happen when the application and image file are 
-		    // packaged in a JAR file
-		    input = ImageReadCRIF.class.getClassLoader().getResourceAsStream((String)input);
-		    if (input == null) 
-			throw new RuntimeException
-			    (I18N.getString("ImageReadCRIF0")+" "+input);
-                }
-            } else if(input instanceof URL) {
-                // If the input is a URL replace it with an InputStream.
-                try {
-                    input = ((URL)input).openStream();
-                } catch(Exception e) {
-                    throw new RuntimeException
-                        (I18N.getString("ImageReadCRIF1")+" "+input);
-                }
-            } else if(input instanceof Socket) {
-                // If output is a Socket replace it with an InputStream.
-                try {
-                    Socket socket = (Socket)input;
-                    // XXX check binding, connection, closed, shutdown
-                    // as these could have changed.
-                    input = socket.getInputStream();
-                } catch(Exception e) {
-                    throw new RuntimeException
-                        (I18N.getString("ImageReadCRIF2")+" "+input);
-                }
-            }
-        }
-
-        // Create the ImageInputStream.
-        try {
-            stream = ImageIO.createImageInputStream(input);
-        } catch(Exception e) {
-            throw new RuntimeException(e);
-        }
-
-        return stream;
-    }
-
-    /**
-     * Get the <code>ImageReader</code> and set its input and metadata flag.
-     * The input set on the reader might not be the same object as the input
-     * passed in if the latter was replaced by getImageInputStream().
-     */
-    static ImageReader getImageReader(ParameterBlock pb) {
-        // Get the input.
-        Object input = pb.getObjectParameter(0);
-
-        // Get the reader parameter.
-        ImageReader reader = (ImageReader)pb.getObjectParameter(8);
-
-        // Attempt to create an ImageInputStream from the input.
-        ImageInputStream stream = getImageInputStream(input);
-
-        // If no reader passed in, try to find one.
-        if(reader == null) {
-            // Get all compatible readers.
-            Iterator readers = ImageIO.getImageReaders(stream != null ?
-                                                       stream : input);
-
-            // If any readers, take the first one whose originating
-            // service provider indicates that it can decode the input.
-            if(readers != null && readers.hasNext()) {
-                do {
-                    ImageReader tmpReader = (ImageReader)readers.next();
-                    ImageReaderSpi readerSpi =
-                        tmpReader.getOriginatingProvider();
-                    try {
-                        if(readerSpi.canDecodeInput(stream != null ?
-                                                    stream : input)) {
-                            reader = tmpReader;
-                        }
-                    } catch(IOException ioe) {
-                        // XXX Ignore it?
-                    }
-                } while(reader == null && readers.hasNext());
-            }
-        }
-
-        // If reader found, set its input and metadata flag.
-        if(reader != null) {
-            // Get the locale parameter and set on the reader.
-            Locale locale = (Locale)pb.getObjectParameter(6);
-            if(locale != null) {
-                reader.setLocale(locale);
-            }
-
-            // Get the listeners parameter and set on the reader.
-            EventListener[] listeners =
-                (EventListener[])pb.getObjectParameter(5);
-            if(listeners != null) {
-                for(int i = 0; i < listeners.length; i++) {
-                    EventListener listener = listeners[i];
-                    if(listener instanceof IIOReadProgressListener) {
-                        reader.addIIOReadProgressListener(
-                            (IIOReadProgressListener)listener);
-                    }
-                    if(listener instanceof IIOReadUpdateListener) {
-                        reader.addIIOReadUpdateListener(
-                            (IIOReadUpdateListener)listener);
-                    }
-                    if(listener instanceof IIOReadWarningListener) {
-                        reader.addIIOReadWarningListener(
-                            (IIOReadWarningListener)listener);
-                    }
-                }
-            }
-
-            // Get the metadata reading flag.
-            boolean readMetadata =
-                ((Boolean)pb.getObjectParameter(2)).booleanValue();
-
-            // Set the input and indicate metadata reading state.
-            reader.setInput(stream != null ? stream : input,
-                            false,          // seekForwardOnly
-                            !readMetadata); // ignoreMetadata
-        }
-
-        return reader;
-    }
-
-    static void copyProperty(PropertySource ps,
-                             WritablePropertySource wps,
-                             String propertyName) {
-        Object propertyValue = ps.getProperty(propertyName);
-
-        if(propertyValue != null &&
-           !propertyValue.equals(java.awt.Image.UndefinedProperty)) {
-            wps.setProperty(propertyName, propertyValue);
-                                        
-        }
-    }
-
-    public RenderedImage create(ParameterBlock pb,
-                                RenderingHints rh) {
-
-        // Value to be returned.
-        RenderedImage image = null;
-
-        // Get the reader.
-        ImageReader reader = getImageReader(pb);
-
-        // Proceed if a compatible reader was found.
-        if(reader != null) {
-            // Get the remaining parameters required.
-            int imageIndex = pb.getIntParameter(1);
-            ImageReadParam param =
-                (ImageReadParam)pb.getObjectParameter(7);
-            boolean readThumbnails =
-                ((Boolean)pb.getObjectParameter(3)).booleanValue();
-
-            // Initialize the layout.
-            ImageLayout layout =
-                (rh != null && rh.containsKey(JAI.KEY_IMAGE_LAYOUT)) ?
-                (ImageLayout)rh.get(JAI.KEY_IMAGE_LAYOUT) :
-                new ImageLayout();
-
-            try {
-                // Get the parameter input.
-                Object paramInput = pb.getObjectParameter(0);
-
-                // Get the reader input.
-                Object readerInput = reader.getInput();
-
-                // Set the stream to close when the OpImage is disposed.
-                ImageInputStream streamToClose = null;
-                if(readerInput != paramInput &&
-                   readerInput instanceof ImageInputStream) {
-                    streamToClose = (ImageInputStream)readerInput;
-                }
-
-                // Create the rendering.
-                image = new ImageReadOpImage(layout,
-                                             rh,
-                                             param,
-                                             reader,
-                                             imageIndex,
-                                             readThumbnails,
-                                             streamToClose);
-            } catch(Exception e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        return image;
-    }
-
-    // XXX This implementation of renderable mode is incredibly lame
-    // but the architecture and implementation allow for nothing else.
-    // It would be better if the CRIFs had some kind of state that
-    // could be associated with them. As it standards getBounds2D()
-    // will create a new MultiResolutionRenderableImage and so will
-    // the second create() below. Actually what is needed is a
-    // RenderableImageFactory definition.
-    // XXX There is also a problem with multiple invocations of the
-    // rendered mode case. Without saving and seeking back to the
-    // same offset it appears to have problems. Should ImageReadOpImage
-    // save the initial position and always seek back to it?
-
-    public RenderableImage createRenderable(ParameterBlock pb,
-                                            RenderingHints rh) {
-
-        // Read the collection.
-        Collection sequence = ImageReadCIF.createStatic(pb, rh);
-
-        // Create a SortedMap which sorts on the basis of inverse area.
-        // The keys will be Dimensions and the objects RenderedImages.
-        TreeMap sourceMap = new TreeMap(new Comparator() {
-                public int compare(Object o1, Object o2) {
-                    Dimension d1 = (Dimension)o1;
-                    Dimension d2 = (Dimension)o2;
-
-                    int area1 = d1.width*d1.height;
-                    int area2 = d2.width*d2.height;
-
-                    double inverse1 = area1 == 0 ?
-                        Double.MAX_VALUE : 1.0/area1;
-                    double inverse2 = area2 == 0 ?
-                        Double.MAX_VALUE : 1.0/area2;
-
-                    if(inverse1 < inverse2) {
-                        return -1;
-                    } else if(inverse1 > inverse2) {
-                        return 1;
-                    } else {
-                        return 0;
-                    }
-                }
-
-                public boolean equals(Object o1, Object o2) {
-                    return o1.equals(o2);
-                }
-            });
-
-        Iterator images = sequence.iterator();
-        while(images.hasNext()) {
-            RenderedImage image = (RenderedImage)images.next();
-            sourceMap.put(new Dimension(image.getWidth(), image.getHeight()),
-                          image);
-        }
-
-        // Create the rendered source list sorted by inverse area.
-        Vector renderedSources = new Vector(sourceMap.size());
-        Iterator keys = sourceMap.keySet().iterator();
-        while(keys.hasNext()) {
-            renderedSources.add(sourceMap.get(keys.next()));
-        }
-
-        // Create the RenderableImage from the sorted RenderedImages.
-        MultiResolutionRenderableImage renderableImage =
-            new MultiResolutionRenderableImage(renderedSources,
-                                               0.0F, 0.0F, 1.0F);
-
-        // Set properties from those of the first rendered source.
-        PropertySource firstSource = (PropertySource)renderedSources.get(0);
-        copyProperty(firstSource,
-                     renderableImage,
-                     ImageReadDescriptor.PROPERTY_NAME_IMAGE_READ_PARAM);
-        copyProperty(firstSource,
-                     renderableImage,
-                     ImageReadDescriptor.PROPERTY_NAME_IMAGE_READER);
-        copyProperty(firstSource,
-                     renderableImage,
-                     ImageReadDescriptor.PROPERTY_NAME_METADATA_STREAM);
-        copyProperty(firstSource,
-                     renderableImage,
-                     ImageReadDescriptor.PROPERTY_NAME_METADATA_IMAGE);
-
-        // Return the RenderableImage.
-        return renderableImage;
-    }
-
-    public RenderedImage create(RenderContext rc,
-                                ParameterBlock pb) {
-
-        RenderableImage renderableImage =
-            createRenderable(pb, rc.getRenderingHints());
-
-        RenderedImage renderedImage = renderableImage.createRendering(rc);
-
-        ((WritablePropertySource)renderedImage).setProperty(
-            ImageReadDescriptor.PROPERTY_NAME_RENDERABLE_INPUT,
-            (PropertySource)renderableImage);
-
-        return renderedImage;
-    }
-
-    public Rectangle2D getBounds2D(ParameterBlock pb) {
-        // XXX Should just get the aspect ratio of the first image and use it.
-        // Otherwise this will be very inefficient.
-        RenderableImage renderable = createRenderable(pb, null);
-
-        return new Rectangle2D.Float(renderable.getMinX(),
-                                     renderable.getMinY(),
-                                     renderable.getWidth(),
-                                     renderable.getHeight());
-    }
-}
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/ImageReadOpImage.java zzx2/src/share/classes/com/sun/media/jai/imageioimpl/ImageReadOpImage.java
--- jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/ImageReadOpImage.java	2006-07-14 17:43:57.000000000 -0400
+++ zzx2/src/share/classes/com/sun/media/jai/imageioimpl/ImageReadOpImage.java	1969-12-31 19:00:00.000000000 -0500
@@ -1,914 +0,0 @@
-/*
- * $RCSfile: ImageReadOpImage.java,v $
- *
- * 
- * Copyright (c) 2005 Sun Microsystems, Inc. All  Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met: 
- * 
- * - Redistribution of source code must retain the above copyright 
- *   notice, this  list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the
- *   distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of 
- * contributors may be used to endorse or promote products derived 
- * from this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any 
- * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 
- * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
- * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL 
- * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF 
- * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
- * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR 
- * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
- * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
- * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
- * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES. 
- * 
- * You acknowledge that this software is not designed or intended for 
- * use in the design, construction, operation or maintenance of any 
- * nuclear facility. 
- *
- * $Revision: 1.2 $
- * $Date: 2006/07/14 21:43:57 $
- * $State: Exp $
- */
-package com.sun.media.jai.imageioimpl;
-
-import java.awt.Dimension;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.image.BufferedImage;
-import java.awt.image.ColorModel;
-import java.awt.image.Raster;
-import java.awt.image.SampleModel;
-import java.awt.image.WritableRaster;
-import java.io.InputStream;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.Map;
-import javax.imageio.ImageReader;
-import javax.imageio.ImageReadParam;
-import javax.imageio.ImageTypeSpecifier;
-import javax.imageio.metadata.IIOMetadata;
-import javax.imageio.spi.ImageReaderSpi;
-import javax.imageio.stream.ImageInputStream;
-import javax.media.jai.ImageLayout;
-import javax.media.jai.OpImage;
-import com.sun.media.jai.operator.ImageReadDescriptor;
-
-/**
- * Implementation of the <code>OpImage</code> of the "ImageRead" operation.
- */
-final class ImageReadOpImage extends OpImage {
-
-    /**
-     * XXX For testing only.
-     */
-    /* XXX
-    public static void main(String[] args) throws Throwable {
-        java.io.File file = new java.io.File(args[0]);
-        int imageIndex = args.length > 1 ?
-            Integer.valueOf(args[1]).intValue() : 0;
-        int tileSize = args.length > 2 ?
-            Integer.valueOf(args[2]).intValue() : 128;
-
-        javax.imageio.stream.ImageInputStream stream =
-            new javax.imageio.stream.FileImageInputStream(file);
-
-        Iterator iter = javax.imageio.ImageIO.getImageReaders(stream);
-        ImageReader imageReader = (ImageReader)iter.next();
-        imageReader.setInput(stream,
-                             true, // seekForwardOnly
-                             false); // ignoreMetadata
-
-        ImageLayout layout = new ImageLayout();
-        layout.setTileWidth(tileSize).setTileHeight(tileSize);
-        //layout.setTileGridXOffset(42).setTileGridYOffset(7);
-
-        ImageReadParam param = imageReader.getDefaultReadParam();
-        param.setSourceSubsampling(2, 2, 0, 0);
-        param.setSourceRegion(new Rectangle(128, 0, 256, 256));
-        param.setSourceBands(new int[] {2, 1, 0});
-        param.setDestinationBands(new int[] {0, 1, 2});
-
-        OpImage image = new ImageReadOpImage(layout, // ImageLayout
-                                             null, // Map
-                                             param, // ImageReadParam
-                                             imageReader,
-                                             imageIndex,
-                                             true,
-                                             null); // streamToClose
-
-        System.out.println(new ImageLayout(image));
-
-        System.out.println("\nImage Properties:");
-        String[] propNames = image.getPropertyNames();
-        if(propNames != null) {
-            for(int i = 0; i < propNames.length; i++) {
-                System.out.println(i+" "+propNames[i]+" = "+
-                                   image.getProperty(propNames[i]));
-            }
-        }
-        System.out.println("");
-
-        BufferedImage[] thumbnails = null;
-        Object thumbnailProp =
-            image.getProperty(ImageReadDescriptor.PROPERTY_NAME_THUMBNAILS);
-        if(thumbnailProp != java.awt.Image.UndefinedProperty) {
-            thumbnails = (BufferedImage[])thumbnailProp;
-        }
-
-        java.awt.Frame frame =
-            new java.awt.Frame("ImageReadOpImage Test: "+file);
-        if(thumbnails != null) {
-            frame.setLayout(new java.awt.GridLayout(1, thumbnails.length+1));
-        }
-
-        frame.add(new javax.media.jai.widget.ScrollingImagePanel(image,
-                                                                 image.getWidth(),
-                                                                 image.getHeight()));
-        if(thumbnails != null) {
-            for(int i= 0; i < thumbnails.length; i++) {
-                frame.add(new javax.media.jai.widget.ScrollingImagePanel(thumbnails[i],
-                                                                         thumbnails[i].getWidth(),
-                                                                         thumbnails[i].getHeight()));
-            }
-        }
-        frame.pack();
-        frame.show();
-    }
-    */
-
-    /**
-     * The <code>ImageReadParam</code> used in reading the image.
-     */
-    private ImageReadParam param;
-
-    /**
-     * The <code>ImageReader</code> used to read the image.
-     */
-    private ImageReader reader;
-
-    /**
-     * The index of the image to be read.
-     */
-    private int imageIndex;
-
-    /**
-     * Whether thumbnails are to be read.
-     */
-    private boolean readThumbnails;
-
-    /**
-     * Whether stream metadata have been be read.
-     */
-    private boolean streamMetadataRead = false;
-
-    /**
-     * Whether image metadata have been be read.
-     */
-    private boolean imageMetadataRead = false;
-
-    /**
-     * A stream to be closed when the instance is disposed; may be null.
-     */
-    private ImageInputStream streamToClose;
-
-    /**
-     * Destination to source X scale factor.
-     */
-    private int scaleX;
-
-    /**
-     * Destination to source Y scale factor.
-     */
-    private int scaleY;
-
-    /**
-     * Destination to source X translation factor.
-     */
-    private int transX;
-
-    /**
-     * Destination to source Y translation factor.
-     */
-    private int transY;
-
-    /**
-     * Derive the image layout based on the user-supplied layout,
-     * reading parameters, and image index.
-     */
-    private static ImageLayout layoutHelper(ImageLayout il,
-                                            ImageReadParam param,
-                                            ImageReader reader,
-                                            int imageIndex)
-        throws IOException {
-        ImageLayout layout = (il == null) ?
-            new ImageLayout() : (ImageLayout)il.clone();
-
-        // --- Determine the image type. ---
-
-        // If not provided in the original layout, set the SampleModel
-        // and ColorModel from the ImageReadParam, if supplied.
-        if(!layout.isValid(ImageLayout.SAMPLE_MODEL_MASK) &&
-           !layout.isValid(ImageLayout.COLOR_MODEL_MASK)) {
-            // If an ImageReadParam has been supplied and has its
-            // destinationType set then use it. Otherwise default to
-            // the raw image type.
-            ImageTypeSpecifier imageType =
-                (param != null && param.getDestinationType() != null) ?
-                param.getDestinationType() :
-                reader.getRawImageType(imageIndex);
-
-            // XXX The following block of code should not be necessary
-            // but for J2SE 1.4.0 FCS ImageReader.getRawImageType(0)
-            // returns null for earth.jpg, Bas-noir.jpg, etc.
-            if(imageType == null) {
-                Iterator imageTypes = reader.getImageTypes(imageIndex);
-                while(imageType == null && imageTypes.hasNext()) {
-                    imageType = (ImageTypeSpecifier)imageTypes.next();
-                }
-            }
-
-            // XXX Should an exception be thrown if imageType is null?
-            if(imageType != null) {
-                // Set the SampleModel and ColorModel.
-                layout.setSampleModel(imageType.getSampleModel());
-                layout.setColorModel(imageType.getColorModel());
-            }
-        }
-
-        // --- Set up the destination bounds. ---
-
-        // Calculate the computable destination bounds.
-        Dimension sourceSize = getSourceSize(param, reader, imageIndex);
-        Rectangle srcRegion = new Rectangle();
-        Rectangle destRegion = new Rectangle();
-        computeRegions(param,
-                       sourceSize.width,
-                       sourceSize.height,
-                       layout.getMinX(null), // valid value or 0
-                       layout.getMinY(null), // valid value or 0
-                       false,
-                       srcRegion,
-                       destRegion);
-
-        if(!destRegion.isEmpty()) {
-           // Backup layout image bounds with computable bounds.
-           if(!layout.isValid(ImageLayout.WIDTH_MASK)) {
-               layout.setWidth(destRegion.width);
-           }
-           if(!layout.isValid(ImageLayout.HEIGHT_MASK)) {
-               layout.setHeight(destRegion.height);
-           }
-           if(!layout.isValid(ImageLayout.MIN_X_MASK)) {
-               layout.setMinX(destRegion.x);
-           }
-           if(!layout.isValid(ImageLayout.MIN_Y_MASK)) {
-               layout.setMinY(destRegion.y);
-           }
-
-           // Ensure the layout bounds intersect computable bounds.
-           Rectangle destBounds = new Rectangle(layout.getMinX(null),
-                                                layout.getMinY(null),
-                                                layout.getWidth(null),
-                                                layout.getHeight(null));
-           if(destRegion.intersection(destBounds).isEmpty()) {
-               throw new IllegalArgumentException
-                   (I18N.getString("ImageReadOpImage0"));
-           }
-        }
-
-        // --- Set up the tile grid. ---
-
-        if(!layout.isValid(ImageLayout.TILE_GRID_X_OFFSET_MASK)) {
-            layout.setTileGridXOffset(reader.getTileGridXOffset(imageIndex));
-        }
-        if(!layout.isValid(ImageLayout.TILE_GRID_Y_OFFSET_MASK)) {
-            layout.setTileGridYOffset(reader.getTileGridYOffset(imageIndex));
-        }
-        if(!layout.isValid(ImageLayout.TILE_WIDTH_MASK)) {
-            layout.setTileWidth(reader.getTileWidth(imageIndex));
-        }
-        if(!layout.isValid(ImageLayout.TILE_HEIGHT_MASK)) {
-            layout.setTileHeight(reader.getTileHeight(imageIndex));
-        }
-
-        return layout;
-    }
-
-    /**
-     * Returns whether an <code>ImageTypeSpecifier</code> may be used
-     * to read in the image at a specified index.
-     *
-     * XXX
-     */
-    private static boolean isCompatibleType(ImageTypeSpecifier imageType,
-                                            ImageReader reader,
-                                            int imageIndex)
-        throws IOException {
-        Iterator imageTypes = reader.getImageTypes(imageIndex);
-
-        boolean foundIt = false;
-        while (imageTypes.hasNext()) {
-            ImageTypeSpecifier type =
-                (ImageTypeSpecifier)imageTypes.next();
-            if (type.equals(imageType)) {
-                foundIt = true;
-                break;
-            }
-        }
-
-        return foundIt;
-    }
-
-    /**
-     * Returns the source region to be read. If the sourceRenderSize
-     * is being used it is returned; otherwise the raw source dimensions
-     * are returned.
-     *
-     * XXX
-     */
-    private static Dimension getSourceSize(ImageReadParam param,
-                                           ImageReader reader,
-                                           int imageIndex)
-        throws IOException {
-        Dimension sourceSize = null;
-        if(param != null && param.canSetSourceRenderSize()) {
-            sourceSize = param.getSourceRenderSize();
-        }
-        if(sourceSize == null) {
-            sourceSize = new Dimension(reader.getWidth(imageIndex),
-                                       reader.getHeight(imageIndex));
-        }
-        return sourceSize;
-    }
-
-    /**
-     * XXX
-     */
-    // Code copied from ImageReader.java
-    private static Rectangle getSourceRegion(ImageReadParam param,
-                                             int srcWidth,
-                                             int srcHeight) {
-        Rectangle sourceRegion = new Rectangle(0, 0, srcWidth, srcHeight);
-        if (param != null) {
-            Rectangle region = param.getSourceRegion();
-            if (region != null) {
-                sourceRegion = sourceRegion.intersection(region);
-            }
-
-            int subsampleXOffset = param.getSubsamplingXOffset();
-            int subsampleYOffset = param.getSubsamplingYOffset();
-            sourceRegion.x += subsampleXOffset;
-            sourceRegion.y += subsampleYOffset;
-            sourceRegion.width -= subsampleXOffset;
-            sourceRegion.height -= subsampleYOffset;
-        }
-
-        return sourceRegion;
-    }
-
-    /**
-     * XXX
-     */
-    // clipDestRegion: whether to clip destRegion to positive coordinates.
-    // Code based on method of same name in ImageReader.java
-    private static void computeRegions(ImageReadParam param,
-                                       int srcWidth,
-                                       int srcHeight,
-                                       int destMinX,
-                                       int destMinY,
-                                       boolean clipDestRegion,
-                                       Rectangle srcRegion,
-                                       Rectangle destRegion) {
-        if (srcRegion == null) {
-            throw new IllegalArgumentException("srcRegion == null");
-        }
-        if (destRegion == null) {
-            throw new IllegalArgumentException("destRegion == null");
-        }
-
-        // Start with the entire source image
-        srcRegion.setBounds(0, 0, srcWidth, srcHeight);
-
-        // Destination also starts with source image, as that is the
-        // maximum extent if there is no subsampling
-        destRegion.setBounds(destMinX, destMinY, srcWidth, srcHeight);
-
-        // Clip that to the param region, if there is one
-        int periodX = 1;
-        int periodY = 1;
-        int gridX = 0;
-        int gridY = 0;
-        if (param != null) {
-            Rectangle paramSrcRegion = param.getSourceRegion();
-            if (paramSrcRegion != null) {
-                srcRegion.setBounds(srcRegion.intersection(paramSrcRegion));
-            }
-            periodX = param.getSourceXSubsampling();
-            periodY = param.getSourceYSubsampling();
-            gridX = param.getSubsamplingXOffset();
-            gridY = param.getSubsamplingYOffset();
-            srcRegion.translate(gridX, gridY);
-            srcRegion.width -= gridX;
-            srcRegion.height -= gridY;
-            Point destinationOffset = param.getDestinationOffset();
-            destRegion.translate(destinationOffset.x, destinationOffset.y);
-        }
-        
-        if(clipDestRegion) {
-            // Now clip any negative destination offsets, i.e. clip
-            // to the top and left of the destination image
-            if (destRegion.x < 0) {
-                int delta = -destRegion.x*periodX;
-                srcRegion.x += delta;
-                srcRegion.width -= delta;
-                destRegion.x = 0;
-            }
-            if (destRegion.y < 0) {
-                int delta = -destRegion.y*periodY;
-                srcRegion.y += delta;
-                srcRegion.height -= delta;
-                destRegion.y = 0;
-            }
-        }
-
-        // Now clip the destination Region to the subsampled width and height
-        int subsampledWidth = (srcRegion.width + periodX - 1)/periodX;
-        int subsampledHeight = (srcRegion.height + periodY - 1)/periodY;
-        destRegion.width = subsampledWidth;
-        destRegion.height = subsampledHeight;
-
-        if (srcRegion.isEmpty() || destRegion.isEmpty()) {
-            throw new IllegalArgumentException
-                (I18N.getString("ImageReadOpImage1"));
-        }
-    }
-
-    /**
-     * XXX
-     * NB: This class may reset the following fields of the ImageReadParam
-     *     destinationOffset
-     *     destinationType
-     *     sourceRegion
-     */
-    ImageReadOpImage(ImageLayout layout,
-                     Map configuration,
-                     ImageReadParam param,
-                     ImageReader reader,
-                     int imageIndex,
-                     boolean readThumbnails,
-                     ImageInputStream streamToClose) throws IOException {
-        super(null,
-              layoutHelper(layout, param, reader, imageIndex),
-              configuration,
-              false);
-
-        // Revise parameter 'param' as needed.
-        if(param == null) {
-            // Get the ImageReadParam from the ImageReader.
-            param = reader.getDefaultReadParam();
-        } else if(param instanceof Cloneable) {
-            this.param = param;
-        } else if(param.getClass().getName().equals(
-                      "javax.imageio.ImageReadParam")) {
-            // The ImageReadParam passed in is non-null. As the
-            // ImageReadParam class is not Cloneable, if the param
-            // class is simply ImageReadParam, then create a new
-            // ImageReadParam instance and set all its fields
-            // which were set in param. This will eliminate problems
-            // with concurrent modification of param for the cases
-            // in which there is not a special ImageReadparam used.
-
-            // Create a new ImageReadParam instance.
-            ImageReadParam newParam = new ImageReadParam();
-
-            // Set all fields which need to be set.
-
-            // IIOParamController field.
-            if(param.hasController()) {
-                newParam.setController(param.getController());
-            }
-
-            // Destination fields.
-            newParam.setDestination(param.getDestination());
-            if(param.getDestinationType() != null) {
-                // Set the destination type only if non-null as the
-                // setDestinationType() clears the destination field.
-                newParam.setDestinationType(param.getDestinationType());
-            }
-            newParam.setDestinationBands(param.getDestinationBands());
-            newParam.setDestinationOffset(param.getDestinationOffset());
-
-            // Source fields.
-            newParam.setSourceBands(param.getSourceBands());
-            newParam.setSourceRegion(param.getSourceRegion());
-            if(param.getSourceMaxProgressivePass() != Integer.MAX_VALUE) {
-                newParam.setSourceProgressivePasses(
-                    param.getSourceMinProgressivePass(),
-                    param.getSourceNumProgressivePasses());
-            }
-            if(param.canSetSourceRenderSize()) {
-                newParam.setSourceRenderSize(param.getSourceRenderSize());
-            }
-            newParam.setSourceSubsampling(param.getSourceXSubsampling(),
-                                          param.getSourceYSubsampling(),
-                                          param.getSubsamplingXOffset(),
-                                          param.getSubsamplingYOffset());
-
-            // Replace the local variable with the new ImageReadParam.
-            param = newParam;
-        }
-
-        // Revise parameter 'readThumbnails' as needed.
-        if(readThumbnails && !reader.hasThumbnails(imageIndex)) {
-            // Unset thumbnail flag if not supported by ImageReader.
-            readThumbnails = false;
-        }
-
-        // Set instance variables from (possibly revised) parameters.
-        this.param = param;
-        this.reader = reader;
-        this.imageIndex = imageIndex;
-        this.readThumbnails = readThumbnails;
-        this.streamToClose = streamToClose;
-
-        // If an ImageTypeSpecifier is specified in the ImageReadParam
-        // but it is incompatible with the ImageReader, then attempt to
-        // replace it with a compatible one derived from this image.
-        if(param.getDestinationType() != null &&
-           !isCompatibleType(param.getDestinationType(), reader, imageIndex) &&
-           sampleModel != null && colorModel != null) {
-            ImageTypeSpecifier newImageType =
-                new ImageTypeSpecifier(colorModel,  sampleModel);
-            if(isCompatibleType(newImageType, reader, imageIndex)) {
-                param.setDestinationType(newImageType);
-            }
-        }
-
-        // --- Compute the destination to source mapping coefficients. ---
-
-        Dimension sourceSize = getSourceSize(param, reader, imageIndex);
-
-        Rectangle srcRegion = getSourceRegion(param,
-                                              sourceSize.width,
-                                              sourceSize.height);
-
-        Point destinationOffset = this.param.getDestinationOffset();
-
-        this.scaleX = this.param.getSourceXSubsampling();
-        this.scaleY = this.param.getSourceYSubsampling();
-        this.transX =
-            srcRegion.x + this.param.getSubsamplingXOffset() -
-            this.param.getSourceXSubsampling()*(minX + destinationOffset.x);
-        this.transY =
-            srcRegion.y + this.param.getSubsamplingYOffset() -
-            this.param.getSourceYSubsampling()*(minY + destinationOffset.y);
-
-        // Replace the original destination offset with (0,0) as the
-        // destination-to-source mapping assimilates this value.
-        this.param.setDestinationOffset(new Point());
-        // XXX Need to unset other ImageReadParam settings either here
-        // or in computeTile(). Examine this issue taking into account
-        // synchronization.
-
-        // Set the ImageReadParam property.
-        setProperty(ImageReadDescriptor.PROPERTY_NAME_IMAGE_READ_PARAM, param);
-
-        // Set the ImageReader property.
-        setProperty(ImageReadDescriptor.PROPERTY_NAME_IMAGE_READER, reader);
-
-        // If metadata are being read, set the value of the metadata
-        // properties to UndefinedProperty so that the property
-        // names will appear in the array of property names. The actual
-        // values will be retrieved when getProperty() is invoked.
-        if(!reader.isIgnoringMetadata()) {
-            // Get the service provider interface, if any.
-            ImageReaderSpi provider = reader.getOriginatingProvider();
-
-            // Stream metadata.
-            if(provider == null ||
-               provider.isStandardStreamMetadataFormatSupported() ||
-               provider.getNativeStreamMetadataFormatName() != null) {
-                // Assume an ImageReader with a null provider supports
-                // stream metadata.
-                setProperty(ImageReadDescriptor.PROPERTY_NAME_METADATA_STREAM,
-                            java.awt.Image.UndefinedProperty);
-            } else {
-                // Provider supports neither standard nor native stream
-                // metadata so set flag to suppress later reading attempt.
-                streamMetadataRead = true;
-            }
-
-            // Image metadata.
-            if(provider == null ||
-               provider.isStandardImageMetadataFormatSupported() ||
-               provider.getNativeImageMetadataFormatName() != null) {
-                // Assume an ImageReader with a null provider supports
-                // image metadata.
-                setProperty(ImageReadDescriptor.PROPERTY_NAME_METADATA_IMAGE,
-                            java.awt.Image.UndefinedProperty);
-            } else {
-                // Provider supports neither standard nor native image
-                // metadata so set flag to suppress later reading attempt.
-                imageMetadataRead = true;
-            }
-        }
-
-        // If thumbnail read flag is set, set the value of the thumbnail
-        // property to UndefinedProperty so that the thumbnail property
-        // name will appear in the array of property names. The actual
-        // value will be retrieved when getProperty() is invoked.
-        if(readThumbnails && reader.readerSupportsThumbnails()) {
-            setProperty(ImageReadDescriptor.PROPERTY_NAME_THUMBNAILS,
-                        java.awt.Image.UndefinedProperty);
-        }
-    }
-
-    /**
-     * Returns false as ImageReaders might return Rasters
-     * via computeTile() tile that are internally cached.
-     */
-    public boolean computesUniqueTiles() {
-        return false;
-    }
-
-    /**
-     * XXX
-     */
-    private Rectangle computeSourceRect(Rectangle destRect) {
-        Rectangle sourceRect = new Rectangle();
-
-        sourceRect.x = scaleX*destRect.x + transX;
-        sourceRect.y = scaleY*destRect.y + transY;
-
-        sourceRect.width =
-            scaleX*(destRect.x + destRect.width) + transX - sourceRect.x;
-        sourceRect.height =
-            scaleY*(destRect.y + destRect.height) + transY - sourceRect.y;
-
-        return sourceRect;
-    }
-
-    /**
-     * Computes a tile.
-     *
-     * @param tileX The X index of the tile.
-     * @param tileY The Y index of the tile.
-     */
-    public Raster computeTile(int tileX, int tileY) {
-        //XXX System.out.println("Tile ("+tileX+","+tileY+")");
-        // Create a new WritableRaster to represent this tile.
-        Point org = new Point(tileXToX(tileX), tileYToY(tileY));
-        //WritableRaster dest = Raster.createWritableRaster(sampleModel, org);
-        Rectangle rect = new Rectangle(org.x, org.y, tileWidth, tileHeight);
-
-        // Clip output rectangle to image bounds.
-        // Not sure what will happen here with the bounds intersection.
-        Rectangle destRect = rect.intersection(getBounds());
-        // XXX Check for destRect.isEmpty()?
-
-        /* XXX delete
-        java.awt.geom.AffineTransform transform =
-            new java.awt.geom.AffineTransform(scaleX, 0, 0, scaleY,
-                                              transX, transY);
-        */
-        Rectangle srcRect =
-            computeSourceRect(destRect);
-            /* XXX delete
-            transform.createTransformedShape(destRect).getBounds();
-            */
-
-        WritableRaster readerTile = null;
-        try {
-            synchronized(reader) {
-                param.setSourceRegion(srcRect);
-                BufferedImage bi = reader.read(imageIndex, param);
-                WritableRaster ras = bi.getRaster();
-                readerTile = ras.createWritableChild(0, 0,
-                                                     ras.getWidth(),
-                                                     ras.getHeight(),
-                                                     org.x, org.y,
-                                                     null);
-            }
-        } catch(IOException e) {
-            throw new RuntimeException(e);
-        }
-
-        WritableRaster tile = null;
-        if(sampleModel == readerTile.getSampleModel()) {
-            tile = readerTile;
-        } else {
-            // XXX As this method is synchronized, could a single
-            // destination be supplied to the reader instead of
-            // creating a new one?
-            tile = Raster.createWritableRaster(sampleModel, org);
-            tile.setRect(readerTile);
-        }
-
-        return tile;
-    }
-    
-    /**
-     * Throws an IllegalArgumentException since the image has no image
-     * sources.
-     *
-     * @param sourceRect ignored.
-     * @param sourceIndex ignored.
-     *
-     * @throws IllegalArgumentException since the image has no sources.
-     */
-    public Rectangle mapSourceRect(Rectangle sourceRect,
-                                   int sourceIndex) {
-        throw new IllegalArgumentException
-            (I18N.getString("ImageReadOpImage2"));
-    }
-    
-    /**
-     * Throws an IllegalArgumentException since the image has no image
-     * sources.
-     *
-     * @param destRect ignored.
-     * @param sourceIndex ignored.
-     *
-     * @throws IllegalArgumentException since the image has no sources.
-     */
-    public Rectangle mapDestRect(Rectangle destRect,
-                                 int sourceIndex) {
-        throw new IllegalArgumentException
-            (I18N.getString("ImageReadOpImage2"));
-    }
-
-    /**
-     * Gets a property from the property set of this image.  If the
-     * property name is not recognized,
-     * <code>java.awt.Image.UndefinedProperty</code> will be returned.
-     *
-     * <p>This implementation first attempts to retrieve the property
-     * using the equivalent superclass method.  If the returned value
-     * is not a valid property value, the requested property name is
-     * that of the image thumbnails property, the stream metadata
-     * property, or the image metadata property, and there has been no
-     * prior attempt to read the corresponding property value, then its
-     * reads the value and set the property.  This implementation therefore
-     * defers reading of the image thumbnails, stream metadata, and image
-     * metadata values until the correpsonding property is actually
-     * requested.</p>
-     *
-     * @param name the name of the property to get, as a <code>String</code>.
-     *
-     * @return A reference to the property <code>Object</code>, or the value
-     *         <code>java.awt.Image.UndefinedProperty</code>.
-     *
-     * @exception IllegalArgumentException if <code>propertyName</code>
-     *                                     is <code>null</code>.
-     */
-    public Object getProperty(String name) {
-        // Attempt to get property from superclass method.
-        Object property = super.getProperty(name);
-
-        // If thumbnail property name with undefined value and thumbnails
-        // are being read and an attempt to read them has not already been
-        // made, then read the thumbnails and set the property.
-        if((property == null ||
-            property == java.awt.Image.UndefinedProperty)) {
-
-            // Thumbnails
-            if(readThumbnails &&
-               name.equalsIgnoreCase(
-                   ImageReadDescriptor.PROPERTY_NAME_THUMBNAILS)) {
-
-                // Lock the class to avoid a race condition here
-                // and with computeTile().
-                synchronized(reader) {
-                    // First re-check the flag in case another thread
-                    // got here first.
-                    if(readThumbnails) {
-                        try {
-                            // Get number of thumbnails.
-                            int numThumbnails =
-                                reader.getNumThumbnails(imageIndex);
-
-                            if(numThumbnails > 0) {
-                                // Read all thumbnails.
-                                BufferedImage[] thumbnails =
-                                    new BufferedImage[numThumbnails];
-                                for(int i = 0; i < numThumbnails; i++) {
-                                    thumbnails[i] =
-                                        reader.readThumbnail(imageIndex, i);
-                                }
-
-                                // Set thumbnail property.
-                                setProperty(
-                                  ImageReadDescriptor.PROPERTY_NAME_THUMBNAILS,
-                                  thumbnails);
-
-                                // Update return value.
-                                property = thumbnails;
-                            }
-                        } catch(IOException e) {
-                            throw new RuntimeException(e);
-                        } finally {
-                            // If return value is somehow null set it
-                            // to UndefinedProperty.
-                            if(property == null) {
-                                property = java.awt.Image.UndefinedProperty;
-                            }
-
-                            // Unset thumbnail flag to avert subsequent
-                            // reading attempts in case this one failed.
-                            readThumbnails = false;
-                        }
-                    }
-                }
-            } else if(!reader.isIgnoringMetadata() &&
-                      ((!streamMetadataRead &&
-                        name.equalsIgnoreCase(
-                         ImageReadDescriptor.PROPERTY_NAME_METADATA_STREAM)) ||
-                       (!imageMetadataRead &&
-                        name.equalsIgnoreCase(
-                         ImageReadDescriptor.PROPERTY_NAME_METADATA_IMAGE)))) {
-
-                // Lock the class to avoid a race condition here
-                // and with computeTile().
-                synchronized(reader) {
-
-                    // Set flag to indicate stream or image metadata.
-                    boolean isStreamMetadata =
-                        name.equalsIgnoreCase(
-                            ImageReadDescriptor.PROPERTY_NAME_METADATA_STREAM);
-
-                    // Recheck the appropriate flag.
-                    if(!(isStreamMetadata ?
-                         streamMetadataRead : imageMetadataRead)) {
-
-                        // Set property name.
-                        String propertyName = isStreamMetadata ?
-                            ImageReadDescriptor.PROPERTY_NAME_METADATA_STREAM :
-                            ImageReadDescriptor.PROPERTY_NAME_METADATA_IMAGE;
-
-                        IIOMetadata metadata = null;
-                        try {
-                            // Read metadata.
-                            metadata = isStreamMetadata ?
-                                reader.getStreamMetadata() :
-                                reader.getImageMetadata(imageIndex);
-
-                            // Set metadata property.
-                            if(metadata != null) {
-                                setProperty(propertyName, metadata);
-                            }
-
-                            // Update return value.
-                            property = metadata;
-                        } catch(IOException e) {
-                            throw new RuntimeException(e);
-                        } finally {
-                            // If return value is somehow null set it
-                            // to UndefinedProperty.
-                            if(property == null) {
-                                property = java.awt.Image.UndefinedProperty;
-                            }
-
-                            // Set appropriate flag to avert subsequent
-                            // reading attempts in case this one failed.
-                            if(isStreamMetadata) {
-                                streamMetadataRead = true;
-                            } else {
-                                imageMetadataRead = true;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return property;
-    }
-
-    /**
-     * Closes an <code>ImageInputStream</code> passed in, if any.
-     */
-    public void dispose() {
-        if(streamToClose != null) {
-            try {
-                streamToClose.close();
-            } catch(IOException e) {
-                // Ignore it.
-            }
-        }
-
-        super.dispose();
-    }
-}
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/ImageReadWriteSpi.java zzx2/src/share/classes/com/sun/media/jai/imageioimpl/ImageReadWriteSpi.java
--- jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/ImageReadWriteSpi.java	2005-02-11 00:01:55.000000000 -0500
+++ zzx2/src/share/classes/com/sun/media/jai/imageioimpl/ImageReadWriteSpi.java	1969-12-31 19:00:00.000000000 -0500
@@ -1,142 +0,0 @@
-/*
- * $RCSfile: ImageReadWriteSpi.java,v $
- *
- * 
- * Copyright (c) 2005 Sun Microsystems, Inc. All  Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met: 
- * 
- * - Redistribution of source code must retain the above copyright 
- *   notice, this  list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the
- *   distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of 
- * contributors may be used to endorse or promote products derived 
- * from this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any 
- * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 
- * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
- * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL 
- * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF 
- * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
- * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR 
- * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
- * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
- * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
- * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES. 
- * 
- * You acknowledge that this software is not designed or intended for 
- * use in the design, construction, operation or maintenance of any 
- * nuclear facility. 
- *
- * $Revision: 1.1 $
- * $Date: 2005/02/11 05:01:55 $
- * $State: Exp $
- */
-package com.sun.media.jai.imageioimpl;
-
-import java.awt.image.renderable.ContextualRenderedImageFactory;
-import javax.media.jai.CollectionImageFactory;
-import javax.media.jai.OperationDescriptor;
-import javax.media.jai.OperationRegistry;
-import javax.media.jai.OperationRegistrySpi;
-import com.sun.media.jai.operator.ImageReadDescriptor;
-import com.sun.media.jai.operator.ImageWriteDescriptor;
-import javax.media.jai.registry.CollectionRegistryMode;
-import javax.media.jai.registry.RenderableRegistryMode;
-import javax.media.jai.registry.RenderedRegistryMode;
-
-/**
- * {@link OperationRegistrySpi} implementation to register the "ImageRead"
- * and "ImageWrite" operations and their associated image factories.
- */
-public class ImageReadWriteSpi implements OperationRegistrySpi {
-
-    /** The name of the product to which these operations belong. */
-    private String productName = "com.sun.media.jai";
- 
-    /** Default constructor. */
-    public ImageReadWriteSpi() {}
-
-    /**
-     * Registers the "ImageRead" and "ImageWrite" operations and their
-     * associated image factories across all supported operation modes.
-     * An {@link OperationDescriptor} is created for each operation and
-     * registered with the supplied {@link OperationRegistry}. An image
-     * factory is then created for each supported mode of each operation
-     * registered for that operation with the registry.
-     *
-     * @param registry The registry with which to register the operations
-     * and their factories.
-     */
-    public void updateRegistry(OperationRegistry registry) {
-        // Create the "ImageRead" descriptor instance.
-        OperationDescriptor readDescriptor = new ImageReadDescriptor();
-
-        // Register the "ImageRead" descriptor.
-        registry.registerDescriptor(readDescriptor);
-
-        // Create the "ImageRead" CRIF.
-        ContextualRenderedImageFactory readCRIF = new ImageReadCRIF();
-
-        // Get the "ImageRead" operation name.
-        String imageReadName = readDescriptor.getName();
-
-        // Register the "ImageRead" factory for rendered mode.
-        registry.registerFactory(RenderedRegistryMode.MODE_NAME,
-                                 imageReadName,
-                                 productName,
-                                 readCRIF);
-
-        // Register the "ImageRead" factory for renderable mode.
-        registry.registerFactory(RenderableRegistryMode.MODE_NAME,
-                                 imageReadName,
-                                 productName,
-                                 readCRIF);
-
-        // Create and register the "ImageRead" factory for collection mode.
-        registry.registerFactory(CollectionRegistryMode.MODE_NAME,
-                                 imageReadName,
-                                 productName,
-                                 new ImageReadCIF());
-
-        // Create the "ImageWrite" descriptor instance.
-        OperationDescriptor writeDescriptor = new ImageWriteDescriptor();
-
-        // Register the "ImageWrite" descriptor.
-        registry.registerDescriptor(writeDescriptor);
-
-        // Create the "ImageWrite" CRIF.
-        ContextualRenderedImageFactory writeCRIF = new ImageWriteCRIF();
-
-        // Get the "ImageWrite" operation name.
-        String imageWriteName = writeDescriptor.getName();
-
-        // Register the "ImageWrite" factory for rendered mode.
-        registry.registerFactory(RenderedRegistryMode.MODE_NAME,
-                                 imageWriteName,
-                                 productName,
-                                 writeCRIF);
-
-        // Register the "ImageWrite" factory for renderable mode.
-        registry.registerFactory(RenderableRegistryMode.MODE_NAME,
-                                 imageWriteName,
-                                 productName,
-                                 writeCRIF);
-
-        // Create and register the "ImageWrite" factory for collection mode.
-        registry.registerFactory(CollectionRegistryMode.MODE_NAME,
-                                 imageWriteName,
-                                 productName,
-                                 new ImageWriteCIF());
-    }
-}
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/ImageWriteCIF.java zzx2/src/share/classes/com/sun/media/jai/imageioimpl/ImageWriteCIF.java
--- jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/ImageWriteCIF.java	2005-02-11 00:01:55.000000000 -0500
+++ zzx2/src/share/classes/com/sun/media/jai/imageioimpl/ImageWriteCIF.java	1969-12-31 19:00:00.000000000 -0500
@@ -1,296 +0,0 @@
-/*
- * $RCSfile: ImageWriteCIF.java,v $
- *
- * 
- * Copyright (c) 2005 Sun Microsystems, Inc. All  Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met: 
- * 
- * - Redistribution of source code must retain the above copyright 
- *   notice, this  list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the
- *   distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of 
- * contributors may be used to endorse or promote products derived 
- * from this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any 
- * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 
- * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
- * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL 
- * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF 
- * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
- * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR 
- * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
- * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
- * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
- * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES. 
- * 
- * You acknowledge that this software is not designed or intended for 
- * use in the design, construction, operation or maintenance of any 
- * nuclear facility. 
- *
- * $Revision: 1.1 $
- * $Date: 2005/02/11 05:01:55 $
- * $State: Exp $
- */
-package com.sun.media.jai.imageioimpl;
-
-import java.awt.RenderingHints;
-import java.awt.image.BufferedImage;
-import java.awt.image.RenderedImage;
-import java.awt.image.renderable.ParameterBlock;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import javax.imageio.ImageIO;
-import javax.imageio.ImageWriteParam;
-import javax.imageio.ImageWriter;
-import javax.imageio.metadata.IIOMetadata;
-import javax.imageio.stream.ImageOutputStream;
-import javax.media.jai.CollectionImage;
-import javax.media.jai.CollectionImageFactory;
-import javax.media.jai.CollectionOp;
-import javax.media.jai.PropertySource;
-import com.sun.media.jai.operator.ImageWriteDescriptor;
-
-public final class ImageWriteCIF implements CollectionImageFactory {
-    /** Constructor. */
-    public ImageWriteCIF() {}
-
-    public CollectionImage create(ParameterBlock args,
-                                  RenderingHints hints) {
-
-        // Get the writer.
-        ImageWriter writer = (ImageWriter)args.getObjectParameter(13);
-
-        // Find a writer if null.
-        if(writer == null) {
-            // Get the format. Should be non-null from OperationDescriptor.
-            String format = (String)args.getObjectParameter(1);
-
-            // Find a writer.
-            Iterator writers = ImageIO.getImageWritersByFormatName(format);
-
-            // Get the writer.
-            if(writers != null) {
-                writer = (ImageWriter)writers.next();
-            } else {
-                throw new RuntimeException
-                    (I18N.getString("ImageWriteCIF0")+" "+format);
-            }
-        }
-
-        // Get the source Collection.
-        Collection collection = (Collection)args.getSource(0);
-
-        // Determine the number of RenderedImages in the Collection.
-        int numRenderedImages = 0;
-        Iterator iter = collection.iterator();
-        while(iter.hasNext()) {
-            if(iter.next() instanceof RenderedImage) {
-                numRenderedImages++;
-            }
-        }
-
-        // Set the sequence flag.
-        boolean writeToSequence = writer.canWriteSequence();
-
-        // Check that the writer can write sequences.
-        if(numRenderedImages > 1 && !writeToSequence) {
-            throw new RuntimeException
-                (I18N.getString("ImageWriteCIF1"));
-        }
-
-        // Get the stream metadata.
-        IIOMetadata streamMetadata =
-            (IIOMetadata)args.getObjectParameter(7);
-
-        // Get the property use flag.
-        boolean useProperties =
-            ((Boolean)args.getObjectParameter(2)).booleanValue();
-
-        // If null, get stream metadata from source properties if allowed.
-        if(streamMetadata == null &&
-           useProperties &&
-           collection instanceof PropertySource) {
-            Object streamMetadataProperty =
-                ((PropertySource)collection).getProperty(
-                    ImageWriteDescriptor.PROPERTY_NAME_METADATA_STREAM);
-            if(streamMetadataProperty instanceof IIOMetadata) {
-                streamMetadata = (IIOMetadata)streamMetadataProperty;
-            }
-        }
-
-        // Get the writer parameters.
-        ImageWriteParam param = (ImageWriteParam)args.getObjectParameter(12);
-
-        // Transcode the stream metadata if requested.
-        if(streamMetadata != null) {
-            // Get the transcoding flag.
-            boolean transcode =
-                ((Boolean)args.getObjectParameter(3)).booleanValue();
-
-            if(transcode) {
-                // Overwrite the stream metadata with transcoded metadata.
-                streamMetadata =
-                    writer.convertStreamMetadata(streamMetadata,
-                                                 param);
-            }
-        }
-
-        if(writeToSequence) {
-            // Write the stream metadata to the sequence.
-            try {
-                // Get the output.
-                Object output = args.getObjectParameter(0);
-
-                // Try to get an ImageOutputStream.
-                ImageOutputStream stream =
-                    ImageWriteCRIF.getImageOutputStream(output);
-
-                // Set the writer's output.
-                writer.setOutput(stream != null ? stream : output);
-
-                // Prepare the sequence.
-                writer.prepareWriteSequence(streamMetadata);
-            } catch(IOException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        // Clone the ParameterBlock as the writer, image metadata, and
-        // thumbnail parameters will be replaced.
-        ParameterBlock imagePB = (ParameterBlock)args.clone();
-
-        // Clear the stream metadata.
-        imagePB.set(null, 7);
-
-        // Set the ImageWriter.
-        imagePB.set(writer, 13);
-
-        // Get the image metadata array.
-        IIOMetadata[] imageMetadata =
-            (IIOMetadata[])args.getObjectParameter(8);
-
-        // Get the thumbnail array.
-        BufferedImage[] thumbnails =
-            (BufferedImage[])args.getObjectParameter(9);
-
-        // Create a new Iterator.
-        iter = collection.iterator();
-
-        // Create an ImageIOCollectionImage to contain the result:
-        ImageIOCollectionImage imageList =
-            new ImageIOCollectionImage(collection.size());
-
-        // Iterate over the collection.
-        int imageIndex = 0;
-        while(iter.hasNext()) {
-            // Get the next element.
-            Object nextElement = iter.next();
-
-            // Process if a RenderedImage.
-            if(nextElement instanceof RenderedImage) {
-                // Replace source with current RenderedImage.
-                imagePB.setSource((RenderedImage)nextElement, 0);
-
-                // Replace image metadata.
-                if(imageMetadata != null) {
-                    imagePB.set(imageMetadata[imageIndex], 8);
-                }
-
-                // Replace thumbnail array.
-                if(thumbnails != null) {
-                    imagePB.set(thumbnails[imageIndex], 9);
-                }
-
-                // Write the image to the sequence
-                RenderedImage nextImage =
-                    ImageWriteCRIF.create(imageIndex,
-                                          writeToSequence,
-                                          imagePB, hints);
-
-                // If the ImageWriteParam passed in was null, replace it
-                // with the first non-null ImageWriteParam property value
-                // and set the value in the local ParameterBlock.
-                if(param == null) {
-                    Object paramPropertyValue =
-                        nextImage.getProperty(
-                        ImageWriteDescriptor.PROPERTY_NAME_IMAGE_WRITE_PARAM);
-
-                    if(paramPropertyValue instanceof ImageWriteParam) {
-                        param = (ImageWriteParam)paramPropertyValue;
-
-                        // Replace the ImageWriteParam so the CRIF doesn't
-                        // have to re-do the tile size initialization.
-                        imagePB.set(param, 12);
-                    }
-                }
-
-                // Add the image to the collection to be returned.
-                imageList.add(nextImage);
-
-                // Increment the index.
-                imageIndex++;
-            }
-        }
-
-        // Get the pixel replacement parameter.
-        boolean allowPixelReplacement =
-            ((Boolean)args.getObjectParameter(5)).booleanValue();
-
-        if(writeToSequence && !allowPixelReplacement) {
-            // Complete writing the sequence.
-            try {
-                // XXX What about pixel replacement? If this is invoked here
-                // it will not be possible. How can this be invoked such that
-                // pixel replacement can occur but the user is not obliged to
-                // call this method manually?
-                // Answer: document that the user must obtain the writer from
-                // the collection-level ImageWriter property and invoke
-                // endWriteSequence() on it.
-                writer.endWriteSequence();
-            } catch(IOException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        // Set collection-level properties.
-        if(param != null) {
-            imageList.setProperty(
-                ImageWriteDescriptor.PROPERTY_NAME_IMAGE_WRITE_PARAM,
-                param);
-        }
-        imageList.setProperty(
-            ImageWriteDescriptor.PROPERTY_NAME_IMAGE_WRITER,
-            writer);
-        if(streamMetadata != null) {
-            imageList.setProperty(
-                ImageWriteDescriptor.PROPERTY_NAME_METADATA_STREAM,
-                streamMetadata);
-        }
-
-        // Return CollectionImage.
-        return imageList;
-    }
-
-    // Forget it.
-    public CollectionImage update(ParameterBlock oldParamBlock,
-                                  RenderingHints oldHints,
-                                  ParameterBlock newParamBlock,
-                                  RenderingHints newHints,
-                                  CollectionImage oldRendering,
-                                  CollectionOp op) {
-        return null;
-    }
-}
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/ImageWriteCRIF.java zzx2/src/share/classes/com/sun/media/jai/imageioimpl/ImageWriteCRIF.java
--- jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/ImageWriteCRIF.java	2005-02-11 00:01:55.000000000 -0500
+++ zzx2/src/share/classes/com/sun/media/jai/imageioimpl/ImageWriteCRIF.java	1969-12-31 19:00:00.000000000 -0500
@@ -1,663 +0,0 @@
-/*
- * $RCSfile: ImageWriteCRIF.java,v $
- *
- * 
- * Copyright (c) 2005 Sun Microsystems, Inc. All  Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met: 
- * 
- * - Redistribution of source code must retain the above copyright 
- *   notice, this  list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the
- *   distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of 
- * contributors may be used to endorse or promote products derived 
- * from this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any 
- * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 
- * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
- * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL 
- * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF 
- * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
- * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR 
- * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
- * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
- * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
- * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES. 
- * 
- * You acknowledge that this software is not designed or intended for 
- * use in the design, construction, operation or maintenance of any 
- * nuclear facility. 
- *
- * $Revision: 1.1 $
- * $Date: 2005/02/11 05:01:55 $
- * $State: Exp $
- */
-package com.sun.media.jai.imageioimpl;
-
-import java.awt.Dimension;
-import java.awt.RenderingHints;
-import java.awt.image.BufferedImage;
-import java.awt.image.RenderedImage;
-import java.awt.image.renderable.ParameterBlock;
-import java.awt.image.renderable.RenderableImage;
-import java.awt.image.renderable.RenderContext;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.RandomAccessFile;
-import java.net.Socket;
-import java.util.Arrays;
-import java.util.EventListener;
-import java.util.Iterator;
-import java.util.Locale;
-import javax.imageio.IIOImage;
-import javax.imageio.ImageIO;
-import javax.imageio.ImageTypeSpecifier;
-import javax.imageio.ImageWriter;
-import javax.imageio.ImageWriteParam;
-import javax.imageio.event.IIOWriteProgressListener;
-import javax.imageio.event.IIOWriteWarningListener;
-import javax.imageio.metadata.IIOMetadata;
-import javax.imageio.stream.ImageOutputStream;
-import javax.media.jai.CRIFImpl;
-import javax.media.jai.PlanarImage;
-import javax.media.jai.RenderedImageAdapter;
-import javax.media.jai.WritablePropertySource;
-import com.sun.media.jai.operator.ImageWriteDescriptor;
-
-public final class ImageWriteCRIF extends CRIFImpl {
-    public static void main(String[] args) throws Throwable {
-        java.io.File inFile = new java.io.File(args[0]);
-        java.io.File outFile = new java.io.File(args[1]);
-        String format = args.length > 2 ? args[2] : "png";
-        String mode = args.length > 3 ? args[3] : "rendered";
-
-        int imageIndex = 0;
-
-        javax.imageio.stream.ImageInputStream inStream =
-            javax.imageio.ImageIO.createImageInputStream(inFile);
-
-        java.util.Iterator iter =
-            javax.imageio.ImageIO.getImageReaders(inStream);
-        javax.imageio.ImageReader reader =
-            (javax.imageio.ImageReader)iter.next();
-
-        reader.setInput(inStream);
-
-        RenderedImage image = reader.read(imageIndex);
-
-        javax.imageio.metadata.IIOMetadata streamMetadata =
-            reader.getStreamMetadata();
-        javax.imageio.metadata.IIOMetadata imageMetadata =
-            reader.getImageMetadata(imageIndex);
-
-        java.awt.image.BufferedImage[] thumbnails = null;
-        if(reader.hasThumbnails(imageIndex)) {
-            int numThumbnails = reader.getNumThumbnails(imageIndex);
-            thumbnails = new java.awt.image.BufferedImage[numThumbnails];
-            for(int i = 0; i < numThumbnails; i++) {
-                thumbnails[i] = reader.readThumbnail(imageIndex, i);
-            }
-        }
-
-        ImageWriteCRIF crif = new ImageWriteCRIF();
-
-        ParameterBlock pb = new ParameterBlock();
-
-        if(mode.equalsIgnoreCase("rendered")) {
-            pb.addSource(image);
-        } else if(mode.equalsIgnoreCase("renderable")) {
-            ParameterBlock renderablePB = new ParameterBlock();
-            renderablePB.addSource(image);
-            RenderableImage renderable =
-                javax.media.jai.JAI.createRenderable("renderable",
-                                                     renderablePB);
-            pb.addSource(renderable);
-        }
-
-        pb.add(outFile); // Output
-        pb.add(format); // Format
-
-        pb.add(Boolean.TRUE); // UseProperties
-        pb.add(Boolean.TRUE); // Transcode
-        pb.add(Boolean.TRUE); // VerifyOutput
-        pb.add(Boolean.TRUE); // AllowPixelReplacement
-
-        pb.add(null); // TileSize
-
-        pb.add(streamMetadata);
-        pb.add(imageMetadata);
-        pb.add(thumbnails);
-
-        pb.add(null); // EventListener[]
-        pb.add(null); // Locale
-
-        pb.add(null); // ImageWriteParam
-        pb.add(null); // ImageWriter
-
-        if(mode.equalsIgnoreCase("rendered")) {
-            crif.create(pb, null);
-        } else if(mode.equalsIgnoreCase("renderable")) {
-            java.awt.geom.AffineTransform transform =
-                new java.awt.geom.AffineTransform(256, 0, 0, 512, 0, 0);
-            crif.create(new RenderContext(transform), pb);
-        }
-    }
-
-    public ImageWriteCRIF() {
-        super();
-    }
-
-    /**
-     * Attempt to create an {@link ImageOutputStream} for the supplied
-     * output. The following sequence is effected:
-     * <ol>
-     * <li><ul>
-     * <li>If <code>output</code> is an <code>ImageOutputStream</code> it
-     * is cast and returned.</li>
-     * <li>If <code>output</code> is a <code>String</code> it is converted
-     * to a read-write <code>RandomAccessFile</code>.</li>
-     * <li>If <code>output</code> is a <code>Socket</code> it is converted
-     * to an <code>OutputStream</code>.</li>
-     * </ul></li>
-     * <li><code>ImageIO.createImageOutputStream()</code> is invoked
-     * with parameter set to the (possibly converted) output and the
-     * value it returns (which could be <code>null</code>) is returned
-     * to the caller.</li>
-     * </ol>
-     *
-     * @param output An <code>Object</code> to be used as the destination,
-     * such as a <code>String</code>, <code>File</code>, writable
-     * <code>RandomAccessFile</code>, <code>OutputStream</code>, writable
-     * <code>Socket</code>, or writable <code>Channel</code>.
-     *
-     * @return An <code>ImageOutputStream</code> or <code>null</code>.
-     */
-    static ImageOutputStream getImageOutputStream(Object output) {
-        // The value to be returned.
-        ImageOutputStream stream = null;
-
-        // If already an ImageOutputStream just cast.
-        if(output instanceof ImageOutputStream) {
-            stream = (ImageOutputStream)output;
-        } else {
-            if(output instanceof String) {
-                // If output is a String replace it with a RandomAccessFile.
-                try {
-                    // 'output' is conditionally checked for writability
-                    // in the OperationDescriptor.
-                    output = new RandomAccessFile((String)output, "rw");
-                } catch(Exception e) {
-                    throw new RuntimeException
-                        (I18N.getString("ImageWriteCRIF0")+" "+output);
-                }
-            } else if(output instanceof Socket) {
-                // If output is a Socket replace it with an OutputStream.
-                try {
-                    // XXX check binding, connection, closed, shutdown
-                    // as these could have changed.
-                    output = ((Socket)output).getOutputStream();
-                } catch(Exception e) {
-                    throw new RuntimeException
-                        (I18N.getString("ImageWriteCRIF1")+" "+output);
-                }
-            }
-
-            // Create the ImageOutputStream.
-            try {
-                stream = ImageIO.createImageOutputStream(output);
-            } catch(IOException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        return stream;
-    }
-
-    /**
-     * {@link RenderedImageFactory} implementation.
-     */
-    public RenderedImage create(ParameterBlock pb,
-                                RenderingHints rh) {
-        return create(0, false, pb, rh);
-    }
-
-    private static ImageWriteParam getWriteParam(ImageWriteParam param,
-                                                 ImageWriter writer) {
-        // Set default to original ImageWriteParam.
-        ImageWriteParam newParam = param;
-
-        if(param == null) {
-            newParam = writer.getDefaultWriteParam();
-        } else if(param.getClass().getName().equals(
-                      "javax.imageio.ImageWriteParam")) {
-            // The ImageWriteParam passed in is non-null. As the
-            // ImageWriteParam class is not Cloneable, if the param
-            // class is simply ImageWriteParam, then create a new
-            // ImageWriteParam instance and set all its fields
-            // which were set in param. This will eliminate problems
-            // with concurrent modification of param for the cases
-            // in which there is not a special ImageWriteParam used.
-
-            // Create a new ImageWriteParam instance.
-            newParam = writer.getDefaultWriteParam();
-
-            // Set all fields which need to be set.
-
-            // IIOParamController field.
-            if(param.hasController()) {
-                newParam.setController(param.getController());
-            }
-
-            // Destination fields.
-            newParam.setDestinationOffset(param.getDestinationOffset());
-            newParam.setDestinationType(param.getDestinationType());
-
-            // Source fields.
-            newParam.setSourceBands(param.getSourceBands());
-            newParam.setSourceRegion(param.getSourceRegion());
-            newParam.setSourceSubsampling(param.getSourceXSubsampling(),
-                                          param.getSourceYSubsampling(),
-                                          param.getSubsamplingXOffset(),
-                                          param.getSubsamplingYOffset());
-
-            // Compression.
-            if(param.canWriteCompressed()) {
-                int compressionMode = param.getCompressionMode();
-                newParam.setCompressionMode(compressionMode);
-                if(compressionMode == ImageWriteParam.MODE_EXPLICIT) {
-                    newParam.setCompressionQuality(param.getCompressionQuality());
-                    newParam.setCompressionType(param.getCompressionType());
-                }
-            }
-
-            // Progressive
-            if(param.canWriteProgressive()) {
-                newParam.setProgressiveMode(param.getProgressiveMode());
-            }
-
-            // Tiling
-            if(param.canWriteTiles()) {
-                int tilingMode = param.getTilingMode();
-                newParam.setTilingMode(tilingMode);
-                if(tilingMode == ImageWriteParam.MODE_EXPLICIT) {
-                    newParam.setTiling(param.getTileWidth(),
-                                       param.getTileHeight(),
-                                       param.getTileGridXOffset(),
-                                       param.getTileGridYOffset());
-                }
-            }
-        }
-
-        return newParam;
-    }
-
-    /**
-     * If tiling is supported, determine the appropriate tile size and
-     * set it on the returned param if necessary. The returned param
-     * will either be a new ImageWriteParam or the one passed in with
-     * its tiling settings possibly modified.
-     */
-    private static ImageWriteParam setTileSize(ImageWriteParam param,
-                                               ImageWriter writer,
-                                               Dimension tileSize,
-                                               RenderedImage source) {
-
-        ImageWriteParam returnParam = getWriteParam(param, writer);
-
-        // If tiling possible set tile size if needed.
-        if(returnParam.canWriteTiles()) {
-            if(tileSize != null) {
-                // Check tile size.
-                if(tileSize.width <= 0 || tileSize.height <= 0) {
-                    throw new IllegalArgumentException
-                        ("tileSize.width <= 0 || tileSize.height <= 0");
-                }
-
-                // Use specified tile size.
-                returnParam.setTilingMode(ImageWriteParam.MODE_EXPLICIT);
-                returnParam.setTiling(tileSize.width,
-                                      tileSize.height,
-                                      0, 0); // XXX set tile offsets?
-            } else if(param == null) {
-                if(source.getNumXTiles() > 1 || source.getNumYTiles() > 1) {
-                    // Null tile size and param args: use source tile size.
-                    returnParam.setTilingMode(ImageWriteParam.MODE_EXPLICIT);
-                    returnParam.setTiling(source.getTileWidth(),
-                                          source.getTileHeight(),
-                                          0, 0); // XXX set tile offsets?
-                }
-            } else if(returnParam.getTilingMode() ==
-                      ImageWriteParam.MODE_EXPLICIT) {
-                // Param passed in has explicit mode set but the tile
-                // grid might not actually be set.
-                boolean setTileSize = false;
-
-                // Save reference to preferred tile size array.
-                Dimension[] preferredTileSizes =
-                    returnParam.getPreferredTileSizes();
-
-                // Set the tile width.
-                int tileWidth = 0;
-                try {
-                    // Try to get it from the param.
-                    tileWidth = returnParam.getTileWidth();
-                } catch(IllegalStateException e) {
-                    // Not set in the param.
-                    setTileSize = true;
-
-                    if(preferredTileSizes != null &&
-                       preferredTileSizes.length >= 2 &&
-                       preferredTileSizes[0].width > 0 &&
-                       preferredTileSizes[1].width > 0) {
-                        // Use average of first two preferred tile widths.
-                        tileWidth = (preferredTileSizes[0].width +
-                                     preferredTileSizes[1].width) / 2;
-                    } else {
-                        // Use source image tile width.
-                        tileWidth = source.getTileWidth();
-                    }
-                }
-
-                // Set the tile height.
-                int tileHeight = 0;
-                try {
-                    // Try to get it from the param.
-                    tileHeight = returnParam.getTileHeight();
-                } catch(IllegalStateException e) {
-                    // Not set in the param.
-                    setTileSize = true;
-
-                    if(preferredTileSizes != null &&
-                       preferredTileSizes.length >= 2 &&
-                       preferredTileSizes[0].height > 0 &&
-                       preferredTileSizes[1].height > 0) {
-                        // Use average of first two preferred tile heights.
-                        tileHeight = (preferredTileSizes[0].height +
-                                      preferredTileSizes[1].height) / 2;
-                    } else {
-                        // Use source image tile height.
-                        tileHeight = source.getTileHeight();
-                    }
-                }
-
-                // Set the tile size if not previously set in the param.
-                if(setTileSize) {
-                    returnParam.setTiling(tileWidth,
-                                          tileHeight,
-                                          0, 0); // XXX set tile offsets?
-                }
-            }
-        }
-
-        return returnParam;
-    }
-
-    static RenderedImage create(int imageIndex,
-                                boolean writeToSequence,
-                                ParameterBlock pb,
-                                RenderingHints rh) {
-
-        // Value to be returned.
-        RenderedImage image = null;
-
-        // Get the source image.
-        RenderedImage source = pb.getRenderedSource(0);
-
-        // Get the writer parameters.
-        ImageWriteParam param = (ImageWriteParam)pb.getObjectParameter(12);
-
-        // Set the target image type.
-        ImageTypeSpecifier destinationType = null;
-        if(param != null) {
-            destinationType = param.getDestinationType();
-        }
-        if(destinationType == null) {
-            destinationType = new ImageTypeSpecifier(source);
-        }
-
-        // Get the writer.
-        ImageWriter writer = (ImageWriter)pb.getObjectParameter(13);
-
-        if(writer == null) {
-            // Get the format. Should be non-null from OperationDescriptor.
-            String format = (String)pb.getObjectParameter(1);
-
-            // Find a writer.
-            Iterator writers = ImageIO.getImageWriters(destinationType,
-                                                       format);
-
-            // Get the writer.
-            if(writers != null && writers.hasNext()) {
-                writer = (ImageWriter)writers.next();
-            }
-        }
-
-        // XXX What if no writer? Exception?
-        if(writer != null) {
-            // XXX Replace ImageWriter parameter in ParameterBlock?
-
-            ImageOutputStream streamToClose = null;
-
-            // Set the output if not writing to a sequence (in which
-            // case the output should already be set.
-            if(!writeToSequence) {
-                // Get the output.
-                Object output = pb.getObjectParameter(0);
-
-                // Try to get an ImageOutputStream.
-                ImageOutputStream stream = getImageOutputStream(output);
-
-                // Set stream to close if not writing to a sequence.
-                streamToClose = stream != output ? stream : null;
-
-                // Set the writer's output.
-                writer.setOutput(stream != null ? stream : output);
-            }
-
-            // Get the property use flag.
-            boolean useProperties =
-                ((Boolean)pb.getObjectParameter(2)).booleanValue();
-
-            // Get the transcoding flag.
-            boolean transcode =
-                ((Boolean)pb.getObjectParameter(3)).booleanValue();
-
-            IIOMetadata streamMetadata = null;
-            if(!writeToSequence) {
-                // Get the stream metadata.
-                streamMetadata = (IIOMetadata)pb.getObjectParameter(7);
-
-                // If null, get stream metadata from source properties
-                // if allowed.
-                if(streamMetadata == null && useProperties) {
-                    Object streamMetadataProperty =
-                        source.getProperty(
-                            ImageWriteDescriptor.PROPERTY_NAME_METADATA_STREAM);
-                    if(streamMetadataProperty instanceof IIOMetadata) {
-                        streamMetadata = (IIOMetadata)streamMetadataProperty;
-                    }
-                }
-
-                // Transcode the stream metadata if requested.
-                if(streamMetadata != null && transcode) {
-                    // Overwrite the stream metadata with transcoded metadata.
-                    streamMetadata =
-                        writer.convertStreamMetadata(streamMetadata,
-                                                     param);
-                }
-            }
-
-            // Get the image metadata.
-            IIOMetadata imageMetadata =
-                (IIOMetadata)pb.getObjectParameter(8);
-
-            // If null, get image metadata from source properties if allowed.
-            if(imageMetadata == null && useProperties) {
-                Object imageMetadataProperty =
-                    source.getProperty(
-                        ImageWriteDescriptor.PROPERTY_NAME_METADATA_IMAGE);
-                if(imageMetadataProperty instanceof IIOMetadata) {
-                    imageMetadata = (IIOMetadata)imageMetadataProperty;
-                }
-            }
-
-            // Transcode the image metadata if requested.
-            if(imageMetadata != null && transcode) {
-                // Overwrite the image metadata with transcoded metadata.
-                imageMetadata = writer.convertImageMetadata(imageMetadata,
-                                                            destinationType,
-                                                            param);
-            }
-
-            // Get the thumbnails if supported by the writer.
-            BufferedImage[] thumbnails = null;
-            if(writer.getNumThumbnailsSupported(destinationType,
-                                                param,
-                                                streamMetadata,
-                                                imageMetadata) > 0) {
-                thumbnails = (BufferedImage[])pb.getObjectParameter(9);
-
-                // If null, get thumbnails from source properties if allowed.
-                if(thumbnails == null && useProperties) {
-                    Object thumbnailsProperty =
-                        source.getProperty(
-                            ImageWriteDescriptor.PROPERTY_NAME_METADATA_IMAGE);
-                    if(thumbnailsProperty instanceof BufferedImage[]) {
-                        thumbnails = (BufferedImage[])thumbnailsProperty;
-                    }
-                }
-            }
-
-            // Get the locale parameter and set on the writer.
-            Locale locale = (Locale)pb.getObjectParameter(11);
-            if(locale != null) {
-                writer.setLocale(locale);
-            }
-
-            // Get the listeners parameter and set on the writer.
-            EventListener[] listeners =
-                (EventListener[])pb.getObjectParameter(10);
-            if(listeners != null) {
-                for(int i = 0; i < listeners.length; i++) {
-                    EventListener listener = listeners[i];
-                    if(listener instanceof IIOWriteProgressListener) {
-                        writer.addIIOWriteProgressListener(
-                            (IIOWriteProgressListener)listener);
-                    }
-                    if(listener instanceof IIOWriteWarningListener) {
-                        writer.addIIOWriteWarningListener(
-                            (IIOWriteWarningListener)listener);
-                    }
-                }
-            }
-
-            // Set the tile size.
-            // XXX Replace ImageWriteParam parameter in ParameterBlock?
-            param = setTileSize(param, writer,
-                                (Dimension)pb.getObjectParameter(6),
-                                source);
-
-            // Create the IIOImage container.
-            IIOImage iioImage = new IIOImage(source,
-                                             thumbnails != null ?
-                                             Arrays.asList(thumbnails) : null,
-                                             imageMetadata);
-
-            try {
-                // Write the image.
-                if(writeToSequence) {
-                    writer.writeToSequence(iioImage, param);
-                } else {
-                    writer.write(streamMetadata, iioImage, param);
-                }
-
-                // Get the pixel replacement parameter.
-                boolean allowPixelReplacement =
-                    ((Boolean)pb.getObjectParameter(5)).booleanValue();
-
-                // Set the return value.
-                if(allowPixelReplacement &&
-                   source instanceof PlanarImage &&
-                   writer.canReplacePixels(imageIndex)) {
-
-                    // Create an image which is a PropertyChangeListener of
-                    // "invalidregion" events including RenderingChangeEvents.
-                    image = new PixelReplacementImage(source,
-                                                      rh,
-                                                      param,
-                                                      writer,
-                                                      imageIndex,
-                                                      streamToClose);
-
-                    // Register the image as a sink of its source so that
-                    // it automatically receives events.
-                    ((PlanarImage)source).addSink(image);
-                } else if(!writeToSequence) {
-                    Object writerOutput = writer.getOutput();
-                    if(writerOutput != pb.getObjectParameter(0) &&
-                       writerOutput instanceof ImageOutputStream) {
-                        // This block is executed if and only if pixel
-                        // replacement is not occurring, a sequence is
-                        // not being written, and an ImageOutputStream
-                        // inaccessible to the application is set on the
-                        // ImageWriter.
-                        ((ImageOutputStream)writerOutput).flush();
-                    }
-
-                    // Set the return value to the original image or
-                    // a wrapped version thereof.
-                    image = source instanceof WritablePropertySource ?
-                        source : new RenderedImageAdapter(source);
-                }
-
-                // Set required properties.
-                WritablePropertySource wps = (WritablePropertySource)image;
-
-                // Set the ImageWriteParam property.
-                wps.setProperty(
-                    ImageWriteDescriptor.PROPERTY_NAME_IMAGE_WRITE_PARAM,
-                    param);
-
-                // Set the ImageWriter property.
-                wps.setProperty(
-                    ImageWriteDescriptor.PROPERTY_NAME_IMAGE_WRITER,
-                    writer);
-
-                // Set the stream metadata property.
-                if(streamMetadata != null) {
-                    wps.setProperty(
-                        ImageWriteDescriptor.PROPERTY_NAME_METADATA_STREAM,
-                        streamMetadata);
-                }
-
-                // Set the image metadata property.
-                if(imageMetadata != null) {
-                    wps.setProperty(
-                        ImageWriteDescriptor.PROPERTY_NAME_METADATA_IMAGE,
-                        imageMetadata);
-                }
-
-                // Set the thumbnail property.
-                if(thumbnails != null) {
-                    wps.setProperty(
-                        ImageWriteDescriptor.PROPERTY_NAME_THUMBNAILS,
-                        thumbnails);
-                }
-            } catch(IOException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        return image;
-    }
-}
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/PixelReplacementImage.java zzx2/src/share/classes/com/sun/media/jai/imageioimpl/PixelReplacementImage.java
--- jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/PixelReplacementImage.java	2005-02-11 00:01:55.000000000 -0500
+++ zzx2/src/share/classes/com/sun/media/jai/imageioimpl/PixelReplacementImage.java	1969-12-31 19:00:00.000000000 -0500
@@ -1,293 +0,0 @@
-/*
- * $RCSfile: PixelReplacementImage.java,v $
- *
- * 
- * Copyright (c) 2005 Sun Microsystems, Inc. All  Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met: 
- * 
- * - Redistribution of source code must retain the above copyright 
- *   notice, this  list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the
- *   distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of 
- * contributors may be used to endorse or promote products derived 
- * from this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any 
- * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 
- * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
- * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL 
- * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF 
- * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
- * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR 
- * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
- * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
- * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
- * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES. 
- * 
- * You acknowledge that this software is not designed or intended for 
- * use in the design, construction, operation or maintenance of any 
- * nuclear facility. 
- *
- * $Revision: 1.1 $
- * $Date: 2005/02/11 05:01:55 $
- * $State: Exp $
- */
-package com.sun.media.jai.imageioimpl;
-
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.Shape;
-import java.awt.image.Raster;
-import java.awt.image.RenderedImage;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Map;
-import java.util.Vector;
-import javax.media.jai.ImageLayout;
-import javax.media.jai.OpImage;
-import javax.media.jai.PlanarImage;
-import javax.media.jai.RenderedOp;
-import javax.media.jai.PropertyChangeEventJAI;
-import javax.media.jai.RenderingChangeEvent;
-import javax.imageio.ImageWriter;
-import javax.imageio.ImageWriteParam;
-import javax.imageio.stream.ImageOutputStream;
-
-/**
- * Implementation of <code>PlanarImage</code> for the "ImageWrite" operation
- * for the case of <code>ImageWriter</code>s which can replace pixels.  The
- * sole purpose of this class is to respond to "invalidregion" events so
- * as to update the written image.
- */
-final class PixelReplacementImage extends PlanarImage
-    implements PropertyChangeListener {
-
-    /**
-     * The <code>ImageWriteParam</code> used in writing the image.
-     */
-    private ImageWriteParam param;
-
-    /**
-     * The <code>ImageWriter</code> used to write the image.
-     */
-    private ImageWriter writer;
-
-    /**
-     * The index of the image to be write.
-     */
-    private int imageIndex;
-
-    /**
-     * A stream to be closed when the instance is disposed; may be null.
-     */
-    private ImageOutputStream streamToClose;
-
-    /**
-     * Creates a <code>Vector</code> containing a single element.
-     */
-    private static Vector createVector(Object element) {
-        Vector v = new Vector(1);
-        v.add(element);
-        return v;
-    }
-
-    /**
-     * XXX
-     */
-    PixelReplacementImage(RenderedImage source,
-                          Map configuration,
-                          ImageWriteParam param,
-                          ImageWriter writer,
-                          int imageIndex,
-                          ImageOutputStream streamToClose) throws IOException {
-        super(new ImageLayout(source),   // Layout same as source.
-              createVector(source),
-              configuration);
-
-        // Verify that the writer can replace pixels.
-        if(!writer.canReplacePixels(imageIndex)) {
-            throw new IllegalArgumentException
-                ("!writer.canReplacePixels(imageIndex)");
-        }
-
-        // Set the instance variables from the parameters.
-        // XXX Should ImageWriteParam original settings be cached for
-        // testing later to see whether anything important has changed?
-        this.param = param;
-        this.writer = writer;
-        this.imageIndex = imageIndex;
-        this.streamToClose = streamToClose;
-    }
-
-    /**
-     * Close an <code>ImageOutputStream</code> passed in.
-     */
-    public void dispose() {
-        if(streamToClose != null) {
-            try {
-                streamToClose.close();
-            } catch(IOException e) {
-                // Ignore it.
-            }
-        }
-
-        super.dispose();
-    }
-
-    /**
-     * Gets a tile.
-     *
-     * @param tileX The X index of the tile.
-     * @param tileY The Y index of the tile.
-     */
-    public Raster getTile(int tileX, int tileY) {
-        return getSourceImage(0).getTile(tileX, tileY);
-    }
-
-    // --- PropertyChangeListener implementation ---
-
-    // XXX Doc
-    public void propertyChange(PropertyChangeEvent evt) {
-        PlanarImage source = getSourceImage(0);
-        Object eventSource = evt.getSource();
-
-        //
-        // Process the event if the writer can replace pixels,
-        // the event source is the source of this OpImage,
-        // and the event name is "invalidregion".
-        //
-        if((evt instanceof PropertyChangeEventJAI &&
-            evt.getPropertyName().equalsIgnoreCase("invalidregion") &&
-            eventSource.equals(source)) ||
-           (evt instanceof RenderingChangeEvent &&
-            evt.getOldValue().equals(source) &&
-            eventSource instanceof RenderedOp &&
-            evt.getNewValue().equals(((RenderedOp)eventSource).getRendering()))) {
-
-            // Get the invalid region information.
-            Shape srcInvalidRegion = null;
-
-            if(evt instanceof RenderingChangeEvent) {
-                // RenderingChangeEvent presumably from a source RenderedOp.
-                RenderingChangeEvent rcEvent = (RenderingChangeEvent)evt;
-
-                // Get the invalidated region of the source.
-                srcInvalidRegion = rcEvent.getInvalidRegion();
-
-                // Reset this image's source.
-                source = (PlanarImage)evt.getNewValue();
-                setSource(source, 0);
-
-                // If entire source is invalid replace with source bounds.
-                if(srcInvalidRegion == null) {
-                    srcInvalidRegion =
-                        ((PlanarImage)rcEvent.getOldValue()).getBounds();
-                }
-            } else {
-                // Get the invalidated region of the source.
-                Object evtNewValue = (Shape)evt.getNewValue();
-
-                // Continue if the value class is correct.
-                if(evtNewValue instanceof Shape) {
-                    srcInvalidRegion = (Shape)evtNewValue;
-
-                    // If entire source is invalid replace with source bounds.
-                    if(srcInvalidRegion == null) {
-                        srcInvalidRegion = source.getBounds();
-                    }
-                }
-            }
-
-            // Return if the invalid portion could not be determined.
-            if(srcInvalidRegion == null) {
-                return;
-            }
-
-            // Return if the invalid region does not overlap the param region.
-            if(param != null) {
-                Rectangle sourceRegion = param.getSourceRegion();
-                if(sourceRegion != null &&
-                   !srcInvalidRegion.intersects(sourceRegion)) {
-                    return;
-                }
-            } else {
-                param = writer.getDefaultWriteParam();
-            }
-
-            // Get indices of all tiles overlapping the invalid region.
-            Point[] tileIndices =
-                source.getTileIndices(srcInvalidRegion.getBounds());
-
-            // Should not happen but return if tileIndices is null.
-            if(tileIndices == null) return;
-
-            // Get subsampling values.
-            int gridX = minX + param.getSubsamplingXOffset();
-            int gridY = minY + param.getSubsamplingYOffset();
-            int stepX = param.getSourceXSubsampling();
-            int stepY = param.getSourceYSubsampling();
-            boolean isSubsampling =
-                stepX != 1 || stepY != 1 || gridX != minX || gridY != minY;
-  
-             // Loop over affected tiles.
-            int numTiles = tileIndices.length;
-            for(int i = 0; i < numTiles; i++) {
-                // Save the next tile index.
-                Point tileIndex = tileIndices[i];
-  
-                 // Compute tile bounds.
-                Rectangle tileRect =
-                    source.getTileRect(tileIndex.x, tileIndex.y);
-  
-                 // Replace if bounds intersect invalid region.
-                if(srcInvalidRegion.intersects(tileRect)) {
-                    // Get the source tile.
-                    Raster raster = source.getTile(tileIndex.x, tileIndex.y);
- 
-                    Rectangle destRect;
-                    if(isSubsampling) {
-                        int destMinX =
-                            (tileRect.x - gridX + stepX - 1)/stepX;
-                        int destMinY =
-                            (tileRect.y - gridY + stepY - 1)/stepY;
-                        int destMaxX =
-                            (tileRect.x + tileRect.width -
-                             gridX + stepX - 1)/stepX;
-                        int destMaxY =
-                            (tileRect.y + tileRect.height -
-                             gridY + stepY - 1)/stepY;
-                        destRect = new Rectangle(destMinX, destMinY,
-                                                 destMaxX - destMinX,
-                                                 destMaxY - destMinY);
-                    } else {
-                        destRect = tileRect;
-                    }
-
-                    // Replace the pixels.
-                    try {
-                        synchronized(writer) {
-                            writer.prepareReplacePixels(imageIndex, destRect);
-                            param.setDestinationOffset(destRect.getLocation());
-                            writer.replacePixels(raster, param);
-                            writer.endReplacePixels();
-                        }
-                    } catch(IOException e) {
-                        throw new RuntimeException(e);
-                    }
-                }
-            }
-        }
-    }
-}
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/properties zzx2/src/share/classes/com/sun/media/jai/imageioimpl/properties
--- jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/imageioimpl/properties	2005-02-11 00:01:56.000000000 -0500
+++ zzx2/src/share/classes/com/sun/media/jai/imageioimpl/properties	1969-12-31 19:00:00.000000000 -0500
@@ -1,26 +0,0 @@
-#
-# $RCSfile: properties,v $
-#
-# Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
-#
-# Use is subject to license terms.
-#
-# $Revision: 1.1 $
-# $Date: 2005/02/11 05:01:56 $
-# $State: Exp $
-#
-# Internationalization file for com.sun.media.jai.imageioimpl
-
-ImageReadCRIF0=Cannot create read-only RandomAccessFile for path
-ImageReadCRIF1=Cannot create InputStream for URL
-ImageReadCRIF2=Cannot create InputStream for Socket
-
-ImageReadOpImage0=Destination bounds do not intersect available destination data region.
-ImageReadOpImage1=Source or destination region is empty.
-ImageReadOpImage2=Cannot perform rectangle mapping between source and destination because the image has no sources.
-
-ImageWriteCIF0=Unable to find an ImageWriter for format
-ImageWriteCIF1=Source Collection has more than one image and ImageWriter cannot write sequences.
-
-ImageWriteCRIF0=Cannot create read-write RandomAccessFile for path
-ImageWriteCRIF1=Cannot create OutputStream for Socket
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/operator/I18N.java zzx2/src/share/classes/com/sun/media/jai/operator/I18N.java
--- jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/operator/I18N.java	2005-02-11 00:01:56.000000000 -0500
+++ zzx2/src/share/classes/com/sun/media/jai/operator/I18N.java	1969-12-31 19:00:00.000000000 -0500
@@ -1,54 +0,0 @@
-/*
- * $RCSfile: I18N.java,v $
- *
- * 
- * Copyright (c) 2005 Sun Microsystems, Inc. All  Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met: 
- * 
- * - Redistribution of source code must retain the above copyright 
- *   notice, this  list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the
- *   distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of 
- * contributors may be used to endorse or promote products derived 
- * from this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any 
- * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 
- * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
- * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL 
- * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF 
- * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
- * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR 
- * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
- * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
- * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
- * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES. 
- * 
- * You acknowledge that this software is not designed or intended for 
- * use in the design, construction, operation or maintenance of any 
- * nuclear facility. 
- *
- * $Revision: 1.1 $
- * $Date: 2005/02/11 05:01:56 $
- * $State: Exp $
- */
-package com.sun.media.jai.operator;
-
-import com.sun.media.imageioimpl.common.I18NImpl;
-
-final class I18N extends I18NImpl {
-    static String getString(String key) {
-        return getString("com.sun.media.jai.operator.I18N", key);
-    }
-}
-
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/operator/ImageReadDescriptor.java zzx2/src/share/classes/com/sun/media/jai/operator/ImageReadDescriptor.java
--- jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/operator/ImageReadDescriptor.java	2005-11-30 19:40:32.000000000 -0500
+++ zzx2/src/share/classes/com/sun/media/jai/operator/ImageReadDescriptor.java	1969-12-31 19:00:00.000000000 -0500
@@ -1,1100 +0,0 @@
-/*
- * $RCSfile: ImageReadDescriptor.java,v $
- *
- * 
- * Copyright (c) 2005 Sun Microsystems, Inc. All  Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met: 
- * 
- * - Redistribution of source code must retain the above copyright 
- *   notice, this  list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the
- *   distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of 
- * contributors may be used to endorse or promote products derived 
- * from this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any 
- * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 
- * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
- * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL 
- * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF 
- * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
- * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR 
- * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
- * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
- * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
- * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES. 
- * 
- * You acknowledge that this software is not designed or intended for 
- * use in the design, construction, operation or maintenance of any 
- * nuclear facility. 
- *
- * $Revision: 1.2 $
- * $Date: 2005/12/01 00:40:32 $
- * $State: Exp $
- */
-package com.sun.media.jai.operator;
-
-import java.awt.RenderingHints;
-import java.awt.image.RenderedImage;
-import java.awt.image.renderable.ContextualRenderedImageFactory;
-import java.awt.image.renderable.ParameterBlock;
-import java.awt.image.renderable.RenderableImage;
-import java.io.File;
-import java.io.InputStream;
-import java.net.Socket;
-import java.util.Collection;
-import java.util.EventListener;
-import java.util.Locale;
-import javax.imageio.ImageReadParam;
-import javax.imageio.ImageReader;
-import javax.imageio.stream.ImageInputStream;
-import javax.media.jai.JAI;
-import javax.media.jai.OperationDescriptorImpl;
-import javax.media.jai.OperationRegistry;
-import javax.media.jai.PropertyGenerator;
-import javax.media.jai.RenderedOp;
-import javax.media.jai.RenderableOp;
-import javax.media.jai.registry.CollectionRegistryMode;
-import javax.media.jai.registry.RenderableRegistryMode;
-import javax.media.jai.registry.RenderedRegistryMode;
-import com.sun.media.jai.util.PropertyGeneratorImpl;
-
-/**
- * An <code>OperationDescriptor</code> describing the "ImageRead" operation.
- *
- * <p>The "ImageRead" operation uses the
- * <a href="http://java.sun.com/j2se/1.4/docs/guide/imageio/index.html">Java
- * Image I/O Framework</a> to read images from an input source. Which formats
- * may be read depends on which {@link javax.imageio.ImageReader} plug-ins are
- * registered with the Image I/O Framework when the operation is invoked.</p>
- *
- * <p>The input source will usually be an
- * {@link javax.imageio.stream.ImageInputStream}, but may be a
- * {@link java.io.File}, {@link java.io.RandomAccessFile},
- * {@link java.io.InputStream}, {@link java.net.URL},
- * {@link java.net.Socket}, {@link java.nio.channels.ReadableByteChannel},
- * file path represented as a <code>String</code> or some other type
- * compatible with a reader plug-in. The
- * {@link javax.imageio.ImageIO} class should be used to specify the location
- * and enable the use of cache files via its <code>setCacheDirectory()</code>
- * and <code>setUseCache()</code> methods, respectively. Note that this cache
- * pertains to image stream caching and is unrelated to the JAI
- * <code>TileCache</code>.</p>
- *
- * <p>The "ImageRead" operation supports <a href="#RenderedMode">rendered</a>,
- * <a href="#RenderableMode">renderable</a>, and
- * <a href="#CollectionMode">collection</a> modes and requires no source image.
- * A {@link java.awt.RenderingHints} object may be supplied when the operation
- * is created. In addition to the {@link java.awt.RenderingHints.Key} hints
- * recognized by the eventual <code>OpImage</code> constructor, an
- * <a href="#ImageLayout"><code>ImageLayout</code> hint</a> may also be
- * supplied. The settings of this <code>ImageLayout</code> override any other
- * possible derivation of its components. In particular, it is possible that
- * the generated image(s) have a different tile layout than that present in
- * the image read from the input source.</p>
- *
- * <p>Image properties are used to make available metadata and other
- * information. Property provision is mode-specific.</p>
- *
- * <p><table border=1>
- * <caption><b>Resource List</b></caption>
- * <tr><th>Name</th>        <th>Value</th></tr>
- * <tr><td>GlobalName</td>  <td>ImageRead</td></tr>
- * <tr><td>LocalName</td>   <td>ImageRead</td></tr>
- * <tr><td>Vendor</td>      <td>com.sun.media.jai</td></tr>
- * <tr><td>Description</td> <td>Reads an image using the Java Image I/O Framework.</td></tr>
- * <tr><td>DocURL</td>      <td>http://java.sun.com/products/java-media/jai/forDevelopers/jai-imageio-1_0-rc-docs/com/sun/media/jai/operator/ImageReadDescriptor.html</td></tr>
- * <tr><td>Version</td>     <td>1.0</td></tr>
- * <tr><td>arg0Desc</td>    <td>The input source.</td></tr>
- * <tr><td>arg1Desc</td>    <td>The index or indices of the image(s) to read.</td></tr>
- * <tr><td>arg2Desc</td>    <td>Whether metadata should be read if available.</td></tr>
- * <tr><td>arg3Desc</td>    <td>Whether thumbnails should be read if available.</td></tr>
- * <tr><td>arg4Desc</td>    <td>Whether to verify the validity of the input source.</td></tr>
- * <tr><td>arg5Desc</td>    <td>EventListeners to be registered with the ImageReader.</td></tr>
- * <tr><td>arg6Desc</td>    <td>The Locale for the ImageReader to use.</td></tr>
- * <tr><td>arg7Desc</td>    <td>Java Image I/O read parameter instance.</td></tr>
- * <tr><td>arg8Desc</td>    <td>Java Image I/O reader instance.</td></tr>
- * </table></p>
- *
- * <h2><a name="RenderedMode"</a>Rendered Mode</h2>
- *
- * In rendered mode the "ImageRead" operation creates a
- * {@link java.awt.image.RenderedImage} from the specified input source.
- *
- * <h3><a name="RenderedModeParameters"</a>Rendered Mode Parameters</h3>
- *
- * The parameter list of the "ImageRead" operation in rendered mode is
- * as in the following table.
- *
- * <p><table border=1>
- * <caption><b>Rendered Mode Parameter List</b></caption>
- * <tr><th>Name</th>           <th>Class Type</th>
- *                             <th>Default Value</th></tr>
- * <tr><td><a href="#ParamInput">
- *     Input</a></td>          <td>java.lang.Object.class</td>
- *                             <td>NO_PARAMETER_DEFAULT</td>
- * <tr><td><a href="#ParamImageChoice">
- *     ImageChoice</a></td>    <td>java.lang.Integer</td>
- *                             <td>0</td>
- * <tr><td><a href="#ParamReadMetadata">
- *     ReadMetadata</a></td>   <td>java.lang.Boolean</td>
- *                             <td>TRUE</td>
- * <tr><td><a href="#ParamReadThumbnails">
- *     ReadThumbnails</a></td> <td>java.lang.Boolean</td>
- *                             <td>TRUE</td>
- * <tr><td><a href="#ParamVerifyInput">
- *     VerifyInput</a></td>    <td>java.lang.Boolean</td>
- *                             <td>TRUE</td>
- * <tr><td><a href="#ParamListeners">
- *     Listeners</a></td>      <td>java.util.EventListener[]</td>
- *                             <td>null</td>
- * <tr><td><a href="#ParamLocale">
- *     Locale</a></td>         <td>java.util.Locale</td>
- *                             <td>null</td>
- * <tr><td><a href="#ParamReadParam">
- *     ReadParam</a></td>      <td>javax.imageio.ImageReadParam</td>
- *                             <td>null</td>
- * <tr><td><a href="#ParamReader">
- *     Reader</a></td>         <td>javax.imageio.ImageReader</td>
- *                             <td>null</td>
- * </table></p>
- *
- * <p>The rendered mode parameters are handled as follows:
- *
- * <ul>
- * <p><li><a name="ParamInput"</a>
- * If Input is a String it is assumed to represent a file path. When
- *   the node is rendered, if Input is not already an ImageInputStream, then
- *   ImageIO.createImageInputStream() will be used to attempt to derive an
- *   ImageInputStream. If such an ImageInputStream is available, it will be
- *   set as the input of the ImageReader; otherwise the original value of
- *   Input will be used. Before attempting to apply createImageInputStream(),
- *   if Input is a String it will be converted to a RandomAccessFile, or if it
- *   is a Socket or a URL to an InputStream. If the conversion of the Input
- *   String to RandomAccessFile fails, it will be converted to an
- *   InputStream by accessing it as a resource bundled in a JAR file.</li></p>
- * 
- * <p><li><a name="ParamImageChoice"</a>
- * If ImageChoice is negative an exception will be thrown when the
- * operation is created.</li></p>
- * 
- * <p><li><a name="ParamReadMetadata"</a>
- * Image properties associated with metadata will be set if and only if
- *   ReadMetadata is TRUE and the respective metadata are defined. This
- *   parameter overrides the setting of the ignoreMetadata field of the
- *   Reader parameter if the latter is also supplied. Metadata property
- *   values will not be set until requested, i.e., their computation is
- *   deferred.</li></p>
- * 
- * <p><li><a name="ParamReadThumbnails"</a>
- * The image property associated with thumbnails will be set if and only if
- *   ReadThumbnails is TRUE and thumbnails are defined for the image at the
- *   specified index. Thumbnail property values are not set until requested,
- *   i.e., their computation is deferred.</li></p>
- * 
- * <p><li><a name="ParamVerifyInput"</a>
- * If VerifyInput is TRUE and Input is either a File or a String which
- *   specifies a file path, then canRead() will be invoked on Input or a
- *   derived File object as appropriate. If canRead() returns 'false' an
- *   exception will be thrown. Note that the canRead() method can not be
- *   invoked in the case of the Input being a String specifying a file path
- *   which can be accessed only as an InputStream resource from a JAR file.
- *   This option is useful to suppress verifying
- *   the existence of a file on the local file system when this operation is
- *   created as the local portion of a remote operation which will be
- *   rendered on a remote peer. This verification will occur when the
- *   operation is created. </li></p>
- * 
- * <p><li>If VerifyInput is TRUE and Input is a Socket, then an exception will
- *   be thrown if the socket is not bound, not connected, is closed, or its
- *   read-half is shut down. This verification will occur when the
- *   operation is created.</li></p>
- * 
- * <p><li><a name="ParamListeners"</a>
- * Listeners will be used to set any progress, update, or warning listeners
- * of the ImageReader. Each element in the java.util.EventListener array will
- * be added for all types of listener it implements. For example if a listener
- *   object implements all of the javax.imageio.event.IIORead*Listeners
- *   interfaces then it will be added as a listener of each of the three types.
- *   Any elements in the array which do not implement any of the
- * IIORead*Listeners will be ignored.</li></p>
- * 
- * <p><li><a name="ParamLocale"</a>
- * Locale will be used to set the Locale of the ImageReader. This parameter
- *   overrides the equivalent setting of the Reader parameter if the latter is
- *   also supplied.</li></p>
- * 
- * <p><li><a name="ParamReadParam"</a>
- * If ReadParam is null, an ImageReadParam will be derived internally using
- * ImageReader.getDefaultReadParam(). Supplying an ImageReadParam can be
- * useful for special operations such as setting the bands to read via
- * setSourceBands() or the subsampling factors via
- * setSourceSubsampling(). If the ImageReadParam parameter is not an instance
- * of a cloneable subclass of javax.imageio.ImageReadParam, then it would be
- * best to avoid using the setDestinationType(), setDestinationOffset(), and
- * setSourceRegion() methods on the supplied object as these methods will be
- * invoked internally by the reader.</li></p>
- * 
- * <p><li><a name="ParamReader"</a>
- * If Reader is null, an attempt will be made to derive an ImageReader
- *   using ImageIO.getImageReaders().</li></p>
- * </ul></p>
- *
- * <h4><a name="SyncPolicy"</a>Parameters and Synchronization Policy</h4>
- *
- * Note that any supplied ImageReadParam parameter may be modified within this
- * operator. Also, any of the various reading methods of the ImageReader may be
- * invoked at an arbitrary subsequent time to populate the image data. Correct
- * handling of these parameters at the application level is left to the user.
- * Specifically no guarantee as to the correct behavior of this operation is
- * made in the cases wherein a user passes in an ImageReadParam or ImageReader
- * parameter and modifies its state while this operation is still using these
- * objects. This applies especially in the case of multi-threaded applications.
- * In such instances it is recommended that the user either not pass in either
- * of these parameters or simply use the Java Image I/O API directly rather
- * than the JAI operation. (Threads managed internally by JAI, e.g., in the
- * TileScheduler, interact with the image object created by this operation only
- * via synchronized methods thereby preventing potential race conditions.)
- * These caveats also apply to the use of ImageReaders and ImageReadParams
- * obtained from image properties.
- * 
- * <p>The foregoing policy regarding modification of any supplied ImageReadParam
- * or ImageReader is necessary as neither of these classes is cloneable. Given
- * that as a starting point there are in effect three possibilities: (A) do not
- * accept them as parameters, (B) accept them via alternate parameters which do
- * not pose these problems (for example an ImageReaderSpi and a long list of
- * settings represented by the ImageReadParam), or (C) accept them explicitly.
- * Option C has been deemed preferable despite the potential race condition
- * issues.</p>
- * 
- * <p>In the Sun Microsystems implementation of this operation these potential
- * conflicts have been mitigated to a certain extent:
- *
- * <ul>
- * <p><li>If the param is cloneable then it is cloned and the clone used internally.
- *   Otherwise if the param is an instance of ImageReadParam itself rather than
- *   of a subclass thereof, i.e., getClass().getName() invoked on the param
- *   returns "javax.imageio.ImageReadParam", then a new ImageReadParam is
- *   constructed and the settings of the original param copied to it. If the
- *   param is not cloneable and is an instance of a proper subclass of
- *   ImageWriteParam then it is used directly.</li></p>
- * 
- * <p><li>The only ImageReader methods invoked after OpImage construction are
- *   read(int,ImageReadParam), getNumThumbnails(int), readThumbnail(int,int),
- *   isIgnoringMetadata(), getStreamMetadata(), and getImageMetadata(int).
- *   These methods are invoked within getProperty() and with the exception
- *   of isIgnoringMetadata() are synchronized on the ImageReader.</li></p>
- * </ul>
- * </p>
- *
- * <h3><a name="ImageLayout"</a>ImageLayout Hint Handling</h3>
- *
- * If an ImageLayout hint is provided via the operation's RenderingHints, its
- * values will be used. In particular a SampleModel or ColorModel supplied via
- * an ImageLayout hint will override any values set via the ImageTypeSpecifier
- * of the ImageReadParam parameter if the latter is non-null. This signifies
- * that the ImageTypeSpecifier of the OpImage rendering associated with the
- * operation node will be forced to match that of the layout even if this type
- * is different from or incompatible with the image types available from the
- * ImageReader. Note that in such an eventuality an extra amount of memory
- * equal to one image tile might be needed for copying purposes. This copying
- * is handled by the JAI operation itself.
- * 
- * <p>Any fields of the supplied ImageLayout which are not set will be set to
- * default values as follows. The ImageLayout will be cloned before it is
- * modified.</p>
- *
- * <h4>ImageLayout Defaults</h4>
- *
- * <p><ul>
- * <p><li>Image Bounds {minX, minY, width, height}
- * 
- * <p>Each value defaults to the corresponding value of the destination
- * which would be derived on the basis of the source image dimensions
- * and the settings of the ImageReadParam, i.e., source region,
- * subsampling offsets and factors, and destination offset.</p>
- * 
- * <p>It should be noted that unlike in the Java Image I/O API itself,
- * negative coordinates are permitted and the image origin is not
- * required to be at (0,0) as for BufferedImages. Therefore it is
- * possible that a given image be loaded using the same ImageReadParam
- * by an ImageReader and by the "ImageRead" operation with different
- * results. Possible differences would be that the portion of the
- * image with negative coordinates is not clipped as it would be with
- * direct Image I/O access, and no empty extent between (0,0) and the
- * start of the data will be present.</p>
- * 
- * <p>For example, if the ImageReadParam had sourceRegion [0,0,w,h],
- * destinationOffset [-w/2,-h/2], and no subsampling, then the Java
- * Image I/O API would compute the effective source and destination
- * regions to be [w/2,h/2,w/2,h/2] and [0,0,w/2,h/2], respectively.
- * The JAI ImageRead operation would compute the effective source and
- * destination regions to be [0,0,w,h] and [-w/2,-h/2,w,h], respectively.
- * The Image I/O result would therefore be equal to the bottom right
- * quadrant of the JAI result.</p></li></p>
- * 
- * <p><li>Tile Grid {tileGridXOffset, tileGridYOffset, tileWidth, tileHeight}
- *
- * <pre>
- * tileGridXOffset = ImageReader.getTileGridXOffset(imageIndex);
- * tileGridYOffset = ImageReader.getTileGridYOffset(imageIndex);
- * tileWidth = ImageReader.getTileWidth(imageIndex);
- * tileHeight = ImageReader.getTileHeight(imageIndex);
- * </pre></li></p>
- * 
- * <p><li>ColorModel
- * 
- * <pre>
- * ImageReader.getRawImageType(imageIndex).getColorModel();
- * </pre></li></p>
- * 
- * <p><li>SampleModel
- * 
- * <pre>
- * ImageReader.getRawImageType(imageIndex).getSampleModel().createCompatibleSampleModel(tileWidth, tileHeight);
- * </pre></li></p>
- * </ul></p>
- *
- * <h3><a name="RenderedModeProperties"</a>Image Properties in Rendered Mode</h3>
- *
- * Image properties are used to provide metadata, thumbnails, and reader-related
- * information. The following properties may be obtained from the RenderedOp
- * created for the "ImageRead" operation in rendered mode:
- *
- * <p><table border=1>
- * <caption><b>Rendered Mode Image Properties</b></caption>
- * <tr>
- * <th>Property Name</th>
- * <th>Type</th>
- * <th>Comment</th>
- * </tr>
- * <tr>
- * <td>JAI.ImageReadParam</td>
- * <td>ImageReadParam</td>
- * <td>Set to ImageReadParam actually used which may differ from the one passed in.</td>
- * </tr>
- * <tr>
- * <td>JAI.ImageReader</td>
- * <td>ImageReader</td>
- * <td>Set to ImageReader actually used.</td>
- * </tr>
- * <tr>
- * <td>JAI.ImageMetadata</td>
- * <td>IIOMetadata</td>
- * <td>Set if and only if ReadMetadata parameter is TRUE and image metadata are available.</td>
- * </tr>
- * <tr>
- * <td>JAI.StreamMetadata</td>
- * <td>IIOMetadata</td>
- * <td>Set if and only if ReadMetadata parameter is TRUE and stream metadata are available.</td>
- * </tr>
- * <tr>
- * <td>JAI.Thumbnails</td>
- * <td>BufferedImage[]</td>
- * <td>Set if and only if ReadThumbnails parameter is TRUE and thumbnails are available.</td>
- * </tr>
- * </table></p>
- * 
- * <p>If a given property is not set, this implies of course that the names of
- * absent properties will not appear in the array returned by getPropertyNames()
- * and getProperty() invoked to obtain absent properties will return
- * java.awt.Image.UndefinedProperty as usual.</p>
- * 
- * <p>The ImageReader and ImageReadParam may be used for subsequent invocations
- * of the operation (for example to obtain different images in a multi-page file)
- * or for informational purposes. Care should be taken in using these property
- * values with respect to the synchronization issues previously discussed.</p>
- * 
- * <p>In all cases image metadata properties will be set when the node is rendered,
- * i.e., metadata reading is not subject to the same deferred execution as is
- * image data reading. The thumbnail property value will not be set however until
- * its value is actually requested.</p>
- *
- * <h2><a name="RenderableMode"</a>Renderable Mode</h2>
- *
- * In renderable mode the "ImageRead" operation creates a
- * {@link java.awt.image.renderable.RenderableImage} from the specified
- * input source.
- *
- * <p>It should be noted that although they are discussed in the context of
- * rendered mode, the <a href="#SyncPolicy">parameter synchronization
- * policy</a> and <a href="#ImageLayout">ImageLayout handling methodology</a>
- * apply to renderable mode as well.</p>
- *
- * <h3><a name="RenderableModeParameters"</a>Renderable Mode Parameters</h3>
- *
- * The parameter list of the "ImageRead" operation in renderable mode is
- * identical to the <a href="#RenderedModeParameters">rendered mode parameter
- * list</a> mode except as indicated in the following table.
- *
- * <p><table border=1>
- * <caption><b>Renderable Mode Parameter Differences</b></caption>
- * <tr><th>Name</th>           <th>Class Type</th>
- *                             <th>Default Value</th></tr>
- * <tr><td>ImageChoice</td>    <td>int[]</td>
- *                             <td>int[] {0,...,NumImages-1}</td>
- * </table></p>
- *
- * <p>In the Sun Microsystems renderable mode implementation of the "ImageRead"
- * operation, when createRendering() is invoked on the RenderableImage created
- * by the operation, a MultiResolutionRenderableImage is constructed from a
- * Vector of RenderedImages consisting of the images at the specified indices.
- * These images will be sorted into order of decreasing resolution (as
- * determined by the product of width and height for each image) and inserted
- * in this order in the Vector of images used to construct the
- * MultiResolutionRenderableImage. Metadata will be set on the component
- * RenderedImages as usual for rendered mode. Finally the
- * createRendering() invocation will be forwarded to the underlying
- * MultiResolutionRenderableImage and the resulting RenderedImage returned.</p>
- *
- * <p>Note that using this approach the entire MultiResolutionRenderableImage
- * must be regenerated for each invocation of createRendering(). If multiple
- * renderings are to be created from the RenderableImage without changing
- * the operation parameters, then a more efficient approach would be to use the
- * "JAI.RenderableInput" property to be described.</p>
- *
- * <h3>Image Properties in Renderable Mode</h3>
- *
- * The following property will be set on the RenderableOp created for the
- * "ImageRead" operation in renderable mode:
- *
- * <p><table border=1>
- * <caption><b>Renderable Mode Image Properties</b></caption>
- * <tr>
- * <th>Property Name</th>
- * <th>Type</th>
- * <th>Comment</th>
- * </tr>
- * <tr>
- * <td>JAI.RenderableInput</td>
- * <td>RenderableImage</td>
- * <td>A RenderableImage derived from the input source according to the supplied set of parameters.</td>
- * </tr>
- * </table></p>
- * 
- * <p>The RenderableImage which is the value of the foregoing property may have
- * set on it any of the properties previously described for rendered mode
- * contingent on parameter settings and data availability. The image metadata
- * and thumbnail properties would be copied from the highest resolution image
- * among those specified by the ImageChoice parameter.</p>
- * 
- * <p>If multiple renderings are to be created from the RenderableImage
- * without changing the operation parameters, then an efficient alternative
- * approach to multiple invocations of createRendering() on the RenderableImage
- * is to obtain the RenderableImage value of the "JAI.RenderableInput" property
- * and invoke createRendering() on this value.</p>
- *
- * <h2><a name="CollectionMode"</a>Collection Mode</h2>
- *
- * In collection mode the "ImageRead" operation creates a
- * <code>Collection</code> of <code>RenderedImage</code>s from the specified
- * input source. This could be used for example to load an animated GIF
- * image or a multi-page TIFF image.
- *
- * <p>It should be noted that although they are discussed in the context of
- * rendered mode, the <a href="#SyncPolicy">parameter synchronization
- * policy</a> and <a href="#ImageLayout">ImageLayout handling methodology</a>
- * apply to collection mode as well.</p>
- *
- * <h3>Collection Mode Parameters</h3>
- *
- * The parameter list of the "ImageRead" operation in collection mode is
- * identical to the <a href="#RenderableModeParameters">renderable mode
- * parameter list</a>. In this case
- * the RenderedImages loaded for the specified indices will be used to create
- * a Collection of RenderedImages. The images will be loaded in the order of
- * the indices in the supplied array and appended to a List. The rendering of
- * the operation will be a CollectionImage the 'imageCollection' instance
- * variable of which will be set to this List.
- *
- * <h3>Image Properties in Collection Mode</h3>
- *
- * Contingent on parameter settings and the presence of the appropriate
- * metadata, the rendered Collection may have the "JAI.StreamMetadata",
- * "JAI.ImageReadParam", and "JAI.ImageReader" properties set. Each
- * RenderedImage in the Collection may contain the
- * <a href="#RenderedModeProperties">rendered mode properties</a> contingent
- * on parameter settings and data availability.
- *
- * @see javax.media.jai.OperationDescriptor
- * @see javax.imageio.ImageReader
- * @see javax.imageio.ImageReadParam
- * @see javax.imageio.metadata.IIOMetadata
- * @see javax.imageio.stream.ImageInputStream
- */
-public class ImageReadDescriptor extends OperationDescriptorImpl {
-
-    // Property name constants have package access for image factory use.
-
-    /** ImageReadParam property name "JAI.ImageReadParam". */
-    public static final String PROPERTY_NAME_IMAGE_READ_PARAM =
-        "JAI.ImageReadParam";
-
-    /** ImageReader property name "JAI.ImageReader". */
-    public static final String PROPERTY_NAME_IMAGE_READER =
-        "JAI.ImageReader";
-
-    /** Image metadata property name "JAI.ImageMetadata". */
-    public static final String PROPERTY_NAME_METADATA_IMAGE =
-        "JAI.ImageMetadata";
-
-    /** Stream metadata property name "JAI.StreamMetadata". */
-    public static final String PROPERTY_NAME_METADATA_STREAM =
-        "JAI.StreamMetadata";
-
-    /** Thumbnail property name "JAI.Thumbnails". */
-    public static final String PROPERTY_NAME_THUMBNAILS =
-        "JAI.Thumbnails";
-
-    /**
-     * Renderable input property name "JAI.RenderableInput".
-     */
-    public static final String PROPERTY_NAME_RENDERABLE_INPUT =
-        "JAI.RenderableInput";
-
-    /**
-     * Test method.
-     *
-     * @param args {inputFile[, mode]}
-     * @throws Throwable any error.
-     */
-    /* XXX
-    public static void main(String[] args) {
-        String fileName = args[0];
-        String modeName = args.length > 1 ?
-            args[1] : RenderedRegistryMode.MODE_NAME;
-
-        ParameterBlock pb =
-            (new ParameterBlock()).add(new java.io.File(fileName));
-
-        java.awt.image.RenderedImage[] images = null;
-        if(modeName.equalsIgnoreCase(RenderedRegistryMode.MODE_NAME)) {
-            images = new java.awt.image.RenderedImage[1];
-            images[0] = JAI.create("ImageRead", pb, null);
-            PrintProps.print((javax.media.jai.PropertySource)images[0]);
-        } else if(modeName.equalsIgnoreCase(RenderableRegistryMode.MODE_NAME)) {
-            //pb.add(new int[] {0});
-            java.awt.image.renderable.RenderableImage ri =
-                JAI.createRenderable("ImageRead", pb, null);
-            PrintProps.print((javax.media.jai.PropertySource)ri);
-            images = new java.awt.image.RenderedImage[1];
-            //java.awt.image.renderable.RenderContext rc =
-            //    new java.awt.image.renderable.RenderContext(
-            //        new java.awt.geom.AffineTransform(42, 0, 0, 42, 0, 0));
-            //images[0] = ri.createRendering(rc);
-            images[0] = ri.createDefaultRendering();
-            PrintProps.print((javax.media.jai.PropertySource)images[0]);
-        } else if(modeName.equalsIgnoreCase(CollectionRegistryMode.MODE_NAME)) {
-            //pb.add(new int[] {0});
-            java.util.Collection imageCollection =
-                JAI.createCollection("ImageRead", pb, null);
-            PrintProps.print((javax.media.jai.PropertySource)imageCollection);
-            images = new java.awt.image.RenderedImage[imageCollection.size()];
-            imageCollection.toArray(images);
-        } else {
-            throw new UnsupportedOperationException(modeName+" mode not supported");
-        }
-
-        final java.awt.Frame frame = new java.awt.Frame();
-        frame.addWindowListener(new java.awt.event.WindowAdapter() {
-                public void windowClosing(java.awt.event.WindowEvent e) {
-                    frame.setEnabled(false);
-                    frame.dispose();
-                }
-            });
-
-        int gridSide = (int)(Math.sqrt(images.length) + 0.5);
-        frame.setLayout(new java.awt.GridLayout(gridSide, gridSide));
-        java.awt.Dimension screenSize =
-            java.awt.Toolkit.getDefaultToolkit().getScreenSize();
-        int width =
-            Math.min(screenSize.width/gridSide, images[0].getWidth());
-        int height =
-            Math.min(screenSize.height/gridSide, images[0].getHeight());
-        for(int i = 0; i < images.length; i++) {
-            javax.media.jai.widget.ScrollingImagePanel panel =
-                new javax.media.jai.widget.ScrollingImagePanel(images[i],
-                                                               width, //image.getWidth(),
-                                                               height);//image.getHeight());
-            frame.add(panel);
-        }
-        frame.pack();
-        frame.show();
-    }
-    */
-
-    /**
-     * The name of the operation.
-     */
-    private static final String OPERATION_NAME = "ImageRead";
-
-    /**
-     * The resource strings that provide the general documentation and
-     * specify the parameter list for the "ImageRead" operation.
-     */
-    private static final String[][] resources = {
-        {"GlobalName",  OPERATION_NAME},
-        {"LocalName",   OPERATION_NAME},
-        {"Vendor",      "com.sun.media.jai"},
-        {"Description", I18N.getString("ImageReadDescriptor0")},
-        {"DocURL",      "http://java.sun.com/products/java-media/jai/forDevelopers/jai-apidocs/javax/media/jai/operator/ImageReadDescriptor.html"},
-        {"Version",     I18N.getString("DescriptorVersion")},
-        {"arg0Desc",    I18N.getString("ImageReadDescriptor1")},
-        {"arg1Desc",    I18N.getString("ImageReadDescriptor2")},
-        {"arg2Desc",    I18N.getString("ImageReadDescriptor3")},
-        {"arg3Desc",    I18N.getString("ImageReadDescriptor4")},
-        {"arg4Desc",    I18N.getString("ImageReadDescriptor5")},
-        {"arg5Desc",    I18N.getString("ImageReadDescriptor6")},
-        {"arg6Desc",    I18N.getString("ImageReadDescriptor7")},
-        {"arg7Desc",    I18N.getString("ImageReadDescriptor8")},
-	{"arg8Desc",    I18N.getString("ImageReadDescriptor9")}
-    };
-
-    /** The parameter names for the "ImageRead" operation. */
-    private static final String[] paramNames = {
-        "Input", "ImageChoice", "ReadMetadata", "ReadThumbnails",
-        "VerifyInput", "Listeners", "Locale", "ReadParam", "Reader"
-    };
-
-    /** The parameter class types for rendered mode of "ImageRead". */
-    private static final Class[] renderedParamClasses = {
-        java.lang.Object.class,             // Input
-        java.lang.Integer.class,            // ImageChoice
-	java.lang.Boolean.class,            // ReadMetadata
-	java.lang.Boolean.class,            // ReadThumbnails
-	java.lang.Boolean.class,            // VerifyInput
-        java.util.EventListener[].class,    // Listeners
-        java.util.Locale.class,             // Locale
-	javax.imageio.ImageReadParam.class, // ReadParam
-	javax.imageio.ImageReader.class     // Reader
-    };
-
-    /** The parameter default values for rendered mode of "ImageRead". */
-    private static final Object[] renderedParamDefaults = {
-        NO_PARAMETER_DEFAULT, // Input
-        new Integer(0),       // ImageChoice
-        Boolean.TRUE,         // ReadMetadata
-        Boolean.TRUE,         // ReadThumbnails
-        Boolean.TRUE,         // VerifyInput
-        null,                 // Listeners
-        null,                 // Locale
-        null,                 // ReadParam
-        null                  // Reader
-    };
-
-    /** The parameter class types for renderable mode of "ImageRead". */
-    private static final Class[] renderableParamClasses = {
-        java.lang.Object.class,             // Input
-        int[].class,                        // ImageChoice
-	java.lang.Boolean.class,            // ReadMetadata
-	java.lang.Boolean.class,            // ReadThumbnails
-	java.lang.Boolean.class,            // VerifyInput
-        java.util.EventListener[].class,    // Listeners
-        java.util.Locale.class,             // Locale
-	javax.imageio.ImageReadParam.class, // ReadParam
-	javax.imageio.ImageReader.class     // Reader
-    };
-
-    /** The parameter default values for renderable mode of "ImageRead". */
-    private static final Object[] renderableParamDefaults = {
-        NO_PARAMETER_DEFAULT, // Input
-        null,                 // ImageChoice
-        Boolean.TRUE,         // ReadMetadata
-        Boolean.TRUE,         // ReadThumbnails
-        Boolean.TRUE,         // VerifyInput
-        null,                 // Listeners
-        null,                 // Locale
-        null,                 // ReadParam
-        null                  // Reader
-    };
-
-    /** The parameter class types for collection mode of "ImageRead". */
-    private static final Class[] collectionParamClasses =
-        renderableParamClasses;
-
-    /** The parameter default values for collection mode of "ImageRead". */
-    private static final Object[] collectionParamDefaults =
-        renderableParamDefaults;
-
-    /** Constructor. */
-    public ImageReadDescriptor() {
-        super(resources,
-              new String[] {RenderedRegistryMode.MODE_NAME,
-                            RenderableRegistryMode.MODE_NAME,
-                            CollectionRegistryMode.MODE_NAME},
-              null, // sourceNames
-              new Class[][] {null, null, null}, // sourceClasses
-              paramNames,
-              new Class[][] {renderedParamClasses,
-                             renderableParamClasses,
-                             collectionParamClasses},
-              new Object[][] {renderedParamDefaults,
-                              renderableParamDefaults,
-                              collectionParamDefaults},
-              new Object[][] {null, null, null}); // validParamValues
-    }
-
-    /**
-     * Type-safe convenience method for creating a {@link RenderedOp}
-     * representing the "ImageRead" operation in rendered mode. The
-     * method packs the parameters into a new <code>ParameterBlock</code>
-     * and invokes {@link JAI#create(String,ParameterBlock,RenderingHints)}.
-     *
-     * @param input The input source.
-     * @param imageChoice The index of the image to read.
-     * @param readMetadata Whether metadata should be read if available.
-     * @param readThumbnails Whether thumbnails should be read if available.
-     * @param verifyInput Whether to verify the validity of the input source.
-     * @param listeners EventListeners to be registered with the ImageReader.
-     * @param locale The Locale for the ImageReader to use.
-     * @param readParam Java Image I/O read parameter instance.
-     * @param reader Java Image I/O reader instance.
-     * @param hints Hints possibly including an <code>ImageLayout</code>.
-     * @return an image derived from the input source.
-     */
-    public static RenderedOp create(ImageInputStream input,
-                                    Integer imageChoice,
-                                    Boolean readMetadata,
-                                    Boolean readThumbnails,
-                                    Boolean verifyInput,
-                                    EventListener[] listeners,
-                                    Locale locale,
-                                    ImageReadParam readParam,
-                                    ImageReader reader,
-                                    RenderingHints hints) {
-
-        ParameterBlock args = new ParameterBlock();
-
-        args.add(input);
-        args.add(imageChoice);
-        args.add(readMetadata);
-        args.add(readThumbnails);
-        args.add(verifyInput);
-        args.add(listeners);
-        args.add(locale);
-        args.add(readParam);
-        args.add(reader);
-
-        return JAI.create(OPERATION_NAME, args, hints);
-    }
-
-    /**
-     * Type-safe convenience method for creating a {@link Collection}
-     * representing the "ImageRead" operation in collection mode. The
-     * method packs the parameters into a new <code>ParameterBlock</code>
-     * and invokes
-     * {@link JAI#createCollection(String,ParameterBlock, RenderingHints)}.
-     *
-     * @param input The input source.
-     * @param imageChoice The indices of the images to read.
-     * @param readMetadata Whether metadata should be read if available.
-     * @param readThumbnails Whether thumbnails should be read if available.
-     * @param verifyInput Whether to verify the validity of the input source.
-     * @param listeners EventListeners to be registered with the ImageReader.
-     * @param locale The Locale for the ImageReader to use.
-     * @param readParam Java Image I/O read parameter instance.
-     * @param reader Java Image I/O reader instance.
-     * @param hints Hints possibly including an <code>ImageLayout</code>.
-     * @return a collection of images derived from the input source.
-     */
-    public static Collection createCollection(ImageInputStream input,
-                                              int[] imageChoice,
-                                              Boolean readMetadata,
-                                              Boolean readThumbnails,
-                                              Boolean verifyInput,
-                                              EventListener[] listeners,
-                                              Locale locale,
-                                              ImageReadParam readParam,
-                                              ImageReader reader,
-                                              RenderingHints hints) {
-
-        ParameterBlock args = new ParameterBlock();
-
-        args.add(input);
-        args.add(imageChoice);
-        args.add(readMetadata);
-        args.add(readThumbnails);
-        args.add(verifyInput);
-        args.add(listeners);
-        args.add(locale);
-        args.add(readParam);
-        args.add(reader);
-
-        return JAI.createCollection(OPERATION_NAME, args, hints);
-    }
-
-    /**
-     * Type-safe convenience method for creating a {@link RenderableOp}
-     * representing the "ImageRead" operation in renderable mode. The
-     * method packs the parameters into a new <code>ParameterBlock</code>
-     * and invokes
-     * {@link JAI#createRenderable(String,ParameterBlock,RenderingHints)}.
-     *
-     * @param input The input source.
-     * @param imageChoice The indices of the images to read.
-     * @param readMetadata Whether metadata should be read if available.
-     * @param readThumbnails Whether thumbnails should be read if available.
-     * @param verifyInput Whether to verify the validity of the input source.
-     * @param listeners EventListeners to be registered with the ImageReader.
-     * @param locale The Locale for the ImageReader to use.
-     * @param readParam Java Image I/O read parameter instance.
-     * @param reader Java Image I/O reader instance.
-     * @param hints Hints possibly including an <code>ImageLayout</code>.
-     * @return an image capable of rendering an image from those in the
-     * input source.
-     */
-    public static RenderableOp createRenderable(ImageInputStream input,
-                                                int[] imageChoice,
-                                                Boolean readMetadata,
-                                                Boolean readThumbnails,
-                                                Boolean verifyInput,
-                                                EventListener[] listeners,
-                                                Locale locale,
-                                                ImageReadParam readParam,
-                                                ImageReader reader,
-                                                RenderingHints hints) {
-
-        ParameterBlock args = new ParameterBlock();
-
-        args.add(input);
-        args.add(imageChoice);
-        args.add(readMetadata);
-        args.add(readThumbnails);
-        args.add(verifyInput);
-        args.add(listeners);
-        args.add(locale);
-        args.add(readParam);
-        args.add(reader);
-
-        return JAI.createRenderable(OPERATION_NAME, args, hints);
-    }
-
-    /**
-     * Returns the array of {@link PropertyGenerator}s for the specified
-     * mode of this operation.
-     *
-     * <p>For renderable mode returns an array containing a single
-     * <code>PropertyGenerator</code> which defines a
-     * {@link RenderableImage}-valued property named "JAI.RenderableInput".
-     * For all other modes <code>null</code> is returned.</p>
-     *
-     * @param modeName The name of the mode.
-     * @return An array containing a single <code>PropertyGenerator</code>
-     * if <code>modeName</code> is "renderable" (case-insensitive) or
-     * <code>null</code> otherwise.
-     */
-    public PropertyGenerator[] getPropertyGenerators(String modeName) {
-        return modeName.equalsIgnoreCase(RenderableRegistryMode.MODE_NAME) ?
-            new PropertyGenerator[] { new ImageReadPropertyGenerator() } :
-            null;
-    }
-
-    /**
-     * Validates the parameters in the supplied <code>ParameterBlock</code>.
-     *
-     * <p>In addition to the standard validation performed by the
-     * corresponding superclass method, this method verifies the following:
-     * <ul>
-     * <li>whether <i>ImageChoice</i> is negative (rendered mode)
-     * or contains any negative indices (other modes); and</li>
-     * <li>if <i>VerifyInput</i> is <code>TRUE</code> and <i>Input</i>
-     * is a <code>File</code> or <code>String</code>, whether the
-     * corresponding physical file exists and is readable; and</li>
-     * <li>if <i>VerifyInput</i> is <code>TRUE</code> and <i>Input</i>
-     * is a <code>String</code>, converting which to a 
-     * corresponding physical file failed, whether it can be converted
-     * to an InputStream accessed as a resource from a JAR file; and</li>
-     * <li>if <i>VerifyInput</i> is <code>TRUE</code> and <i>Input</i>
-     * is a <code>Socket</code>, whether it is bound, connected, open,
-     * and the read-half is not shut down.</li>
-     * </ul>
-     *
-     * If the superclass method finds that the arguments are invalid, or if
-     * this method determines that any of the foregoing conditions is true,
-     * an error message will be appended to <code>msg</code> and
-     * <code>false</code> will be returned; otherwise <code>true</code> will
-     * be returned.</p>
-     *
-     * <p>The file existence and readability verification may be suppressed
-     * by setting the <i>VerifyInput</i> parameter to <code>FALSE</code>.
-     * This might be desirable for example if the operation is being
-     * created for remote rendering and <i>Input</i> is a file which is at
-     * a location visible on the remote peer but not on the host on which
-     * the operation is created.</p>
-     *
-     * @param modeName The operation mode.
-     * @param args The source and parameters of the operation.
-     * @param msg A container for any error messages.
-     *
-     * @return Whether the supplied parameters are valid.
-     */
-    protected boolean validateParameters(String modeName,
-                                         ParameterBlock args,
-                                         StringBuffer msg) {
-        if (!super.validateParameters(modeName, args, msg)) {
-            return false;
-        }
-
-        // Check "ImageChoice" for negative value(s).
-        if(modeName.equalsIgnoreCase(RenderedRegistryMode.MODE_NAME)) {
-            if(args.getIntParameter(1) < 0) {
-                msg.append(I18N.getString("ImageReadDescriptor10"));
-                return false;
-            }
-        } else { // Non-rendered modes.
-            int[] imageIndices = (int[])args.getObjectParameter(1);
-            if(imageIndices != null) {
-                for(int i = 0; i < imageIndices.length; i++) {
-                    if(imageIndices[i] < 0) {
-                        msg.append(I18N.getString("ImageReadDescriptor10"));
-                        return false;
-                    }
-                }
-            }
-        }
-
-        // Check the input if so requested by "VerifyInput".
-	Boolean verifyInput = (Boolean)args.getObjectParameter(4);
-	if (verifyInput.booleanValue()){
-            // Get the Input parameter.
-            Object input = args.getObjectParameter(0);
-
-            if(input instanceof File || input instanceof String) {
-                // Set file and path variables.
-                File file = null;
-                String path = null;
-                if(input instanceof File) {
-                    file = (File)input;
-                    path = file.getPath();
-                } else if(input instanceof String) {
-                    path = (String)input;
-                    file = new File(path);
-                }
-
-                // If input is a verify that it exists and is readable.
-                if(file != null) {
-                    if (!file.exists()) {
-			// Check if the file is accessible as an InputStream
-			// resource. This would be the case if the application
-			// and the image file are packaged in a JAR file
-			InputStream is = 
-			    getClass().getClassLoader().getResourceAsStream((String)input);
-			if(is == null) {
-			    msg.append("\"" + path + "\": " + 
-				       I18N.getString("ImageReadDescriptor11"));
-			    return false;
-			}
-                    } else if (!file.canRead()) {
-                        msg.append("\"" + path + "\": " + 
-                                   I18N.getString("ImageReadDescriptor12"));
-                        return false;
-                    }
-                }
-            } else if(input instanceof Socket) {
-                Socket socket = (Socket)input;
-
-                if(socket.isInputShutdown()) {
-                    msg.append("\"" + socket + "\": " + 
-                               I18N.getString("ImageReadDescriptor13"));
-                    return false;
-                } else if(socket.isClosed()) {
-                    msg.append("\"" + socket + "\": " + 
-                               I18N.getString("ImageReadDescriptor14"));
-                    return false;
-                } else if(!socket.isBound()) {
-                    msg.append("\"" + socket + "\": " + 
-                               I18N.getString("ImageReadDescriptor15"));
-                    return false;
-                } else if(!socket.isConnected()) {
-                    msg.append("\"" + socket + "\": " + 
-                               I18N.getString("ImageReadDescriptor16"));
-                    return false;
-                }
-            }
-        }
-        
-        return true;
-    }
-}
-
-// XXX Does this need to return ImageReader and ReadParam props also?
-// XXX This same property needs to be set also on each rendering so that
-// copying does not occur and require more computation.
-final class ImageReadPropertyGenerator extends PropertyGeneratorImpl {
-
-    /** Constructor. */
-    ImageReadPropertyGenerator() {
-        super(new String[] {
-                  ImageReadDescriptor.PROPERTY_NAME_RENDERABLE_INPUT},
-              new Class[] {RenderableImage.class},
-              new Class[] {RenderableOp.class});
-    }
-
-    /**
-     * Returns the specified property in the renderable layer.
-     *
-     * @param name   Property name.
-     * @param opNode Operation node.
-     */
-    public Object getProperty(String name,
-                              Object opNode) {
-        // Check arguments.
-        validate(name, opNode);
-
-        // Default to undefined value.
-        Object value = java.awt.Image.UndefinedProperty;
-
-        if(opNode instanceof RenderableOp &&
-           name.equalsIgnoreCase(
-               ImageReadDescriptor.PROPERTY_NAME_RENDERABLE_INPUT)) {
-
-            // Save the node reference and get the hints.
-            RenderableOp node = (RenderableOp)opNode;
-            RenderingHints hints = node.getRenderingHints();
-
-            // Get the CRIF for "ImageRead".
-            OperationRegistry registry = null;
-            ContextualRenderedImageFactory crif = null;
-
-            // Try to get the CRIF from a registry specified in the hints.
-            if(hints != null &&
-               hints.containsKey(JAI.KEY_OPERATION_REGISTRY)) {
-                registry =
-                    (OperationRegistry)hints.get(JAI.KEY_OPERATION_REGISTRY);
-                crif =
-                    (ContextualRenderedImageFactory)registry.getFactory(
-                        RenderableRegistryMode.MODE_NAME, "ImageRead");
-            }
-
-            // If no registry in the hints or that registry does not contain
-            // a CRIF for "ImageRead", try to get it from the default registry.
-            if(crif == null) {
-                registry =
-                    JAI.getDefaultInstance().getOperationRegistry();
-                crif =
-                    (ContextualRenderedImageFactory)registry.getFactory(
-                        RenderableRegistryMode.MODE_NAME, "ImageRead");
-            }
-
-            // Create the RenderableImage and set the property value to it.
-            if(crif != null &&
-               crif instanceof com.sun.media.jai.imageioimpl.ImageReadCRIF) {
-                value = ((com.sun.media.jai.imageioimpl.ImageReadCRIF)crif).createRenderable(
-                            node.getParameterBlock(),
-                            hints);
-            }
-        }
-
-        return value;
-    }
-}
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/operator/ImageWriteDescriptor.java zzx2/src/share/classes/com/sun/media/jai/operator/ImageWriteDescriptor.java
--- jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/operator/ImageWriteDescriptor.java	2005-02-11 00:01:56.000000000 -0500
+++ zzx2/src/share/classes/com/sun/media/jai/operator/ImageWriteDescriptor.java	1969-12-31 19:00:00.000000000 -0500
@@ -1,1375 +0,0 @@
-/*
- * $RCSfile: ImageWriteDescriptor.java,v $
- *
- * 
- * Copyright (c) 2005 Sun Microsystems, Inc. All  Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met: 
- * 
- * - Redistribution of source code must retain the above copyright 
- *   notice, this  list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the
- *   distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of 
- * contributors may be used to endorse or promote products derived 
- * from this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any 
- * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 
- * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
- * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL 
- * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF 
- * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
- * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR 
- * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
- * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
- * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
- * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES. 
- * 
- * You acknowledge that this software is not designed or intended for 
- * use in the design, construction, operation or maintenance of any 
- * nuclear facility. 
- *
- * $Revision: 1.1 $
- * $Date: 2005/02/11 05:01:56 $
- * $State: Exp $
- */
-package com.sun.media.jai.operator;
-
-import java.awt.Dimension;
-import java.awt.RenderingHints;
-import java.awt.image.BufferedImage;
-import java.awt.image.RenderedImage;
-import java.awt.image.renderable.ParameterBlock;
-import java.awt.image.renderable.RenderableImage;
-import java.io.File;
-import java.io.IOException;
-import java.net.Socket;
-import java.util.Collection;
-import java.util.EventListener;
-import java.util.Iterator;
-import java.util.Locale;
-import javax.imageio.ImageIO;
-import javax.imageio.ImageWriteParam;
-import javax.imageio.ImageWriter;
-import javax.imageio.metadata.IIOMetadata;
-import javax.imageio.spi.ImageWriterSpi;
-import javax.imageio.stream.ImageOutputStream;
-import javax.media.jai.CollectionOp;
-import javax.media.jai.JAI;
-import javax.media.jai.OperationDescriptorImpl;
-import javax.media.jai.RenderableOp;
-import javax.media.jai.RenderedOp;
-import javax.media.jai.registry.CollectionRegistryMode;
-import javax.media.jai.registry.RenderableRegistryMode;
-import javax.media.jai.registry.RenderedRegistryMode;
-
-/**
- * An <code>OperationDescriptor</code> describing the "ImageWrite" operation.
- *
- * <p>The "ImageWrite" operation uses the
- * <a href="http://java.sun.com/j2se/1.4/docs/guide/imageio/index.html">Java
- * Image I/O Framework</a> to write images to an output destination. Which
- * formats may be written depends on which {@link javax.imageio.ImageWriter}
- * plug-ins are registered with the Image I/O Framework when the operation is
- * invoked.</p>
- *
- * <p>The output destination will usually be an
- * {@link javax.imageio.stream.ImageOutputStream}, but may be a
- * {@link java.io.File}, {@link java.io.RandomAccessFile},
- * {@link java.io.OutputStream}, {@link java.net.Socket},
- * {@link java.nio.channels.WritableByteChannel}, file path represented as a
- * <code>String</code> or some other type compatible with a writer plug-in. The
- * {@link javax.imageio.ImageIO} class should be used to specify the location
- * and enable the use of cache files via its <code>setCacheDirectory()</code>
- * and <code>setUseCache()</code> methods, respectively. Note that this cache
- * pertains to image stream caching and is unrelated to the JAI
- * <code>TileCache</code>. If an {@link javax.imageio.stream.ImageOutputStream}
- * is created internally by the operation, for example from a
- * {@link java.io.File}-valued <a href="#ParamOutput">Output</a> parameter,
- * then it will be flushed automatically if and only if the operation is not
- * in <a href="#CollectionMode">collection mode</a> and pixel replacement is
- * not occurring.</p>
- *
- * <p>The "ImageWrite" operation supports <a href="#RenderedMode">rendered</a>,
- * <a href="#RenderableMode">renderable</a>, and
- * <a href="#CollectionMode">collection</a> modes and requires a single
- * source. The operation is "immediate" for all modes as specified by
- * <code>OperationDescriptor.isImmediate()</code> so that
- * {@link #isImmediate()} returns <code>true</code>. The operation will
- * therefore be rendered when created via either <code>JAI.create[NS]()</code>
- * or <code>JAI.createCollection[NS]()</code>.
- * A {@link java.awt.RenderingHints} object supplied when the
- * operation is created will have no effect except with respect to the
- * mapping of <code>JAI.KEY_INTERPOLATION</code> and then only in renderable
- * mode.</p>
- *
- * <p>Image properties are used to pass metadata and other information to the
- * writer plug-in and to make available metadata as actually written to the
- * output destination. Property handling is mode-specific.</p>
- *
- * <p><table border=1>
- * <caption><b>Resource List</b></caption>
- * <tr><th>Name</th>        <th>Value</th></tr>
- * <tr><td>GlobalName</td>  <td>ImageWrite</td></tr>
- * <tr><td>LocalName</td>   <td>ImageWrite</td></tr>
- * <tr><td>Vendor</td>      <td>com.sun.media.jai</td></tr>
- * <tr><td>Description</td> <td>Writes an image using the Java Image I/O Framework.</td></tr>
- * <tr><td>DocURL</td>      <td>http://java.sun.com/products/java-media/jai/forDevelopers/jai-imageio-1_0-rc-docs/com/sun/media/jai/operator/ImageWriteDescriptor.html</td></tr>
- * <tr><td>Version</td>     <td>1.0</td></tr>
- * <tr><td>arg0Desc</td>    <td>The output destination.</td></tr>
- * <tr><td>arg1Desc</td>    <td>The format name of the output.</td></tr>
- * <tr><td>arg2Desc</td>    <td>Whether to use image metadata properties as fallbacks.</td></tr>
- * <tr><td>arg3Desc</td>    <td>Whether to transcode metadata before writing.</td></tr>
- * <tr><td>arg4Desc</td>    <td>Whether to verify the validity of the output destination.</td></tr>
- * <tr><td>arg5Desc</td>    <td>Whether to allow pixel replacement in the output image.</td></tr>
- * <tr><td>arg6Desc</td>    <td>The tile size of the output image.</td></tr>
- * <tr><td>arg7Desc</td>    <td>Stream metadata to write to the output.</td></tr>
- * <tr><td>arg8Desc</td>    <td>Image metadata to write to the output.</td></tr>
- * <tr><td>arg9Desc</td>    <td>Thumbnails to write to the output.</td></tr>
- * <tr><td>arg10Desc</td>    <td>EventListeners to be registered with the ImageWriter.</td></tr>
- * <tr><td>arg11Desc</td>    <td>The Locale for the ImageWriter to use.</td></tr>
- * <tr><td>arg12Desc</td>    <td>Java Image I/O write parameter instance.</td></tr>
- * <tr><td>arg13Desc</td>    <td>Java Image I/O writer instance.</td></tr>
- * </table></p>
- *
- * <h2><a name="RenderedMode"</a>Rendered Mode</h2>
- *
- * In rendered mode the "ImageWrite" operation writes a
- * {@link java.awt.image.RenderedImage} to the specified output destination.
- *
- * <h3><a name="RenderedModeParameters"</a>Rendered Mode Parameters</h3>
- *
- * The parameter list of the "ImageWrite" operation in rendered mode is
- * as in the following table.
- *
- * <p><table border=1>
- * <caption><b>Rendered Mode Parameter List</b></caption>
- * <tr><th>Name</th>           <th>Class Type</th>
- *                             <th>Default Value</th></tr>
- * <tr><td><a href="#ParamOutput">
- *     Output</a></td>          <td>java.lang.Object.class</td>
- *                             <td>NO_PARAMETER_DEFAULT</td>
- * <tr><td><a href="#ParamFormat">
- *     Format</a></td>    <td>java.lang.String</td>
- *                             <td>null</td>
- * <tr><td><a href="#ParamUseProperties">
- *     UseProperties</a></td>   <td>java.lang.Boolean</td>
- *                             <td>TRUE</td>
- * <tr><td><a href="#ParamTranscode">
- *     Transcode</a></td> <td>java.lang.Boolean</td>
- *                             <td>TRUE</td>
- * <tr><td><a href="#ParamVerifyOutput">
- *     VerifyOutput</a></td>    <td>java.lang.Boolean</td>
- *                             <td>TRUE</td>
- * <tr><td><a href="#ParamAllowPixelReplacement">
- *     AllowPixelReplacement</a></td> <td>java.lang.Boolean</td>
- *                             <td>FALSE</td>
- * <tr><td><a href="#ParamTileSize">
- *     TileSize</a></td>    <td>java.awt.Dimension</td>
- *                             <td>null</td>
- * <tr><td><a href="#ParamStreamMetadata">
- *     StreamMetadata</a></td>    <td>javax.imageio.metadata.IIOMetadata</td>
- *                             <td>null</td>
- * <tr><td><a href="#ParamImageMetadata">
- *     ImageMetadata</a></td>    <td>javax.imageio.metadata.IIOMetadata</td>
- *                             <td>null</td>
- * <tr><td><a href="#ParamThumbnails">
- *     Thumbnails</a></td>    <td>java.awt.BufferedImage[]</td>
- *                             <td>null</td>
- * <tr><td><a href="#ParamListeners">
- *     Listeners</a></td>      <td>java.util.EventListener[]</td>
- *                             <td>null</td>
- * <tr><td><a href="#ParamLocale">
- *     Locale</a></td>         <td>java.util.Locale</td>
- *                             <td>null</td>
- * <tr><td><a href="#ParamWriteParam">
- *     WriteParam</a></td>      <td>javax.imageio.ImageWriteParam</td>
- *                             <td>null</td>
- * <tr><td><a href="#ParamWriter">
- *     Writer</a></td>         <td>javax.imageio.ImageWriter</td>
- *                             <td>null</td>
- * </table></p>
- *
- * <p>The rendered mode parameters are handled as follows:
- *
- * <ul>
- * <p><li><a name="ParamOutput"</a>
- * If Output is a String it is assumed to represent a file path.
- * </li></p>
- * <p><li><a name="ParamFormat"</a>
- * Format will be used to obtain an ImageWriter if one is not supplied. If
- * this parameter is null and Writer is non-null and has an originating
- * ImageWriterSpi, then the first format name listed by that provider will be
- * used. If Writer is null and Output is a File or a String, an attempt will
- * be made to derive the format name from the suffix of the file path. If
- * this fails, then the format will default to "PNG" as this is the most
- * versatile writer plug-in in the Java 2 core.
- * </li></p>
- * <p><li><a name="ParamUseProperties"</a>
- * If UseProperties is TRUE, then if stream or image metadata or thumbnails
- * are not provided as parameters, an attempt will be made to derive them
- * from the source image using the respective image properties previously
- * described for the "ImageRead" operation.
- * </li></p>
- * <p><li><a name="ParamTranscode"</a>
- * If Transcode is TRUE, then any stream or metadata derived either from
- * operation parameters or source image properties will be converted using
- * the ImageWriter's implementation of ImageTranscoder.
- * </li></p>
- * <p><li><a name="ParamVerifyOutput"</a>
- * If VerifyOutput is TRUE, then if the Output is a File or a String it will
- * be verified that a file at the specified location may either be overwritten
- * or created. If Output is a Socket, it will be verified that it is bound,
- * connected, not closed, and its write-half is not shut down. If any of
- * these checks fails, an exception will be thrown when the operation is
- * created. This parameter is ignored for other output types.
- * </li></p>
- * <p><li><a name="ParamAllowPixelReplacement"</a>
- * If AllowPixelReplacement is TRUE, and the ImageWriter supports pixel
- * replacement, then a construct will be enabled to allow "live" updating
- * of the output in response to RenderingChangeEvents or "InvalidRegion"
- * events.
- * </li></p>
- * <p><li><a name="ParamTileSize"</a>
- * TileSize specifies the desired tile size; it is used as defined by the
- * <a href="#RenderedModeTiling">tiling algorithm</a>. This parameter is
- * ignored if the ImageWriter does not support tiling.
- * Regardless of the capabilities of the writer, an exception will be thrown
- * when the operation is created if this parameter is non-null and either
- * its width or height is not positive.
- * </li></p>
- * <p><li><a name="ParamStreamMetadata"</a>
- * If StreamMetadata is non-null, then the parameter will take priority over
- * the corresponding image property as the source of stream metadata to
- * be written.
- * </li></p>
- * <p><li><a name="ParamImageMetadata"</a>
- * If ImageMetadata is non-null, then the parameter will take priority over
- * the corresponding image property as the source of image metadata to
- * be written.
- * </li></p>
- * <p><li><a name="ParamThumbnails"</a>
- * If Thumbnails is non-null, then the parameter will take priority over
- * the corresponding image property as the source of image thumbnails to
- * be written.
- * </li></p>
- * <p><li><a name="ParamListeners"</a>
- * Listeners will be used to set any progress or warning listeners of the
- * ImageWriter. Each element in the java.util.EventListener array will be
- * added for all types of listener it implements. For example if a listener
- * object implements all of the javax.imageio.event.IIOWrite*Listeners
- * interfaces then it will be added as a listener of each of the three types.
- * Any elements in the array which do not implement any of the
- * IIOWrite*Listeners will be ignored.
- * </li></p>
- * <p><li><a name="ParamLocale"</a>
- * Locale will be used to set the Locale of the ImageWriter. This parameter
- * overrides the equivalent setting of the Writer parameter if the latter is
- * also supplied.
- * </li></p>
- * <p><li><a name="ParamWriteParam"</a>
- * If WriteParam is null, an ImageWriteParam will be derived internally using
- * ImageWriter.getDefaultWriteParam().
- * </li></p>
- * <p><li><a name="ParamWriter"</a>
- * If Writer is null, an attempt will be made to find an ImageWriter capable
- * of writing the image. If this attempt to obtain an ImageWriter fails, an
- * exception will be thrown.
- * </li></p>
- * </ul>
- * </p>
- *
- * <h4><a name="SyncPolicy"</a>Parameters and Synchronization Policy</h4>
- *
- * Similarly to the case of any ImageReadParam or ImageReader supplied to the
- * "ImageRead" operation, any ImageWriteParam or ImageWriter supplied to the
- * "ImageWrite" operation is subject to modification within the operation
- * classes. A policy similar to the
- * <a href="./ImageReadDescriptor.html#SyncPolicy">"ImageRead"
- * synchronization policy</a> therefore applies as well for "ImageWrite".
- * 
- * <p>In the Sun Microsystems implementation of this operation these potential
- * conflicts have been mitigated to a certain extent:
- * 
- * <ul>
- * <p><li>
- * If the param is cloneable then it is cloned and the clone used internally.
- *  Otherwise if the param is an instance of ImageWriteParam itself rather than
- *   of a subclass thereof, i.e., getClass().getName() invoked on the param
- *   returns "javax.imageio.ImageWriteParam", then a new ImageWriteParam is
- *   constructed and the settings of the original param copied to it. If the
- *   param is not cloneable and is an instance of a proper subclass of
- *   ImageWriteParam then it is used directly.</li></p>
- * 
- * <p><li>
- * The only ImageWriter methods invoked after rendering are
- *   prepareReplacePixels(int,Rectangle), replacePixels(Raster,ImageWriteParam),
- *   and endReplacePixels() and these are invoked within a method synchronized
- *   on the ImageWriter object.</li></p>
- * </ul>
- * </p>
- *
- * <h3><a name="RenderedModeTiling"</a>Tiling</h3>
- *
- * The following algorithm is used to determine the tile size of the
- * image written to the output destination:
- * 
- * <pre>
- * if ImageWriter cannot write tiles
- *    output is untiled
- * else
- *    if TileSize parameter is non-null
- *       set tile size to TileSize
- *    else
- *       if WriteParam is null
- *          set tile size to source tile size
- *       else
- *          if tilingMode is ImageWriteParam.MODE_EXPLICIT
- *             if tile dimension is set in WriteParam
- *                set tile size to tile dimension from WriteParam
- *             else
- *                if preferred tile dimension is set in WriteParam
- * 		  set tile size to average of first two preferred dimensions
- *                else
- *                   set tile size to source tile size
- *          else // tilingMode is not ImageWriteParam.MODE_EXPLICIT
- *             the plug-in decides the tile size
- * </pre>
- * 
- * There is no mechanism to set the tile grid offsets of the output.
- *
- * <h3><a name="RenderedModePixelReplacement"</a>Pixel Replacement</h3>
- *
- * If AllowPixelReplacement is TRUE, the ImageWriter can replace pixels, and
- * the source is a PlanarImage, then the rendering of the operation
- * will respond to RenderingChangeEvents and Shape-valued PropertyChangeEvents
- * named "InvalidRegion". The rendering will be automatically registered as
- * a sink of the rendering of the operation node's source. As the source
- * rendering does not usually generate events, the calling code must also
- * explicitly register the "ImageWrite" rendering as a sink of the source
- * node. By whatever means the event is generated, when the rendering
- * receives such an event, it will determine the indices of all tiles which
- * overlap the invalid region and will replace the pixels of all these tiles
- * in the output.
- * 
- * <p>Note that this behavior differs from what would happen if the RenderedOp
- * created by the operation received a RenderingChangeEvent: in this case a
- * new rendering of the node would be created using the ParameterBlock and
- * RenderingHints currently in effect. This would cause the entire image to be
- * rewritten at the current position of the output. This will also happen
- * when AllowPixelReplacement is FALSE. In effect in both of these cases the
- * behavior in response to a RenderingChangeEvent is unspecified and the result
- * will likely be unexpected.</p>
- * 
- * <p>To avoid any inadvertent overwriting of the destination as a result of
- * events received by the RenderedOp, the following usage is recommended when
- * the objective is automatic pixel replacement:
- * 
- * <pre>
- *        // Sources, parameters, and hints.
- *        ParameterBlock args;
- *        RenderingHints hints;
- * 
- *        // Create the OperationNode.
- *        RenderedOp imageWriteNode = JAI.create("ImageWrite", args, hints);
- * 
- *        // Get the rendering which already exists due to "immediate" status.
- *        RenderedImage imageWriteRendering = imageWriteNode.getRendering();
- * 
- *        // Unhook the OperationNode as a sink of its source OperationNode.
- *        imageWriteNode.getSourceImage(0).removeSink(imageWriteNode);
- *
- *        // Add the rendering as a sink of the source OperationNode.
- *        imageWriteNode.getSourceImage(0).addSink(imageWriteRendering);
- * 
- *        // Free the OperationNode for garbage collection.
- *        imageWriteNode = null;
- * </pre>
- * 
- * At this point a reference to imageWriteRendering must be held as long as the
- * data of the source of the operation may change. Then provided the events are
- * correctly propagated to imageWriteRendering, the data in the output file
- * will be automatically updated to match the source data.</p>
- * 
- * <p>If pixel replacement is not the objective and inadvertent overwriting is
- * to be avoided then the safest approach would be the following:
- * 
- * <pre>
- *        // Create the OperationNode.
- *        RenderedOp imageWriteNode = JAI.create("ImageWrite", args, hints);
- * 
- *        // Unhook the OperationNode as a sink of its source
- *        imageWriteNode.getSourceImage(0).removeSink(imageWriteNode);
- * </pre>
- * 
- * The image is written by the first statement and no reference to the
- * rendering need be retained as before.
- *
- * <h3><a name="RenderedModeProperties"</a>Image Properties in Rendered Mode</h3>
- *
- * Image properties are used for metadata, thumbnails, and writer-related
- * information. The following properties may be set on the RenderedOp created
- * for the "ImageWrite" operation in rendered mode:
- * 
- * <p><table border=1>
- * <caption><b>Rendered Mode Image Properties</b></caption>
- * <tr>
- * <th>Property Name</th>
- * <th>Type</th>
- * <th>Comment</th>
- * </tr>
- * <tr>
- * <td>JAI.ImageWriteParam</td>
- * <td>ImageWriteParam</td>
- * <td>Set to ImageWriteParam actually used which may differ from the one passed in.</td>
- * </tr>
- * <tr>
- * <td>JAI.ImageWriter</td>
- * <td>ImageWriter</td>
- * <td>Set to ImageWriter actually used.</td>
- * </tr>
- * <tr>
- * <td>JAI.ImageMetadata</td>
- * <td>IIOMetadata</td>
- * <td>Set if and only if image metadata are available; may be transcoded.</td>
- * </tr>
- * <tr>
- * <td>JAI.StreamMetadata</td>
- * <td>IIOMetadata</td>
- * <td>Set if and only if stream metadata are available; may be transcoded.</td>
- * </tr>
- * <tr>
- * <td>JAI.Thumbnails</td>
- * <td>BufferedImage[]</td>
- * <td>Set if and only thumbnails are provided and the writer supportes writing them.</td>
- * </tr>
- * </table></p>
- * 
- * <p>If a given property is not set, this implies of course that the names of
- * absent properties will not appear in the array returned by getPropertyNames()
- * and getProperty() invoked to obtain absent properties will return
- * java.awt.Image.UndefinedProperty as usual.</p>
- * 
- * <p>The ImageWriter and ImageWriteParam may be used for subsequent invocations
- * of the operation or for informational purposes. Care should be taken in using
- * these property values with respect to the synchronization issues previously
- * discussed.</p>
- * 
- * <p>Metadata properties will be set to those actually written to the output. They
- * may be derived either from input parameters or source properties depending on
- * the values of the StreamMetadata, ImageMetadata, and UseProperties parameters.
- * They will be transcoded data if Transcode is TRUE and the ImageWriter supports
- * transcoding.</p>
- * 
- * <p>All properties will be set when the node is rendered.</p>
- *
- * <h2><a name="RenderableMode"</a>Renderable Mode</h2>
- *
- * In renderable mode the "ImageWrite" operation requires a
- * {@link java.awt.image.renderable.RenderableImage} source and writes a
- * {@link java.awt.image.RenderedImage} to the specified output destination.
- * As the "immediate" designation specified by {@link #isImmediate()}
- * has no effect in renderable mode, no image will be written without further
- * action by the calling code. To write an image, createRendering(),
- * createScaledRendering(), or createDefaultRendering()
- * must be invoked. Each of these will create a RenderedImage by forwarding the
- * createRendering() or equivalent call to the source image. The resulting
- * RenderedImage will be written to the output according to the
- * <a href="#RenderedMode">rendered mode</a> operation of "ImageWrite".
- * If a mapping of <code>JAI.KEY_INTERPOLATION</code> is supplied via a
- * <code>RenderingHints</code> passed to the operation, then the interpolation
- * type it specifies will be used to create the rendering if interpolation is
- * required.
- *
- * <h3><a name="RenderableModeParameters"</a>Renderable Mode Parameters</h3>
- *
- * The parameter list of the "ImageRead" operation in renderable mode is
- * identical to the <a href="#RenderedModeParameters">rendered mode
- * parameter list</a>.
- *
- * <h3>Pixel Replacement in Renderable Mode</h3>
- *
- * Pixel replacement pertains only to RenderedImages generated by rendering the
- * RenderableOp. It may occur if the same conditions apply as described for
- * pixel replacement in rendered mode. Due to the unspecified nature of the
- * underlying rendered sources of any rendering, this is not a recommended
- * procedure.
- *
- * <h3>Image Properties in Renderable Mode</h3>
- *
- * The RenderableOp node itself does not have any ImageWrite-related
- * properties. Any RenderedImages created by rendering the RenderableOp
- * (thereby writing an image to the output as described), may have
- * <a href="#RenderedModeProperties">rendered mode properties</a> set.
- *
- * <h2><a name="CollectionMode"</a>Collection Mode</h2>
- *
- * In collection mode the "ImageWrite" operation requires a
- * {@link java.util.Collection} source and writes its contents to the
- * specified output destination.
- *
- * <p>The Collection is treated as a sequence of images which will be
- * extracted from the Collection in the order returned by a new Iterator.
- * Elements in the Collection which are not RenderedImages will be ignored.
- * The derived sequence of images will then be written to the output.</p>
- * 
- * <p>If there is only one RenderedImage in the source Collection, this image
- * will be written as done in rendered mode operation. If there is more than
- * one RenderedImage, the sequence of RenderedImages will be written as an
- * image sequence. In the latter case the ImageWriter must be able to write
- * sequences.</p>
- *
- * <h3><a name="CollectionModeParameters"</a>Collection Mode Parameters</h3>
- *
- * Identical parameter list to rendered mode except:
- * 
- * <p><table border=1>
- * <caption><b>Collection Mode Parameter Differences</b></caption>
- * <tr><th>Name</th>           <th>Class Type</th>
- *                             <th>Default Value</th></tr>
- * <tr><td>ImageMetadata</td>  <td>javax.imageio.metadataIIOMetadata[]</td>
- *                             <td>null</td>
- * <tr><td>Thumbnails</td>     <td>java.awt.image.BufferedImage[][]</td>
- *                             <td>null</td>
- * </table></p>
- * 
- * <ul>
- * <p><li>
- * If the source is not a CollectionOp then the number of RenderedImages in
- * the source is counted. If it is not at least one then an exception is
- * thrown when the operation is created. If it is greater than one, then
- * the ImageWriter is checked to determine whether it can write sequences.
- * If it cannot then an exception is thrown when the operation is created.
- * </li></p>
- * <p><li>
- * The first index of the thumbnails array corresponds to the ordinal position
- * of the image in the collection and the second index to the thumbnails of
- * that image.
- * </li></p>
- * </ul>
- * 
- * <p>
- * The change to the ImageMetadata and Thumbnails parameters is that there can
- * now be a distinct image metadata object and thumbnail array for each image
- * in the Collection. The components of these respective arrays will be indexed
- * using the sequence of RenderedImages extracted from the source Collection by
- * the Iterator. It is the responsibility of the caller to ensure that this
- * sequencing is correct. In this context it is advisable to use a source
- * Collection which maintains the order of its elements such as a List.
- * </p>
- *
- * <h3>Pixel Replacement in Collection Mode</h3>
- *
- * If the value of the AllowPixelReplacement parameter is TRUE, then the
- * rendered Collection will contain RenderedImages which are registered as
- * listeners of their respective sources. Each image in the rendered Collection
- * will however be a rendering as opposed to a RenderedOp. This obviates the
- * need to unhook such a RenderedOp from its source as suggested. Two actions
- * on the part of the application are however necessary in this case:  1) the
- * sequence must be manually ended, and 2) the Collection node must be removed
- * as a sink of its source Collection. The first action is necessary as
- * pixels may be replaced at various times in various images in the sequence
- * and it is not possible to terminate the sequence at rendering time, and there
- * is no reliable mechanism to detect programmatically when this may later be
- * effected. The second action is necessary because a CollectionChangeEvent
- * received by the Collection node would cause the node to be re-rendered, i.e.,
- * the collection data to be rewritten using the current state of all parameters.
- * This will in fact also happen when AllowPixelReplacement is FALSE. In effect
- * in both of these cases the behavior in response to a CollectionChangeEvent
- * is unspecified and the result will likely be unexpected.
- * 
- * <p>
- * To ensure proper termination of the image sequence and avoid any inadvertent
- * overwriting of the destination as a result of events received by the
- * CollectionOp, the following usage is recommended when the objective is
- * automatic pixel replacement:
- * 
- * <pre>
- *        // Sources, parameters, and hints.
- *        ParameterBlock args;
- *        RenderingHints hints;
- * 
- *        // Create the Collection.
- *        CollectionImage imageWriteCollection =
- *            (CollectionImage)JAI.createCollection("ImageWrite", args, hints);
- * 
- *        // Unhook the Collection node from the source to avoid
- *        // re-renderings caused by CollectionChangeEvents.
- *        if(args.getSource(0) instanceof CollectionImage) {
- *            CollectionImage sourceCollection =
- * 	       (CollectionImage)args.getSource(0);
- *            sourceCollection.removeSink(imageWriteCollection);
- *        }
- * 
- *        // !!! Pixel replacement activity happens here ... !!!
- * 
- *        // Get the ImageWriter.
- *        ImageWriter writer =
- *            (ImageWriter)imageWriteCollection.getProperty("JAI.ImageWriter");
- * 
- *        // End the sequence if necessary.
- *        if(writer.canWriteSequence()) {
- *            writer.endWriteSequence();
- *        }
- * </pre>
- * </p>
- * 
- * <p>
- * Using the foregoing construct, all pixels in all images written to the output
- * sequence will remain current with the in-memory data of their respective
- * source provided all events are propagated as expected. Note that it is not
- * necessary to end the sequence manually if pixel replacement is not allowed or
- * is not supported. Also the sequence must be manually ended if and only if the
- * writer is capable of writing sequences. This permits pixel replacement to
- * work in the case where the source collection contains only a single image
- * and the writer supports pixel replacement but cannot write sequences.
- * </p>
- * 
- * <p>
- * If pixel replacement is not the objective, i.e., AllowPixelReplacement is
- * FALSE, and inadvertent overwriting is to be avoided then the safest approach
- * would be the following:
- * 
- * <pre>
- *        // Create the Collection.
- *        Collection imageWriteCollection =
- *            JAI.create("ImageWrite", args, hints);
- * 
- *        // Unhook the Collection node from the source to avoid
- *        // re-renderings caused by CollectionChangeEvents.
- *        if(args.getSource(0) instanceof CollectionImage) {
- *            CollectionImage sourceCollection =
- * 	       (CollectionImage)args.getSource(0);
- *            sourceCollection.removeSink(imageWriteCollection);
- *        }
- * </pre>
- * 
- * The image is written by the first statement and no reference to the
- * rendering need be retained.</p>
- *
- * <h3>Image Properties in Collection Mode</h3>
- *
- * Contingent on parameter settings and the presence of the appropriate
- * metadata, the rendered Collection may have the "JAI.StreamMetadata",
- * "JAI.ImageReadParam", and "JAI.ImageReader" properties set. Each
- * RenderedImage in the Collection may contain
- * <a href="#RenderedModeProperties">rendered mode properties</a>
- * contingent on parameter settings and data availability. Metadata
- * properties may be transcoded.
- *
- * @see javax.media.jai.OperationDescriptor
- * @see javax.imageio.ImageWriter
- * @see javax.imageio.ImageWriteParam
- * @see javax.imageio.metadata.IIOMetadata
- * @see javax.imageio.stream.ImageOutputStream
- */
-public class ImageWriteDescriptor extends OperationDescriptorImpl {
-
-    // Property name constants have package access for image factory use.
-
-    /** ImageWriteParam property name "JAI.ImageWriteParam". */
-    public static final String PROPERTY_NAME_IMAGE_WRITE_PARAM =
-        "JAI.ImageWriteParam";
-
-    /** ImageWriter property name "JAI.ImageWriter". */
-    public static final String PROPERTY_NAME_IMAGE_WRITER =
-        "JAI.ImageWriter";
-
-    /**
-     * Image metadata property name. Set to same value as
-     * {@link ImageReadDescriptor#PROPERTY_NAME_METADATA_IMAGE}.
-     */
-    public static final String PROPERTY_NAME_METADATA_IMAGE =
-        ImageReadDescriptor.PROPERTY_NAME_METADATA_IMAGE;
-
-    /**
-     * Stream metadata property name. Set to same value as
-     * {@link ImageReadDescriptor#PROPERTY_NAME_METADATA_STREAM}.
-     */
-    public static final String PROPERTY_NAME_METADATA_STREAM =
-        ImageReadDescriptor.PROPERTY_NAME_METADATA_STREAM;
-
-    /**
-     * Thumbnail property name. Set to same value as
-     * {@link ImageReadDescriptor#PROPERTY_NAME_THUMBNAILS}.
-     */
-    public static final String PROPERTY_NAME_THUMBNAILS =
-        ImageReadDescriptor.PROPERTY_NAME_THUMBNAILS;
-
-    /**
-     * Test method.
-     *
-     * @param args {inputFile, outputFile [, mode]}
-     * @throws Throwable any error.
-     */
-    /* XXX
-    public static void main(String[] args) throws Throwable {
-        String inputFile = args[0];
-        String outputFile = args[1];
-        String modeName = args.length > 2 ?
-            args[2] : RenderedRegistryMode.MODE_NAME;
-        String formatName = args.length > 3 ?
-            args[3] : null;
-
-        ParameterBlock pb = new ParameterBlock();
-        pb.set(new java.io.File(outputFile), 0);
-        if(formatName != null) {
-            pb.set(formatName, 1);
-        }
-
-        java.awt.image.RenderedImage[] images = null;
-        if(modeName.equalsIgnoreCase(RenderedRegistryMode.MODE_NAME)) {
-            pb.addSource(ImageIO.read(new java.io.File(inputFile)));
-            images = new java.awt.image.RenderedImage[1];
-            pb.set(new Dimension(128, 128), 6);
-            images[0] = JAI.create("ImageWrite", pb, null);
-            PrintProps.print((javax.media.jai.PropertySource)images[0]);
-        } else if(modeName.equalsIgnoreCase(RenderableRegistryMode.MODE_NAME)) {
-            ParameterBlock renderablePB = new ParameterBlock();
-            renderablePB.addSource(ImageIO.read(new java.io.File(inputFile)));
-            pb.addSource(javax.media.jai.JAI.createRenderable("renderable", renderablePB));
-            java.awt.image.renderable.RenderableImage ri =
-                JAI.createRenderable("ImageWrite", pb, null);
-            PrintProps.print((javax.media.jai.PropertySource)ri);
-            images = new java.awt.image.RenderedImage[1];
-            //java.awt.image.renderable.RenderContext rc =
-            //    new java.awt.image.renderable.RenderContext(
-            //        new java.awt.geom.AffineTransform(42, 0, 0, 42, 0, 0));
-            //images[0] = ri.createRendering(rc);
-            images[0] = ri.createDefaultRendering();
-            PrintProps.print((javax.media.jai.PropertySource)images[0]);
-        } else if(modeName.equalsIgnoreCase(CollectionRegistryMode.MODE_NAME)) {
-            java.util.ArrayList sourceCollection = new java.util.ArrayList();
-            Object input =
-                ImageIO.createImageInputStream(new java.io.File(inputFile));
-            javax.imageio.ImageReader reader =
-                (javax.imageio.ImageReader)ImageIO.getImageReaders(input).next();
-            reader.setInput(input);
-            int imageIndex = 0;
-            do {
-                try {
-                    RenderedImage nextImage = reader.read(imageIndex);
-                    sourceCollection.add(nextImage);
-                } catch(IndexOutOfBoundsException e) {
-                    break;
-                }
-                imageIndex++;
-            } while(true);
-            pb.addSource(sourceCollection);
-            java.util.Collection imageCollection =
-                JAI.createCollection("ImageWrite", pb, null);
-            PrintProps.print((javax.media.jai.PropertySource)imageCollection);
-            images = new java.awt.image.RenderedImage[imageCollection.size()];
-            imageCollection.toArray(images);
-        } else {
-            throw new UnsupportedOperationException(modeName+" mode not supported");
-        }
-
-        final java.awt.Frame frame = new java.awt.Frame();
-        frame.addWindowListener(new java.awt.event.WindowAdapter() {
-                public void windowClosing(java.awt.event.WindowEvent e) {
-                    frame.setEnabled(false);
-                    frame.dispose();
-                }
-            });
-
-        int gridSide = (int)(Math.sqrt(images.length) + 0.5);
-        frame.setLayout(new java.awt.GridLayout(gridSide, gridSide));
-        java.awt.Dimension screenSize =
-            java.awt.Toolkit.getDefaultToolkit().getScreenSize();
-        int width =
-            Math.min(screenSize.width/gridSide, images[0].getWidth());
-        int height =
-            Math.min(screenSize.height/gridSide, images[0].getHeight());
-        for(int i = 0; i < images.length; i++) {
-            javax.media.jai.widget.ScrollingImagePanel panel =
-                new javax.media.jai.widget.ScrollingImagePanel(images[i],
-                                                               width, //image.getWidth(),
-                                                               height);//image.getHeight());
-            frame.add(panel);
-        }
-        frame.pack();
-        frame.show();
-    }
-    */
-
-    /**
-     * The name of the operation.
-     */
-    private static final String OPERATION_NAME = "ImageWrite";
-
-    /**
-     * The resource strings that provide the general documentation and
-     * specify the parameter list for the "ImageWrite" operation.
-     */
-    private static final String[][] resources = {
-        {"GlobalName",  "ImageWrite"},
-        {"LocalName",   "ImageWrite"},
-        {"Vendor",      "com.sun.media.jai"},
-        {"Description", I18N.getString("ImageWriteDescriptor0")},
-        {"DocURL",      "http://java.sun.com/products/java-media/jai/forDevelopers/jai-apidocs/javax/media/jai/operator/ImageWriteDescriptor.html"},
-        {"Version",     I18N.getString("DescriptorVersion")},
-        {"arg0Desc",    I18N.getString("ImageWriteDescriptor1")},
-        {"arg1Desc",    I18N.getString("ImageWriteDescriptor2")},
-        {"arg2Desc",    I18N.getString("ImageWriteDescriptor3")},
-        {"arg3Desc",    I18N.getString("ImageWriteDescriptor4")},
-        {"arg4Desc",    I18N.getString("ImageWriteDescriptor5")},
-        {"arg5Desc",    I18N.getString("ImageWriteDescriptor6")},
-        {"arg6Desc",    I18N.getString("ImageWriteDescriptor7")},
-        {"arg7Desc",    I18N.getString("ImageWriteDescriptor8")},
-	{"arg8Desc",    I18N.getString("ImageWriteDescriptor9")},
-	{"arg9Desc",    I18N.getString("ImageWriteDescriptor10")},
-	{"arg10Desc",    I18N.getString("ImageWriteDescriptor11")},
-	{"arg11Desc",    I18N.getString("ImageWriteDescriptor12")},
-	{"arg12Desc",    I18N.getString("ImageWriteDescriptor13")},
-	{"arg13Desc",    I18N.getString("ImageWriteDescriptor14")}
-    };
-
-    /** The parameter names for the "ImageWrite" operation. */
-    private static final String[] paramNames = {
-        "Output", "Format", "UseProperties", "Transcode",
-        "VerifyOutput", "AllowPixelReplacement", "TileSize",
-        "StreamMetadata", "ImageMetadata", "Thumbnails",
-        "Listeners", "Locale", "WriteParam", "Writer"
-    };
-
-    /** The parameter class types for rendered mode of "ImageWrite". */
-    private static final Class[] renderedParamClasses = {
-        java.lang.Object.class,                   // Output
-        java.lang.String.class,                   // Format
-	java.lang.Boolean.class,                  // UseProperties
-	java.lang.Boolean.class,                  // Transcode
-	java.lang.Boolean.class,                  // VerifyOutput
-	java.lang.Boolean.class,                  // AllowPixelReplacement
-	java.awt.Dimension.class,                 // TileSize
-	javax.imageio.metadata.IIOMetadata.class, // StreamMetadata
-	javax.imageio.metadata.IIOMetadata.class, // ImageMetadata
-        java.awt.image.BufferedImage[].class,     // Thumbnails
-        java.util.EventListener[].class,          // Listeners
-        java.util.Locale.class,                   // Locale
-	javax.imageio.ImageWriteParam.class,      // WriteParam
-	javax.imageio.ImageWriter.class           // Writer
-    };
-
-    /** The parameter default values for rendered mode of "ImageWrite". */
-    private static final Object[] renderedParamDefaults = {
-        NO_PARAMETER_DEFAULT, // Output
-        null,                 // Format
-        Boolean.TRUE,         // UseProperties
-        Boolean.TRUE,         // Transcode
-        Boolean.TRUE,         // VerifyOutput
-        Boolean.FALSE,        // AllowPixelReplacement
-        null,                 // TileSize
-        null,                 // StreamMetadata
-        null,                 // ImageMetadata
-        null,                 // Thumbnails
-        null,                 // Listeners
-        null,                 // Locale
-        null,                 // WriteParam
-        null                  // Writer
-    };
-
-    /** The parameter class types for renderable mode of "ImageWrite". */
-    private static final Class[] renderableParamClasses =
-        renderedParamClasses;
-
-    /** The parameter default values for renderable mode of "ImageWrite". */
-    private static final Object[] renderableParamDefaults =
-        renderedParamDefaults;
-
-    /** The parameter class types for collection mode of "ImageWrite". */
-    private static final Class[] collectionParamClasses = {
-        java.lang.Object.class,                     // Output
-        java.lang.String.class,                     // Format
-	java.lang.Boolean.class,                    // UseProperties
-	java.lang.Boolean.class,                    // Transcode
-	java.lang.Boolean.class,                    // VerifyOutput
-	java.lang.Boolean.class,                    // AllowPixelReplacement
-	java.awt.Dimension.class,                   // TileSize
-	javax.imageio.metadata.IIOMetadata.class,   // StreamMetadata
-	javax.imageio.metadata.IIOMetadata[].class, // ImageMetadata
-        java.awt.image.BufferedImage[][].class,     // Thumbnails
-        java.util.EventListener[].class,            // Listeners
-        java.util.Locale.class,                     // Locale
-	javax.imageio.ImageWriteParam.class,        // WriteParam
-	javax.imageio.ImageWriter.class             // Writer
-    };
-
-    /** The parameter default values for collection mode of "ImageWrite". */
-    private static final Object[] collectionParamDefaults =
-        renderedParamDefaults;
-
-    /** Constructor. */
-    public ImageWriteDescriptor() {
-        super(resources,
-              new String[] {RenderedRegistryMode.MODE_NAME,
-                            RenderableRegistryMode.MODE_NAME,
-                            CollectionRegistryMode.MODE_NAME},
-              null, // sourceNames
-              new Class[][] {{RenderedImage.class},
-                             {RenderableImage.class},
-                             {Collection.class}}, // sourceClasses
-              paramNames,
-              new Class[][] {renderedParamClasses,
-                             renderableParamClasses,
-                             collectionParamClasses},
-              new Object[][] {renderedParamDefaults,
-                              renderableParamDefaults,
-                              collectionParamDefaults},
-              new Object[][] {null, null, null}); // validParamValues
-    }
-
-    /**
-     * Type-safe convenience method for creating a {@link RenderedOp}
-     * representing the "ImageWrite" operation in rendered mode. The
-     * method packs the source and parameters into a new
-     * <code>ParameterBlock</code> and invokes
-     * {@link JAI#create(String,ParameterBlock,RenderingHints)}.
-     *
-     * @param source The image to be written.
-     * @param output The output destination.
-     * @param format The format name of the output.
-     * @param useProperties Whether to use image metadata properties as
-     * fallbacks.
-     * @param transcode Whether to transcode metadata before writing.
-     * @param verifyOutput Whether to verify the validity of the output
-     * destination.
-     * @param allowPixelReplacement Whether to allow pixel replacement
-     * in the output image.
-     * @param tileSize The tile size of the output image.
-     * @param streamMetadata Stream metadata to write to the output.
-     * @param imageMetadata Image metadata to write to the output.
-     * @param thumbnails Thumbnails to write to the output.
-     * @param listeners EventListeners to be registered with the ImageWriter.
-     * @param locale The Locale for the ImageWriter to use.
-     * @param writeParam Java Image I/O write parameter instance.
-     * @param writer Java Image I/O writer instance.
-     * @param hints Operation hints.
-     * @return a reference to the operation source.
-     */
-    public static RenderedOp create(RenderedImage source,
-                                    ImageOutputStream output,
-                                    String format,
-                                    Boolean useProperties,
-                                    Boolean transcode,
-                                    Boolean verifyOutput,
-                                    Boolean allowPixelReplacement,
-                                    Dimension tileSize,
-                                    IIOMetadata streamMetadata,
-                                    IIOMetadata imageMetadata,
-                                    BufferedImage[] thumbnails,
-                                    EventListener[] listeners,
-                                    Locale locale,
-                                    ImageWriteParam writeParam,
-                                    ImageWriter writer,
-                                    RenderingHints hints) {
-
-        ParameterBlock args = new ParameterBlock();
-
-        args.addSource(source);
-
-        args.add(output);
-        args.add(format);
-        args.add(useProperties);
-        args.add(transcode);
-        args.add(verifyOutput);
-        args.add(allowPixelReplacement);
-        args.add(tileSize);
-        args.add(streamMetadata);
-        args.add(imageMetadata);
-        args.add(thumbnails);
-        args.add(listeners);
-        args.add(locale);
-        args.add(writeParam);
-        args.add(writer);
-
-        return JAI.create(OPERATION_NAME, args, hints);
-    }
-
-    /**
-     * Type-safe convenience method for creating a {@link Collection}
-     * representing the "ImageWrite" operation in collection mode. The
-     * method packs the source and parameters into a new
-     * <code>ParameterBlock</code> and invokes
-     * {@link JAI#createCollection(String,ParameterBlock,RenderingHints)}.
-     *
-     * @param source The collection to be written.
-     * @param output The output destination.
-     * @param format The format name of the output.
-     * @param useProperties Whether to use image metadata properties as
-     * fallbacks.
-     * @param transcode Whether to transcode metadata before writing.
-     * @param verifyOutput Whether to verify the validity of the output
-     * destination.
-     * @param allowPixelReplacement Whether to allow pixel replacement
-     * in the output image.
-     * @param tileSize The tile size of the output image.
-     * @param streamMetadata Stream metadata to write to the output.
-     * @param imageMetadata Image metadata to write to the output.
-     * @param thumbnails Thumbnails to write to the output.
-     * @param listeners EventListeners to be registered with the ImageWriter.
-     * @param locale The Locale for the ImageWriter to use.
-     * @param writeParam Java Image I/O write parameter instance.
-     * @param writer Java Image I/O writer instance.
-     * @param hints Operation hints.
-     * @return a reference to the operation source.
-     */
-    public static Collection createCollection(Collection source,
-                                              ImageOutputStream output,
-                                              String format,
-                                              Boolean useProperties,
-                                              Boolean transcode,
-                                              Boolean verifyOutput,
-                                              Boolean allowPixelReplacement,
-                                              Dimension tileSize,
-                                              IIOMetadata streamMetadata,
-                                              IIOMetadata[] imageMetadata,
-                                              BufferedImage[][] thumbnails,
-                                              EventListener[] listeners,
-                                              Locale locale,
-                                              ImageWriteParam writeParam,
-                                              ImageWriter writer,
-                                              RenderingHints hints) {
-
-        ParameterBlock args = new ParameterBlock();
-
-        args.addSource(source);
-
-        args.add(output);
-        args.add(format);
-        args.add(useProperties);
-        args.add(transcode);
-        args.add(verifyOutput);
-        args.add(allowPixelReplacement);
-        args.add(tileSize);
-        args.add(streamMetadata);
-        args.add(imageMetadata);
-        args.add(thumbnails);
-        args.add(listeners);
-        args.add(locale);
-        args.add(writeParam);
-        args.add(writer);
-
-        return JAI.createCollection(OPERATION_NAME, args, hints);
-    }
-
-    /**
-     * Type-safe convenience method for creating a {@link RenderableOp}
-     * representing the "ImageWrite" operation in renderable mode. The
-     * method packs the source and parameters into a new
-     * <code>ParameterBlock</code> and invokes
-     * {@link JAI#createRenderable(String,ParameterBlock,RenderingHints)}.
-     *
-     * @param source The renderable source to be written.
-     * @param output The output destination.
-     * @param format The format name of the output.
-     * @param useProperties Whether to use image metadata properties as
-     * fallbacks.
-     * @param transcode Whether to transcode metadata before writing.
-     * @param verifyOutput Whether to verify the validity of the output
-     * destination.
-     * @param allowPixelReplacement Whether to allow pixel replacement
-     * in the output image.
-     * @param tileSize The tile size of the output image.
-     * @param streamMetadata Stream metadata to write to the output.
-     * @param imageMetadata Image metadata to write to the output.
-     * @param thumbnails Thumbnails to write to the output.
-     * @param listeners EventListeners to be registered with the ImageWriter.
-     * @param locale The Locale for the ImageWriter to use.
-     * @param writeParam Java Image I/O write parameter instance.
-     * @param writer Java Image I/O writer instance.
-     * @param hints Operation hints.
-     * @return a reference to the operation source.
-     */
-    public static RenderableOp createRenderable(RenderableImage source,
-                                                ImageOutputStream output,
-                                                String format,
-                                                Boolean useProperties,
-                                                Boolean transcode,
-                                                Boolean verifyOutput,
-                                                Boolean allowPixelReplacement,
-                                                Dimension tileSize,
-                                                IIOMetadata streamMetadata,
-                                                IIOMetadata imageMetadata,
-                                                BufferedImage[] thumbnails,
-                                                EventListener[] listeners,
-                                                Locale locale,
-                                                ImageWriteParam writeParam,
-                                                ImageWriter writer,
-                                                RenderingHints hints) {
-        ParameterBlock args = new ParameterBlock();
-
-        args.addSource(source);
-
-        args.add(output);
-        args.add(format);
-        args.add(useProperties);
-        args.add(transcode);
-        args.add(verifyOutput);
-        args.add(allowPixelReplacement);
-        args.add(tileSize);
-        args.add(streamMetadata);
-        args.add(imageMetadata);
-        args.add(thumbnails);
-        args.add(listeners);
-        args.add(locale);
-        args.add(writeParam);
-        args.add(writer);
-
-        return JAI.createRenderable(OPERATION_NAME, args, hints);
-    }
-
-    /**
-     * Returns true indicating that the operation should be rendered
-     * immediately during a call to <code>JAI.create[]()</code> or
-     * <code>JAI.createCollection[NS]()</code>.
-     *
-     * @see javax.media.jai.OperationDescriptor
-     */
-    public boolean isImmediate() {
-        return true;
-    }
-
-    /**
-     * Validates the parameters in the supplied <code>ParameterBlock</code>.
-     *
-     * <p>In addition to the standard validation performed by the
-     * corresponding superclass method, this method verifies the following:
-     * <ul>
-     * <li>if <i>VerifyOutput</i> is <code>TRUE</code> and <i>Output</i>
-     * is a <code>File</code> or <code>String</code>, whether the
-     * corresponding physical file is writable, i.e., exists and may
-     * be overwritten or does not exist and may be created; and</li>
-     * <li>if <i>VerifyOutput</i> is <code>TRUE</code> and <i>Output</i>
-     * is a <code>Socket</code>, whether it is bound, connected, open,
-     * and the write-half is not shut down; and</li>
-     * <li>if in collection mode (<code>modeName</code> equals
-     * {@link CollectionRegistryMode#MODE_NAME}), the source is not a
-     * {@link CollectionOp}, and the size of the source
-     * {@link Collection} is greater than unity, whether the
-     * {@link ImageWriter} <i>cannot</i> write sequences.</li>
-     * </ul>
-     *
-     * If the superclass method finds that the arguments are invalid, or if
-     * this method determines that any of the foregoing conditions is true,
-     * an error message will be appended to <code>msg</code> and
-     * <code>false</code> will be returned; otherwise <code>true</code> will
-     * be returned.</p>
-     *
-     * @param modeName The operation mode.
-     * @param args The source and parameters of the operation.
-     * @param msg A container for any error messages.
-     *
-     * @return Whether the supplied parameters are valid.
-     */
-    protected boolean validateParameters(String modeName,
-                                         ParameterBlock args,
-                                         StringBuffer msg) {
-        if (!super.validateParameters(modeName, args, msg)) {
-            return false;
-        }
-
-        // Get the Output parameter.
-        Object output = args.getObjectParameter(0);
-
-        // Check the output if so requested by "VerifyOutput".
-	Boolean verifyOutput = (Boolean)args.getObjectParameter(4);
-	if (verifyOutput.booleanValue()){
-            if(output instanceof File || output instanceof String) {
-                // Set file and path variables.
-                File file = null;
-                String path = null;
-                if(output instanceof File) {
-                    file = (File)output;
-                    path = file.getPath();
-                } else if(output instanceof String) {
-                    path = (String)output;
-                    file = new File(path);
-                }
-
-                // Perform non-destructive test that the file
-                // may be created and written.
-                try {
-                    if (file.exists()) {
-                        if (!file.canWrite()) {
-                            // Cannot write to existing file.
-                            msg.append(file.getPath() + " " +
-                                       I18N.getString("ImageWriteDescriptor15"));
-                            return false;
-                        }
-                    } else {
-                        if (!file.createNewFile()) {
-                            // Cannot create file.
-                            msg.append(file.getPath() + " " +
-                                       I18N.getString("ImageWriteDescriptor16"));
-                            return false;
-                        }
-                        file.delete();
-                    }
-                } catch (IOException ioe) {
-                    // I/O exception during createNewFile().
-                    msg.append(file.getPath() + " " +
-                               I18N.getString("ImageWriteDescriptor17") + " " +
-                               ioe.getMessage());
-                    return false;
-                } catch (SecurityException se) {
-                    // Security exception during exists(), canWrite(),
-                    // createNewFile(), or delete().
-                    msg.append(file.getPath() + " " +
-                               I18N.getString("ImageWriteDescriptor18") + " " +
-                               se.getMessage());
-                    return false;
-                }
-            } else if(output instanceof Socket) {
-                Socket socket = (Socket)output;
-
-                if(socket.isOutputShutdown()) {
-                    msg.append("\"" + socket + "\": " + 
-                               I18N.getString("ImageWriteDescriptor19"));
-                    return false;
-                } else if(socket.isClosed()) {
-                    msg.append("\"" + socket + "\": " + 
-                               I18N.getString("ImageWriteDescriptor20"));
-                    return false;
-                } else if(!socket.isBound()) {
-                    msg.append("\"" + socket + "\": " + 
-                               I18N.getString("ImageWriteDescriptor21"));
-                    return false;
-                } else if(!socket.isConnected()) {
-                    msg.append("\"" + socket + "\": " + 
-                               I18N.getString("ImageWriteDescriptor22"));
-                    return false;
-                }
-            }
-        }
-
-        // Get the Format parameter.
-        String format = (String)args.getObjectParameter(1);
-
-        // Get the ImageWriter parameter.
-        ImageWriter writer = (ImageWriter)args.getObjectParameter(13);
-
-        if(format == null) {
-            // Attempt to get the format from the ImageWriter provider.
-            if(writer != null) {
-
-                // Get the SPI.
-                ImageWriterSpi spi = writer.getOriginatingProvider();
-
-                // Set from the SPI.
-                if(spi != null) {
-                    format = spi.getFormatNames()[0];
-                }
-            }
-
-            // Attempt to deduce the format from the file suffix.
-            if(format == null &&
-               (output instanceof File || output instanceof String)) {
-
-                // Set the file name string.
-                String name = output instanceof File ?
-                    ((File)output).getName() : (String)output;
-
-                // Extract the suffix.
-                String suffix = name.substring(name.lastIndexOf(".") + 1);
-
-                // Get the writers of that suffix.
-                Iterator writers = ImageIO.getImageWritersBySuffix(suffix);
-
-                if(writers != null) {
-                    // Get the first writer.
-                    writer = (ImageWriter)writers.next();
-
-                    if(writer != null) {
-                        // Get the SPI.
-                        ImageWriterSpi spi = writer.getOriginatingProvider();
-
-                        // Set from the SPI.
-                        if(spi != null) {
-                            format = spi.getFormatNames()[0];
-                        }
-                    }
-                }
-            }
-
-            // Default to the most versatile core Java Image I/O writer.
-            if(format == null) {
-                format = "PNG";
-            }
-
-            // Replace the format setting.
-            if(format != null) {
-                args.set(format, 1);
-            }
-        }
-
-        // Check the tile size parameter if present.
-        Dimension tileSize = (Dimension)args.getObjectParameter(6);
-        if(tileSize != null && (tileSize.width <= 0 || tileSize.height <= 0)) {
-            msg.append(I18N.getString("ImageWriteDescriptor23"));
-            return false;
-        }
-
-        // For collection mode, verify that the source collection contains
-        // at least one RenderedImage and that the writer can handle sequences
-        // if there is more than one RenderedImage in the source collection.
-        if(modeName.equalsIgnoreCase(CollectionRegistryMode.MODE_NAME)) {
-            // Get the source collection.
-            Collection source = (Collection)args.getSource(0);
-
-            // If the source collection is a CollectionOp do not perform this
-            // check as invoking source.size() will render the node.
-            if(!(source instanceof CollectionOp)) {
-
-                // Determine the number of RenderedImages in the Collection.
-                int numRenderedImages = 0;
-                Iterator iter = source.iterator();
-                while(iter.hasNext()) {
-                    if(iter.next() instanceof RenderedImage) {
-                        numRenderedImages++;
-                    }
-                }
-
-                if(numRenderedImages == 0) {
-                    msg.append(I18N.getString("ImageWriteDescriptor24"));
-                    return false;
-                } else if(numRenderedImages > 1) {
-                    // Get the writer parameter.
-                    writer = (ImageWriter)args.getObjectParameter(13);
-
-                    // If the parameter writer is null, get one based on the
-                    // format.
-                    if(writer == null && format != null) {
-                        // Get the writers of that format.
-                        Iterator writers =
-                            ImageIO.getImageWritersByFormatName(format);
-
-                        if(writers != null) {
-                            // Get the first writer.
-                            writer = (ImageWriter)writers.next();
-                        }
-                    }
-
-                    if(writer != null) {
-                        // Check that the writer can write sequences.
-                        if(!writer.canWriteSequence()) {
-                            msg.append(I18N.getString("ImageWriteDescriptor25"));
-                            return false;
-                        }
-                    }
-                }
-            }
-        }
-
-        return true;
-    }
-}
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/operator/package.html zzx2/src/share/classes/com/sun/media/jai/operator/package.html
--- jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/operator/package.html	2005-02-11 00:01:57.000000000 -0500
+++ zzx2/src/share/classes/com/sun/media/jai/operator/package.html	1969-12-31 19:00:00.000000000 -0500
@@ -1,52 +0,0 @@
-<!--
-$RCSfile: package.html,v $
-
-
-Copyright (c) 2005 Sun Microsystems, Inc. All  Rights Reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met: 
-
-- Redistribution of source code must retain the above copyright 
-  notice, this  list of conditions and the following disclaimer.
-
-- Redistribution in binary form must reproduce the above copyright
-  notice, this list of conditions and the following disclaimer in 
-  the documentation and/or other materials provided with the
-  distribution.
-
-Neither the name of Sun Microsystems, Inc. or the names of 
-contributors may be used to endorse or promote products derived 
-from this software without specific prior written permission.
-
-This software is provided "AS IS," without a warranty of any 
-kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 
-WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 
-FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
-EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL 
-NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF 
-USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
-DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR 
-ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
-CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
-REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
-INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES. 
-
-You acknowledge that this software is not designed or intended for 
-use in the design, construction, operation or maintenance of any 
-nuclear facility. 
-
-$Revision: 1.1 $
-$Date: 2005/02/11 05:01:57 $
-$State: Exp $
--->
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<body>
-Provides JAI operations which read and write images using the Java Image
-I/O Framework. These operations are plug-ins which are automatically loaded
-using the <code>javax.media.jai.OperationRegistrySpi</code> mechanism of JAI.
-
-@since 1.0
-</body>
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/operator/PrintProps.java zzx2/src/share/classes/com/sun/media/jai/operator/PrintProps.java
--- jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/operator/PrintProps.java	2005-02-11 00:01:57.000000000 -0500
+++ zzx2/src/share/classes/com/sun/media/jai/operator/PrintProps.java	1969-12-31 19:00:00.000000000 -0500
@@ -1,85 +0,0 @@
-/*
- * $RCSfile: PrintProps.java,v $
- *
- * 
- * Copyright (c) 2005 Sun Microsystems, Inc. All  Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met: 
- * 
- * - Redistribution of source code must retain the above copyright 
- *   notice, this  list of conditions and the following disclaimer.
- * 
- * - Redistribution in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in 
- *   the documentation and/or other materials provided with the
- *   distribution.
- * 
- * Neither the name of Sun Microsystems, Inc. or the names of 
- * contributors may be used to endorse or promote products derived 
- * from this software without specific prior written permission.
- * 
- * This software is provided "AS IS," without a warranty of any 
- * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 
- * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
- * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL 
- * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF 
- * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
- * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR 
- * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
- * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
- * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
- * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES. 
- * 
- * You acknowledge that this software is not designed or intended for 
- * use in the design, construction, operation or maintenance of any 
- * nuclear facility. 
- *
- * $Revision: 1.1 $
- * $Date: 2005/02/11 05:01:57 $
- * $State: Exp $
- */
-package com.sun.media.jai.operator;
-
-import java.util.Collection;
-import java.util.Iterator;
-import javax.media.jai.PropertySource;
-
-final class PrintProps {
-    static final void print(PropertySource ps) {
-        String[] propNames = ps.getPropertyNames();
-        if(propNames != null) {
-            System.out.println("\nPROPERTIES OF "+
-                               ps.getClass().getName()+"@"+
-                               ps.hashCode()+":\n");
-            for(int j = 0; j < propNames.length; j++) {
-                Object propVal = ps.getProperty(propNames[j]);
-                if(propVal == null) {
-                    System.out.println(propNames[j]+" is NULL.");
-                } else if(propVal == java.awt.Image.UndefinedProperty) {
-                    System.out.println(propNames[j]+" is UNDEFINED.");
-                } else {
-                    System.out.println(propNames[j]+" = "+
-                                       propVal.getClass().getName()+"@"+
-                                       propVal.hashCode());
-                }
-            }
-        } else {
-            System.out.println("\n"+ps+" has no properties.");
-        }
-        System.out.println("\n");
-
-        if(ps instanceof Collection) {
-            Iterator iter = ((Collection)ps).iterator();
-            while(iter.hasNext()) {
-                Object nextElement = iter.next();
-                if(nextElement instanceof PropertySource) {
-                    print((PropertySource)nextElement);
-                }
-            }
-        }
-    }
-}
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/operator/properties zzx2/src/share/classes/com/sun/media/jai/operator/properties
--- jai-imageio-core-cvs20091111-CLEANED/src/share/classes/com/sun/media/jai/operator/properties	2005-02-11 00:01:57.000000000 -0500
+++ zzx2/src/share/classes/com/sun/media/jai/operator/properties	1969-12-31 19:00:00.000000000 -0500
@@ -1,60 +0,0 @@
-#
-# $RCSfile: properties,v $
-#
-# Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
-#
-# Use is subject to license terms.
-#
-# $Revision: 1.1 $
-# $Date: 2005/02/11 05:01:57 $
-# $State: Exp $
-#
-# Internationalization file for com.sun.media.jai.operator
-
-DescriptorVersion=1.0
-
-ImageReadDescriptor0=Reads an image using the Java Image I/O Framework.
-ImageReadDescriptor1=The input source.
-ImageReadDescriptor2=The index or indices of the image(s) to read.
-ImageReadDescriptor3=Whether metadata should be read if available.
-ImageReadDescriptor4=Whether thumbnails should be read if available.
-ImageReadDescriptor5=Whether to verify the validity of the input source.
-ImageReadDescriptor6=EventListeners to be registered with the ImageReader.
-ImageReadDescriptor7=The Locale for the ImageReader to use.
-ImageReadDescriptor8=Java Image I/O read parameter instance.
-ImageReadDescriptor9=Java Image I/O reader instance.
-ImageReadDescriptor10=Image index parameter must be non-negative.
-ImageReadDescriptor11=does not exist.
-ImageReadDescriptor12=is not readable.
-ImageReadDescriptor13=has its read-half shut down.
-ImageReadDescriptor14=is closed.
-ImageReadDescriptor15=is not bound to an address.
-ImageReadDescriptor16=is not connected.
-
-ImageWriteDescriptor0=Writes an image using the Java Image I/O Framework.
-ImageWriteDescriptor1=The output destination.
-ImageWriteDescriptor2=The format name of the output.
-ImageWriteDescriptor3=Whether to use image metadata properties as fallbacks.
-ImageWriteDescriptor4=Whether to transcode metadata before writing.
-ImageWriteDescriptor5=Whether to verify the validity of the output destination.
-ImageWriteDescriptor6=Whether to allow pixel replacement in the output image.
-ImageWriteDescriptor7=The tile size of the output image.
-ImageWriteDescriptor8=Stream metadata to write to the output.
-ImageWriteDescriptor9=Image metadata to write to the output.
-ImageWriteDescriptor10=Thumbnails to write to the output.
-ImageWriteDescriptor11=EventListeners to be registered with the ImageWriter.
-ImageWriteDescriptor12=The Locale for the ImageWriter to use.
-ImageWriteDescriptor13=Java Image I/O write parameter instance.
-ImageWriteDescriptor14=Java Image I/O writer instance.
-ImageWriteDescriptor15=exists but is not writable.
-ImageWriteDescriptor16=does not exist and cannot be created.
-ImageWriteDescriptor17=encountered IOException during createNewFile:
-ImageWriteDescriptor18=access denied by security manager:
-ImageWriteDescriptor19=has its write-half shut down.
-ImageWriteDescriptor20=is closed.
-ImageWriteDescriptor21=is not bound to an address.
-ImageWriteDescriptor22=is not connected.
-ImageWriteDescriptor23=Non-positive tile dimension specified.
-ImageWriteDescriptor24=No RenderedImages in the source Collection.
-ImageWriteDescriptor25=There is more than one RenderedImage in the source \
-Collection and the supplied ImageWriter cannot write sequences.
diff -urN jai-imageio-core-cvs20091111-CLEANED/src/share/services/javax.imageio.spi.ImageReaderSpi zzx2/src/share/services/javax.imageio.spi.ImageReaderSpi
--- jai-imageio-core-cvs20091111-CLEANED/src/share/services/javax.media.jai.OperationRegistrySpi	2005-02-11 00:02:44.000000000 -0500
+++ zzx2/src/share/services/javax.media.jai.OperationRegistrySpi	1969-12-31 19:00:00.000000000 -0500
@@ -1,47 +0,0 @@
-#
-# $RCSfile: javax.media.jai.OperationRegistrySpi,v $
-#
-# 
-# Copyright (c) 2005 Sun Microsystems, Inc. All  Rights Reserved.
-# 
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met: 
-# 
-# - Redistribution of source code must retain the above copyright 
-#   notice, this  list of conditions and the following disclaimer.
-# 
-# - Redistribution in binary form must reproduce the above copyright
-#   notice, this list of conditions and the following disclaimer in 
-#   the documentation and/or other materials provided with the
-#   distribution.
-# 
-# Neither the name of Sun Microsystems, Inc. or the names of 
-# contributors may be used to endorse or promote products derived 
-# from this software without specific prior written permission.
-# 
-# This software is provided "AS IS," without a warranty of any 
-# kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND 
-# WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, 
-# FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
-# EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL 
-# NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF 
-# USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
-# DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR 
-# ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
-# CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
-# REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
-# INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGES. 
-# 
-# You acknowledge that this software is not designed or intended for 
-# use in the design, construction, operation or maintenance of any 
-# nuclear facility. 
-#
-# $Revision: 1.1 $
-# $Date: 2005/02/11 05:02:44 $
-# $State: Exp $
-#
-# --- JAI-Image I/O operations registration ---
-#
-com.sun.media.jai.imageioimpl.ImageReadWriteSpi