diff options
Diffstat (limited to 'awt/java/awt/image/Raster.java')
-rw-r--r-- | awt/java/awt/image/Raster.java | 1412 |
1 files changed, 1412 insertions, 0 deletions
diff --git a/awt/java/awt/image/Raster.java b/awt/java/awt/image/Raster.java new file mode 100644 index 0000000..4b2426e --- /dev/null +++ b/awt/java/awt/image/Raster.java @@ -0,0 +1,1412 @@ +/* + * 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.gl.image.OrdinaryWritableRaster; +import org.apache.harmony.awt.internal.nls.Messages; + +/** + * The Raster class represents a rectangular area of pixels. + * This class is defined by DataBuffer and SampleModel objects. + * The DataBuffer object stores sample values and DSampleModel defines + * the location of sample in this DataBuffer. + */ +public class Raster { + + /** The DataBuffer of this Raster. */ + protected DataBuffer dataBuffer; + + /** The height of this Raster. */ + protected int height; + + /** The X coordinate of the upper left pixel in this Raster. */ + protected int minX; + + /** The Y coordinate of the upper left pixel in this Raster. */ + protected int minY; + + /** The number of bands in this Raster. */ + protected int numBands; + + /** The number of data elements. */ + protected int numDataElements; + + /** The parent of this Raster. */ + protected Raster parent; + + /** The SampleModel of this Raster. */ + protected SampleModel sampleModel; + + /** + * The X translation from the coordinate space of the + * SampleModel of this Raster. + */ + protected int sampleModelTranslateX; + + /** + * The Y translation from the coordinate space of the + * SampleModel of this Raster. + */ + protected int sampleModelTranslateY; + + /** The width of this Raster. */ + protected int width; + + /** + * Creates a Raster object with a BandedSampleModel and the specified + * DataBuffer. The number of bands is defined by the length of bandOffsets + * or bankIndices arrays. + * + * @param dataBuffer the specified DataBuffer. + * @param w the width of the image data. + * @param h the height of the image data. + * @param bankIndices the bank indices of bands. + * @param bandOffsets the band offsets of bands. + * @param location the location which defines the upper left corner + * of Raster. + * + * @return the WritableRaster object. + */ + public static WritableRaster createBandedRaster(DataBuffer dataBuffer, + int w, int h, int scanlineStride, int bankIndices[], + int bandOffsets[], Point location) { + + if (w <= 0 || h <= 0) { + // awt.22E=w or h is less than or equal to zero + throw new RasterFormatException(Messages.getString("awt.22E")); //$NON-NLS-1$ + } + + if (location == null) { + location = new Point(0, 0); + } + + if ((long) location.x + w > Integer.MAX_VALUE + || (long) location.y + h > Integer.MAX_VALUE) { + // awt.276=location.x + w or location.y + h results in integer overflow + throw new RasterFormatException(Messages.getString("awt.276")); //$NON-NLS-1$ + } + + if (bankIndices == null || bandOffsets == null) { + // awt.277=bankIndices or bandOffsets is null + throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.277")); //$NON-NLS-1$ + } + + if (dataBuffer == null) { + // awt.278=dataBuffer is null + throw new NullPointerException(Messages.getString("awt.278")); //$NON-NLS-1$ + } + + int dataType = dataBuffer.getDataType(); + + if (dataType != DataBuffer.TYPE_BYTE + && dataType != DataBuffer.TYPE_USHORT + && dataType != DataBuffer.TYPE_INT) { + // awt.230=dataType is not one of the supported data types + throw new IllegalArgumentException(Messages.getString("awt.230")); //$NON-NLS-1$ + } + + BandedSampleModel sampleModel = new BandedSampleModel(dataType, w, h, + scanlineStride, bankIndices, bandOffsets); + + return new OrdinaryWritableRaster(sampleModel, dataBuffer, location); + } + + /** + * Creates a Raster object with a BandedSampleModel and the specified + * data type. The Data type can be one of the following values: + * TYPE_BYTE, TYPE_USHORT, or TYPE_INT. + * + * @param dataType the data type of the samples: + * TYPE_BYTE, TYPE_USHORT, or TYPE_INT. + * @param w the width of the image data. + * @param h the height of the image data. + * @param scanlineStride the scanline stride of the image data. + * @param bankIndices the bank indices of bands. + * @param bandOffsets the band offsets of bands. + * @param location the location which defines the upper left corner + * of the Raster. + * + * @return the WritableRaster object. + */ + public static WritableRaster createBandedRaster(int dataType, int w, int h, + int scanlineStride, int bankIndices[], int bandOffsets[], + Point location) { + + if (w <= 0 || h <= 0) { + // awt.22E=w or h is less than or equal to zero + throw new RasterFormatException(Messages.getString("awt.22E")); //$NON-NLS-1$ + } + + if (location == null) { + location = new Point(0, 0); + } + + if ((long) location.x + w > Integer.MAX_VALUE + || (long) location.y + h > Integer.MAX_VALUE) { + // awt.276=location.x + w or location.y + h results in integer overflow + throw new RasterFormatException(Messages.getString("awt.276")); //$NON-NLS-1$ + } + + if (bankIndices == null || bandOffsets == null) { + // awt.277=bankIndices or bandOffsets is null + throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.277")); //$NON-NLS-1$ + } + + if (dataType != DataBuffer.TYPE_BYTE + && dataType != DataBuffer.TYPE_USHORT + && dataType != DataBuffer.TYPE_INT) { + // awt.230=dataType is not one of the supported data types + throw new IllegalArgumentException(Messages.getString("awt.230")); //$NON-NLS-1$ + } + + int maxOffset = bandOffsets[0]; + int maxBank = bankIndices[0]; + + for (int i = 0; i < bankIndices.length; i++) { + if (bandOffsets[i] > maxOffset) { + maxOffset = bandOffsets[i]; + } + if (bankIndices[i] > maxBank) { + maxBank = bankIndices[i]; + } + } + + int numBanks = maxBank + 1; + int dataSize = scanlineStride * (h - 1) + w + maxOffset; + + DataBuffer data = null; + + switch (dataType) { + case DataBuffer.TYPE_BYTE: + data = new DataBufferByte(dataSize, numBanks); + break; + case DataBuffer.TYPE_USHORT: + data = new DataBufferUShort(dataSize, numBanks); + break; + case DataBuffer.TYPE_INT: + data = new DataBufferInt(dataSize, numBanks); + break; + } + return createBandedRaster(data, w, h, scanlineStride, bankIndices, + bandOffsets, location); + } + + /** + * Creates a Raster object with a BandedSampleModel and the specified + * data type. The Data type can be one of the following values: + * TYPE_BYTE, TYPE_USHORT, or TYPE_INT. + * + * @param dataType the data type of the samples: + * TYPE_BYTE, TYPE_USHORT, or TYPE_INT. + * @param w the width of the image data. + * @param h the height of the image data. + * @param bands the number of bands. + * @param location the location which defines the upper left corner + * of the Raster. + * + * @return the WritableRaster object. + */ + public static WritableRaster createBandedRaster(int dataType, int w, int h, + int bands, Point location) { + + if (w <= 0 || h <= 0) { + // awt.22E=w or h is less than or equal to zero + throw new RasterFormatException(Messages.getString("awt.22E")); //$NON-NLS-1$ + } + + if (location == null) { + location = new Point(0, 0); + } + + if ((long) location.x + w > Integer.MAX_VALUE + || (long) location.y + h > Integer.MAX_VALUE) { + // awt.276=location.x + w or location.y + h results in integer overflow + throw new RasterFormatException(Messages.getString("awt.276")); //$NON-NLS-1$ + } + + if (bands < 1) { + // awt.279=bands is less than 1 + throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.279")); //$NON-NLS-1$ + } + + int bandOffsets[] = new int[bands]; + int bankIndices[] = new int[bands]; + + for (int i = 0; i < bands; i++) { + bandOffsets[i] = 0; + bankIndices[i] = i; + } + return createBandedRaster(dataType, w, h, w, bankIndices, bandOffsets, + location); + } + + /** + * Creates a Raster object with a PixelInterleavedSampleModel + * and the specified DataBuffer. + * + * @param dataBuffer the DataBuffer. + * @param w the width of image data. + * @param h the height of image data. + * @param scanlineStride the scanline stride of the image data. + * @param pixelStride the pixel stride of image data. + * @param bandOffsets the band offsets of bands. + * @param location the location which defines the upper left corner + * of the Raster. + * + * @return the WritableRaster object. + */ + public static WritableRaster createInterleavedRaster(DataBuffer dataBuffer, + int w, int h, int scanlineStride, int pixelStride, + int bandOffsets[], Point location) { + + if (w <= 0 || h <= 0) { + // awt.22E=w or h is less than or equal to zero + throw new RasterFormatException(Messages.getString("awt.22E")); //$NON-NLS-1$ + } + + if (location == null) { + location = new Point(0, 0); + } + + if ((long) location.x + w > Integer.MAX_VALUE + || (long) location.y + h > Integer.MAX_VALUE) { + // awt.276=location.x + w or location.y + h results in integer overflow + throw new RasterFormatException(Messages.getString("awt.276")); //$NON-NLS-1$ + } + + if (dataBuffer == null) { + // awt.278=dataBuffer is null + throw new NullPointerException(Messages.getString("awt.278")); //$NON-NLS-1$ + } + + int dataType = dataBuffer.getDataType(); + if (dataType != DataBuffer.TYPE_BYTE + && dataType != DataBuffer.TYPE_USHORT) { + // awt.230=dataType is not one of the supported data types + throw new IllegalArgumentException(Messages.getString("awt.230")); //$NON-NLS-1$ + } + + if (dataBuffer.getNumBanks() > 1) { + // awt.27A=dataBuffer has more than one bank + throw new RasterFormatException(Messages.getString("awt.27A")); //$NON-NLS-1$ + } + + if (bandOffsets == null) { + // awt.27B=bandOffsets is null + throw new NullPointerException(Messages.getString("awt.27B")); //$NON-NLS-1$ + } + + PixelInterleavedSampleModel sampleModel = + new PixelInterleavedSampleModel(dataType, w, h, + pixelStride, scanlineStride, bandOffsets); + + return new OrdinaryWritableRaster(sampleModel, dataBuffer, location); + + } + + /** + * Creates a Raster object with a PixelInterleavedSampleModel + * and the specified data type. The Data type can be one of the + * following values: + * TYPE_BYTE, TYPE_USHORT, or TYPE_INT. + * + * @param dataType the data type of the samples: + * TYPE_BYTE, TYPE_USHORT, or TYPE_INT. + * @param w the width of image data. + * @param h the height of image data. + * @param scanlineStride the scanline stride of the image data. + * @param pixelStride the pixel stride of image data. + * @param bandOffsets the band offsets of bands. + * @param location the location which defines the upper left corner + * of the Raster. + * + * @return the WritableRaster object. + */ + public static WritableRaster createInterleavedRaster(int dataType, int w, + int h, int scanlineStride, int pixelStride, int bandOffsets[], + Point location) { + + if (w <= 0 || h <= 0) { + // awt.22E=w or h is less than or equal to zero + throw new RasterFormatException(Messages.getString("awt.22E")); //$NON-NLS-1$ + } + + if (location == null) { + location = new Point(0, 0); + } + + if ((long) location.x + w > Integer.MAX_VALUE + || (long) location.y + h > Integer.MAX_VALUE) { + // awt.276=location.x + w or location.y + h results in integer overflow + throw new RasterFormatException(Messages.getString("awt.276")); //$NON-NLS-1$ + } + + if (dataType != DataBuffer.TYPE_BYTE + && dataType != DataBuffer.TYPE_USHORT) { + // awt.230=dataType is not one of the supported data types + throw new IllegalArgumentException(Messages.getString("awt.230")); //$NON-NLS-1$ + } + + if (bandOffsets == null) { + // awt.27B=bandOffsets is null + throw new NullPointerException(Messages.getString("awt.27B")); //$NON-NLS-1$ + } + + int minOffset = bandOffsets[0]; + for (int i = 1; i < bandOffsets.length; i++) { + if (bandOffsets[i] < minOffset) { + minOffset = bandOffsets[i]; + } + } + int size = (h - 1) * scanlineStride + w * pixelStride + minOffset; + DataBuffer data = null; + + switch (dataType) { + case DataBuffer.TYPE_BYTE: + data = new DataBufferByte(size); + break; + case DataBuffer.TYPE_USHORT: + data = new DataBufferUShort(size); + break; + } + + return createInterleavedRaster(data, w, h, scanlineStride, pixelStride, + bandOffsets, location); + } + + /** + * Creates a Raster object with a PixelInterleavedSampleModel + * and the specified data type. The Data type can be one of the + * following values: + * TYPE_BYTE, TYPE_USHORT, or TYPE_INT. + * + * @param dataType the data type of samples: + * TYPE_BYTE, TYPE_USHORT, or TYPE_INT. + * @param w the width of image data. + * @param h the height of image data. + * @param bands the number of bands. + * @param location the location which defines the upper left corner + * of the Raster. + * + * @return the WritableRaster. + */ + public static WritableRaster createInterleavedRaster(int dataType, int w, + int h, int bands, Point location) { + + if (w <= 0 || h <= 0) { + // awt.22E=w or h is less than or equal to zero + throw new RasterFormatException(Messages.getString("awt.22E")); //$NON-NLS-1$ + } + + if (location == null) { + location = new Point(0, 0); + } + + if ((long) location.x + w > Integer.MAX_VALUE + || (long) location.y + h > Integer.MAX_VALUE) { + // awt.276=location.x + w or location.y + h results in integer overflow + throw new RasterFormatException(Messages.getString("awt.276")); //$NON-NLS-1$ + } + + if (dataType != DataBuffer.TYPE_BYTE + && dataType != DataBuffer.TYPE_USHORT) { + // awt.230=dataType is not one of the supported data types + throw new IllegalArgumentException(Messages.getString("awt.230")); //$NON-NLS-1$ + } + + int bandOffsets[] = new int[bands]; + for (int i = 0; i < bands; i++) { + bandOffsets[i] = i; + } + + return createInterleavedRaster(dataType, w, h, w * bands, bands, + bandOffsets, location); + } + + /** + * Creates a Raster object with a SinglePixelPackedSampleModel + * and the specified DataBuffer. + * + * @param dataBuffer the DataBuffer. + * @param w the width of the image data. + * @param h the height of the image data. + * @param scanlineStride the scanline stride of the image data. + * @param bandMasks the band masks. + * @param location the location which defines the upper left corner + * of the Raster. + * + * @return the WritableRaster. + */ + public static WritableRaster createPackedRaster(DataBuffer dataBuffer, + int w, int h, int scanlineStride, int bandMasks[], Point location) { + if (dataBuffer == null) { + // awt.278=dataBuffer is null + throw new NullPointerException(Messages.getString("awt.278")); //$NON-NLS-1$ + } + + if (w <= 0 || h <= 0) { + // awt.22E=w or h is less than or equal to zero + throw new RasterFormatException(Messages.getString("awt.22E")); //$NON-NLS-1$ + } + + if (location == null) { + location = new Point(0, 0); + } + + if ((long) location.x + w > Integer.MAX_VALUE + || (long) location.y + h > Integer.MAX_VALUE) { + // awt.276=location.x + w or location.y + h results in integer overflow + throw new RasterFormatException(Messages.getString("awt.276")); //$NON-NLS-1$ + } + + if (bandMasks == null) { + // awt.27C=bandMasks is null + throw new RasterFormatException(Messages.getString("awt.27C")); //$NON-NLS-1$ + } + + if (dataBuffer.getNumBanks() > 1) { + // awt.27A=dataBuffer has more than one bank + throw new RasterFormatException(Messages.getString("awt.27A")); //$NON-NLS-1$ + } + + int dataType = dataBuffer.getDataType(); + if (dataType != DataBuffer.TYPE_BYTE + && dataType != DataBuffer.TYPE_USHORT + && dataType != DataBuffer.TYPE_INT) { + // awt.230=dataType is not one of the supported data types + throw new IllegalArgumentException(Messages.getString("awt.230")); //$NON-NLS-1$ + } + + SinglePixelPackedSampleModel sampleModel = + new SinglePixelPackedSampleModel(dataType, w, h, + scanlineStride, bandMasks); + + return new OrdinaryWritableRaster(sampleModel, dataBuffer, location); + } + + /** + * Creates a Raster object with a MultiPixelPackedSampleModel + * and the specified DataBuffer. + * + * @param dataBuffer the DataBuffer. + * @param w the width of the image data. + * @param h the height of the image data. + * @param bitsPerPixel the number of bits per pixel. + * @param location the location which defines the upper left corner + * of the Raster. + * + * @return the WritableRaster. + */ + public static WritableRaster createPackedRaster(DataBuffer dataBuffer, + int w, int h, int bitsPerPixel, Point location) { + + if (w <= 0 || h <= 0) { + // awt.22E=w or h is less than or equal to zero + throw new RasterFormatException(Messages.getString("awt.22E")); //$NON-NLS-1$ + } + + if (location == null) { + location = new Point(0, 0); + } + + if ((long) location.x + w > Integer.MAX_VALUE + || (long) location.y + h > Integer.MAX_VALUE) { + // awt.276=location.x + w or location.y + h results in integer overflow + throw new RasterFormatException(Messages.getString("awt.276")); //$NON-NLS-1$ + } + + if (dataBuffer == null) { + // awt.278=dataBuffer is null + throw new NullPointerException(Messages.getString("awt.278")); //$NON-NLS-1$ + } + + if (dataBuffer.getNumBanks() > 1) { + // awt.27A=dataBuffer has more than one bank + throw new RasterFormatException(Messages.getString("awt.27A")); //$NON-NLS-1$ + } + + int dataType = dataBuffer.getDataType(); + if (dataType != DataBuffer.TYPE_BYTE + && dataType != DataBuffer.TYPE_USHORT + && dataType != DataBuffer.TYPE_INT) { + // awt.230=dataType is not one of the supported data types + throw new IllegalArgumentException(Messages.getString("awt.230")); //$NON-NLS-1$ + } + + MultiPixelPackedSampleModel sampleModel = + new MultiPixelPackedSampleModel(dataType, w, h, bitsPerPixel); + + return new OrdinaryWritableRaster(sampleModel, dataBuffer, location); + + } + + /** + * Creates a Raster object with a MultiPixelPackedSampleModel + * and the specified DataBuffer. + * + * @param dataType the data type of samples: + * TYPE_BYTE, TYPE_USHORT, or TYPE_INT. + * @param w the width of the image data. + * @param h the height of the image data. + * @param bands the number of bands. + * @param bitsPerBand the number of bits per band. + * @param location the location which defines the upper left corner + * of the Raster. + * + * @return the WritableRaster. + */ + public static WritableRaster createPackedRaster(int dataType, int w, int h, + int bands, int bitsPerBand, Point location) { + + if (w <= 0 || h <= 0) { + // awt.22E=w or h is less than or equal to zero + throw new RasterFormatException(Messages.getString("awt.22E")); //$NON-NLS-1$ + } + + if (location == null) { + location = new Point(0, 0); + } + + if ((long) location.x + w > Integer.MAX_VALUE + || (long) location.y + h > Integer.MAX_VALUE) { + // awt.276=location.x + w or location.y + h results in integer overflow + throw new RasterFormatException(Messages.getString("awt.276")); //$NON-NLS-1$ + } + + if (bands < 1 || bitsPerBand < 1) { + // awt.27D=bitsPerBand or bands is not greater than zero + throw new IllegalArgumentException(Messages.getString("awt.27D")); //$NON-NLS-1$ + } + + if (dataType != DataBuffer.TYPE_BYTE + && dataType != DataBuffer.TYPE_USHORT + && dataType != DataBuffer.TYPE_INT) { + // awt.230=dataType is not one of the supported data types + throw new IllegalArgumentException(Messages.getString("awt.230")); //$NON-NLS-1$ + } + + if (bitsPerBand * bands > DataBuffer.getDataTypeSize(dataType)) { + // awt.27E=The product of bitsPerBand and bands is greater than the number of bits held by dataType + throw new IllegalArgumentException(Messages.getString("awt.27E")); //$NON-NLS-1$ + } + + if (bands > 1) { + + int bandMasks[] = new int[bands]; + int mask = (1 << bitsPerBand) - 1; + + for (int i = 0; i < bands; i++) { + bandMasks[i] = mask << (bitsPerBand * (bands - 1 - i)); + } + + return createPackedRaster(dataType, w, h, bandMasks, location); + } + DataBuffer data = null; + int size = ((bitsPerBand * w + + DataBuffer.getDataTypeSize(dataType) - 1) / + DataBuffer.getDataTypeSize(dataType)) * h; + + switch (dataType) { + case DataBuffer.TYPE_BYTE: + data = new DataBufferByte(size); + break; + case DataBuffer.TYPE_USHORT: + data = new DataBufferUShort(size); + break; + case DataBuffer.TYPE_INT: + data = new DataBufferInt(size); + break; + } + return createPackedRaster(data, w, h, bitsPerBand, location); + } + + /** + * Creates a Raster object with a SinglePixelPackedSampleModel + * and the specified DataBuffer. + * + * @param dataType the data type of samples: + * TYPE_BYTE, TYPE_USHORT, or TYPE_INT. + * @param w the width of the image data. + * @param h the height of the image data. + * @param bandMasks the band masks. + * @param location the location which defines the upper left corner + * of the Raster. + * + * @return the WritableRaster. + */ + public static WritableRaster createPackedRaster(int dataType, int w, int h, + int bandMasks[], Point location) { + + if (dataType != DataBuffer.TYPE_BYTE + && dataType != DataBuffer.TYPE_USHORT + && dataType != DataBuffer.TYPE_INT) { + // awt.230=dataType is not one of the supported data types + throw new IllegalArgumentException(Messages.getString("awt.230")); //$NON-NLS-1$ + } + + if (w <= 0 || h <= 0) { + // awt.22E=w or h is less than or equal to zero + throw new RasterFormatException(Messages.getString("awt.22E")); //$NON-NLS-1$ + } + + if (location == null) { + location = new Point(0, 0); + } + + if ((long) location.x + w > Integer.MAX_VALUE + || (long) location.y + h > Integer.MAX_VALUE) { + // awt.276=location.x + w or location.y + h results in integer overflow + throw new RasterFormatException(Messages.getString("awt.276")); //$NON-NLS-1$ + } + + if (bandMasks == null) { + // awt.27C=bandMasks is null + throw new NullPointerException(Messages.getString("awt.27C")); //$NON-NLS-1$ + } + + DataBuffer data = null; + + switch (dataType) { + case DataBuffer.TYPE_BYTE: + data = new DataBufferByte(w * h); + break; + case DataBuffer.TYPE_USHORT: + data = new DataBufferUShort(w * h); + break; + case DataBuffer.TYPE_INT: + data = new DataBufferInt(w * h); + break; + } + + return createPackedRaster(data, w, h, w, bandMasks, location); + } + + /** + * Creates a Raster object with the specified DataBuffer and SampleModel. + * + * @param sm the specified SampleModel. + * @param db the specified DataBuffer. + * @param location the location which defines the upper left corner + * of the Raster. + * + * @return the Raster. + */ + public static Raster createRaster(SampleModel sm, DataBuffer db, + Point location) { + + if (sm == null || db == null) { + // awt.27F=SampleModel or DataBuffer is null + throw new NullPointerException(Messages.getString("awt.27F")); //$NON-NLS-1$ + } + + if (location == null) { + location = new Point(0, 0); + } + + return new Raster(sm, db, location); + } + + /** + * Creates a WritableRaster with the specified SampleModel and DataBuffer. + * + * @param sm the specified SampleModel. + * @param db the specified DataBuffer. + * @param location the location which defines the upper left corner + * of the Raster. + * + * @return the WritableRaster. + */ + public static WritableRaster createWritableRaster(SampleModel sm, + DataBuffer db, Point location) { + + if (sm == null || db == null) { + // awt.27F=SampleModel or DataBuffer is null + throw new NullPointerException(Messages.getString("awt.27F")); //$NON-NLS-1$ + } + + if (location == null) { + location = new Point(0, 0); + } + + return new OrdinaryWritableRaster(sm, db, location); + } + + /** + * Creates a WritableRaster with the specified SampleModel. + * + * @param sm the specified SampleModel. + * @param location the location which defines the upper left corner + * of the Raster. + * + * @return the WritableRaster. + */ + public static WritableRaster createWritableRaster(SampleModel sm, + Point location) { + + if (sm == null) { + // awt.280=SampleModel is null + throw new NullPointerException(Messages.getString("awt.280")); //$NON-NLS-1$ + } + + if (location == null) { + location = new Point(0, 0); + } + + return createWritableRaster(sm, sm.createDataBuffer(), location); + } + + /** + * Instantiates a new Raster object with the specified SampleModel and + * DataBuffer. + * + * @param sampleModel the specified SampleModel. + * @param dataBuffer the specified DataBuffer. + * @param origin the specified origin. + */ + protected Raster(SampleModel sampleModel, DataBuffer dataBuffer, + Point origin) { + + this(sampleModel, dataBuffer, new Rectangle(origin.x, origin.y, + sampleModel.getWidth(), sampleModel.getHeight()), origin, null); + } + + /** + * Instantiates a new Raster object with the specified SampleModel, + * DataBuffer, rectangular region and parent Raster. + * + * @param sampleModel the specified SampleModel. + * @param dataBuffer the specified DataBuffer. + * @param aRegion the a rectangular region which defines the new image bounds. + * @param sampleModelTranslate this point defines the translation point + * from the SampleModel coordinates to the new Raster coordinates. + * @param parent the parent of this Raster. + */ + protected Raster(SampleModel sampleModel, DataBuffer dataBuffer, + Rectangle aRegion, Point sampleModelTranslate, Raster parent) { + + if (sampleModel == null || dataBuffer == null || aRegion == null + || sampleModelTranslate == null) { + // awt.281=sampleModel, dataBuffer, aRegion or sampleModelTranslate is null + throw new NullPointerException(Messages.getString("awt.281")); //$NON-NLS-1$ + } + + if (aRegion.width <= 0 || aRegion.height <= 0) { + // awt.282=aRegion has width or height less than or equal to zero + throw new RasterFormatException(Messages.getString("awt.282")); //$NON-NLS-1$ + } + + if ((long) aRegion.x + (long) aRegion.width > Integer.MAX_VALUE) { + // awt.283=Overflow X coordinate of Raster + throw new RasterFormatException(Messages.getString("awt.283")); //$NON-NLS-1$ + } + + if ((long) aRegion.y + (long) aRegion.height > Integer.MAX_VALUE) { + // awt.284=Overflow Y coordinate of Raster + throw new RasterFormatException(Messages.getString("awt.284")); //$NON-NLS-1$ + } + + if (sampleModel instanceof ComponentSampleModel) { + validateDataBuffer(dataBuffer, aRegion.width, aRegion.height, + ((ComponentSampleModel) sampleModel).getScanlineStride()); + } else if (sampleModel instanceof MultiPixelPackedSampleModel) { + validateDataBuffer(dataBuffer, aRegion.width, aRegion.height, + ((MultiPixelPackedSampleModel) sampleModel) + .getScanlineStride()); + } else if (sampleModel instanceof SinglePixelPackedSampleModel) { + validateDataBuffer(dataBuffer, aRegion.width, aRegion.height, + ((SinglePixelPackedSampleModel) sampleModel) + .getScanlineStride()); + } + + this.sampleModel = sampleModel; + this.dataBuffer = dataBuffer; + this.minX = aRegion.x; + this.minY = aRegion.y; + this.width = aRegion.width; + this.height = aRegion.height; + this.sampleModelTranslateX = sampleModelTranslate.x; + this.sampleModelTranslateY = sampleModelTranslate.y; + this.parent = parent; + this.numBands = sampleModel.getNumBands(); + this.numDataElements = sampleModel.getNumDataElements(); + + } + + /** + * Instantiates a new Raster with the specified SampleModel. + * + * @param sampleModel the specified SampleModel. + * @param origin the origin. + */ + protected Raster(SampleModel sampleModel, Point origin) { + this(sampleModel, sampleModel.createDataBuffer(), new Rectangle( + origin.x, origin.y, sampleModel.getWidth(), sampleModel + .getHeight()), origin, null); + } + + /** + * Creates the child of this Raster by sharing the specified rectangular + * area in this Raste. The parentX, parentY, width + * and height parameters specify the rectangular area to be shared. + * + * @param parentX the X coordinate of the upper left corner of this Raster. + * @param parentY the Y coordinate of the upper left corner of this Raster. + * @param width the width of the child area. + * @param height 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 Raster. + */ + public Raster createChild(int parentX, int parentY, int width, int height, + int childMinX, int childMinY, int bandList[]) { + if (width <= 0 || height <= 0) { + // awt.285=Width or Height of child Raster is less than or equal to zero + throw new RasterFormatException(Messages.getString("awt.285")); //$NON-NLS-1$ + } + + if (parentX < this.minX || parentX + width > this.minX + this.width) { + // awt.286=parentX disposes outside Raster + throw new RasterFormatException(Messages.getString("awt.286")); //$NON-NLS-1$ + } + + if (parentY < this.minY || parentY + height > this.minY + this.height) { + // awt.287=parentY disposes outside Raster + throw new RasterFormatException(Messages.getString("awt.287")); //$NON-NLS-1$ + } + + if ((long) parentX + width > Integer.MAX_VALUE) { + // awt.288=parentX + width results in integer overflow + throw new RasterFormatException(Messages.getString("awt.288")); //$NON-NLS-1$ + } + + if ((long) parentY + height > Integer.MAX_VALUE) { + // awt.289=parentY + height results in integer overflow + throw new RasterFormatException(Messages.getString("awt.289")); //$NON-NLS-1$ + } + + if ((long) childMinX + width > Integer.MAX_VALUE) { + // awt.28A=childMinX + width results in integer overflow + throw new RasterFormatException(Messages.getString("awt.28A")); //$NON-NLS-1$ + } + + if ((long) childMinY + height > Integer.MAX_VALUE) { + // awt.28B=childMinY + height results in integer overflow + throw new RasterFormatException(Messages.getString("awt.28B")); //$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 Raster(childModel, dataBuffer, new Rectangle(childMinX, + childMinY, width, height), new Point(childTranslateX + + sampleModelTranslateX, childTranslateY + + sampleModelTranslateY), this); + } + + /** + * Create a compatible WritableRaster with the same parameters + * as this Raster. + * + * @return the WritableRaster. + */ + public WritableRaster createCompatibleWritableRaster() { + return new OrdinaryWritableRaster(sampleModel, new Point(0, 0)); + } + + /** + * Create a compatible WritableRaster with the same parameters + * as this Raster and the specified size. + * + * @param w the width of the new WritableRaster. + * @param h the height of the new WritableRaster. + * + * @return the WritableRaster. + */ + public WritableRaster createCompatibleWritableRaster(int w, int h) { + if (w <= 0 || h <= 0) { + // awt.22E=w or h is less than or equal to zero + throw new RasterFormatException(Messages.getString("awt.22E")); //$NON-NLS-1$ + } + + SampleModel sm = sampleModel.createCompatibleSampleModel(w, h); + + return new OrdinaryWritableRaster(sm, new Point(0, 0)); + } + + /** + * Create a compatible WritableRaster with the same parameters + * as this Raster and the specified size and location. + * + * @param x the X coordinate of the new WritableRaster. + * @param y the Y coordinate of the new WritableRaster. + * @param w the width of the new WritableRaster. + * @param h the height of the new WritableRaster. + * + * @return the WritableRaster. + */ + public WritableRaster createCompatibleWritableRaster(int x, int y, int w, + int h) { + + WritableRaster raster = createCompatibleWritableRaster(w, h); + + return raster.createWritableChild(0, 0, w, h, x, y, null); + } + + /** + * Create a compatible WritableRaster with the same parameters + * as this Raster and the specified rectangle which determines + * new WritableRaster's location and size. + * + * @param rect the specified Rectangle. + * + * @return the WritableRaster. + */ + public WritableRaster createCompatibleWritableRaster(Rectangle rect) { + if (rect == null) { + // awt.28C=Rect is null + throw new NullPointerException(Messages.getString("awt.28C")); //$NON-NLS-1$ + } + + return createCompatibleWritableRaster(rect.x, rect.y, rect.width, + rect.height); + } + + /** + * Creates the translated child of this Raster. The New Raster + * object is a reference to the this Raster with a + * different location. + * + * @param childMinX the X coordinate of the new Raster. + * @param childMinY the Y coordinate of the new Raster. + * + * @return the Raster. + */ + public Raster createTranslatedChild(int childMinX, int childMinY) { + return createChild(minX, minY, width, height, childMinX, childMinY, + null); + } + + /** + * Gets the bounds of this Raster as a rectangle. + * + * @return the bounds of this Raster. + */ + public Rectangle getBounds() { + return new Rectangle(minX, minY, width, height); + } + + /** + * Gets the DataBuffer associated with this Raster. + * + * @return the DataBuffer associated with this Raster. + */ + public DataBuffer getDataBuffer() { + return dataBuffer; + } + + /** + * Gets the data elements which represent the pixel data of 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 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 outData the resulting array. + * + * @return the data elements of the specified area of this Raster. + */ + public Object getDataElements(int x, int y, int w, int h, Object outData) { + return sampleModel.getDataElements(x - sampleModelTranslateX, y + - sampleModelTranslateY, w, h, outData, dataBuffer); + } + + /** + * Gets the data elements which represent the specified pixel of + * this Raster 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 pixel. + * @param y the Y coordinate of the pixel. + * @param outData the resulting data. + * + * @return the data elements of the specified pixel of this Raster. + */ + public Object getDataElements(int x, int y, Object outData) { + return sampleModel.getDataElements(x - sampleModelTranslateX, y + - sampleModelTranslateY, outData, dataBuffer); + } + + /** + * Gets the height of this Raster. + * + * @return the height of this Raster. + */ + public final int getHeight() { + return height; + } + + /** + * Gets the minimum X coordinate of this Raster. + * + * @return the minimum X coordinate of this Raster. + */ + public final int getMinX() { + return minX; + } + + /** + * Gets the minimum Y coordinate of this Raster. + * + * @return the minimum Y coordinate of this Raster. + */ + public final int getMinY() { + return minY; + } + + /** + * Gets the number of bands in this Raster. + * + * @return the number of bands in this Raster. + */ + public final int getNumBands() { + return numBands; + } + + /** + * Gets the number of data elements for one pixel. + * + * @return the number of data elements for one pixel. + */ + public final int getNumDataElements() { + return numDataElements; + } + + /** + * Gets the parent Raster for this Raster object. + * + * @return the parent Raster for this Raster object. + */ + public Raster getParent() { + return parent; + } + + /** + * Gets a double array of samples for the specified pixel in this Raster. + * + * @param x the pixel's X coordinate. + * @param y the pixel's Y coordinate. + * @param dArray the double array where result array will be stored. + * + * @return the double array of samples for the specified pixel in + * this Raster. + */ + public double[] getPixel(int x, int y, double dArray[]) { + return sampleModel.getPixel(x - sampleModelTranslateX, y + - sampleModelTranslateY, dArray, dataBuffer); + } + + /** + * Gets a float array of samples for the specified pixel in this Raster. + * + * @param x the pixel's X coordinate. + * @param y the pixel's Y coordinate. + * @param fArray the float array where the result array will be stored. + * + * @return the float array of samples for the specified pixel in + * this Raster. + */ + public float[] getPixel(int x, int y, float fArray[]) { + return sampleModel.getPixel(x - sampleModelTranslateX, y + - sampleModelTranslateY, fArray, dataBuffer); + } + + /** + * Gets an int array of samples for the specified pixel in this Raster. + * + * @param x the pixel's X coordinate. + * @param y the pixel's Y coordinate. + * @param iArray the int array where the result array will be stored. + * + * @return the int array of samples for the specified pixel in + * this Raster. + */ + public int[] getPixel(int x, int y, int iArray[]) { + return sampleModel.getPixel(x - sampleModelTranslateX, y + - sampleModelTranslateY, iArray, dataBuffer); + } + + /** + * Gets an double array of samples for the specified rectangular + * area of pixels in this Raster. + * + * @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 dArray the resulting array. + * + * @return the double array of samples for the specified rectangular + * area of pixels in this Raster. + */ + public double[] getPixels(int x, int y, int w, int h, double dArray[]) { + return sampleModel.getPixels(x - sampleModelTranslateX, y + - sampleModelTranslateY, w, h, dArray, dataBuffer); + } + + /** + * Gets an float array of samples for the specified rectangular + * area of pixels in this Raster. + * + * @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 fArray the resulting array. + * + * @return the float array of samples for the specified rectangular + * area of pixels in this Raster. + */ + public float[] getPixels(int x, int y, int w, int h, float fArray[]) { + return sampleModel.getPixels(x - sampleModelTranslateX, y + - sampleModelTranslateY, w, h, fArray, dataBuffer); + } + + /** + * Gets an int array of samples for the specified rectangular + * area of pixels in this Raster. + * + * @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 pixel's the area of pixels. + * @param h the height of pixel's the area of pixels. + * @param iArray the resulting array. + * + * @return the int array of samples for the specified rectangular + * area of pixels in this Raster. + */ + public int[] getPixels(int x, int y, int w, int h, int iArray[]) { + return sampleModel.getPixels(x - sampleModelTranslateX, y + - sampleModelTranslateY, w, h, iArray, dataBuffer); + } + + /** + * Gets the sample for the specified band of the specified + * pixel as an int. + * + * @param x the X coordinate of the pixel. + * @param y the Y coordinate of the pixel. + * @param b the band. + * + * @return the sample for the specified band of the specified + * pixel as an int. + */ + public int getSample(int x, int y, int b) { + return sampleModel.getSample(x - sampleModelTranslateX, y + - sampleModelTranslateY, b, dataBuffer); + } + + /** + * Gets the sample for the specified band of the specified + * pixel as a double. + * + * @param x the X coordinate of the pixel. + * @param y the Y coordinate of the pixel. + * @param b the band. + * + * @return the sample for the specified band of the specified + * pixel as a double. + */ + public double getSampleDouble(int x, int y, int b) { + return sampleModel.getSampleDouble(x - sampleModelTranslateX, y + - sampleModelTranslateY, b, dataBuffer); + } + + /** + * Gets the sample for the specified band of the specified + * pixel as a float. + * + * @param x the X coordinate of the pixel. + * @param y the Y coordinate of the pixel. + * @param b the band. + * + * @return the sample for the specified band of the specified + * pixel as a float. + */ + public float getSampleFloat(int x, int y, int b) { + return sampleModel.getSampleFloat(x - sampleModelTranslateX, y + - sampleModelTranslateY, b, dataBuffer); + } + + /** + * Gets the SampleModel associated with this Raster. + * + * @return the SampleModel associated with this Raster. + */ + public SampleModel getSampleModel() { + return sampleModel; + } + + /** + * Gets the translation of the X coordinate from the SampleModel + * coordinate system to the Rasters's coordinate system. + * + * @return the value of the translation of the X coordinate from + * the SampleModel coordinate system to the Rasters's + * coordinate system. + */ + public final int getSampleModelTranslateX() { + return sampleModelTranslateX; + } + + /** + * Gets the translation of the Y coordinate from the SampleModel + * coordinate system to the Rasters's coordinate system. + * + * @return the value of the translation of the Y coordinate from + * the SampleModel coordinate system to the Rasters's + * coordinate system. + + */ + public final int getSampleModelTranslateY() { + return sampleModelTranslateY; + } + + /** + * Gets the double array of samples for the specified band + * of the specified rectangular area of pixels in this Raster + * as a double array. + * + * @param x the X coordinate of the rectangular area of pixels. + * @param y the Y coordinate of the rectangular area of pixels. + * @param w the width of the rectangular area of pixels. + * @param h the height of the rectangular area of pixels. + * @param b the band. + * @param dArray the resulting double array. + * + * @return the double array of samples for the specified band + * of the specified rectangular area of pixels. + */ + public double[] getSamples(int x, int y, int w, int h, int b, + double dArray[]) { + + return sampleModel.getSamples(x - sampleModelTranslateX, y + - sampleModelTranslateY, w, h, b, dArray, dataBuffer); + } + + /** + * Gets the float array of samples for the specified band + * of the specified rectangular area of pixels in this Raster + * as a float array. + * + * @param x the X coordinate of the rectangular area of pixels. + * @param y the Y coordinate of the rectangular area of pixels. + * @param w the width of the rectangular area of pixels. + * @param h the height of the rectangular area of pixels. + * @param b the band. + * @param fArray the resulting float array. + * + * @return the float array of samples for the specified band + * of the specified rectangular area of pixels. + */ + public float[] getSamples(int x, int y, int w, int h, int b, float fArray[]) { + + return sampleModel.getSamples(x - sampleModelTranslateX, y + - sampleModelTranslateY, w, h, b, fArray, dataBuffer); + } + + /** + * Gets the int array of samples for the specified band + * of the specified rectangular area of pixels in this Raster + * as a int array. + * + * @param x the X coordinate of the rectangular area of pixels. + * @param y the Y coordinate of the rectangular area of pixels. + * @param w the width of the rectangular area of pixels. + * @param h the height of the rectangular area of pixels. + * @param b the band. + * @param iArray the resulting int array. + * + * @return the int array of samples for the specified band + * of the specified rectangular area of pixels. + */ + public int[] getSamples(int x, int y, int w, int h, int b, int iArray[]) { + return sampleModel.getSamples(x - sampleModelTranslateX, y + - sampleModelTranslateY, w, h, b, iArray, dataBuffer); + } + + /** + * Gets the transfer type for pixels of this Raster. + * @see SampleModel#getTransferType() + * + * @return the transfer type for pixels of this Raster. + */ + public final int getTransferType() { + return sampleModel.getTransferType(); + } + + /** + * Gets the width of this Raster. + * + * @return the width of this Raster. + */ + public final int getWidth() { + return width; + } + + /** + * Validate data buffer. + * + * @param dataBuffer the data buffer + * @param w the w + * @param h the h + * @param scanlineStride the scanline stride + */ + private static void validateDataBuffer(final DataBuffer dataBuffer, final int w, + final int h, final int scanlineStride) { + if (dataBuffer.getSize() < (scanlineStride * (h - 1) + w - 1)) { + // awt.298=dataBuffer is too small + throw new RasterFormatException(Messages.getString("awt.298")); //$NON-NLS-1$ + } + } +} + + |