blob: 885fb8da76dbfd88fe072d8e16d71b8ea050bb80 [file] [log] [blame]
/*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.awt.Point;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.DataBufferDouble;
import java.awt.image.DataBufferFloat;
import java.awt.image.DataBufferInt;
import java.awt.image.DataBufferShort;
import java.awt.image.DataBufferUShort;
import java.awt.image.Raster;
import java.awt.image.SampleModel;
import java.awt.image.MultiPixelPackedSampleModel;
import java.awt.image.PixelInterleavedSampleModel;
import java.awt.image.SinglePixelPackedSampleModel;
/*
* @test
* @bug 6353518
* @summary Test possible combinations of Raster creation
* Test fails if any of Raster.createXXX() method throws exception.
*/
public class RasterCreationTest {
public static void main(String[] args) {
final int width = 10;
final int height = 5;
final int imageSize = width * height;
Point location = new Point(0, 0);
int[] bandOffsets = {0};
int[] bitMask = {0x00ff0000, 0x0000ff00, 0xff, 0x0};
SampleModel[] inputSampleModels = {
new PixelInterleavedSampleModel(DataBuffer.TYPE_BYTE,
1, 1, 1, 1, bandOffsets),
new PixelInterleavedSampleModel(DataBuffer.TYPE_USHORT,
1, 1, 1, 1, bandOffsets),
new PixelInterleavedSampleModel(DataBuffer.TYPE_INT,
1, 1, 1, 1, bandOffsets),
new SinglePixelPackedSampleModel(DataBuffer.TYPE_BYTE,
width, height, bitMask),
new SinglePixelPackedSampleModel(DataBuffer.TYPE_USHORT,
width, height, bitMask),
new SinglePixelPackedSampleModel(DataBuffer.TYPE_INT,
width, height, bitMask),
new MultiPixelPackedSampleModel(DataBuffer.TYPE_BYTE,
width, height, 4),
new MultiPixelPackedSampleModel(DataBuffer.TYPE_USHORT,
width, height, 2),
new MultiPixelPackedSampleModel(DataBuffer.TYPE_INT,
width, height, 2)
};
// ---------------------------------------------------------------------
// Test ability to create Raster & WritableRaster with DataBuffer
// classes
// ---------------------------------------------------------------------
DataBuffer[] inputDataBuffer = {
new DataBufferByte(imageSize),
new DataBufferUShort(imageSize),
new DataBufferInt(imageSize, 1),
new DataBufferShort(imageSize),
new DataBufferFloat(imageSize),
new DataBufferDouble(imageSize)
};
for (SampleModel sm : inputSampleModels) {
for (DataBuffer db : inputDataBuffer) {
// Test Raster creation
Raster.createRaster(sm, db, location);
// Test writableRaster creation
Raster.createWritableRaster(sm, db, location);
Raster.createWritableRaster(sm, location);
}
}
// ---------------------------------------------------------------------
// Test ability to create Raster & WritableRaster with custom DataBuffer
// classes
// ---------------------------------------------------------------------
DataBuffer[] myDataBuffer = {
new MyDataBufferByte(imageSize),
new MyDataBufferUShort(imageSize),
new MyDataBufferInt(imageSize),
new MyDataBufferShort(imageSize),
new MyDataBufferDouble(imageSize),
new MyDataBufferFloat(imageSize)
};
for (SampleModel sm : inputSampleModels) {
for (DataBuffer db : myDataBuffer) {
// Test Raster creation
Raster.createRaster(sm, db, location);
// Test writableRaster creation
Raster.createWritableRaster(sm, db, location);
Raster.createWritableRaster(sm, location);
}
}
// ---------------------------------------------------------------------
// Test ability to create InterleavedRaster
// ---------------------------------------------------------------------
int[] interleavedInputDataTypes = {
DataBuffer.TYPE_BYTE,
DataBuffer.TYPE_USHORT
};
int numBands = 1;
for (int i : interleavedInputDataTypes) {
Raster.createInterleavedRaster(i, width, height, 1, location);
Raster.createInterleavedRaster(i, width, height, width * numBands,
numBands, bandOffsets, location);
}
for (int i = 0; i < interleavedInputDataTypes.length ; i++) {
DataBuffer d1 = inputDataBuffer[i];
DataBuffer d2 = myDataBuffer[i];
Raster.createInterleavedRaster(d1, width, height, width * numBands,
numBands, bandOffsets, location);
Raster.createInterleavedRaster(d2, width, height, width * numBands,
numBands, bandOffsets, location);
}
// ---------------------------------------------------------------------
// Test ability to create BandedRaster
// ---------------------------------------------------------------------
int[] bankIndices = new int[numBands];
bankIndices[0] = 0;
int[] bandedInputDataTypes = {
DataBuffer.TYPE_BYTE,
DataBuffer.TYPE_USHORT,
DataBuffer.TYPE_INT
};
for (int i : bandedInputDataTypes) {
Raster.createBandedRaster(i, width, height, 1, location);
Raster.createBandedRaster(i, width, height, width,
bankIndices, bandOffsets, location);
}
for (int i = 0; i < bandedInputDataTypes.length; i++) {
DataBuffer d1 = inputDataBuffer[i];
DataBuffer d2 = myDataBuffer[i];
Raster.createBandedRaster(d1, width, height, width,
bankIndices, bandOffsets, location);
Raster.createBandedRaster(d2, width, height, width,
bankIndices, bandOffsets, location);
}
// ---------------------------------------------------------------------
// Test ability to create PackedRaster
// ---------------------------------------------------------------------
int[] bandMasks = new int[numBands];
bandMasks[0] = 0;
int packedInputDataTypes[] = {
DataBuffer.TYPE_BYTE,
DataBuffer.TYPE_USHORT,
DataBuffer.TYPE_INT
};
for (int i : packedInputDataTypes) {
Raster.createPackedRaster(i, width, height, bandMasks, location);
for (int bits = 1; bits < 5; bits *= 2) {
Raster.createPackedRaster(i, width, height, 1, bits, location);
}
}
for (int i = 0; i < packedInputDataTypes.length; i++) {
DataBuffer d1 = inputDataBuffer[i];
DataBuffer d2 = myDataBuffer[i];
for (int bits = 1; bits < 5; bits *= 2) {
Raster.createPackedRaster(d1, width, height, bits, location);
Raster.createPackedRaster(d2, width, height, bits, location);
}
Raster.createPackedRaster(d1, width, height, 1,bandMasks, location);
Raster.createPackedRaster(d2, width, height, 1,bandMasks, location);
}
}
}
// ---------------------------------------------------------------------
// Custom DataBuffer classes for testing purpose
// ---------------------------------------------------------------------
final class MyDataBufferByte extends DataBuffer {
byte[] data;
byte[][] bankdata;
public MyDataBufferByte(int size) {
super(TYPE_BYTE, size);
data = new byte[size];
bankdata = new byte[1][];
bankdata[0] = data;
}
@Override
public int getElem(int bank, int i) {
return bankdata[bank][i + offsets[bank]];
}
@Override
public void setElem(int bank, int i, int val) {
bankdata[bank][i + offsets[bank]] = (byte) val;
}
}
final class MyDataBufferDouble extends DataBuffer {
double[] data;
double[][] bankdata;
public MyDataBufferDouble(int size) {
super(TYPE_DOUBLE, size);
data = new double[size];
bankdata = new double[1][];
bankdata[0] = data;
}
@Override
public int getElem(int bank, int i) {
return (int) bankdata[bank][i + offsets[bank]];
}
@Override
public void setElem(int bank, int i, int val) {
bankdata[bank][i + offsets[bank]] = (double) val;
}
}
final class MyDataBufferFloat extends DataBuffer {
float[] data;
float[][] bankdata;
public MyDataBufferFloat(int size) {
super(TYPE_FLOAT, size);
data = new float[size];
bankdata = new float[1][];
bankdata[0] = data;
}
@Override
public int getElem(int bank, int i) {
return (int) bankdata[bank][i + offsets[bank]];
}
@Override
public void setElem(int bank, int i, int val) {
bankdata[bank][i + offsets[bank]] = (float) val;
}
}
final class MyDataBufferShort extends DataBuffer {
short[] data;
short[][] bankdata;
public MyDataBufferShort(int size) {
super(TYPE_SHORT, size);
data = new short[size];
bankdata = new short[1][];
bankdata[0] = data;
}
@Override
public int getElem(int bank, int i) {
return bankdata[bank][i + offsets[bank]];
}
@Override
public void setElem(int bank, int i, int val) {
bankdata[bank][i + offsets[bank]] = (short) val;
}
}
final class MyDataBufferUShort extends DataBuffer {
short[] data;
short[][] bankdata;
public MyDataBufferUShort(int size) {
super(TYPE_USHORT, size);
data = new short[size];
bankdata = new short[1][];
bankdata[0] = data;
}
@Override
public int getElem(int bank, int i) {
return bankdata[bank][i + offsets[bank]];
}
@Override
public void setElem(int bank, int i, int val) {
bankdata[bank][i + offsets[bank]] = (short) val;
}
}
final class MyDataBufferInt extends DataBuffer {
int[] data;
int[][] bankdata;
public MyDataBufferInt(int size) {
super(TYPE_INT, size);
data = new int[size];
bankdata = new int[1][];
bankdata[0] = data;
}
@Override
public int getElem(int bank, int i) {
return bankdata[bank][i + offsets[bank]];
}
@Override
public void setElem(int bank, int i, int val) {
bankdata[bank][i + offsets[bank]] = (int) val;
}
}