From ac1ed908de999523efc36f38e69bca1aadfe0808 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Mon, 14 Aug 2006 23:12:35 +0000 Subject: Imported GNU Classpath 0.92 2006-08-14 Mark Wielaard Imported GNU Classpath 0.92 * HACKING: Add more importing hints. Update automake version requirement. * configure.ac (gconf-peer): New enable AC argument. Add --disable-gconf-peer and --enable-default-preferences-peer to classpath configure when gconf is disabled. * scripts/makemake.tcl: Set gnu/java/util/prefs/gconf and gnu/java/awt/dnd/peer/gtk to bc. Classify gnu/java/security/Configuration.java as generated source file. * gnu/java/lang/management/VMGarbageCollectorMXBeanImpl.java, gnu/java/lang/management/VMMemoryPoolMXBeanImpl.java, gnu/java/lang/management/VMClassLoadingMXBeanImpl.java, gnu/java/lang/management/VMRuntimeMXBeanImpl.java, gnu/java/lang/management/VMMemoryManagerMXBeanImpl.java, gnu/java/lang/management/VMThreadMXBeanImpl.java, gnu/java/lang/management/VMMemoryMXBeanImpl.java, gnu/java/lang/management/VMCompilationMXBeanImpl.java: New VM stub classes. * java/lang/management/VMManagementFactory.java: Likewise. * java/net/VMURLConnection.java: Likewise. * gnu/java/nio/VMChannel.java: Likewise. * java/lang/Thread.java (getState): Add stub implementation. * java/lang/Class.java (isEnum): Likewise. * java/lang/Class.h (isEnum): Likewise. * gnu/awt/xlib/XToolkit.java (getClasspathTextLayoutPeer): Removed. * javax/naming/spi/NamingManager.java: New override for StackWalker functionality. * configure, sources.am, Makefile.in, gcj/Makefile.in, include/Makefile.in, testsuite/Makefile.in: Regenerated. From-SVN: r116139 --- .../awt/image/MultiPixelPackedSampleModel.java | 458 +++++++++++++++------ 1 file changed, 336 insertions(+), 122 deletions(-) (limited to 'libjava/classpath/java/awt/image/MultiPixelPackedSampleModel.java') diff --git a/libjava/classpath/java/awt/image/MultiPixelPackedSampleModel.java b/libjava/classpath/java/awt/image/MultiPixelPackedSampleModel.java index 18a6e555205..8732e57659e 100644 --- a/libjava/classpath/java/awt/image/MultiPixelPackedSampleModel.java +++ b/libjava/classpath/java/awt/image/MultiPixelPackedSampleModel.java @@ -1,4 +1,4 @@ -/* Copyright (C) 2004 Free Software Foundation +/* Copyright (C) 2004, 2006, Free Software Foundation This file is part of GNU Classpath. @@ -56,12 +56,43 @@ public class MultiPixelPackedSampleModel extends SampleModel private int numberOfBits; private int numElems; + /** + * Creates a new MultiPixelPackedSampleModel with the specified + * data type, which should be one of: + * + * + * @param dataType the data type. + * @param w the width (in pixels). + * @param h the height (in pixels). + * @param numberOfBits the number of bits per pixel (must be a power of 2). + */ public MultiPixelPackedSampleModel(int dataType, int w, int h, int numberOfBits) { this(dataType, w, h, numberOfBits, 0, 0); } + /** + * Creates a new MultiPixelPackedSampleModel with the specified + * data type, which should be one of: + * + * + * @param dataType the data type. + * @param w the width (in pixels). + * @param h the height (in pixels). + * @param numberOfBits the number of bits per pixel (must be a power of 2). + * @param scanlineStride the number of data elements from a pixel on one + * row to the corresponding pixel in the next row. + * @param dataBitOffset the offset to the first data bit. + */ public MultiPixelPackedSampleModel(int dataType, int w, int h, int numberOfBits, int scanlineStride, int dataBitOffset) @@ -101,7 +132,7 @@ public class MultiPixelPackedSampleModel extends SampleModel // Compute scan line large enough for w pixels. if (scanlineStride == 0) - scanlineStride = ((dataBitOffset + w * numberOfBits) / elemBits); + scanlineStride = ((dataBitOffset + w * numberOfBits) - 1) / elemBits + 1; this.scanlineStride = scanlineStride; @@ -118,6 +149,16 @@ public class MultiPixelPackedSampleModel extends SampleModel } } + /** + * Creates a new MultiPixelPackedSample model with the same + * data type and bits per pixel as this model, but with the specified + * dimensions. + * + * @param w the width (in pixels). + * @param h the height (in pixels). + * + * @return The new sample model. + */ public SampleModel createCompatibleSampleModel(int w, int h) { /* FIXME: We can avoid recalculation of bit offsets and sample @@ -126,78 +167,163 @@ public class MultiPixelPackedSampleModel extends SampleModel return new MultiPixelPackedSampleModel(dataType, w, h, numberOfBits); } - /** * Creates a DataBuffer for holding pixel data in the format and * layout described by this SampleModel. The returned buffer will * consist of one single bank. + * + * @return A new data buffer. */ public DataBuffer createDataBuffer() { - int size; - - // FIXME: The comment refers to SinglePixelPackedSampleModel. See if the - // same can be done for MultiPixelPackedSampleModel. - // We can save (scanlineStride - width) pixels at the very end of - // the buffer. The Sun reference implementation (J2SE 1.3.1 and - // 1.4.1_01) seems to do this; tested with Mauve test code. - size = scanlineStride * height; - + int size = scanlineStride * height; + if (dataBitOffset > 0) + size += (dataBitOffset - 1) / elemBits + 1; return Buffers.createBuffer(getDataType(), size); } - + /** + * Returns the number of data elements required to transfer a pixel in the + * get/setDataElements() methods. + * + * @return 1. + */ public int getNumDataElements() { return 1; } + /** + * Returns an array containing the size (in bits) of the samples in each + * band. The MultiPixelPackedSampleModel class supports only + * one band, so this method returns an array with length 1. + * + * @return An array containing the size (in bits) of the samples in band zero. + * + * @see #getSampleSize(int) + */ public int[] getSampleSize() { - return sampleSize; + return (int[]) sampleSize.clone(); } + /** + * Returns the size of the samples in the specified band. Note that the + * MultiPixelPackedSampleModel supports only one band -- this + * method ignored the band argument, and always returns the size + * of band zero. + * + * @param band the band (this parameter is ignored). + * + * @return The size of the samples in band zero. + * + * @see #getSampleSize() + */ public int getSampleSize(int band) { return sampleSize[0]; } + /** + * Returns the index in the data buffer that stores the pixel at (x, y). + * + * @param x the x-coordinate. + * @param y the y-coordinate. + * + * @return The index in the data buffer that stores the pixel at (x, y). + * + * @see #getBitOffset(int) + */ public int getOffset(int x, int y) { - return scanlineStride * y + ((dataBitOffset + x*numberOfBits) / elemBits); + return scanlineStride * y + ((dataBitOffset + x * numberOfBits) / elemBits); } + /** + * The bit offset (within an element in the data buffer) of the pixels with + * the specified x-coordinate. + * + * @param x the x-coordinate. + * + * @return The bit offset. + */ public int getBitOffset(int x) { - return (dataBitOffset + x*numberOfBits) % elemBits; + return (dataBitOffset + x * numberOfBits) % elemBits; } + /** + * Returns the offset to the first data bit. + * + * @return The offset to the first data bit. + */ public int getDataBitOffset() { return dataBitOffset; } + /** + * Returns the number of data elements from a pixel in one row to the + * corresponding pixel in the next row. + * + * @return The scanline stride. + */ public int getScanlineStride() { return scanlineStride; } + /** + * Returns the number of bits per pixel. + * + * @return The number of bits per pixel. + */ public int getPixelBitStride() { return numberOfBits; } + + /** + * Returns the transfer type, which is one of the following (depending on + * the number of bits per sample for this model): + * + * + * @return The transfer type. + */ + public int getTransferType() + { + if (numberOfBits <= DataBuffer.getDataTypeSize(DataBuffer.TYPE_BYTE)) + return DataBuffer.TYPE_BYTE; + else if (numberOfBits <= DataBuffer.getDataTypeSize(DataBuffer.TYPE_USHORT)) + return DataBuffer.TYPE_USHORT; + return DataBuffer.TYPE_INT; + } - + /** + * Normally this method returns a sample model for accessing a subset of + * bands of image data, but since MultiPixelPackedSampleModel + * only supports a single band, this overridden implementation just returns + * a new instance of MultiPixelPackedSampleModel, with the same + * attributes as this instance. + * + * @param bands the bands to include in the subset (this is ignored, except + * that if it is non-null a check is made to ensure that the + * array length is equal to 1). + * + * @throws RasterFormatException if bands is not + * null and bands.length != 1. + */ public SampleModel createSubsetSampleModel(int[] bands) { - int numBands = bands.length; - if (numBands != 1) + if (bands != null && bands.length != 1) throw new RasterFormatException("MultiPixelPackedSampleModel only" - + " supports one band"); - - return new MultiPixelPackedSampleModel(dataType, width, height, - numberOfBits, scanlineStride, - dataBitOffset); + + " supports one band"); + return new MultiPixelPackedSampleModel(dataType, width, height, + numberOfBits, scanlineStride, dataBitOffset); } /** @@ -207,68 +333,82 @@ public class MultiPixelPackedSampleModel extends SampleModel * array obj, since there is only one band. If obj is null, a new array of * getTransferType() is created. * - * @param x The x-coordinate of the pixel rectangle to store in obj. - * @param y The y-coordinate of the pixel rectangle to store in obj. - * @param obj The primitive array to store the pixels into or null to force creation. + * @param x The x-coordinate of the pixel rectangle to store in + * obj. + * @param y The y-coordinate of the pixel rectangle to store in + * obj. + * @param obj The primitive array to store the pixels into or null to force + * creation. * @param data The DataBuffer that is the source of the pixel data. * @return The primitive array containing the pixel data. - * @see java.awt.image.SampleModel#getDataElements(int, int, java.lang.Object, java.awt.image.DataBuffer) + * @see java.awt.image.SampleModel#getDataElements(int, int, Object, + * DataBuffer) */ - public Object getDataElements(int x, int y, Object obj, - DataBuffer data) + public Object getDataElements(int x, int y, Object obj, DataBuffer data) { int pixel = getSample(x, y, 0, data); switch (getTransferType()) - { - case DataBuffer.TYPE_BYTE: - if (obj == null) obj = new byte[1]; - ((byte[])obj)[0] = (byte)pixel; - return obj; - case DataBuffer.TYPE_USHORT: - if (obj == null) obj = new short[1]; - ((short[])obj)[0] = (short)pixel; - return obj; - case DataBuffer.TYPE_INT: - if (obj == null) obj = new int[1]; - ((int[])obj)[0] = pixel; - return obj; - default: - // Seems like the only sensible thing to do. - throw new ClassCastException(); - } + { + case DataBuffer.TYPE_BYTE: + if (obj == null) + obj = new byte[1]; + ((byte[]) obj)[0] = (byte) pixel; + return obj; + case DataBuffer.TYPE_USHORT: + if (obj == null) + obj = new short[1]; + ((short[]) obj)[0] = (short) pixel; + return obj; + case DataBuffer.TYPE_INT: + if (obj == null) + obj = new int[1]; + ((int[]) obj)[0] = pixel; + return obj; + default: + // Seems like the only sensible thing to do. + throw new ClassCastException(); + } } + /** + * Returns an array (of length 1) containing the sample for the pixel at + * (x, y) in the specified data buffer. If iArray is not + * null, it will be populated with the sample value and + * returned as the result of this function (this avoids allocating a new + * array instance). + * + * @param x the x-coordinate of the pixel. + * @param y the y-coordinate of the pixel. + * @param iArray an array to populate with the sample values and return as + * the result (if null, a new array will be allocated). + * @param data the data buffer (null not permitted). + * + * @return An array containing the pixel sample value. + * + * @throws NullPointerException if data is null. + */ public int[] getPixel(int x, int y, int[] iArray, DataBuffer data) { - if (iArray == null) iArray = new int[1]; + if (iArray == null) + iArray = new int[1]; iArray[0] = getSample(x, y, 0, data); - return iArray; } - public int[] getPixels(int x, int y, int w, int h, int[] iArray, - DataBuffer data) - { - int offset = getOffset(x, y); - if (iArray == null) iArray = new int[w*h]; - int outOffset = 0; - for (y=0; y>> bitOffsets[b]; - x++; - } - } - offset += scanlineStride; - } - return iArray; - } - + /** + * Returns the sample value for the pixel at (x, y) in the specified data + * buffer. + * + * @param x the x-coordinate of the pixel. + * @param y the y-coordinate of the pixel. + * @param b the band (in the range 0 to + * getNumBands() - 1). + * @param data the data buffer (null not permitted). + * + * @return The sample value. + * + * @throws NullPointerException if data is null. + */ public int getSample(int x, int y, int b, DataBuffer data) { int pos = @@ -286,72 +426,82 @@ public class MultiPixelPackedSampleModel extends SampleModel * @param y The y-coordinate of the data elements in obj. * @param obj The primitive array containing the data elements to set. * @param data The DataBuffer to store the data elements into. - * @see java.awt.image.SampleModel#setDataElements(int, int, int, int, java.lang.Object, java.awt.image.DataBuffer) */ public void setDataElements(int x, int y, Object obj, DataBuffer data) { int transferType = getTransferType(); - if (getTransferType() != data.getDataType()) - { - throw new IllegalArgumentException("transfer type ("+ - getTransferType()+"), "+ - "does not match data "+ - "buffer type (" + - data.getDataType() + - ")."); - } - - int offset = getOffset(x, y); - try { - switch (transferType) - { - case DataBuffer.TYPE_BYTE: - { - DataBufferByte out = (DataBufferByte) data; - byte[] in = (byte[]) obj; - out.getData()[offset] = in[0]; - return; - } - case DataBuffer.TYPE_USHORT: - { - DataBufferUShort out = (DataBufferUShort) data; - short[] in = (short[]) obj; - out.getData()[offset] = in[0]; - return; - } - case DataBuffer.TYPE_INT: - { - DataBufferInt out = (DataBufferInt) data; - int[] in = (int[]) obj; - out.getData()[offset] = in[0]; - return; - } - default: - throw new ClassCastException("Unsupported data type"); - } + switch (transferType) + { + case DataBuffer.TYPE_BYTE: + { + byte[] in = (byte[]) obj; + setSample(x, y, 0, in[0] & 0xFF, data); + return; + } + case DataBuffer.TYPE_USHORT: + { + short[] in = (short[]) obj; + setSample(x, y, 0, in[0] & 0xFFFF, data); + return; + } + case DataBuffer.TYPE_INT: + { + int[] in = (int[]) obj; + setSample(x, y, 0, in[0], data); + return; + } + default: + throw new ClassCastException("Unsupported data type"); + } } catch (ArrayIndexOutOfBoundsException aioobe) { - String msg = "While writing data elements" + - ", x="+x+", y="+y+ - ", width="+width+", height="+height+ - ", scanlineStride="+scanlineStride+ - ", offset="+offset+ - ", data.getSize()="+data.getSize()+ - ", data.getOffset()="+data.getOffset()+ - ": " + - aioobe; - throw new ArrayIndexOutOfBoundsException(msg); + String msg = "While writing data elements" + + ", x=" + x + ", y=" + y + + ", width=" + width + ", height=" + height + + ", scanlineStride=" + scanlineStride + + ", offset=" + getOffset(x, y) + + ", data.getSize()=" + data.getSize() + + ", data.getOffset()=" + data.getOffset() + + ": " + aioobe; + throw new ArrayIndexOutOfBoundsException(msg); } - } + } + /** + * Sets the sample value for the pixel at (x, y) in the specified data + * buffer to the specified value. + * + * @param x the x-coordinate of the pixel. + * @param y the y-coordinate of the pixel. + * @param iArray the sample value (null not permitted). + * @param data the data buffer (null not permitted). + * + * @throws NullPointerException if either iArray or + * data is null. + * + * @see #setSample(int, int, int, int, DataBuffer) + */ public void setPixel(int x, int y, int[] iArray, DataBuffer data) { setSample(x, y, 0, iArray[0], data); } + /** + * Sets the sample value for a band for the pixel at (x, y) in the + * specified data buffer. + * + * @param x the x-coordinate of the pixel. + * @param y the y-coordinate of the pixel. + * @param b the band (in the range 0 to + * getNumBands() - 1). + * @param s the sample value. + * @param data the data buffer (null not permitted). + * + * @throws NullPointerException if data is null. + */ public void setSample(int x, int y, int b, int s, DataBuffer data) { int bitpos = @@ -366,6 +516,70 @@ public class MultiPixelPackedSampleModel extends SampleModel data.setElem(offset, sample); } + /** + * Tests this sample model for equality with an arbitrary object. This + * method returns true if and only if: + *
    + *
  • obj is not null; + *
  • obj is an instance of + * MultiPixelPackedSampleModel; + *
  • both models have the same: + *
      + *
    • dataType; + *
    • width; + *
    • height; + *
    • numberOfBits; + *
    • scanlineStride; + *
    • dataBitOffsets. + *
    + *
  • + *
+ * + * @param obj the object (null permitted) + * + * @return true if this model is equal to obj, and + * false otherwise. + */ + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (! (obj instanceof MultiPixelPackedSampleModel)) + return false; + MultiPixelPackedSampleModel that = (MultiPixelPackedSampleModel) obj; + if (this.dataType != that.dataType) + return false; + if (this.width != that.width) + return false; + if (this.height != that.height) + return false; + if (this.numberOfBits != that.numberOfBits) + return false; + if (this.scanlineStride != that.scanlineStride) + return false; + if (this.dataBitOffset != that.dataBitOffset) + return false; + return true; + } + + /** + * Returns a hash code for this MultiPixelPackedSampleModel. + * + * @return A hash code. + */ + public int hashCode() + { + // this hash code won't match Sun's, but that shouldn't matter... + int result = 193; + result = 37 * result + dataType; + result = 37 * result + width; + result = 37 * result + height; + result = 37 * result + numberOfBits; + result = 37 * result + scanlineStride; + result = 37 * result + dataBitOffset; + return result; + } + /** * Creates a String with some information about this SampleModel. * @return A String describing this SampleModel. -- cgit v1.2.3