/* * 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. * * @since Android 1.0 */ 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 indices. * @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 an integer 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 integer 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 integer 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 integer 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 integer 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 integer 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 * integer 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 an * integer 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); } }