| /* |
| * 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; |
| } |
| |
| } |