1 /* 2 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 import java.awt.Point; 25 import java.awt.image.DataBuffer; 26 import java.awt.image.DataBufferByte; 27 import java.awt.image.DataBufferDouble; 28 import java.awt.image.DataBufferFloat; 29 import java.awt.image.DataBufferInt; 30 import java.awt.image.DataBufferShort; 31 import java.awt.image.DataBufferUShort; 32 import java.awt.image.Raster; 33 import java.awt.image.SampleModel; 34 import java.awt.image.MultiPixelPackedSampleModel; 35 import java.awt.image.PixelInterleavedSampleModel; 36 import java.awt.image.SinglePixelPackedSampleModel; 37 38 /* 39 * @test 40 * @bug 6353518 41 * @summary Test possible combinations of Raster creation 42 * Test fails if any of Raster.createXXX() method throws exception. 43 */ 44 public class RasterCreationTest { 45 46 public static void main(String[] args) { 47 48 final int width = 10; 49 final int height = 5; 50 final int imageSize = width * height; 51 Point location = new Point(0, 0); 52 int bandOffsets[] = {0}; 53 int bitMask[] = {0x00ff0000, 0x0000ff00, 0xff, 0x0}; 54 55 SampleModel inputSampleModels[] = { 56 new PixelInterleavedSampleModel(DataBuffer.TYPE_BYTE, 57 1, 1, 1, 1, bandOffsets), 58 new PixelInterleavedSampleModel(DataBuffer.TYPE_USHORT, 59 1, 1, 1, 1, bandOffsets), 60 new PixelInterleavedSampleModel(DataBuffer.TYPE_INT, 61 1, 1, 1, 1, bandOffsets), 62 new SinglePixelPackedSampleModel(DataBuffer.TYPE_BYTE, 63 width, height, bitMask), 64 new SinglePixelPackedSampleModel(DataBuffer.TYPE_USHORT, 65 width, height, bitMask), 66 new SinglePixelPackedSampleModel(DataBuffer.TYPE_INT, 67 width, height, bitMask), 68 new MultiPixelPackedSampleModel(DataBuffer.TYPE_BYTE, 69 width, height, 4) 70 }; 71 72 // --------------------------------------------------------------------- 73 // Test ability to create Raster & WritableRaster with DataBuffer 74 // classes 75 // --------------------------------------------------------------------- 76 DataBuffer inputDataBuffer[] = { 77 new DataBufferByte(imageSize), 78 new DataBufferUShort(imageSize), 79 new DataBufferInt(imageSize, 1), 80 new DataBufferShort(imageSize), 81 new DataBufferFloat(imageSize), 82 new DataBufferDouble(imageSize) 83 }; 84 85 for (SampleModel sm : inputSampleModels) { 86 for (DataBuffer db : inputDataBuffer) { 87 // Test Raster creation 88 Raster.createRaster(sm, db, location); 89 90 // Test writableRaster creation 91 Raster.createWritableRaster(sm, db, location); 92 Raster.createWritableRaster(sm, location); 93 } 94 } 95 96 // --------------------------------------------------------------------- 97 // Test ability to create Raster & WritableRaster with custom DataBuffer 98 // classes 99 // --------------------------------------------------------------------- 100 DataBuffer myDataBuffer[] = { 101 new MyDataBufferByte(imageSize), 102 new MyDataBufferUShort(imageSize), 103 new MyDataBufferInt(imageSize), 104 new MyDataBufferShort(imageSize), 105 new MyDataBufferDouble(imageSize), 106 new MyDataBufferFloat(imageSize) 107 }; 108 109 for (SampleModel sm : inputSampleModels) { 110 for (DataBuffer db : myDataBuffer) { 111 // Test Raster creation 112 Raster.createRaster(sm, db, location); 113 114 // Test writableRaster creation 115 Raster.createWritableRaster(sm, db, location); 116 Raster.createWritableRaster(sm, location); 117 } 118 } 119 120 // --------------------------------------------------------------------- 121 // Test ability to create InterleavedRaster 122 // --------------------------------------------------------------------- 123 int interleavedInputDataTypes[] = 124 {DataBuffer.TYPE_BYTE, DataBuffer.TYPE_USHORT}; 125 126 int numBands = 1; 127 128 for (int i : interleavedInputDataTypes) { 129 Raster.createInterleavedRaster(i, width, height, 1, location); 130 Raster.createInterleavedRaster(i, width, height, width * numBands, 131 numBands, bandOffsets, location); 132 } 133 134 for (int i = 0; i < interleavedInputDataTypes.length ; i++) { 135 DataBuffer d1 = inputDataBuffer[i]; 136 DataBuffer d2 = myDataBuffer[i]; 137 138 Raster.createInterleavedRaster(d1, width, height, width * numBands, 139 numBands, bandOffsets, location); 140 Raster.createInterleavedRaster(d2, width, height, width * numBands, 141 numBands, bandOffsets, location); 142 } 143 144 // --------------------------------------------------------------------- 145 // Test ability to create BandedRaster 146 // --------------------------------------------------------------------- 147 int[] bankIndices = new int[numBands]; 148 bankIndices[0] = 0; 149 150 int bandedInputDataTypes[] = { 151 DataBuffer.TYPE_BYTE, 152 DataBuffer.TYPE_USHORT, 153 DataBuffer.TYPE_INT 154 }; 155 156 for (int i : bandedInputDataTypes) { 157 Raster.createBandedRaster(i, width, height, 1, location); 158 Raster.createBandedRaster(i, width, height, width, 159 bankIndices, bandOffsets, location); 160 } 161 162 for (int i = 0; i < bandedInputDataTypes.length; i++) { 163 DataBuffer d1 = inputDataBuffer[i]; 164 DataBuffer d2 = myDataBuffer[i]; 165 166 Raster.createBandedRaster(d1, width, height, width, 167 bankIndices, bandOffsets, location); 168 Raster.createBandedRaster(d2, width, height, width, 169 bankIndices, bandOffsets, location); 170 } 171 172 // --------------------------------------------------------------------- 173 // Test ability to create PackedRaster 174 // --------------------------------------------------------------------- 175 int[] bandMasks = new int[numBands]; 176 bandMasks[0] = 0; 177 178 int packedInputDataTypes[] = { 179 DataBuffer.TYPE_BYTE, 180 DataBuffer.TYPE_USHORT, 181 DataBuffer.TYPE_INT 182 }; 183 184 for (int i : packedInputDataTypes) { 185 Raster.createPackedRaster(i, width, height, bandMasks, location); 186 187 for (int bits = 1; bits < 5; bits *= 2) { 188 Raster.createPackedRaster(i, width, height, 1, bits, location); 189 } 190 } 191 192 for (int i = 0; i < packedInputDataTypes.length; i++) { 193 DataBuffer d1 = inputDataBuffer[i]; 194 DataBuffer d2 = myDataBuffer[i]; 195 196 for (int bits = 1; bits < 5; bits *= 2) { 197 Raster.createPackedRaster(d1, width, height, bits, location); 198 Raster.createPackedRaster(d2, width, height, bits, location); 199 } 200 201 Raster.createPackedRaster(d1, width, height, 1,bandMasks, location); 202 Raster.createPackedRaster(d2, width, height, 1,bandMasks, location); 203 } 204 } 205 } 206 207 // --------------------------------------------------------------------- 208 // Custom DataBuffer classes for testing purpose 209 // --------------------------------------------------------------------- 210 final class MyDataBufferByte extends DataBuffer { 211 212 byte data[]; 213 byte bankdata[][]; 214 215 public MyDataBufferByte(int size) { 216 super(TYPE_BYTE, size); 217 data = new byte[size]; 218 bankdata = new byte[1][]; 219 bankdata[0] = data; 220 } 221 222 @Override 223 public int getElem(int bank, int i) { 224 return bankdata[bank][i + offsets[bank]]; 225 } 226 227 @Override 228 public void setElem(int bank, int i, int val) { 229 bankdata[bank][i + offsets[bank]] = (byte) val; 230 } 231 } 232 233 final class MyDataBufferDouble extends DataBuffer { 234 235 double data[]; 236 double bankdata[][]; 237 238 public MyDataBufferDouble(int size) { 239 super(TYPE_DOUBLE, size); 240 data = new double[size]; 241 bankdata = new double[1][]; 242 bankdata[0] = data; 243 } 244 245 @Override 246 public int getElem(int bank, int i) { 247 return (int) bankdata[bank][i + offsets[bank]]; 248 } 249 250 @Override 251 public void setElem(int bank, int i, int val) { 252 bankdata[bank][i + offsets[bank]] = (double) val; 253 } 254 } 255 256 final class MyDataBufferFloat extends DataBuffer { 257 258 float data[]; 259 float bankdata[][]; 260 261 public MyDataBufferFloat(int size) { 262 super(TYPE_FLOAT, size); 263 data = new float[size]; 264 bankdata = new float[1][]; 265 bankdata[0] = data; 266 } 267 268 @Override 269 public int getElem(int bank, int i) { 270 return (int) bankdata[bank][i + offsets[bank]]; 271 } 272 273 @Override 274 public void setElem(int bank, int i, int val) { 275 bankdata[bank][i + offsets[bank]] = (float) val; 276 } 277 } 278 279 final class MyDataBufferShort extends DataBuffer { 280 281 short data[]; 282 short bankdata[][]; 283 284 public MyDataBufferShort(int size) { 285 super(TYPE_SHORT, size); 286 data = new short[size]; 287 bankdata = new short[1][]; 288 bankdata[0] = data; 289 } 290 291 @Override 292 public int getElem(int bank, int i) { 293 return bankdata[bank][i + offsets[bank]]; 294 } 295 296 @Override 297 public void setElem(int bank, int i, int val) { 298 bankdata[bank][i + offsets[bank]] = (short) val; 299 } 300 } 301 302 final class MyDataBufferUShort extends DataBuffer { 303 304 short data[]; 305 short bankdata[][]; 306 307 public MyDataBufferUShort(int size) { 308 super(TYPE_USHORT, size); 309 data = new short[size]; 310 bankdata = new short[1][]; 311 bankdata[0] = data; 312 } 313 314 @Override 315 public int getElem(int bank, int i) { 316 return bankdata[bank][i + offsets[bank]]; 317 } 318 319 @Override 320 public void setElem(int bank, int i, int val) { 321 bankdata[bank][i + offsets[bank]] = (short) val; 322 } 323 } 324 325 final class MyDataBufferInt extends DataBuffer { 326 327 int data[]; 328 int bankdata[][]; 329 330 public MyDataBufferInt(int size) { 331 super(TYPE_INT, size); 332 data = new int[size]; 333 bankdata = new int[1][]; 334 bankdata[0] = data; 335 } 336 337 @Override 338 public int getElem(int bank, int i) { 339 return bankdata[bank][i + offsets[bank]]; 340 } 341 342 @Override 343 public void setElem(int bank, int i, int val) { 344 bankdata[bank][i + offsets[bank]] = (int) val; 345 } 346 }