| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| /** |
| * @author Igor V. Stolyarov |
| * @version $Revision$ |
| */ |
| package java.awt.image; |
| |
| import java.awt.Point; |
| import java.awt.Rectangle; |
| |
| import org.apache.harmony.awt.internal.nls.Messages; |
| |
| /** |
| * The WritableRaster class provides functionality for |
| * writing samples and pixel capabilities to the Raster. |
| */ |
| public class WritableRaster extends Raster { |
| |
| /** |
| * Instantiates a new WritableRaster object with the specified |
| * SampleModel, DataBuffer, rectangular region and parent |
| * WritableRaster. |
| * |
| * @param sampleModel the specified SampleModel. |
| * @param dataBuffer the specified DataBuffer. |
| * @param aRegion the rectangular region which defines the new image bounds. |
| * @param sampleModelTranslate this point defines the translation point |
| * from the SampleModel to the new WritableRaster coordinates. |
| * @param parent the parent of this WritableRaster. |
| */ |
| protected WritableRaster(SampleModel sampleModel, DataBuffer dataBuffer, |
| Rectangle aRegion, Point sampleModelTranslate, |
| WritableRaster parent) { |
| super(sampleModel, dataBuffer, aRegion, sampleModelTranslate, parent); |
| } |
| |
| /** |
| * Instantiates a new WritableRaster object with the specified |
| * SampleModel which defines a layout of this WritableRaster and |
| * DataBuffer objects which defines the image data. |
| * |
| * @param sampleModel the specified SampleModel. |
| * @param dataBuffer the specified DataBuffer. |
| * @param origin the point of origin. |
| */ |
| protected WritableRaster(SampleModel sampleModel, DataBuffer dataBuffer, |
| Point origin) { |
| this(sampleModel, dataBuffer, new Rectangle(origin.x, origin.y, |
| sampleModel.width, sampleModel.height), origin, null); |
| } |
| |
| /** |
| * Instantiates a new WritableRaster with the specified SampleModel. |
| * |
| * @param sampleModel the specified SampleModel. |
| * @param origin the origin. |
| */ |
| protected WritableRaster(SampleModel sampleModel, Point origin) { |
| this(sampleModel, sampleModel.createDataBuffer(), new Rectangle( |
| origin.x, origin.y, sampleModel.width, sampleModel.height), |
| origin, null); |
| } |
| |
| /** |
| * Sets the data for a single pixel from an input Object which |
| * represents an array of primitive types: DataBuffer.TYPE_BYTE, |
| * DataBuffer.TYPE_USHORT, DataBuffer.TYPE_INT, DataBuffer.TYPE_SHORT, |
| * DataBuffer.TYPE_FLOAT, or DataBuffer.TYPE_DOUBLE. |
| * |
| * @param x the X coordinate of the pixel. |
| * @param y the Y coordinate of the pixel. |
| * @param inData the input data. |
| */ |
| public void setDataElements(int x, int y, Object inData) { |
| sampleModel.setDataElements(x - sampleModelTranslateX, |
| y - sampleModelTranslateY, inData, dataBuffer); |
| } |
| |
| /** |
| * Sets the data elements which represent pixel data to the specified |
| * rectangle area as a primitive array. The following image data types |
| * are supported: DataBuffer.TYPE_BYTE, DataBuffer.TYPE_USHORT, |
| * DataBuffer.TYPE_INT, DataBuffer.TYPE_SHORT, DataBuffer.TYPE_FLOAT, |
| * or DataBuffer.TYPE_DOUBLE. |
| * |
| * @param x the X coordinate of the rectangle of pixels. |
| * @param y the Y coordinate of the rectangle of pixels. |
| * @param w the width of the rectangle of pixels. |
| * @param h the height of the rectangle of pixels. |
| * @param inData the array of primitive type data to be set to the |
| * specified area. |
| */ |
| public void setDataElements(int x, int y, int w, int h, Object inData) { |
| sampleModel.setDataElements(x - sampleModelTranslateX, |
| y - sampleModelTranslateY, w, h, inData, dataBuffer); |
| } |
| |
| /** |
| * Creates the child of this WritableRaster by sharing the specified |
| * rectangular area in this WritableRaster. |
| * The parentX, parentY, width and height parameters specify rectangular |
| * area to be shared. |
| * |
| * @param parentX the X coordinate of the upper left corner of |
| * the shared rectangle with respect to this WritableRaster' coordinates. |
| * @param parentY the Y coordinate of the upper left corner of |
| * the shared rectangle with respect to this WritableRaster' coordinates. |
| * @param w the width of the child area. |
| * @param h the height of the child area. |
| * @param childMinX the X coordinate of child area mapped to the parentX |
| * coordinate. |
| * @param childMinY the Y coordinate of child area mapped to the parentY |
| * coordinate. |
| * @param bandList the array of band indicies. |
| * |
| * @return the child WritableRaster. |
| */ |
| public WritableRaster createWritableChild(int parentX, int parentY, int w, |
| int h, int childMinX, int childMinY, int bandList[]) { |
| if (w <= 0 || h <= 0) { |
| // awt.244=Width or Height of child Raster is less than or equal to zero |
| throw new RasterFormatException(Messages.getString("awt.244")); //$NON-NLS-1$ |
| } |
| |
| if (parentX < this.minX || parentX + w > this.minX + this.width) { |
| // awt.245=parentX disposes outside Raster |
| throw new RasterFormatException(Messages.getString("awt.245")); //$NON-NLS-1$ |
| } |
| |
| if (parentY < this.minY || parentY + h > this.minY + this.height) { |
| // awt.246=parentY disposes outside Raster |
| throw new RasterFormatException(Messages.getString("awt.246")); //$NON-NLS-1$ |
| } |
| |
| if ((long) parentX + w > Integer.MAX_VALUE) { |
| // awt.247=parentX + w results in integer overflow |
| throw new RasterFormatException(Messages.getString("awt.247")); //$NON-NLS-1$ |
| } |
| |
| if ((long) parentY + h > Integer.MAX_VALUE) { |
| // awt.248=parentY + h results in integer overflow |
| throw new RasterFormatException(Messages.getString("awt.248")); //$NON-NLS-1$ |
| } |
| |
| if ((long) childMinX + w > Integer.MAX_VALUE) { |
| // awt.249=childMinX + w results in integer overflow |
| throw new RasterFormatException(Messages.getString("awt.249")); //$NON-NLS-1$ |
| } |
| |
| if ((long) childMinY + h > Integer.MAX_VALUE) { |
| // awt.24A=childMinY + h results in integer overflow |
| throw new RasterFormatException(Messages.getString("awt.24A")); //$NON-NLS-1$ |
| } |
| |
| SampleModel childModel; |
| |
| if (bandList == null) { |
| childModel = sampleModel; |
| } else { |
| childModel = sampleModel.createSubsetSampleModel(bandList); |
| } |
| |
| int childTranslateX = childMinX - parentX; |
| int childTranslateY = childMinY - parentY; |
| |
| return new WritableRaster(childModel, dataBuffer, |
| new Rectangle(childMinX, childMinY, w, h), |
| new Point(childTranslateX + sampleModelTranslateX, |
| childTranslateY + sampleModelTranslateY), |
| this); |
| } |
| |
| /** |
| * Creates the translated child of this WritableRaster. |
| * New WritableRaster object is a reference to the this |
| * WritableRaster and with different location. |
| * |
| * @param childMinX the X coordinate of the new WritableRaster. |
| * @param childMinY the Y coordinate of the new WritableRaster. |
| * |
| * @return the WritableRaster. |
| */ |
| public WritableRaster createWritableTranslatedChild(int childMinX, |
| int childMinY) { |
| return createWritableChild(minX, minY, width, height, childMinX, |
| childMinY, null); |
| } |
| |
| /** |
| * Gets the parent WritableRaster for this WritableRaster object. |
| * |
| * @return the parent WritableRaster for this WritableRaster object. |
| */ |
| public WritableRaster getWritableParent() { |
| return (WritableRaster) parent; |
| } |
| |
| /** |
| * Sets pixels from the specified source Raster srcRaster to this |
| * WritableRaster. |
| * |
| * @param srcRaster the source Raster. |
| */ |
| public void setRect(Raster srcRaster) { |
| setRect(0, 0, srcRaster); |
| } |
| |
| /** |
| * Sets pixels from the specified source Raster srcRaster to this |
| * WritableRaster. Each pixel with (x, y) coordinates from the source |
| * Raster is copied to pixel with (x+dx, y+dy) coordinates in this |
| * WritableRaster. The pixels with (x+dx, y+dy) coordinates which |
| * are out the bounds of this raster are ignored. |
| * |
| * @param dx the distance the pixel's X coordinate in the source |
| * Raster is translated when writtien to this WritableRaster. |
| * @param dy the distance the pixel's Y coordinate in the source |
| * Raster is translated when writtien to this WritableRaster. |
| * @param srcRaster the source Raster. |
| */ |
| public void setRect(int dx, int dy, Raster srcRaster) { |
| int w = srcRaster.getWidth(); |
| int h = srcRaster.getHeight(); |
| |
| int srcX = srcRaster.getMinX(); |
| int srcY = srcRaster.getMinY(); |
| |
| int dstX = srcX + dx; |
| int dstY = srcY + dy; |
| |
| if (dstX < this.minX) { |
| int minOffX = this.minX - dstX; |
| w -= minOffX; |
| dstX = this.minX; |
| srcX += minOffX; |
| } |
| |
| if (dstY < this.minY) { |
| int minOffY = this.minY - dstY; |
| h -= minOffY; |
| dstY = this.minY; |
| srcY += minOffY; |
| } |
| |
| if (dstX + w > this.minX + this.width) { |
| int maxOffX = (dstX + w) - (this.minX + this.width); |
| w -= maxOffX; |
| } |
| |
| if (dstY + h > this.minY + this.height) { |
| int maxOffY = (dstY + h) - (this.minY + this.height); |
| h -= maxOffY; |
| } |
| |
| if (w <= 0 || h <= 0) { |
| return; |
| } |
| |
| switch (sampleModel.getDataType()) { |
| case DataBuffer.TYPE_BYTE: |
| case DataBuffer.TYPE_SHORT: |
| case DataBuffer.TYPE_USHORT: |
| case DataBuffer.TYPE_INT: |
| int iPixelsLine[] = null; |
| for (int i = 0; i < h; i++) { |
| iPixelsLine = srcRaster.getPixels(srcX, srcY + i, w, 1, |
| iPixelsLine); |
| setPixels(dstX, dstY + i, w, 1, iPixelsLine); |
| } |
| break; |
| |
| case DataBuffer.TYPE_FLOAT: |
| float fPixelsLine[] = null; |
| for (int i = 0; i < h; i++) { |
| fPixelsLine = srcRaster.getPixels(srcX, srcY + i, w, 1, |
| fPixelsLine); |
| setPixels(dstX, dstY + i, w, 1, fPixelsLine); |
| } |
| break; |
| |
| case DataBuffer.TYPE_DOUBLE: |
| double dPixelsLine[] = null; |
| for (int i = 0; i < h; i++) { |
| dPixelsLine = srcRaster.getPixels(srcX, srcY + i, w, 1, |
| dPixelsLine); |
| setPixels(dstX, dstY + i, w, 1, dPixelsLine); |
| } |
| break; |
| } |
| } |
| |
| /** |
| * Sets the data for a rectangle of pixels from an input Raster to |
| * this WritableRaster. |
| * |
| * @param x the X coordinate of the point where the data of |
| * the input Raster is to be written. |
| * @param y the Y coordinate of the point where the data of |
| * the input Raster is to be written. |
| * @param inRaster the input Raster. |
| */ |
| public void setDataElements(int x, int y, Raster inRaster) { |
| int dstX = x + inRaster.getMinX(); |
| int dstY = y + inRaster.getMinY(); |
| |
| int w = inRaster.getWidth(); |
| int h = inRaster.getHeight(); |
| |
| if (dstX < this.minX || dstX + w > this.minX + this.width || |
| dstY < this.minY || dstY + h > this.minY + this.height) { |
| // awt.63=Coordinates are not in bounds |
| throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$ |
| } |
| |
| int srcX = inRaster.getMinX(); |
| int srcY = inRaster.getMinY(); |
| Object line = null; |
| |
| for (int i = 0; i < h; i++) { |
| line = inRaster.getDataElements(srcX, srcY + i, w, 1, line); |
| setDataElements(dstX, dstY + i, w, 1, line); |
| } |
| } |
| |
| /** |
| * Sets a int array of samples for the specified pixel |
| * in this WritableRaster. |
| * |
| * @param x the pixel's X coordinate. |
| * @param y the pixel's Y coordinate. |
| * @param iArray the int array of samples. |
| */ |
| public void setPixel(int x, int y, int iArray[]) { |
| sampleModel.setPixel(x - sampleModelTranslateX, |
| y - sampleModelTranslateY, iArray, dataBuffer); |
| } |
| |
| /** |
| * Sets a float array of samples for the specified pixel |
| * in this WritableRaster. |
| * |
| * @param x the pixel's X coordinate. |
| * @param y the pixel's Y coordinate. |
| * @param fArray the float array of samples. |
| */ |
| public void setPixel(int x, int y, float fArray[]) { |
| sampleModel.setPixel(x - sampleModelTranslateX, |
| y - sampleModelTranslateY, fArray, dataBuffer); |
| } |
| |
| /** |
| * Sets a double array of samples for the specified pixel |
| * in this WritableRaster. |
| * |
| * @param x the pixel's X coordinate. |
| * @param y the pixel's Y coordinate. |
| * @param dArray the double array of samples. |
| */ |
| public void setPixel(int x, int y, double dArray[]) { |
| sampleModel.setPixel(x - sampleModelTranslateX, |
| y - sampleModelTranslateY, dArray, dataBuffer); |
| } |
| |
| /** |
| * Sets a int array of samples for the specified rectangular area |
| * of pixels in this WritableRaster. |
| * |
| * @param x the X coordinate of rectangular area. |
| * @param y the Y coordinate of rectangular area. |
| * @param w the width of rectangular area. |
| * @param h the height of rectangular area. |
| * @param iArray the int array of samples. |
| */ |
| public void setPixels(int x, int y, int w, int h, int iArray[]) { |
| sampleModel.setPixels(x - sampleModelTranslateX, |
| y - sampleModelTranslateY, w, h, iArray, dataBuffer); |
| } |
| |
| /** |
| * Sets a float array of samples for the specified rectangular area |
| * of pixels in this WritableRaster. |
| * |
| * @param x the X coordinate of rectangular area. |
| * @param y the Y coordinate of rectangular area. |
| * @param w the width of rectangular area. |
| * @param h the height of rectangular area. |
| * @param fArray the float array of samples. |
| */ |
| public void setPixels(int x, int y, int w, int h, float fArray[]) { |
| sampleModel.setPixels(x - sampleModelTranslateX, |
| y - sampleModelTranslateY, w, h, fArray, dataBuffer); |
| } |
| |
| /** |
| * Sets a double array of samples for the specified rectangular area |
| * of pixels in this WritableRaster. |
| * |
| * @param x the X coordinate of rectangular area. |
| * @param y the Y coordinate of rectangular area. |
| * @param w the width of rectangular area. |
| * @param h the height of rectangular area. |
| * @param dArray the double array of samples. |
| */ |
| public void setPixels(int x, int y, int w, int h, double dArray[]) { |
| sampleModel.setPixels(x - sampleModelTranslateX, |
| y - sampleModelTranslateY, w, h, dArray, dataBuffer); |
| } |
| |
| /** |
| * Sets the samples for the specified band and the specified |
| * rectangular area of pixels with an int array of samples. |
| * |
| * @param x the X coordinate of the area of pixels. |
| * @param y the Y coordinate of the area of pixels. |
| * @param w the width of the area of pixels. |
| * @param h the height of the area of pixels. |
| * @param b the specified band. |
| * @param iArray the int array of samples. |
| |
| */ |
| public void setSamples(int x, int y, int w, int h, int b, int iArray[]) { |
| sampleModel.setSamples(x - sampleModelTranslateX, |
| y - sampleModelTranslateY, w, h, b, iArray, dataBuffer); |
| } |
| |
| /** |
| * Sets the samples for the specified band and the specified |
| * rectangular area of pixels with a float array of samples. |
| * |
| * @param x the X coordinate of the area of pixels. |
| * @param y the Y coordinate of the area of pixels. |
| * @param w the width of the area of pixels. |
| * @param h the height of the area of pixels. |
| * @param b the specified band. |
| * @param fArray the float array of samples. |
| */ |
| public void setSamples(int x, int y, int w, int h, int b, float fArray[]) { |
| sampleModel.setSamples(x - sampleModelTranslateX, |
| y - sampleModelTranslateY, w, h, b, fArray, dataBuffer); |
| } |
| |
| /** |
| * Sets the samples for the specified band and the specified |
| * rectangular area of pixels with a double array of samples. |
| * |
| * @param x the X coordinate of the area of pixels. |
| * @param y the Y coordinate of the area of pixels. |
| * @param w the width of the area of pixels. |
| * @param h the height of the area of pixels. |
| * @param b the specified band. |
| * @param dArray the double array of samples. |
| */ |
| public void setSamples(int x, int y, int w, int h, int b, double dArray[]) { |
| sampleModel.setSamples(x - sampleModelTranslateX, |
| y - sampleModelTranslateY, w, h, b, dArray, dataBuffer); |
| } |
| |
| /** |
| * Sets the sample for the specified band and the specified |
| * pixel with an int sample. |
| * |
| * @param x the X coordinate of the pixel. |
| * @param y the Y coordinate of the pixel. |
| * @param b the specified band. |
| * @param s the sample to be set. |
| */ |
| public void setSample(int x, int y, int b, int s) { |
| sampleModel.setSample(x - sampleModelTranslateX, |
| y - sampleModelTranslateY, b, s, dataBuffer); |
| } |
| |
| /** |
| * Sets the sample for the specified band and the specified |
| * pixel with a float sample. |
| * |
| * @param x the X coordinate of the pixel. |
| * @param y the Y coordinate of the pixel. |
| * @param b the specified band. |
| * @param s the sample to be set. |
| */ |
| public void setSample(int x, int y, int b, float s) { |
| sampleModel.setSample(x - sampleModelTranslateX, |
| y - sampleModelTranslateY, b, s, dataBuffer); |
| } |
| |
| /** |
| * Sets the sample for the specified band and the specified |
| * pixel with a int sample. |
| * |
| * @param x the X coordinate of the pixel. |
| * @param y the Y coordinate of the pixel. |
| * @param b the specified band. |
| * @param s the sample to be set. |
| */ |
| public void setSample(int x, int y, int b, double s) { |
| sampleModel.setSample(x - sampleModelTranslateX, |
| y - sampleModelTranslateY, b, s, dataBuffer); |
| } |
| |
| } |
| |