diff options
Diffstat (limited to 'libjava/java/awt/image/Raster.java')
-rw-r--r-- | libjava/java/awt/image/Raster.java | 86 |
1 files changed, 78 insertions, 8 deletions
diff --git a/libjava/java/awt/image/Raster.java b/libjava/java/awt/image/Raster.java index 4fd194e2a9e..0fad4ba0acb 100644 --- a/libjava/java/awt/image/Raster.java +++ b/libjava/java/awt/image/Raster.java @@ -128,8 +128,8 @@ public class Raster int w, int h, int bands, Point location) { - // FIXME: Implement; - throw new UnsupportedOperationException("not implemented yet"); + SampleModel sm = new BandedSampleModel(dataType, w, h, bands); + return createWritableRaster(sm, location); } public static WritableRaster createBandedRaster(int dataType, @@ -139,8 +139,9 @@ public class Raster int[] bandOffsets, Point location) { - // FIXME: Implement; - throw new UnsupportedOperationException("not implemented yet"); + SampleModel sm = new BandedSampleModel(dataType, w, h, scanlineStride, + bankIndices, bandOffsets); + return createWritableRaster(sm, location); } public static WritableRaster createPackedRaster(int dataType, @@ -154,6 +155,35 @@ public class Raster return createWritableRaster(sm, location); } + public static WritableRaster createPackedRaster(int dataType, + int w, int h, + int bands, int bitsPerBand, + Point location) + { + if (bands <= 0 || (bands * bitsPerBand > getTypeBits(dataType))) + throw new IllegalArgumentException(); + + SampleModel sm; + + if (bands == 1) + sm = new MultiPixelPackedSampleModel(dataType, w, h, bitsPerBand); + else + { + int[] bandMasks = new int[bands]; + int mask = 0x1; + for (int bits = bitsPerBand; --bits != 0;) + mask = (mask << 1) | 0x1; + for (int i = 0; i < bands; i++) + { + bandMasks[i] = mask; + mask <<= bitsPerBand; + } + + sm = new SinglePixelPackedSampleModel(dataType, w, h, bandMasks); + } + return createWritableRaster(sm, location); + } + public static WritableRaster createInterleavedRaster(DataBuffer dataBuffer, int w, int h, int scanlineStride, int pixelStride, @@ -175,8 +205,10 @@ public class Raster int[] bandOffsets, Point location) { - // FIXME: Implement; - throw new UnsupportedOperationException("not implemented yet"); + SampleModel sm = new BandedSampleModel(dataBuffer.getDataType(), + w, h, scanlineStride, + bankIndices, bandOffsets); + return createWritableRaster(sm, dataBuffer, location); } public static WritableRaster @@ -184,7 +216,8 @@ public class Raster int w, int h, int scanlineStride, int[] bandMasks, - Point location) { + Point location) + { SampleModel sm = new SinglePixelPackedSampleModel(dataBuffer.getDataType(), w, h, @@ -192,6 +225,19 @@ public class Raster bandMasks); return createWritableRaster(sm, dataBuffer, location); } + + public static WritableRaster + createPackedRaster(DataBuffer dataBuffer, + int w, int h, + int bitsPerPixel, + Point location) + { + SampleModel sm = + new MultiPixelPackedSampleModel(dataBuffer.getDataType(), + w, h, + bitsPerPixel); + return createWritableRaster(sm, dataBuffer, location); + } public static Raster createRaster(SampleModel sm, DataBuffer db, Point location) @@ -329,6 +375,11 @@ public class Raster return height; } + public final int getNumBands() + { + return numBands; + } + public final int getNumDataElements() { return numDataElements; @@ -472,5 +523,24 @@ public class Raster return result.toString(); } - + + // Map from datatype to bits + private static int getTypeBits(int dataType) + { + switch (dataType) + { + case DataBuffer.TYPE_BYTE: + return 8; + case DataBuffer.TYPE_USHORT: + case DataBuffer.TYPE_SHORT: + return 16; + case DataBuffer.TYPE_INT: + case DataBuffer.TYPE_FLOAT: + return 32; + case DataBuffer.TYPE_DOUBLE: + return 64; + default: + return 0; + } + } } |