/* * 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. * * @since Android 1.0 */ 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 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 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 raster. 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 indices. * @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 integer 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 integer array where the result array will be stored. * @return the integer 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 integer 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 integer 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 * integer. * * @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 * integer. */ 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 integer array of samples for the specified band of the specified * rectangular area of pixels in this Raster as a integer 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 integer array. * @return the integer 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$ } } }