001: /*
002: * $RCSfile: ImageReadCIF.java,v $
003: *
004: *
005: * Copyright (c) 2005 Sun Microsystems, Inc. All Rights Reserved.
006: *
007: * Redistribution and use in source and binary forms, with or without
008: * modification, are permitted provided that the following conditions
009: * are met:
010: *
011: * - Redistribution of source code must retain the above copyright
012: * notice, this list of conditions and the following disclaimer.
013: *
014: * - Redistribution in binary form must reproduce the above copyright
015: * notice, this list of conditions and the following disclaimer in
016: * the documentation and/or other materials provided with the
017: * distribution.
018: *
019: * Neither the name of Sun Microsystems, Inc. or the names of
020: * contributors may be used to endorse or promote products derived
021: * from this software without specific prior written permission.
022: *
023: * This software is provided "AS IS," without a warranty of any
024: * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
025: * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
026: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
027: * EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL
028: * NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF
029: * USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
030: * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR
031: * ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
032: * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
033: * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
034: * INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
035: * POSSIBILITY OF SUCH DAMAGES.
036: *
037: * You acknowledge that this software is not designed or intended for
038: * use in the design, construction, operation or maintenance of any
039: * nuclear facility.
040: *
041: * $Revision: 1.1 $
042: * $Date: 2005/02/11 05:01:54 $
043: * $State: Exp $
044: */
045: package com.sun.media.jai.imageioimpl;
046:
047: import java.awt.Dimension;
048: import java.awt.RenderingHints;
049: import java.awt.image.renderable.ParameterBlock;
050: import java.util.ArrayList;
051: import java.util.List;
052: import javax.imageio.ImageReader;
053: import javax.media.jai.CollectionImage;
054: import javax.media.jai.CollectionImageFactory;
055: import javax.media.jai.CollectionOp;
056: import javax.media.jai.JAI;
057: import javax.media.jai.PlanarImage;
058: import com.sun.media.jai.operator.ImageReadDescriptor;
059:
060: public class ImageReadCIF implements CollectionImageFactory {
061:
062: static CollectionImage createStatic(ParameterBlock args,
063: RenderingHints hints) {
064:
065: // Clone the ParameterBlock as the ImageChoice will be overwritten.
066: ParameterBlock renderedPB = (ParameterBlock) args.clone();
067:
068: // Get the ImageChoice.
069: int[] imageIndices = (int[]) args.getObjectParameter(1);
070:
071: // Variables to be set in the subsequent "if" block.
072: // XXX Could probably collapse the if block into a single code seq.
073: int numSources;
074: ImageIOCollectionImage imageList = null;
075:
076: if (imageIndices == null) {
077: // null-valued ImageChoice: load all images.
078:
079: // Load the first image.
080: renderedPB.set(0, 1);
081: PlanarImage image = JAI.create("ImageRead", renderedPB,
082: hints);
083:
084: // Get the ImageReader property.
085: Object readerProperty = image
086: .getProperty(ImageReadDescriptor.PROPERTY_NAME_IMAGE_READER);
087:
088: // Try to read the number of images.
089: if (readerProperty instanceof ImageReader) {
090: try {
091: // XXX Really should not allow search here. If search
092: // is disallowed and -1 is returned from getNumImages(),
093: // then "ImageRead" should just be called until an
094: // IndexOutOfBoundsException is caught.
095: numSources = ((ImageReader) readerProperty)
096: .getNumImages(true);
097: } catch (Exception e) { // IOException
098: // Default to one source.
099: numSources = 1;
100: }
101: } else {
102: numSources = 1;
103: }
104:
105: // Allocate and fill index array.
106: imageIndices = new int[numSources];
107: for (int i = 0; i < numSources; i++) {
108: imageIndices[i] = i;
109: }
110:
111: // Allocate list and add first image.
112: imageList = new ImageIOCollectionImage(numSources);
113: imageList.add(image);
114: } else {
115: // Set the number of sources and create the list.
116: numSources = imageIndices.length;
117: imageList = new ImageIOCollectionImage(numSources);
118:
119: // Load the first image requested.
120: renderedPB.set(imageIndices[0], 1);
121: PlanarImage image = JAI.create("ImageRead", renderedPB,
122: hints);
123:
124: // Add the first image to the list.
125: imageList.add(image);
126: }
127:
128: // Read subsequent images and add to the list.
129: for (int idx = 1; idx < numSources; idx++) {
130: renderedPB.set(imageIndices[idx], 1);
131: PlanarImage image = JAI.create("ImageRead", renderedPB,
132: hints);
133: imageList.add(image);
134: }
135:
136: // Get the first image in the Collection.
137: PlanarImage firstImage = (PlanarImage) imageList.get(0);
138:
139: // Transfer properties to the Collection.
140: ImageReadCRIF.copyProperty(firstImage, imageList,
141: ImageReadDescriptor.PROPERTY_NAME_IMAGE_READ_PARAM);
142: ImageReadCRIF.copyProperty(firstImage, imageList,
143: ImageReadDescriptor.PROPERTY_NAME_IMAGE_READER);
144: ImageReadCRIF.copyProperty(firstImage, imageList,
145: ImageReadDescriptor.PROPERTY_NAME_METADATA_STREAM);
146:
147: return imageList;
148: }
149:
150: /** Constructor. */
151: public ImageReadCIF() {
152: }
153:
154: public CollectionImage create(ParameterBlock args,
155: RenderingHints hints) {
156: return createStatic(args, hints);
157: }
158:
159: // Forget it.
160: public CollectionImage update(ParameterBlock oldParamBlock,
161: RenderingHints oldHints, ParameterBlock newParamBlock,
162: RenderingHints newHints, CollectionImage oldRendering,
163: CollectionOp op) {
164: return null;
165: }
166: }
|