aboutsummaryrefslogtreecommitdiffstats
path: root/src/javax/media/j3d/ImageComponent3D.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/javax/media/j3d/ImageComponent3D.java')
-rw-r--r--src/javax/media/j3d/ImageComponent3D.java979
1 files changed, 979 insertions, 0 deletions
diff --git a/src/javax/media/j3d/ImageComponent3D.java b/src/javax/media/j3d/ImageComponent3D.java
new file mode 100644
index 0000000..34be8b9
--- /dev/null
+++ b/src/javax/media/j3d/ImageComponent3D.java
@@ -0,0 +1,979 @@
+/*
+ * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+package javax.media.j3d;
+
+import java.awt.image.BufferedImage;
+import java.awt.image.RenderedImage;
+
+/**
+ * This class defines a 3D image component. This is used for texture
+ * images.
+ * Prior to Java 3D 1.2, only BufferedImage objects could be used as
+ * the input to an ImageComponent3D object. As of Java 3D 1.2, an
+ * ImageComponent3D accepts an array of arbitrary RenderedImage
+ * objects (BufferedImage is an implementation of the RenderedImage
+ * interface). The methods that set/get a BufferedImage object are
+ * left in for compatibility. The new methods that set/get a
+ * RenderedImage are a superset of the old methods. In particular,
+ * the two set methods in the following example are equivalent:
+ *
+ * <p>
+ * <ul>
+ * <code>
+ * BufferedImage bi;<br>
+ * RenderedImage ri = bi;<br>
+ * ImageComponent3D ic;<br>
+ * <p>
+ * // Set image 0 to the specified BufferedImage<br>
+ * ic.set(0, bi);<br>
+ * <p>
+ * // Set image 0 to the specified RenderedImage<br>
+ * ic.set(0, ri);<br>
+ * </code>
+ * </ul>
+ *
+ */
+public class ImageComponent3D extends ImageComponent {
+
+ // non-public, no parameter constructor
+ ImageComponent3D() {}
+
+ /**
+ * Constructs a 3D image component object using the specified
+ * format, width, height, and depth. Default values are used for
+ * all other parameters. The default values are as follows:
+ * <ul>
+ * array of images : null<br>
+ * imageClass : ImageClass.BUFFERED_IMAGE<br>
+ * </ul>
+ *
+ * @param format the image component format, one of: FORMAT_RGB,
+ * FORMAT_RGBA, etc.
+ * @param width the number of columns of pixels in this image component
+ * object
+ * @param height the number of rows of pixels in this image component
+ * object
+ * @param depth the number of 2D slices in this image component object
+ * @exception IllegalArgumentException if format is invalid, or if
+ * any of width, height, or depth are not positive.
+ */
+ public ImageComponent3D(int format,
+ int width,
+ int height,
+ int depth) {
+
+ ((ImageComponent3DRetained)this.retained).processParams(format, width, height, depth);
+ }
+
+ /**
+ * Constructs a 3D image component object using the specified format,
+ * and the BufferedImage array.
+ * The image class is set to ImageClass.BUFFERED_IMAGE.
+ * Default values are used for all other parameters.
+ *
+ * @param format the image component format, one of: FORMAT_RGB,
+ * FORMAT_RGBA etc.
+ * @param images an array of BufferedImage objects. The
+ * first image in the array determines the width and height of this
+ * ImageComponent3D.
+ *
+ * @exception IllegalArgumentException if format is invalid, or if
+ * the width or height of the first image are not positive.
+ */
+ public ImageComponent3D(int format, BufferedImage[] images) {
+ ((ImageComponent3DRetained)this.retained).processParams(format,
+ images[0].getWidth(null), images[0].getHeight(null), images.length);
+ for (int i=0; i<images.length; i++) {
+ ((ImageComponent3DRetained)this.retained).set(i, images[i]);
+ }
+ }
+
+ /**
+ * Constructs a 3D image component object using the specified format,
+ * and the RenderedImage array.
+ * The image class is set to ImageClass.BUFFERED_IMAGE.
+ * Default values are used for all other parameters.
+ *
+ * @param format the image component format, one of: FORMAT_RGB,
+ * FORMAT_RGBA etc.
+ * @param images an array of RenderedImage objects. The
+ * first image in the array determines the width and height of this
+ * ImageComponent3D.
+ *
+ * @exception IllegalArgumentException if format is invalid, or if
+ * the width or height of the first image are not positive.
+ *
+ * @since Java 3D 1.2
+ */
+ public ImageComponent3D(int format, RenderedImage[] images) {
+
+ ((ImageComponent3DRetained)this.retained).processParams(format,
+ images[0].getWidth(), images[0].getHeight(), images.length);
+ for (int i=0; i<images.length; i++) {
+ ((ImageComponent3DRetained)this.retained).set(i, images[i]);
+ }
+ }
+
+ /**
+ * Constructs a 3D image component object using the specified
+ * format, width, height, depth, byReference flag, and yUp flag.
+ * Default values are used for all other parameters.
+ *
+ * @param format the image component format, one of: FORMAT_RGB,
+ * FORMAT_RGBA, etc.
+ * @param width the number of columns of pixels in this image component
+ * object
+ * @param height the number of rows of pixels in this image component
+ * object
+ * @param depth the number of 2D slices in this image component object
+ * @param byReference a flag that indicates whether the data is copied
+ * into this image component object or is accessed by reference.
+ * @param yUp a flag that indicates the y-orientation of this image
+ * component. If yUp is set to true, the origin of the image is
+ * the lower left; otherwise, the origin of the image is the upper
+ * left.
+ *
+ * @exception IllegalArgumentException if format is invalid, or if
+ * any of width, height, or depth are not positive.
+ *
+ * @since Java 3D 1.2
+ */
+ public ImageComponent3D(int format,
+ int width,
+ int height,
+ int depth,
+ boolean byReference,
+ boolean yUp) {
+
+ ((ImageComponentRetained)this.retained).setByReference(byReference);
+ ((ImageComponentRetained)this.retained).setYUp(yUp);
+ ((ImageComponent3DRetained)this.retained).processParams(format, width, height, depth);
+ }
+
+ /**
+ * Constructs a 3D image component object using the specified format,
+ * BufferedImage array, byReference flag, and yUp flag.
+ * The image class is set to ImageClass.BUFFERED_IMAGE.
+ *
+ * @param format the image component format, one of: FORMAT_RGB,
+ * FORMAT_RGBA etc.
+ * @param images an array of BufferedImage objects. The
+ * first image in the array determines the width and height of this
+ * ImageComponent3D.
+ * @param byReference a flag that indicates whether the data is copied
+ * into this image component object or is accessed by reference.
+ * @param yUp a flag that indicates the y-orientation of this image
+ * component. If yUp is set to true, the origin of the image is
+ * the lower left; otherwise, the origin of the image is the upper
+ * left.
+ *
+ * @exception IllegalArgumentException if format is invalid, or if
+ * the width or height of the first image are not positive.
+ *
+ * @since Java 3D 1.2
+ */
+ public ImageComponent3D(int format,
+ BufferedImage[] images,
+ boolean byReference,
+ boolean yUp) {
+
+
+ ((ImageComponentRetained)this.retained).setByReference(byReference);
+ ((ImageComponentRetained)this.retained).setYUp(yUp);
+ ((ImageComponent3DRetained)this.retained).processParams(format,
+ images[0].getWidth(null), images[0].getHeight(null), images.length);
+ for (int i=0; i<images.length; i++) {
+ ((ImageComponent3DRetained)this.retained).set(i, images[i]);
+ }
+ }
+
+ /**
+ * Constructs a 3D image component object using the specified format,
+ * RenderedImage array, byReference flag, and yUp flag.
+ * The image class is set to ImageClass.RENDERED_IMAGE if the byReference
+ * flag is true and any of the specified RenderedImages is <i>not</i> an
+ * instance of BufferedImage. In all other cases, the image class is set to
+ * ImageClass.BUFFERED_IMAGE.
+ *
+ * @param format the image component format, one of: FORMAT_RGB,
+ * FORMAT_RGBA etc.
+ * @param images an array of RenderedImage objects. The
+ * first image in the array determines the width and height of this
+ * ImageComponent3D.
+ * @param byReference a flag that indicates whether the data is copied
+ * into this image component object or is accessed by reference.
+ * @param yUp a flag that indicates the y-orientation of this image
+ * component. If yUp is set to true, the origin of the image is
+ * the lower left; otherwise, the origin of the image is the upper
+ * left.
+ * @exception IllegalArgumentException if format is invalid, or if
+ * the width or height of the first image are not positive.
+ *
+ * @since Java 3D 1.2
+ */
+ public ImageComponent3D(int format,
+ RenderedImage[] images,
+ boolean byReference,
+ boolean yUp) {
+
+ ((ImageComponentRetained)this.retained).setByReference(byReference);
+ ((ImageComponentRetained)this.retained).setYUp(yUp);
+ ((ImageComponent3DRetained)this.retained).processParams(format,
+ images[0].getWidth(), images[0].getHeight(), images.length);
+ for (int i=0; i<images.length; i++) {
+ ((ImageComponent3DRetained)this.retained).set(i, images[i]);
+ }
+ }
+
+ /**
+ * Constructs a 3D image component object using the specified format,
+ * NioImageBuffer array, byReference flag, and yUp flag.
+ * The image class is set to ImageClass.NIO_IMAGE_BUFFER.
+ *
+ * @param format the image component format, one of: FORMAT_RGB,
+ * FORMAT_RGBA etc.
+ * @param images an array of NioImageBuffer objects. The
+ * first image in the array determines the width and height of this
+ * ImageComponent3D.
+ * @param byReference a flag that indicates whether the data is copied
+ * into this image component object or is accessed by reference.
+ * @param yUp a flag that indicates the y-orientation of this image
+ * component. If yUp is set to true, the origin of the image is
+ * the lower left; otherwise, the origin of the image is the upper
+ * left.
+ *
+ * @exception IllegalArgumentException if format is invalid, or if
+ * the width or height of the first image are not positive.
+ *
+ * @exception IllegalArgumentException if the byReference flag is false.
+ *
+ * @exception IllegalArgumentException if the yUp flag is false.
+ *
+ * @exception UnsupportedOperationException this method is not supported
+ * for Java 3D 1.5.
+ *
+ * @since Java 3D 1.5
+ */
+ public ImageComponent3D(int format,
+ NioImageBuffer[] images,
+ boolean byReference,
+ boolean yUp) {
+
+
+ throw new UnsupportedOperationException();
+ /*
+ ((ImageComponentRetained)this.retained).setByReference(byReference);
+ ((ImageComponentRetained)this.retained).setYUp(yUp);
+ ((ImageComponent3DRetained)this.retained).processParams(format,
+ images[0].getWidth(), images[0].getHeight(), images.length);
+ for (int i=0; i<images.length; i++) {
+ ((ImageComponent3DRetained)this.retained).set(i, images[i]);
+ }
+ */
+ }
+
+ /**
+ * Retrieves the depth of this 3D image component object.
+ *
+ * @return the depth of this 3D image component object
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ */
+ public int getDepth() {
+ if (isLiveOrCompiled())
+ if(!this.getCapability(ImageComponent.ALLOW_SIZE_READ))
+ throw new CapabilityNotSetException(J3dI18N.getString("ImageComponent3D0"));
+ return ((ImageComponent3DRetained)this.retained).getDepth();
+ }
+
+ /**
+ * Sets the array of images in this image component to the
+ * specified array of BufferedImage objects. If the data access
+ * mode is not by-reference, then the BufferedImage data is copied
+ * into this object. If the data access mode is by-reference,
+ * then a shallow copy of the array of references to the
+ * BufferedImage objects is made, but the BufferedImage
+ * data is not necessarily copied.
+ * <p>
+ * The image class is set to ImageClass.BUFFERED_IMAGE.
+ *
+ * @param images array of BufferedImage objects containing the image.
+ * The size (width and height) of each image must be the same as the
+ * size of the image component, and the length of the images array
+ * must equal the depth of the image component.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @exception IllegalArgumentException if the length of the images array is
+ * not equal to the depth of this ImageComponent object.
+ *
+ * @exception IllegalArgumentException if the width and height of each
+ * image in the images array is not equal to the width and height of this
+ * ImageComponent object.
+ */
+ public void set(BufferedImage[] images) {
+ checkForLiveOrCompiled();
+ int depth = ((ImageComponent3DRetained)this.retained).getDepth();
+
+ if (depth != images.length)
+ throw new IllegalArgumentException(J3dI18N.getString("ImageComponent3D1"));
+ for (int i=0; i<depth; i++) {
+ ((ImageComponent3DRetained)this.retained).set(i, images[i]);
+ }
+ }
+
+ /**
+ * Sets the array of images in this image component to the
+ * specified array of RenderedImage objects. If the data access
+ * mode is not by-reference, then the RenderedImage data is copied
+ * into this object. If the data access mode is by-reference,
+ * then a shallow copy of the array of references to the
+ * RenderedImage objects is made, but the RenderedImage
+ * data is not necessarily copied.
+ * <p>
+ * The image class is set to ImageClass.RENDERED_IMAGE if the data access
+ * mode is by-reference and any of the specified RenderedImages
+ * is <i>not</i> an instance of BufferedImage. In all other cases,
+ * the image class is set to ImageClass.BUFFERED_IMAGE.
+ *
+ * @param images array of RenderedImage objects containing the image.
+ * The size (width and height) of each image must be the same as the
+ * size of the image component, and the length of the images array
+ * must equal the depth of the image component.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @exception IllegalArgumentException if the length of the images array is
+ * not equal to the depth of this ImageComponent object.
+ *
+ * @exception IllegalArgumentException if the width and height of each
+ * image in the images array is not equal to the width and height of this
+ * ImageComponent object.
+ *
+ * @since Java 3D 1.2
+ */
+ public void set(RenderedImage[] images) {
+
+ checkForLiveOrCompiled();
+ int depth = ((ImageComponent3DRetained)this.retained).getDepth();
+
+ if (depth != images.length)
+ throw new IllegalArgumentException(J3dI18N.getString("ImageComponent3D1"));
+ for (int i=0; i<depth; i++) {
+ ((ImageComponent3DRetained)this.retained).set(i, images[i]);
+ }
+ }
+
+ /**
+ * Sets the array of images in this image component to the
+ * specified array of NioImageBuffer objects. If the data access
+ * mode is not by-reference, then the NioImageBuffer data is copied
+ * into this object. If the data access mode is by-reference,
+ * then a shallow copy of the array of references to the
+ * NioImageBuffer objects is made, but the NioImageBuffer
+ * data is not necessarily copied.
+ * <p>
+ * The image class is set to ImageClass.NIO_IMAGE_BUFFER.
+ *
+ * @param images array of NioImageBuffer objects containing the image.
+ * The size (width and height) of each image must be the same as the
+ * size of the image component, and the length of the images array
+ * must equal the depth of the image component.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @exception IllegalStateException if this ImageComponent object
+ * is <i>not</i> yUp.
+ *
+ * @exception IllegalArgumentException if the length of the images array is
+ * not equal to the depth of this ImageComponent object.
+ *
+ * @exception IllegalArgumentException if the width and height of each
+ * image in the images array is not equal to the width and height of this
+ * ImageComponent object.
+ *
+ * @exception UnsupportedOperationException this method is not supported
+ * for Java 3D 1.5.
+ *
+ * @since Java 3D 1.5
+ */
+ public void set(NioImageBuffer[] images) {
+
+ throw new UnsupportedOperationException();
+ /*
+ checkForLiveOrCompiled();
+ int depth = ((ImageComponent3DRetained)this.retained).getDepth();
+
+ if (depth != images.length)
+ throw new IllegalArgumentException(J3dI18N.getString("ImageComponent3D1"));
+ for (int i=0; i<depth; i++) {
+ ((ImageComponent3DRetained)this.retained).set(i, images[i]);
+ }
+ */
+ }
+
+ /**
+ * Sets this image component at the specified index to the
+ * specified BufferedImage object. If the data access mode is not
+ * by-reference, then the BufferedImage data is copied into this
+ * object. If the data access mode is by-reference, then a
+ * reference to the BufferedImage is saved, but the data is not
+ * necessarily copied.
+ *
+ * @param index the image index.
+ * The index must be less than the depth of this ImageComponent3D object.
+ *
+ * @param image BufferedImage object containing the image.
+ * The size (width and height) must be the same as the current size of this
+ * ImageComponent3D object.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @exception IllegalStateException if the image class is not
+ * ImageClass.BUFFERED_IMAGE.
+ *
+ * @exception IllegalArgumentException if the width and height the image
+ * is not equal to the width and height of this ImageComponent object.
+ */
+ public void set(int index, BufferedImage image) {
+ checkForLiveOrCompiled();
+ if (image.getWidth(null) != this.getWidth())
+ throw new IllegalArgumentException(J3dI18N.getString("ImageComponent3D2"));
+
+ if (image.getHeight(null) != this.getHeight())
+ throw new IllegalArgumentException(J3dI18N.getString("ImageComponent3D4"));
+
+ ((ImageComponent3DRetained)this.retained).set(index, image);
+ }
+
+ /**
+ * Sets this image component at the specified index to the
+ * specified RenderedImage object. If the data access mode is not
+ * by-reference, then the RenderedImage data is copied into this
+ * object. If the data access mode is by-reference, then a
+ * reference to the RenderedImage is saved, but the data is not
+ * necessarily copied.
+ *
+ * @param index the image index.
+ * The index must be less than the depth of this ImageComponent3D object.
+ *
+ * @param image RenderedImage object containing the image.
+ * The size (width and height) must be the same as the current size of this
+ * ImageComponent3D object.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @exception IllegalStateException if the image class is not one of:
+ * ImageClass.BUFFERED_IMAGE or ImageClass.RENDERED_IMAGE.
+ *
+ * @exception IllegalArgumentException if the width and height the image
+ * is not equal to the width and height of this ImageComponent object.
+ *
+ * @since Java 3D 1.2
+ */
+ public void set(int index, RenderedImage image) {
+
+ checkForLiveOrCompiled();
+ // For RenderedImage the width and height checking is done in the retained.
+ ((ImageComponent3DRetained)this.retained).set(index, image);
+ }
+
+ /**
+ * Sets this image component at the specified index to the
+ * specified NioImageBuffer object. If the data access mode is not
+ * by-reference, then the NioImageBuffer data is copied into this
+ * object. If the data access mode is by-reference, then a
+ * reference to the NioImageBuffer is saved, but the data is not
+ * necessarily copied.
+ *
+ * @param index the image index.
+ * The index must be less than the depth of this ImageComponent3D object.
+ *
+ * @param image NioImageBuffer object containing the image.
+ * The size (width and height) must be the same as the current size of this
+ * ImageComponent3D object.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @exception IllegalStateException if the image class is not
+ * ImageClass.NIO_IMAGE_BUFFER.
+ *
+ * @exception IllegalArgumentException if the width and height the image
+ * is not equal to the width and height of this ImageComponent object.
+ *
+ * @exception UnsupportedOperationException this method is not supported
+ * for Java 3D 1.5.
+ *
+ * @since Java 3D 1.5
+ */
+ public void set(int index, NioImageBuffer image) {
+
+ throw new UnsupportedOperationException();
+ /*
+ checkForLiveOrCompiled();
+ // For NioImageBuffer the width and height checking is done in the retained.
+ ((ImageComponent3DRetained)this.retained).set(index, image);
+ */
+ }
+
+ /**
+ * Retrieves the images from this ImageComponent3D object. If the
+ * data access mode is not by-reference, then a copy of the images
+ * is made. If the data access mode is by-reference, then the
+ * references are returned.
+ *
+ * @return either a new array of new BufferedImage objects created from
+ * the data
+ * in this image component, or a new array of
+ * references to the BufferedImages that this image component refers to.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @exception IllegalStateException if the image class is not
+ * ImageClass.BUFFERED_IMAGE.
+ */
+ public BufferedImage[] getImage() {
+ if (isLiveOrCompiled())
+ if(!this.getCapability(ImageComponent.ALLOW_IMAGE_READ))
+ throw new CapabilityNotSetException(J3dI18N.getString("ImageComponent3D3"));
+ return ((ImageComponent3DRetained)this.retained).getImage();
+ }
+
+ /**
+ * Retrieves the images from this ImageComponent3D object. If the
+ * data access mode is not by-reference, then a copy of the images
+ * is made. If the data access mode is by-reference, then the
+ * references are returned.
+ *
+ * @return either a new array of new RenderedImage objects created from
+ * the data
+ * in this image component, or a new array of
+ * references to the RenderedImages that this image component refers to.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @exception IllegalStateException if the image class is not one of:
+ * ImageClass.BUFFERED_IMAGE or ImageClass.RENDERED_IMAGE.
+ *
+ * @since Java 3D 1.2
+ */
+ public RenderedImage[] getRenderedImage() {
+ if (isLiveOrCompiled())
+ if(!this.getCapability(ImageComponent.ALLOW_IMAGE_READ))
+ throw new CapabilityNotSetException(J3dI18N.getString("ImageComponent3D3"));
+ return ((ImageComponent3DRetained)this.retained).getRenderedImage();
+ }
+
+ /**
+ * Retrieves the images from this ImageComponent3D object. If the
+ * data access mode is not by-reference, then a copy of the images
+ * is made. If the data access mode is by-reference, then the
+ * references are returned.
+ *
+ * @return either a new array of new RenderedImage objects created from
+ * the data
+ * in this image component, or a new array of
+ * references to the RenderedImages that this image component refers to.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @exception IllegalStateException if the image class is not
+ * ImageClass.NIO_IMAGE_BUFFER.
+ *
+ * @exception UnsupportedOperationException this method is not supported
+ * for Java 3D 1.5.
+ *
+ * @since Java 3D 1.5
+ */
+ public NioImageBuffer[] getNioImage() {
+
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Retrieves one of the images from this ImageComponent3D object. If the
+ * data access mode is not by-reference, then a copy of the image
+ * is made. If the data access mode is by-reference, then the
+ * reference is returned.
+ *
+ * @param index the index of the image to retrieve.
+ * The index must be less than the depth of this ImageComponent3D object.
+ *
+ * @return either a new BufferedImage object created from the data
+ * in this image component, or the BufferedImage object referenced
+ * by this image component.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @exception IllegalStateException if the image class is not
+ * ImageClass.BUFFERED_IMAGE.
+ */
+ public BufferedImage getImage(int index) {
+ if (isLiveOrCompiled())
+ if(!this.getCapability(ImageComponent.ALLOW_IMAGE_READ))
+ throw new CapabilityNotSetException(J3dI18N.getString("ImageComponent3D3"));
+
+ RenderedImage img = ((ImageComponent3DRetained)this.retained).getImage(index);
+ if ((img != null) && !(img instanceof BufferedImage)) {
+ throw new IllegalStateException(J3dI18N.getString("ImageComponent3D9"));
+ }
+ return (BufferedImage) img;
+ }
+
+ /**
+ * Retrieves one of the images from this ImageComponent3D object. If the
+ * data access mode is not by-reference, then a copy of the image
+ * is made. If the data access mode is by-reference, then the
+ * reference is returned.
+ *
+ * @param index the index of the image to retrieve.
+ * The index must be less than the depth of this ImageComponent3D object.
+ *
+ * @return either a new RenderedImage object created from the data
+ * in this image component, or the RenderedImage object referenced
+ * by this image component.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @exception IllegalStateException if the image class is not one of:
+ * ImageClass.BUFFERED_IMAGE or ImageClass.RENDERED_IMAGE.
+ *
+ * @since Java 3D 1.2
+ */
+ public RenderedImage getRenderedImage(int index) {
+
+ if (isLiveOrCompiled())
+ if(!this.getCapability(ImageComponent.ALLOW_IMAGE_READ))
+ throw new CapabilityNotSetException(J3dI18N.getString("ImageComponent3D3"));
+ return ((ImageComponent3DRetained)this.retained).getImage(index);
+ }
+
+ /**
+ * Retrieves one of the images from this ImageComponent3D object. If the
+ * data access mode is not by-reference, then a copy of the image
+ * is made. If the data access mode is by-reference, then the
+ * reference is returned.
+ *
+ * @param index the index of the image to retrieve.
+ * The index must be less than the depth of this ImageComponent3D object.
+ *
+ * @return either a new NioImageBuffer object created from the data
+ * in this image component, or the NioImageBuffer object referenced
+ * by this image component.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @exception IllegalStateException if the image class is not
+ * ImageClass.NIO_IMAGE_BUFFER.
+ *
+ * @exception UnsupportedOperationException this method is not supported
+ * for Java 3D 1.5.
+ *
+ * @since Java 3D 1.5
+ */
+ public NioImageBuffer getNioImage(int index) {
+
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Modifies a contiguous subregion of a particular slice of
+ * image of this ImageComponent3D object.
+ * Block of data of dimension (width * height)
+ * starting at the offset (srcX, srcY) of the specified
+ * RenderedImage object will be copied into the particular slice of
+ * image component
+ * starting at the offset (dstX, dstY) of this ImageComponent3D object.
+ * The specified RenderedImage object must be of the same format as
+ * the current format of this object.
+ * This method can only be used if the data access mode is
+ * by-copy. If it is by-reference, see updateData().
+ *
+ * @param index index of the image to be modified.
+ * The index must be less than the depth of this ImageComponent3D object.
+ * @param image RenderedImage object containing the subimage.
+ * @param width width of the subregion.
+ * @param height height of the subregion.
+ * @param srcX starting X offset of the subregion in the specified image.
+ * @param srcY starting Y offset of the subregion in the specified image.
+ * @param dstX startin X offset of the subregion in the image
+ * component of this object.
+ * @param dstY starting Y offset of the subregion in the image
+ * component of this object.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @exception IllegalStateException if the data access mode is
+ * <code>BY_REFERENCE</code>.
+ *
+ * @exception IllegalArgumentException if <code>width</code> or
+ * <code>height</code> of
+ * the subregion exceeds the dimension of the image in this object.
+ *
+ * @exception IllegalArgumentException if <code>dstX</code> < 0, or
+ * (<code>dstX</code> + <code>width</code>) > width of this object, or
+ * <code>dstY</code> < 0, or
+ * (<code>dstY</code> + <code>height</code>) > height of this object.
+ *
+ * @exception IllegalArgumentException if <code>srcX</code> < 0, or
+ * (<code>srcX</code> + <code>width</code>) > width of the RenderedImage
+ * object containing the subimage, or
+ * <code>srcY</code> < 0, or
+ * (<code>srcY</code> + <code>height</code>) > height of the
+ * RenderedImage object containing the subimage.
+ *
+ * @exception IllegalArgumentException if the specified RenderedImage
+ * is not compatible with the existing RenderedImage.
+ *
+ * @exception IllegalStateException if the image class is not one of:
+ * ImageClass.BUFFERED_IMAGE or ImageClass.RENDERED_IMAGE.
+ *
+ * @since Java 3D 1.3
+ */
+ public void setSubImage(int index, RenderedImage image,
+ int width, int height,
+ int srcX, int srcY, int dstX, int dstY) {
+ if (isLiveOrCompiled() &&
+ !this.getCapability(ALLOW_IMAGE_WRITE)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("ImageComponent3D5"));
+ }
+
+ if (((ImageComponent3DRetained)this.retained).isByReference()) {
+ throw new IllegalStateException(
+ J3dI18N.getString("ImageComponent3D8"));
+ }
+
+ int w = ((ImageComponent3DRetained)this.retained).getWidth();
+ int h = ((ImageComponent3DRetained)this.retained).getHeight();
+
+ if ((srcX < 0) || (srcY < 0) ||
+ ((srcX + width) > w) || ((srcY + height) > h) ||
+ (dstX < 0) || (dstY < 0) ||
+ ((dstX + width) > w) || ((dstY + height) > h)) {
+ throw new IllegalArgumentException(
+ J3dI18N.getString("ImageComponent3D7"));
+ }
+
+ ((ImageComponent3DRetained)this.retained).setSubImage(
+ index, image, width, height, srcX, srcY, dstX, dstY);
+ }
+
+ /**
+ * Updates a particular slice of image data that is accessed by reference.
+ * This method calls the updateData method of the specified
+ * ImageComponent3D.Updater object to synchronize updates to the
+ * image data that is referenced by this ImageComponent3D object.
+ * Applications that wish to modify such data must perform all
+ * updates via this method.
+ * <p>
+ * The data to be modified has to be within the boundary of the
+ * subregion
+ * specified by the offset (x, y) and the dimension (width*height).
+ * It is illegal to modify data outside this boundary. If any
+ * referenced data is modified outside the updateData method, or
+ * any data outside the specified boundary is modified, the
+ * results are undefined.
+ * <p>
+ * @param updater object whose updateData callback method will be
+ * called to update the data referenced by this ImageComponent3D object.
+ * @param index index of the image to be modified.
+ * The index must be less than the depth of this ImageComponent3D object.
+ * @param x starting X offset of the subregion.
+ * @param y starting Y offset of the subregion.
+ * @param width width of the subregion.
+ * @param height height of the subregion.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ * @exception IllegalStateException if the data access mode is
+ * <code>BY_COPY</code>.
+ * @exception IllegalArgumentException if <code>width</code> or
+ * <code>height</code> of
+ * the subregion exceeds the dimension of the image in this object.
+ * @exception IllegalArgumentException if <code>x</code> < 0, or
+ * (<code>x</code> + <code>width</code>) > width of this object, or
+ * <code>y</code> < 0, or
+ * (<code>y</code> + <code>height</code>) > height of this object.
+ * @exception ArrayIndexOutOfBoundsException if <code>index</code> > the
+ * depth of this object.
+ *
+ * @since Java 3D 1.3
+ */
+ public void updateData(Updater updater, int index,
+ int x, int y,
+ int width, int height) {
+ if (isLiveOrCompiled() &&
+ !this.getCapability(ALLOW_IMAGE_WRITE)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("ImageComponent3D5"));
+ }
+
+ if (!((ImageComponent3DRetained)this.retained).isByReference()) {
+ throw new IllegalStateException(
+ J3dI18N.getString("ImageComponent3D6"));
+ }
+
+ int w = ((ImageComponent3DRetained)this.retained).getWidth();
+ int h = ((ImageComponent3DRetained)this.retained).getHeight();
+
+ if ((x < 0) || (y < 0) || ((x + width) > w) || ((y + height) > h)) {
+ throw new IllegalArgumentException(
+ J3dI18N.getString("ImageComponent3D7"));
+ }
+
+ ((ImageComponent3DRetained)this.retained).updateData(
+ updater, index, x, y, width, height);
+ }
+
+
+ /**
+ * Creates a retained mode ImageComponent3DRetained object that this
+ * ImageComponent3D component object will point to.
+ */
+ @Override
+ void createRetained() {
+ this.retained = new ImageComponent3DRetained();
+ this.retained.setSource(this);
+ }
+
+
+
+ /**
+ * @deprecated replaced with cloneNodeComponent(boolean forceDuplicate)
+ */
+ @Override
+ public NodeComponent cloneNodeComponent() {
+ ImageComponent3DRetained rt = (ImageComponent3DRetained) retained;
+
+ ImageComponent3D img = new ImageComponent3D(rt.getFormat(),
+ rt.width,
+ rt.height,
+ rt.depth);
+
+ // XXXX : replace by this to duplicate other attributes
+ /*
+ ImageComponent3D img = new ImageComponent3D(rt.format,
+ rt.width,
+ rt.height,
+ rt.depth,
+ rt.byReference,
+ rt.yUp);
+ */
+ img.duplicateNodeComponent(this);
+ return img;
+ }
+
+
+ /**
+ * Copies all node information from <code>originalNodeComponent</code> into
+ * the current node. This method is called from the
+ * <code>duplicateNode</code> method. This routine does
+ * the actual duplication of all "local data" (any data defined in
+ * this object).
+ *
+ * @param originalNodeComponent the original node to duplicate.
+ * @param forceDuplicate when set to <code>true</code>, causes the
+ * <code>duplicateOnCloneTree</code> flag to be ignored. When
+ * <code>false</code>, the value of each node's
+ * <code>duplicateOnCloneTree</code> variable determines whether
+ * NodeComponent data is duplicated or copied.
+ *
+ * @see Node#cloneTree
+ * @see NodeComponent#setDuplicateOnCloneTree
+ */
+ @Override
+ void duplicateAttributes(NodeComponent originalNodeComponent,
+ boolean forceDuplicate) {
+ super.duplicateAttributes(originalNodeComponent, forceDuplicate);
+ // TODO : Handle NioImageBuffer if its supported.
+ RenderedImage imgs[] = ((ImageComponent3DRetained)
+ originalNodeComponent.retained).getImage();
+
+ if (imgs != null) {
+ ImageComponent3DRetained rt = (ImageComponent3DRetained) retained;
+
+ for (int i=rt.depth-1; i>=0; i--) {
+ if (imgs[i] != null) {
+ rt.set(i, imgs[i]);
+ }
+ }
+ }
+ }
+
+ /**
+ * The ImageComponent3D.Updater interface is used in updating image data
+ * that is accessed by reference from a live or compiled ImageComponent
+ * object. Applications that wish to modify such data must define a
+ * class that implements this interface. An instance of that class is
+ * then passed to the <code>updateData</code> method of the
+ * ImageComponent object to be modified.
+ *
+ * @since Java 3D 1.3
+ */
+ public static interface Updater {
+ /**
+ * Updates image data that is accessed by reference.
+ * This method is called by the updateData method of an
+ * ImageComponent object to effect
+ * safe updates to image data that
+ * is referenced by that object. Applications that wish to modify
+ * such data must implement this method and perform all updates
+ * within it.
+ * <br>
+ * NOTE: Applications should <i>not</i> call this method directly.
+ *
+ * @param imageComponent the ImageComponent object being updated.
+ * @param index index of the image to be modified.
+ * @param x starting X offset of the subregion.
+ * @param y starting Y offset of the subregion.
+ * @param width width of the subregion.
+ * @param height height of the subregion.
+ *
+ * @see ImageComponent3D#updateData
+ */
+ public void updateData(ImageComponent3D imageComponent,
+ int index,
+ int x, int y,
+ int width, int height);
+ }
+
+}