/** * Set one pixel value at the correct index in this field. Basically a single pixel set, but it * could also be width, height, number of components. This must be used with great care as it * could well corrupt the user data. * * @param index The position in the array to set * @param value The value to use at that position */ public void set1Value(int index, int value) throws ArrayIndexOutOfBoundsException { checkReadAccess(); checkWriteAccess(); if (value < 0) throw new IllegalArgumentException("Pixels may not be negative."); if (index < 0) throw new ArrayIndexOutOfBoundsException(); synchronized (theEventQueue.eventLock) { MFImageWrapper queuedElement = (MFImageWrapper) theEventQueue.getLast(this); boolean newEvent = false; if (queuedElement == null || !queuedElement.isSetOneValue) { // Input and output buffers do not mix if (!storedInput && !storedOutput) { queuedElement = this; loadInputValue(); isSetOneValue = true; } else { queuedElement = new MFImageWrapper(theNode, fieldIndex, theEventQueue, theEventAdapterFactory, true); queuedElement.isSetOneValue = true; } newEvent = true; } queuedElement.storedInputValue[index] = value; queuedElement.rogueInputData = true; if (newEvent) theEventQueue.processEvent(queuedElement); } }
/** * Inserts a value into an existing index of the field. Current field values from the index to the * end of the field are shifted down and the field length is increased by one to accomodate the * new element. * * <p>This method modifies the integer array rather than the conceptual image array. * * <p>If the index is out of the bounds of the current field an ArrayIndexOutofBoundsException * will be generated. * * @param index The position at which to insert * @param value The new element to insert * @exception ArrayIndexOutOfBoundsException The index was outside the current field size. */ public void insertValue(int index, int value) throws ArrayIndexOutOfBoundsException { checkReadAccess(); checkWriteAccess(); synchronized (theEventQueue.eventLock) { MFImageWrapper queuedElement = (MFImageWrapper) theEventQueue.getLast(this); boolean newEvent = false; if (queuedElement == null || !queuedElement.isSetOneValue) { // Input and output buffers do not mix if (!storedInput && !storedOutput) { queuedElement = this; loadInputValue(); isSetOneValue = true; } else { queuedElement = new MFImageWrapper(theNode, fieldIndex, theEventQueue, theEventAdapterFactory, true); queuedElement.isSetOneValue = true; } newEvent = true; } queuedElement.ensureArraySize(queuedElement.storedInputLength + 1); System.arraycopy( queuedElement.storedInputValue, index, queuedElement.storedInputValue, index + 1, queuedElement.storedInputLength - index); queuedElement.storedInputValue[index] = value; queuedElement.storedInputLength++; queuedElement.rogueInputData = true; if (newEvent) theEventQueue.processEvent(queuedElement); } }
/** @see org.web3d.x3d.sai.MFImage#removeValue(int) */ public void removeValue(int index) throws ArrayIndexOutOfBoundsException { checkReadAccess(); checkWriteAccess(); synchronized (theEventQueue.eventLock) { MFImageWrapper queuedElement = (MFImageWrapper) theEventQueue.getLast(this); boolean newEvent = false; if (queuedElement == null || !queuedElement.isSetOneValue) { // Input and output buffers do not mix if (!storedInput && !storedOutput) { queuedElement = this; loadInputValue(); isSetOneValue = true; } else { queuedElement = new MFImageWrapper(theNode, fieldIndex, theEventQueue, theEventAdapterFactory, true); queuedElement.isSetOneValue = true; } newEvent = true; } // Removing a raw byte, rather than an image value. if (queuedElement.storedInputLength > 0) { if (index + 1 < queuedElement.storedInputLength) System.arraycopy( queuedElement.storedInputValue, index + 1, queuedElement.storedInputValue, index, queuedElement.storedInputLength - index - 1); queuedElement.storedInputLength--; queuedElement.rogueInputData = true; if (newEvent) theEventQueue.processEvent(queuedElement); } else { // Free up the buffer before throwing the exception if (newEvent) queuedElement.isSetOneValue = false; throw new ArrayIndexOutOfBoundsException(); } } }