From 7a2e20caac9db6f789a7b3fab344b9758af45335 Mon Sep 17 00:00:00 2001 From: Harvey Harrison Date: Sun, 19 Apr 2015 21:02:06 -0700 Subject: j3dcore: flatten the directory structure a bit Signed-off-by: Harvey Harrison --- src/javax/media/j3d/Raster.java | 822 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 822 insertions(+) create mode 100644 src/javax/media/j3d/Raster.java (limited to 'src/javax/media/j3d/Raster.java') diff --git a/src/javax/media/j3d/Raster.java b/src/javax/media/j3d/Raster.java new file mode 100644 index 0000000..9b2cb3c --- /dev/null +++ b/src/javax/media/j3d/Raster.java @@ -0,0 +1,822 @@ +/* + * Copyright 1997-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.Dimension; +import java.awt.Point; + +import javax.vecmath.Point3f; + + +/** + * The Raster object extends Geometry to allow drawing a raster image + * that is attached to a 3D location in the virtual world. + * It contains a 3D point that is defined in the local object + * coordinate system of the Shape3D node that references the Raster. + * It also contains a type specifier, a clipping mode, a reference to + * a ImageComponent2D object and/or a DepthComponent object, an + * integer x,y source offset and a size (width, height) to allow + * reading or writing a portion of the referenced image, and an + * integer x,y destination offset to position the raster relative to + * the transformed 3D point. + * In addition to being used as a type of geometry for drawing, + * a Raster may be used to readback pixel data (color and/or z-buffer) + * from the frame buffer in immediate mode. + *

+ * The geometric extent of a Raster object is a single 3D point, specified + * by the raster position. This means that geometry-based picking or + * collision with a Raster object will only intersect the object at + * this single point; the 2D raster image is neither pickable + * nor collidable. + */ + +public class Raster extends Geometry { + /** + * Specifies a Raster object with color data. + * In this mode, the image reference must point to + * a valid ImageComponent object. + * + * @see #setType + */ + public static final int RASTER_COLOR = 0x1; + + /** + * Specifies a Raster object with depth (z-buffer) data. + * In this mode, the depthImage reference must point to + * a valid DepthComponent object. + * + * @see #setType + */ + public static final int RASTER_DEPTH = 0x2; + + /** + * Specifies a Raster object with both color and depth (z-buffer) data. + * In this mode, the image reference must point to + * a valid ImageComponent object, and the depthImage reference + * must point to a valid DepthComponent object. + * + * @see #setType + */ + public static final int RASTER_COLOR_DEPTH = RASTER_COLOR | RASTER_DEPTH; + + + /** + * Specifies that this raster object is not drawn + * if the raster position is outside the viewing volume. + * In this mode, the raster is not drawn when the transformed + * raster position is clipped out, even if part of the raster would + * have been visible. This is the default mode. + * + * @see #setClipMode + * + * @since Java 3D 1.3 + */ + public static final int CLIP_POSITION = 0; + + /** + * Specifies that the raster object is clipped as an image after + * the raster position has been transformed. In this mode, part + * of the raster may be drawn even when the transformed raster + * position is clipped out. + * + * @see #setClipMode + * + * @since Java 3D 1.3 + */ + public static final int CLIP_IMAGE = 1; + + + /** + * Specifies that this Raster allows reading the position. + */ + public static final int + ALLOW_POSITION_READ = CapabilityBits.RASTER_ALLOW_POSITION_READ; + + /** + * Specifies that this Raster allows writing the position. + */ + public static final int + ALLOW_POSITION_WRITE = CapabilityBits.RASTER_ALLOW_POSITION_WRITE; + + /** + * Specifies that this Raster allows reading the source or + * destination offset. + */ + public static final int + ALLOW_OFFSET_READ = CapabilityBits.RASTER_ALLOW_OFFSET_READ; + + /** + * Specifies that this Raster allows writing the source or + * destination offset. + */ + public static final int + ALLOW_OFFSET_WRITE = CapabilityBits.RASTER_ALLOW_OFFSET_WRITE; + + /** + * Specifies that this Raster allows reading the image. + */ + public static final int + ALLOW_IMAGE_READ = CapabilityBits.RASTER_ALLOW_IMAGE_READ; + + /** + * Specifies that this Raster allows writing the image. + */ + public static final int + ALLOW_IMAGE_WRITE = CapabilityBits.RASTER_ALLOW_IMAGE_WRITE; + + /** + * Specifies that this Raster allows reading the depth component. + */ + public static final int + ALLOW_DEPTH_COMPONENT_READ = CapabilityBits.RASTER_ALLOW_DEPTH_COMPONENT_READ; + + /** + * Specifies that this Raster allows writing the depth component. + */ + public static final int + ALLOW_DEPTH_COMPONENT_WRITE = CapabilityBits.RASTER_ALLOW_DEPTH_COMPONENT_WRITE; + + /** + * Specifies that this Raster allows reading the size. + */ + public static final int + ALLOW_SIZE_READ = CapabilityBits.RASTER_ALLOW_SIZE_READ; + + /** + * Specifies that this Raster allows writing the size. + */ + public static final int + ALLOW_SIZE_WRITE = CapabilityBits.RASTER_ALLOW_SIZE_WRITE; + + /** + * Specifies that this Raster allows reading the type. + */ + public static final int + ALLOW_TYPE_READ = CapabilityBits.RASTER_ALLOW_TYPE_READ; + + /** + * Specifies that this Raster allows reading the clip mode. + * + * @since Java 3D 1.3 + */ + public static final int + ALLOW_CLIP_MODE_READ = CapabilityBits.RASTER_ALLOW_CLIP_MODE_READ; + + /** + * Specifies that this Raster allows writing the clip mode. + * + * @since Java 3D 1.3 + */ + public static final int + ALLOW_CLIP_MODE_WRITE = CapabilityBits.RASTER_ALLOW_CLIP_MODE_WRITE; + + + // Array for setting default read capabilities + private static final int[] readCapabilities = { + ALLOW_POSITION_READ, + ALLOW_OFFSET_READ, + ALLOW_IMAGE_READ, + ALLOW_DEPTH_COMPONENT_READ, + ALLOW_SIZE_READ, + ALLOW_TYPE_READ, + ALLOW_CLIP_MODE_READ + }; + + /** + * Constructs a Raster object with default parameters. + * The default values are as follows: + *

+ */ + public Raster() { + // set default read capabilities + setDefaultReadCapabilities(readCapabilities); + } + + /** + * Constructs a new Raster object with the specified values. + * @param pos the position in object coordinates of the upper-left + * corner of the raster + * @param type the type of raster object, one of: RASTER_COLOR, + * RASTER_DEPTH, or RASTER_COLOR_DEPTH + * @param xSrcOffset the x offset within the source array of pixels + * at which to start copying + * @param ySrcOffset the y offset within the source array of pixels + * at which to start copying + * @param width the number of columns of pixels to copy + * @param height the number of rows of pixels to copy + * @param image the ImageComponent2D object containing the + * color data + * @param depthComponent the DepthComponent object containing the depth + * (z-buffer) data + * + * @exception IllegalArgumentException if the image class of the specified + * ImageComponent2D is ImageClass.NIO_IMAGE_BUFFER. + */ + public Raster(Point3f pos, + int type, + int xSrcOffset, + int ySrcOffset, + int width, + int height, + ImageComponent2D image, + DepthComponent depthComponent) { + + // set default read capabilities + setDefaultReadCapabilities(readCapabilities); + + ((RasterRetained)this.retained).setPosition(pos); + ((RasterRetained)this.retained).setType(type); + ((RasterRetained)this.retained).setSrcOffset(xSrcOffset, ySrcOffset); + ((RasterRetained)this.retained).setSize(width, height); + ((RasterRetained)this.retained).setImage(image); + ((RasterRetained)this.retained).setDepthComponent(depthComponent); + } + + /** + * Constructs a new Raster object with the specified values. + * @param pos the position in object coordinates of the upper-left + * corner of the raster + * @param type the type of raster object, one of: RASTER_COLOR, + * RASTER_DEPTH, or RASTER_COLOR_DEPTH + * @param srcOffset the offset within the source array of pixels + * at which to start copying + * @param size the width and height of the image to be copied + * @param image the ImageComponent2D object containing the + * color data + * @param depthComponent the DepthComponent object containing the depth + * (z-buffer) data + * + * @exception IllegalArgumentException if the image class of the specified + * ImageComponent2D is ImageClass.NIO_IMAGE_BUFFER. + */ + public Raster(Point3f pos, + int type, + Point srcOffset, + Dimension size, + ImageComponent2D image, + DepthComponent depthComponent) { + + // set default read capabilities + setDefaultReadCapabilities(readCapabilities); + + ((RasterRetained)this.retained).setPosition(pos); + ((RasterRetained)this.retained).setType(type); + ((RasterRetained)this.retained).setSrcOffset(srcOffset.x, srcOffset.y); + ((RasterRetained)this.retained).setSize(size.width, size.height); + ((RasterRetained)this.retained).setImage(image); + ((RasterRetained)this.retained).setDepthComponent(depthComponent); + } + + /** + * Constructs a new Raster object with the specified values. + * @param pos the position in object coordinates of the upper-left + * corner of the raster + * @param type the type of raster object, one of: RASTER_COLOR, + * RASTER_DEPTH, or RASTER_COLOR_DEPTH + * @param clipMode the clipping mode of the raster object, one of: + * CLIP_POSITION or CLIP_IMAGE + * @param srcOffset the offset within the source array of pixels + * at which to start copying + * @param size the width and height of the image to be copied + * @param dstOffset the destination pixel offset of the upper-left + * corner of the rendered image relative to the transformed position + * @param image the ImageComponent2D object containing the + * color data + * @param depthComponent the DepthComponent object containing the depth + * (z-buffer) data + * + * @exception IllegalArgumentException if the image class of the specified + * ImageComponent2D is ImageClass.NIO_IMAGE_BUFFER. + * + * @since Java 3D 1.3 + */ + public Raster(Point3f pos, + int type, + int clipMode, + Point srcOffset, + Dimension size, + Point dstOffset, + ImageComponent2D image, + DepthComponent depthComponent) { + + + // set default read capabilities + setDefaultReadCapabilities(readCapabilities); + + ((RasterRetained)this.retained).setPosition(pos); + ((RasterRetained)this.retained).setType(type); + ((RasterRetained)this.retained).setClipMode(clipMode); + ((RasterRetained)this.retained).setSrcOffset(srcOffset.x, srcOffset.y); + ((RasterRetained)this.retained).setSize(size.width, size.height); + ((RasterRetained)this.retained).setDstOffset(dstOffset.x, dstOffset.y); + ((RasterRetained)this.retained).setImage(image); + ((RasterRetained)this.retained).setDepthComponent(depthComponent); + } + + /** + * Creates the retained mode Raster object that this + * Raster object will point to. + */ + @Override + void createRetained() { + retained = new RasterRetained(); + retained.setSource(this); + } + + /** + * Sets the position in object coordinates of this raster. This + * position is transformed into device coordinates and is used as + * the upper-left corner of the raster. + * @param pos the new position of this raster + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public void setPosition(Point3f pos) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_POSITION_WRITE)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster0")); + ((RasterRetained)this.retained).setPosition(pos); + } + + /** + * Retrieves the current position in object coordinates of this raster. + * @param pos the vector that will receive the current position + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public void getPosition(Point3f pos) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_POSITION_READ)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster1")); + + ((RasterRetained)this.retained).getPosition(pos); + } + + /** + * Sets the type of this raster object to one of: RASTER_COLOR, + * RASTER_DEPTH, or RASTER_COLOR_DEPTH. + * @param type the new type of this raster + * @exception RestrictedAccessException if the method is called + * when this object is part of live or compiled scene graph. + */ + public void setType(int type) { + checkForLiveOrCompiled(); + ((RasterRetained)this.retained).setType(type); + } + + + /** + * Retrieves the current type of this raster object, one of: RASTER_COLOR, + * RASTER_DEPTH, or RASTER_COLOR_DEPTH. + * @return type the type of this raster + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public int getType() { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_TYPE_READ)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster2")); + return (((RasterRetained)this.retained).getType()); + } + + + /** + * Sets the clipping mode of this raster object. + * @param clipMode the new clipping mode of this raster, + * one of: CLIP_POSITION or CLIP_IMAGE. The default mode + * is CLIP_POSITION. + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + * + * @since Java 3D 1.3 + */ + public void setClipMode(int clipMode) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_CLIP_MODE_WRITE)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster10")); + + ((RasterRetained)this.retained).setClipMode(clipMode); + } + + + /** + * Retrieves the current clipping mode of this raster object. + * @return clipMode the clipping mode of this raster, + * one of: CLIP_POSITION or CLIP_IMAGE. + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + * + * @since Java 3D 1.3 + */ + public int getClipMode() { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_CLIP_MODE_READ)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster11")); + + return (((RasterRetained)this.retained).getClipMode()); + } + + + /** + * @deprecated As of Java 3D version 1.3, replaced by + * setSrcOffset(int,int) + */ + public void setOffset(int xSrcOffset, int ySrcOffset) { + setSrcOffset(xSrcOffset, ySrcOffset); + } + + + /** + * @deprecated As of Java 3D version 1.3, replaced by + * setSrcOffset(java.awt.Point) + */ + public void setOffset(Point srcOffset) { + setSrcOffset(srcOffset); + } + + + /** + * @deprecated As of Java 3D version 1.3, replaced by + * getSrcOffset(java.awt.Point) + */ + public void getOffset(Point srcOffset) { + getSrcOffset(srcOffset); + } + + + /** + * Sets the offset within the source array of pixels + * at which to start copying. + * @param xSrcOffset the x offset within the source array of pixels + * at which to start copying + * @param ySrcOffset the y offset within the source array of pixels + * at which to start copying + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + * + * @since Java 3D 1.3 + */ + public void setSrcOffset(int xSrcOffset, int ySrcOffset) { + + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_OFFSET_WRITE)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster7")); + + ((RasterRetained)this.retained).setSrcOffset(xSrcOffset, ySrcOffset); + } + + + /** + * Sets the offset within the source array of pixels + * at which to start copying. + * @param srcOffset the new source pixel offset + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + * + * @since Java 3D 1.3 + */ + public void setSrcOffset(Point srcOffset) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_OFFSET_WRITE)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster7")); + + ((RasterRetained)this.retained).setSrcOffset(srcOffset.x, srcOffset.y); + } + + + /** + * Retrieves the current source pixel offset. + * @param srcOffset the object that will receive the source offset + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + * + * @since Java 3D 1.3 + */ + public void getSrcOffset(Point srcOffset) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_OFFSET_READ)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster8")); + + ((RasterRetained)this.retained).getSrcOffset(srcOffset); + } + + + /** + * Sets the number of pixels to be copied from the pixel array. + * @param width the number of columns in the array of pixels to copy + * @param height the number of rows in the array of pixels to copy + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public void setSize(int width, int height) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_SIZE_WRITE)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster9")); + + ((RasterRetained)this.retained).setSize(width, height); + } + + /** + * Sets the size of the array of pixels to be copied. + * @param size the new size + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public void setSize(Dimension size) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_SIZE_WRITE)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster9")); + + ((RasterRetained)this.retained).setSize(size.width, size.height); + } + + + /** + * Retrieves the current raster size. + * @param size the object that will receive the size + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public void getSize(Dimension size) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_SIZE_READ)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster1")); + + ((RasterRetained)this.retained).getSize(size); + } + + + /** + * Sets the destination pixel offset of the upper-left corner of + * the rendered image relative to the transformed position. This + * pixel offset is added to the transformed raster position prior + * to rendering the image. + * + * @param xDstOffset the x coordinate of the new offset + * @param yDstOffset the y coordinate of the new offset + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + * + * @since Java 3D 1.3 + */ + public void setDstOffset(int xDstOffset, int yDstOffset) { + + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_OFFSET_WRITE)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster7")); + + ((RasterRetained)this.retained).setDstOffset(xDstOffset, yDstOffset); + } + + + /** + * Sets the destination pixel offset of the upper-left corner of + * the rendered image relative to the transformed position. This + * pixel offset is added to the transformed raster position prior + * to rendering the image. + * + * @param dstOffset the new destination pixel offset + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + * + * @since Java 3D 1.3 + */ + public void setDstOffset(Point dstOffset) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_OFFSET_WRITE)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster7")); + + ((RasterRetained)this.retained).setDstOffset(dstOffset.x, dstOffset.y); + } + + + /** + * Retrieves the current destination pixel offset. + * @param dstOffset the object that will receive the destination offset + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + * + * @since Java 3D 1.3 + */ + public void getDstOffset(Point dstOffset) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_OFFSET_READ)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster8")); + + ((RasterRetained)this.retained).getDstOffset(dstOffset); + } + + + /** + * Sets the pixel array used to copy pixels to/from a Canvas3D. + * This is used when the type is RASTER_COLOR or RASTER_COLOR_DEPTH. + * + * @param image the ImageComponent2D object containing the + * color data + * + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + * + * @exception IllegalSharingException if this Raster is live and + * the specified image is being used by a Canvas3D as an off-screen buffer. + * + * @exception IllegalArgumentException if the image class of the specified + * ImageComponent2D is ImageClass.NIO_IMAGE_BUFFER. + * + */ + public void setImage(ImageComponent2D image) { + + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_IMAGE_WRITE)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster3")); + + // Do illegal sharing check + if(image != null) { + ImageComponent2DRetained imageRetained = (ImageComponent2DRetained) image.retained; + if(imageRetained.getUsedByOffScreen()) { + if(isLive()) { + throw new IllegalSharingException(J3dI18N.getString("Raster12")); + } + } + } + + ((RasterRetained)this.retained).setImage(image); + } + + /** + * Retrieves the current pixel array object. + * @return image the ImageComponent2D object containing the + * color data + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public ImageComponent2D getImage() { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_IMAGE_READ)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster4")); + return (((RasterRetained)this.retained).getImage()); + } + + /** + * Sets the depth image used to copy pixels to/from a Canvas3D. + * This is used when the type is RASTER_DEPTH or RASTER_COLOR_DEPTH. + * @param depthComponent the DepthComponent object containing the + * depth (z-buffer) data + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public void setDepthComponent(DepthComponent depthComponent) { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_DEPTH_COMPONENT_WRITE)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster5")); + ((RasterRetained)this.retained).setDepthComponent(depthComponent); + } + + /** + * Retrieves the current depth image object. + * @return depthImage DepthComponent containing the + * depth (z-buffer) data + * @exception CapabilityNotSetException if appropriate capability is + * not set and this object is part of live or compiled scene graph + */ + public DepthComponent getDepthComponent() { + if (isLiveOrCompiled()) + if(!this.getCapability(ALLOW_DEPTH_COMPONENT_READ)) + throw new CapabilityNotSetException(J3dI18N.getString("Raster6")); + return (((RasterRetained)this.retained).getDepthComponent()); + } + + + + /** + * @deprecated replaced with cloneNodeComponent(boolean forceDuplicate) + */ + @Override + public NodeComponent cloneNodeComponent() { + Raster r = new Raster(); + r.duplicateNodeComponent(this); + return r; + } + + + /** + * NOTE: Applications should not call this method directly. + * It should only be called by the cloneNode method. + * + * @deprecated replaced with duplicateNodeComponent( + * NodeComponent originalNodeComponent, boolean forceDuplicate) + */ + @Override + public void duplicateNodeComponent(NodeComponent originalNodeComponent) { + checkDuplicateNodeComponent(originalNodeComponent); + } + + + + /** + * Copies all node information from originalNodeComponent into + * the current node. This method is called from the + * duplicateNode 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 true, causes the + * duplicateOnCloneTree flag to be ignored. When + * false, the value of each node's + * duplicateOnCloneTree 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); + + RasterRetained raster = (RasterRetained) originalNodeComponent.retained; + RasterRetained rt = (RasterRetained) retained; + + Point3f p = new Point3f(); + raster.getPosition(p); + rt.setPosition(p); + rt.setType(raster.getType()); + rt.setClipMode(raster.getClipMode()); + Point offset = new Point(); + raster.getSrcOffset(offset); + rt.setSrcOffset(offset.x, offset.y); + raster.getDstOffset(offset); + rt.setDstOffset(offset.x, offset.y); + Dimension dim = new Dimension(); + raster.getSize(dim); + rt.setSize(dim.width, dim.height); + rt.setImage((ImageComponent2D) getNodeComponent( + raster.getImage(), + forceDuplicate, + originalNodeComponent.nodeHashtable)); + rt.setDepthComponent((DepthComponent) getNodeComponent( + raster.getDepthComponent(), + forceDuplicate, + originalNodeComponent.nodeHashtable)); + } + + + /** + * This function is called from getNodeComponent() to see if any of + * the sub-NodeComponents duplicateOnCloneTree flag is true. + * If it is the case, current NodeComponent needs to + * duplicate also even though current duplicateOnCloneTree flag is false. + * This should be overwrite by NodeComponent which contains sub-NodeComponent. + */ + @Override + boolean duplicateChild() { + if (getDuplicateOnCloneTree()) + return true; + RasterRetained rt = (RasterRetained) retained; + + NodeComponent nc = rt.getImage(); + if ((nc != null) && nc.getDuplicateOnCloneTree()) + return true; + + nc = rt.getDepthComponent(); + if ((nc != null) && nc.getDuplicateOnCloneTree()) + return true; + + return false; + } + +} -- cgit v1.2.3