summaryrefslogtreecommitdiffstats
path: root/awt/java/awt/image/SampleModel.java
diff options
context:
space:
mode:
Diffstat (limited to 'awt/java/awt/image/SampleModel.java')
-rw-r--r--awt/java/awt/image/SampleModel.java1166
1 files changed, 1166 insertions, 0 deletions
diff --git a/awt/java/awt/image/SampleModel.java b/awt/java/awt/image/SampleModel.java
new file mode 100644
index 0000000..c967fa6
--- /dev/null
+++ b/awt/java/awt/image/SampleModel.java
@@ -0,0 +1,1166 @@
+/*
+ * 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 org.apache.harmony.awt.internal.nls.Messages;
+
+/**
+ * The SampleModel class is abstract class for retrieving pixel's samples in the
+ * data of an image. Each pixel contains several samples. A sample is the set of
+ * values of the bands for single pixel. For example, each pixel in the RGB
+ * model contains three samples and there are three corresponding bands in the
+ * image data of such pixels representing red, green and blue components.
+ * <p>
+ * The image data is represented as a Raster with a DataBuffer and a
+ * SampleModel. The SampleModel allows access to the samples in the DataBuffer.
+ *
+ * @since Android 1.0
+ */
+public abstract class SampleModel {
+
+ /**
+ * The width of the image data which this SampleModel describes.
+ */
+ protected int width;
+
+ /**
+ * The height of the image data which this SampleModel describes.
+ */
+ protected int height;
+
+ /**
+ * The number of bands of image data which this SampleModel describes.
+ */
+ protected int numBands;
+
+ /**
+ * The data type of the image data which this SampleModel describes.
+ */
+ protected int dataType;
+
+ /**
+ * Instantiates a new SampleModel with the specified data type, width,
+ * height and number of bands.
+ *
+ * @param dataType
+ * the data type of the image data.
+ * @param w
+ * the width of the image data.
+ * @param h
+ * the height of the image data.
+ * @param numBands
+ * the number of bands of the image data.
+ */
+ public SampleModel(int dataType, int w, int h, int numBands) {
+ if (w <= 0 || h <= 0) {
+ // awt.22E=w or h is less than or equal to zero
+ throw new IllegalArgumentException(Messages.getString("awt.22E")); //$NON-NLS-1$
+ }
+
+ double squre = ((double)w) * ((double)h);
+ if (squre >= Integer.MAX_VALUE) {
+ // awt.22F=The product of w and h is greater than Integer.MAX_VALUE
+ throw new IllegalArgumentException(Messages.getString("awt.22F")); //$NON-NLS-1$
+ }
+
+ if (dataType < DataBuffer.TYPE_BYTE || dataType > DataBuffer.TYPE_DOUBLE
+ && dataType != DataBuffer.TYPE_UNDEFINED) {
+ // awt.230=dataType is not one of the supported data types
+ throw new IllegalArgumentException(Messages.getString("awt.230")); //$NON-NLS-1$
+ }
+
+ if (numBands < 1) {
+ // awt.231=Number of bands must be more then 0
+ throw new IllegalArgumentException(Messages.getString("awt.231")); //$NON-NLS-1$
+ }
+
+ this.dataType = dataType;
+ this.width = w;
+ this.height = h;
+ this.numBands = numBands;
+
+ }
+
+ /**
+ * Gets the data array for the specified pixel of the specified DataBuffer
+ * with one of the following 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 pixel.
+ * @param y
+ * the Y coordinate of pixel.
+ * @param obj
+ * the Object is a data where the result will be stored.
+ * @param data
+ * the image data.
+ * @return the data array for the specified pixel of the specified
+ * DataBuffer.
+ */
+ public abstract Object getDataElements(int x, int y, Object obj, DataBuffer data);
+
+ /**
+ * Gets the array of pixel data for the specified rectangular area of pixels
+ * of the specified DataBuffer with one of the following 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 rectangular pixel area.
+ * @param y
+ * the Y coordinate of the rectangular pixel area.
+ * @param w
+ * the width of the rectangular pixel area.
+ * @param h
+ * the height of the rectangular pixel area.
+ * @param obj
+ * the Object is an array with the primitive type, where the
+ * result array will be stored.
+ * @param data
+ * the image data.
+ * @return the array of pixel data for the specified rectangular area of
+ * pixels of the specified DataBuffer object.
+ */
+ public Object getDataElements(int x, int y, int w, int h, Object obj, DataBuffer data) {
+ int numDataElements = getNumDataElements();
+ int idx = 0;
+
+ switch (getTransferType()) {
+ case DataBuffer.TYPE_BYTE:
+ byte bdata[];
+ byte bbuf[] = null;
+
+ if (obj == null) {
+ bdata = new byte[numDataElements * w * h];
+ } else {
+ bdata = (byte[])obj;
+ }
+
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ bbuf = (byte[])getDataElements(j, i, bbuf, data);
+ for (int n = 0; n < numDataElements; n++) {
+ bdata[idx++] = bbuf[n];
+ }
+ }
+ }
+ obj = bdata;
+ break;
+
+ case DataBuffer.TYPE_SHORT:
+ case DataBuffer.TYPE_USHORT:
+ short sdata[];
+ short sbuf[] = null;
+
+ if (obj == null) {
+ sdata = new short[numDataElements * w * h];
+ } else {
+ sdata = (short[])obj;
+ }
+
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ sbuf = (short[])getDataElements(j, i, sbuf, data);
+ for (int n = 0; n < numDataElements; n++) {
+ sdata[idx++] = sbuf[n];
+ }
+ }
+ }
+ obj = sdata;
+ break;
+
+ case DataBuffer.TYPE_INT:
+ int idata[];
+ int ibuf[] = null;
+
+ if (obj == null) {
+ idata = new int[numDataElements * w * h];
+ } else {
+ idata = (int[])obj;
+ }
+
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ ibuf = (int[])getDataElements(j, i, ibuf, data);
+ for (int n = 0; n < numDataElements; n++) {
+ idata[idx++] = ibuf[n];
+ }
+ }
+ }
+ obj = idata;
+ break;
+
+ case DataBuffer.TYPE_FLOAT:
+ float fdata[];
+ float fbuf[] = null;
+
+ if (obj == null) {
+ fdata = new float[numDataElements * w * h];
+ } else {
+ fdata = (float[])obj;
+ }
+
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ fbuf = (float[])getDataElements(j, i, fbuf, data);
+ for (int n = 0; n < numDataElements; n++) {
+ fdata[idx++] = fbuf[n];
+ }
+ }
+ }
+ obj = fdata;
+ break;
+
+ case DataBuffer.TYPE_DOUBLE:
+ double ddata[];
+ double dbuf[] = null;
+
+ if (obj == null) {
+ ddata = new double[numDataElements * w * h];
+ } else {
+ ddata = (double[])obj;
+ }
+
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ dbuf = (double[])getDataElements(j, i, dbuf, data);
+ for (int n = 0; n < numDataElements; n++) {
+ ddata[idx++] = dbuf[n];
+ }
+ }
+ }
+ obj = ddata;
+ break;
+
+ }
+
+ return obj;
+ }
+
+ /**
+ * Sets the data for a single pixel in the specified DataBuffer from a
+ * primitive array with one of the following 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 pixel.
+ * @param y
+ * the Y coordinate of pixel.
+ * @param obj
+ * the Object - the array of primitive pixel data to be set.
+ * @param data
+ * the image data.
+ */
+ public abstract void setDataElements(int x, int y, Object obj, DataBuffer data);
+
+ /**
+ * Sets the data elements for a rectangular area of pixels in the specified
+ * DataBuffer from a primitive array with one of the following 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 specified rectangular area.
+ * @param y
+ * the Y coordinate of the specified rectangular area.
+ * @param w
+ * the width of rectangle.
+ * @param h
+ * the height of rectangle.
+ * @param obj
+ * the Object - the array of primitive pixel data to be set.
+ * @param data
+ * the image data.
+ */
+ public void setDataElements(int x, int y, int w, int h, Object obj, DataBuffer data) {
+ int numDataElements = getNumDataElements();
+ int idx = 0;
+
+ switch (getTransferType()) {
+ case DataBuffer.TYPE_BYTE:
+ byte bbuf[] = new byte[numDataElements];
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ for (int n = 0; n < numDataElements; n++) {
+ bbuf[n] = ((byte[])obj)[idx++];
+ }
+ setDataElements(j, i, bbuf, data);
+ }
+ }
+
+ break;
+
+ case DataBuffer.TYPE_SHORT:
+ case DataBuffer.TYPE_USHORT:
+ short sbuf[] = new short[numDataElements];
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ for (int n = 0; n < numDataElements; n++) {
+ sbuf[n] = ((short[])obj)[idx++];
+ }
+ setDataElements(j, i, sbuf, data);
+ }
+ }
+ break;
+
+ case DataBuffer.TYPE_INT:
+ int ibuf[] = new int[numDataElements];
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ for (int n = 0; n < numDataElements; n++) {
+ ibuf[n] = ((int[])obj)[idx++];
+ }
+ setDataElements(j, i, ibuf, data);
+ }
+ }
+ break;
+
+ case DataBuffer.TYPE_FLOAT:
+ float fbuf[] = new float[numDataElements];
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ for (int n = 0; n < numDataElements; n++) {
+ fbuf[n] = ((float[])obj)[idx++];
+ }
+ setDataElements(j, i, fbuf, data);
+ }
+ }
+ break;
+
+ case DataBuffer.TYPE_DOUBLE:
+ double dbuf[] = new double[numDataElements];
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ for (int n = 0; n < numDataElements; n++) {
+ dbuf[n] = ((double[])obj)[idx++];
+ }
+ setDataElements(j, i, dbuf, data);
+ }
+ }
+ break;
+
+ }
+ }
+
+ /**
+ * Creates a new SampleModel with the specified bands of this SampleModel.
+ *
+ * @param bands
+ * the array of bands from this SampleModel.
+ * @return the SampleModel with the specified bands of this SampleModel.
+ */
+ public abstract SampleModel createSubsetSampleModel(int bands[]);
+
+ /**
+ * Creates the SampleModel which has the same data as in this SampleModel
+ * with a different width and height.
+ *
+ * @param a0
+ * the width of the image data.
+ * @param a1
+ * the height of the image data.
+ * @return the SampleModel which has the same data as in this SampleModel
+ * with a different width and height.
+ */
+ public abstract SampleModel createCompatibleSampleModel(int a0, int a1);
+
+ /**
+ * Gets the samples of the specified pixel as an integer array.
+ *
+ * @param x
+ * the X coordinate of pixel.
+ * @param y
+ * the Y coordinate of pixel.
+ * @param iArray
+ * the integer array where result will be stored.
+ * @param data
+ * the image data.
+ * @return the integer array with the samples of the specified pixel.
+ */
+ public int[] getPixel(int x, int y, int iArray[], DataBuffer data) {
+ if (x < 0 || y < 0 || x >= this.width || y >= this.height) {
+ // awt.63=Coordinates are not in bounds
+ throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
+ }
+ int pixel[];
+
+ if (iArray == null) {
+ pixel = new int[numBands];
+ } else {
+ pixel = iArray;
+ }
+
+ for (int i = 0; i < numBands; i++) {
+ pixel[i] = getSample(x, y, i, data);
+ }
+
+ return pixel;
+ }
+
+ /**
+ * Sets a pixel of the DataBuffer from a integer array of samples.
+ *
+ * @param x
+ * the X coordinate of pixel.
+ * @param y
+ * the Y coordinate of pixel.
+ * @param iArray
+ * the integer array.
+ * @param data
+ * the image data.
+ */
+ public void setPixel(int x, int y, int iArray[], DataBuffer data) {
+ if (x < 0 || y < 0 || x >= this.width || y >= this.height) {
+ // awt.63=Coordinates are not in bounds
+ throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
+ }
+ for (int i = 0; i < numBands; i++) {
+ setSample(x, y, i, iArray[i], data);
+ }
+ }
+
+ /**
+ * Gets the samples of the specified pixel as a float array.
+ *
+ * @param x
+ * the X coordinate of pixel.
+ * @param y
+ * the Y coordinate of pixel.
+ * @param fArray
+ * the float array where result will be stored.
+ * @param data
+ * the image data.
+ * @return the float array with the samples of the specified pixel.
+ */
+ public float[] getPixel(int x, int y, float fArray[], DataBuffer data) {
+ if (x < 0 || y < 0 || x >= this.width || y >= this.height) {
+ // awt.63=Coordinates are not in bounds
+ throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
+ }
+ float pixel[];
+
+ if (fArray == null) {
+ pixel = new float[numBands];
+ } else {
+ pixel = fArray;
+ }
+
+ for (int i = 0; i < numBands; i++) {
+ pixel[i] = getSampleFloat(x, y, i, data);
+ }
+
+ return pixel;
+ }
+
+ /**
+ * Sets a pixel of the DataBuffer from a float array of samples.
+ *
+ * @param x
+ * the X coordinate of pixel.
+ * @param y
+ * the Y coordinate of pixel.
+ * @param fArray
+ * the float array.
+ * @param data
+ * the image data.
+ */
+ public void setPixel(int x, int y, float fArray[], DataBuffer data) {
+ if (x < 0 || y < 0 || x >= this.width || y >= this.height) {
+ // awt.63=Coordinates are not in bounds
+ throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
+ }
+ for (int i = 0; i < numBands; i++) {
+ setSample(x, y, i, fArray[i], data);
+ }
+ }
+
+ /**
+ * Gets the samples of the specified pixel as a double array.
+ *
+ * @param x
+ * the X coordinate of pixel.
+ * @param y
+ * the Y coordinate of pixel.
+ * @param dArray
+ * the double array where result will be stored.
+ * @param data
+ * the image data.
+ * @return the double array with the samples of the specified pixel.
+ */
+ public double[] getPixel(int x, int y, double dArray[], DataBuffer data) {
+ if (x < 0 || y < 0 || x >= this.width || y >= this.height) {
+ // awt.63=Coordinates are not in bounds
+ throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
+ }
+ double pixel[];
+
+ if (dArray == null) {
+ pixel = new double[numBands];
+ } else {
+ pixel = dArray;
+ }
+
+ for (int i = 0; i < numBands; i++) {
+ pixel[i] = getSampleDouble(x, y, i, data);
+ }
+
+ return pixel;
+ }
+
+ /**
+ * Sets a pixel of the DataBuffer from a double array of samples.
+ *
+ * @param x
+ * the X coordinate of pixel.
+ * @param y
+ * the Y coordinate of pixel.
+ * @param dArray
+ * the double array.
+ * @param data
+ * the image data.
+ */
+ public void setPixel(int x, int y, double dArray[], DataBuffer data) {
+ if (x < 0 || y < 0 || x >= this.width || y >= this.height) {
+ // awt.63=Coordinates are not in bounds
+ throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
+ }
+ for (int i = 0; i < numBands; i++) {
+ setSample(x, y, i, dArray[i], data);
+ }
+ }
+
+ /**
+ * Gets the sample of a specified band for the specified pixel as an
+ * integer.
+ *
+ * @param x
+ * the X coordinate of pixel.
+ * @param y
+ * the Y coordinate of pixel.
+ * @param b
+ * the specified band.
+ * @param data
+ * the image data.
+ * @return the sample of a specified band for the specified pixel.
+ */
+ public abstract int getSample(int x, int y, int b, DataBuffer data);
+
+ /**
+ * Gets the sample of a specified band for the specified pixel as a float.
+ *
+ * @param x
+ * the X coordinate of pixel.
+ * @param y
+ * the Y coordinate of pixel.
+ * @param b
+ * the specified band.
+ * @param data
+ * the image data.
+ * @return the sample of a specified band for the specified pixel.
+ */
+ public float getSampleFloat(int x, int y, int b, DataBuffer data) {
+ return getSample(x, y, b, data);
+ }
+
+ /**
+ * Gets the sample of a specified band for the specified pixel as a double.
+ *
+ * @param x
+ * the X coordinate of pixel.
+ * @param y
+ * the Y coordinate of pixel.
+ * @param b
+ * the specified band.
+ * @param data
+ * the image data.
+ * @return the sample of a specified band for the specified pixel.
+ */
+ public double getSampleDouble(int x, int y, int b, DataBuffer data) {
+ return getSample(x, y, b, data);
+ }
+
+ /**
+ * Gets the samples of the specified rectangular area of pixels as an
+ * integer array.
+ *
+ * @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 iArray
+ * the integer array where result will be stored.
+ * @param data
+ * the image data.
+ * @return the integer array with the samples of the specified rectangular
+ * area of pixels.
+ */
+ public int[] getPixels(int x, int y, int w, int h, int iArray[], DataBuffer data) {
+ if (x < 0 || y < 0 || x + w > this.width || y + h > this.height) {
+ // awt.63=Coordinates are not in bounds
+ throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
+ }
+ int pixels[];
+ int idx = 0;
+
+ if (iArray == null) {
+ pixels = new int[w * h * numBands];
+ } else {
+ pixels = iArray;
+ }
+
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ for (int n = 0; n < numBands; n++) {
+ pixels[idx++] = getSample(j, i, n, data);
+ }
+ }
+ }
+ return pixels;
+ }
+
+ /**
+ * Sets all of the samples for a rectangular area of pixels of the
+ * DataBuffer from an integer array.
+ *
+ * @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 iArray
+ * the integer array.
+ * @param data
+ * the image data.
+ */
+ public void setPixels(int x, int y, int w, int h, int iArray[], DataBuffer data) {
+ if (x < 0 || y < 0 || x + w > this.width || y + h > this.height) {
+ // awt.63=Coordinates are not in bounds
+ throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
+ }
+ int idx = 0;
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ for (int n = 0; n < numBands; n++) {
+ setSample(j, i, n, iArray[idx++], data);
+ }
+ }
+ }
+ }
+
+ /**
+ * Gets the samples of the specified rectangular area of pixels as a float
+ * array.
+ *
+ * @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 fArray
+ * the float array where result will be stored.
+ * @param data
+ * the image data.
+ * @return the float array with the samples of the specified rectangular
+ * area of pixels.
+ */
+ public float[] getPixels(int x, int y, int w, int h, float fArray[], DataBuffer data) {
+ if (x < 0 || y < 0 || x + w > this.width || y + h > this.height) {
+ // awt.63=Coordinates are not in bounds
+ throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
+ }
+ float pixels[];
+ int idx = 0;
+
+ if (fArray == null) {
+ pixels = new float[w * h * numBands];
+ } else {
+ pixels = fArray;
+ }
+
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ for (int n = 0; n < numBands; n++) {
+ pixels[idx++] = getSampleFloat(j, i, n, data);
+ }
+ }
+ }
+ return pixels;
+ }
+
+ /**
+ * Sets all of the samples for a rectangular area of pixels of the
+ * DataBuffer from a float array.
+ *
+ * @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 fArray
+ * the float array.
+ * @param data
+ * the image data.
+ */
+ public void setPixels(int x, int y, int w, int h, float fArray[], DataBuffer data) {
+ if (x < 0 || y < 0 || x + w > this.width || y + h > this.height) {
+ // awt.63=Coordinates are not in bounds
+ throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
+ }
+ int idx = 0;
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ for (int n = 0; n < numBands; n++) {
+ setSample(j, i, n, fArray[idx++], data);
+ }
+ }
+ }
+ }
+
+ /**
+ * Gets the samples of the specified rectangular area of pixels as a double
+ * array.
+ *
+ * @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 dArray
+ * the double array where result will be stored.
+ * @param data
+ * the image data.
+ * @return the double array with the samples of the specified rectangular
+ * area of pixels.
+ */
+ public double[] getPixels(int x, int y, int w, int h, double dArray[], DataBuffer data) {
+ if (x < 0 || y < 0 || x + w > this.width || y + h > this.height) {
+ // awt.63=Coordinates are not in bounds
+ throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
+ }
+ double pixels[];
+ int idx = 0;
+
+ if (dArray == null) {
+ pixels = new double[w * h * numBands];
+ } else {
+ pixels = dArray;
+ }
+
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ for (int n = 0; n < numBands; n++) {
+ pixels[idx++] = getSampleDouble(j, i, n, data);
+ }
+ }
+ }
+ return pixels;
+ }
+
+ /**
+ * Sets all of the samples for a rectangular area of pixels of the
+ * DataBuffer from a double array.
+ *
+ * @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 dArray
+ * the double array.
+ * @param data
+ * the image data.
+ */
+ public void setPixels(int x, int y, int w, int h, double dArray[], DataBuffer data) {
+ if (x < 0 || y < 0 || x + w > this.width || y + h > this.height) {
+ // awt.63=Coordinates are not in bounds
+ throw new ArrayIndexOutOfBoundsException(Messages.getString("awt.63")); //$NON-NLS-1$
+ }
+ int idx = 0;
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ for (int n = 0; n < numBands; n++) {
+ setSample(j, i, n, dArray[idx++], data);
+ }
+ }
+ }
+ }
+
+ /**
+ * Sets a sample of the specified band for the specified pixel in the
+ * DataBuffer as integer value.
+ *
+ * @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 as an integer value.
+ * @param data
+ * the image data.
+ */
+ public abstract void setSample(int x, int y, int b, int s, DataBuffer data);
+
+ /**
+ * Gets the samples of a specified band for a specified rectangular area of
+ * pixels as a integer array.
+ *
+ * @param x
+ * the X coordinate of the rectangle.
+ * @param y
+ * the Y coordinate of the rectangle.
+ * @param w
+ * the width of the rectangle.
+ * @param h
+ * the height of the rectangle.
+ * @param b
+ * the specified band.
+ * @param iArray
+ * the integer array where result will be stored.
+ * @param data
+ * the image data.
+ * @return the samples of a specified band for a specified rectangular area
+ * of pixels.
+ */
+ public int[] getSamples(int x, int y, int w, int h, int b, int iArray[], DataBuffer data) {
+ int samples[];
+ int idx = 0;
+
+ if (iArray == null) {
+ samples = new int[w * h];
+ } else {
+ samples = iArray;
+ }
+
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ samples[idx++] = getSample(j, i, b, data);
+ }
+ }
+
+ return samples;
+ }
+
+ /**
+ * Sets the samples from an integer array in the specified band for the
+ * specified rectangle of pixels.
+ *
+ * @param x
+ * the X coordinate of the rectangle.
+ * @param y
+ * the Y coordinate of the rectangle.
+ * @param w
+ * the width of the rectangle.
+ * @param h
+ * the height of the rectangle.
+ * @param b
+ * the specified band.
+ * @param iArray
+ * the integer array.
+ * @param data
+ * the image data.
+ */
+ public void setSamples(int x, int y, int w, int h, int b, int iArray[], DataBuffer data) {
+ int idx = 0;
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ setSample(j, i, b, iArray[idx++], data);
+ }
+ }
+ }
+
+ /**
+ * Gets the samples of a specified band for a specified rectangular area of
+ * pixels as a float array.
+ *
+ * @param x
+ * the X coordinate of the rectangle.
+ * @param y
+ * the Y coordinate of the rectangle.
+ * @param w
+ * the width of the rectangle.
+ * @param h
+ * the height of the rectangle.
+ * @param b
+ * the specified band.
+ * @param fArray
+ * the float array where result will be stored.
+ * @param data
+ * the image data.
+ * @return the samples of a specified band for a specified rectangular area
+ * of pixels.
+ */
+ public float[] getSamples(int x, int y, int w, int h, int b, float fArray[], DataBuffer data) {
+ float samples[];
+ int idx = 0;
+
+ if (fArray == null) {
+ samples = new float[w * h];
+ } else {
+ samples = fArray;
+ }
+
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ samples[idx++] = getSampleFloat(j, i, b, data);
+ }
+ }
+
+ return samples;
+ }
+
+ /**
+ * Sets the samples from an float array in the specified band for the
+ * specified rectangle of pixels.
+ *
+ * @param x
+ * the X coordinate of the rectangle.
+ * @param y
+ * the Y coordinate of the rectangle.
+ * @param w
+ * the width of the rectangle.
+ * @param h
+ * the height of the rectangle.
+ * @param b
+ * the specified band.
+ * @param fArray
+ * the float array.
+ * @param data
+ * the image data.
+ */
+ public void setSamples(int x, int y, int w, int h, int b, float fArray[], DataBuffer data) {
+ int idx = 0;
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ setSample(j, i, b, fArray[idx++], data);
+ }
+ }
+ }
+
+ /**
+ * Gets the samples of a specified band for a specified rectangular area of
+ * pixels as a double array.
+ *
+ * @param x
+ * the X coordinate of the rectangle.
+ * @param y
+ * the Y coordinate of the rectangle.
+ * @param w
+ * the width of the rectangle.
+ * @param h
+ * the height of the rectangle.
+ * @param b
+ * the specified band.
+ * @param dArray
+ * the double array where result will be stored.
+ * @param data
+ * the image data.
+ * @return the samples of a specified band for a specified rectangular area
+ * of pixels.
+ */
+ public double[] getSamples(int x, int y, int w, int h, int b, double dArray[], DataBuffer data) {
+ double samples[];
+ int idx = 0;
+
+ if (dArray == null) {
+ samples = new double[w * h];
+ } else {
+ samples = dArray;
+ }
+
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ samples[idx++] = getSampleDouble(j, i, b, data);
+ }
+ }
+
+ return samples;
+ }
+
+ /**
+ * Sets the samples from an double array in the specified band for the
+ * specified rectangle of pixels.
+ *
+ * @param x
+ * the X coordinate of the rectangle.
+ * @param y
+ * the Y coordinate of the rectangle.
+ * @param w
+ * the width of the rectangle.
+ * @param h
+ * the height of the rectangle.
+ * @param b
+ * the specified band.
+ * @param dArray
+ * the double array.
+ * @param data
+ * the image data.
+ */
+ public void setSamples(int x, int y, int w, int h, int b, double dArray[], DataBuffer data) {
+ int idx = 0;
+ for (int i = y; i < y + h; i++) {
+ for (int j = x; j < x + w; j++) {
+ setSample(j, i, b, dArray[idx++], data);
+ }
+ }
+ }
+
+ /**
+ * Sets a sample of the specified band for the specified pixel in the
+ * DataBuffer as float value.
+ *
+ * @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 as float value.
+ * @param data
+ * the image data.
+ */
+ public void setSample(int x, int y, int b, float s, DataBuffer data) {
+ setSample(x, y, b, (int)s, data);
+ }
+
+ /**
+ * Sets a sample of the specified band for the specified pixel in the
+ * DataBuffer as double value.
+ *
+ * @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 as double value.
+ * @param data
+ * the image data.
+ */
+ public void setSample(int x, int y, int b, double s, DataBuffer data) {
+ setSample(x, y, b, (int)s, data);
+ }
+
+ /**
+ * Creates a DataBuffer object which corresponds to the SampleModel.
+ *
+ * @return the DataBuffer object which corresponds to the SampleModel.
+ */
+ public abstract DataBuffer createDataBuffer();
+
+ /**
+ * Gets the sample size in bits for the specified band.
+ *
+ * @param band
+ * the specified band.
+ * @return the sample size in bits for the specified band.
+ */
+ public abstract int getSampleSize(int band);
+
+ /**
+ * Gets an array of the sample size in bits for all bands.
+ *
+ * @return an array of the sample size in bits for all bands.
+ */
+ public abstract int[] getSampleSize();
+
+ /**
+ * Gets the width of the image data of this SampleModel object.
+ *
+ * @return the width of the image data of this SampleModel object.
+ */
+ public final int getWidth() {
+ return width;
+ }
+
+ /**
+ * Gets the transfer type used to transfer pixels via the getDataElements
+ * and setDataElements methods. Transfer type value can be one of the
+ * predefined type from DataBuffer class or not.
+ *
+ * @return the transfer type.
+ */
+ public int getTransferType() {
+ return dataType;
+ }
+
+ /**
+ * Returns the number of data elements for pixel transferring via the
+ * getDataElements and setDataElements methods.
+ *
+ * @return the number of data elements for pixel transferring via the
+ * getDataElements and setDataElements methods.
+ */
+ public abstract int getNumDataElements();
+
+ /**
+ * Gets the number of bands in the image data of this SampleModel object.
+ *
+ * @return the number of bands in the image data of this SampleModel object.
+ */
+ public final int getNumBands() {
+ return numBands;
+ }
+
+ /**
+ * Gets the height of the image data of this SampleModel object.
+ *
+ * @return the height of the image data of this SampleModel object.
+ */
+ public final int getHeight() {
+ return height;
+ }
+
+ /**
+ * Gets the data type of image data of this SampleModel object.
+ *
+ * @return the data type of image data of this SampleModel object.
+ */
+ public final int getDataType() {
+ return dataType;
+ }
+
+}