593 lines
20 KiB
Java
593 lines
20 KiB
Java
/*
|
|
* 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);
|
|
}
|
|
|
|
}
|