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 new MultiPixelPackedSampleModel(DataBuffer.TYPE_USHORT, 71 width, height, 2), 72 new MultiPixelPackedSampleModel(DataBuffer.TYPE_INT, 73 width, height, 2) 74 }; 75 76 // --------------------------------------------------------------------- 77 // Test ability to create Raster & WritableRaster with DataBuffer 78 // classes 79 // --------------------------------------------------------------------- 80 DataBuffer[] inputDataBuffer = { 81 new DataBufferByte(imageSize), 82 new DataBufferUShort(imageSize), 83 new DataBufferInt(imageSize, 1), 84 new DataBufferShort(imageSize), 85 new DataBufferFloat(imageSize), 86 new DataBufferDouble(imageSize) 87 }; 88 89 for (SampleModel sm : inputSampleModels) { 90 for (DataBuffer db : inputDataBuffer) { 91 // Test Raster creation 92 Raster.createRaster(sm, db, location); 93 94 // Test writableRaster creation 95 Raster.createWritableRaster(sm, db, location); 96 Raster.createWritableRaster(sm, location); 97 } 98 } 99 100 // --------------------------------------------------------------------- 101 // Test ability to create Raster & WritableRaster with custom DataBuffer 102 // classes 103 // --------------------------------------------------------------------- 104 DataBuffer[] myDataBuffer = { 105 new MyDataBufferByte(imageSize), 106 new MyDataBufferUShort(imageSize), 107 new MyDataBufferInt(imageSize), 108 new MyDataBufferShort(imageSize), 109 new MyDataBufferDouble(imageSize), 110 new MyDataBufferFloat(imageSize) 111 }; 112 113 for (SampleModel sm : inputSampleModels) { 114 for (DataBuffer db : myDataBuffer) { 115 // Test Raster creation 116 Raster.createRaster(sm, db, location); 117 118 // Test writableRaster creation 119 Raster.createWritableRaster(sm, db, location); 120 Raster.createWritableRaster(sm, location); 121 } 122 } 123 124 // --------------------------------------------------------------------- 125 // Test ability to create InterleavedRaster 126 // --------------------------------------------------------------------- 127 int[] interleavedInputDataTypes = { 128 DataBuffer.TYPE_BYTE, 129 DataBuffer.TYPE_USHORT 130 }; 131 132 int numBands = 1; 133 134 for (int i : interleavedInputDataTypes) { 135 Raster.createInterleavedRaster(i, width, height, 1, location); 136 Raster.createInterleavedRaster(i, width, height, width * numBands, 137 numBands, bandOffsets, location); 138 } 139 140 for (int i = 0; i < interleavedInputDataTypes.length ; i++) { 141 DataBuffer d1 = inputDataBuffer[i]; 142 DataBuffer d2 = myDataBuffer[i]; 143 144 Raster.createInterleavedRaster(d1, width, height, width * numBands, 145 numBands, bandOffsets, location); 146 Raster.createInterleavedRaster(d2, width, height, width * numBands, 147 numBands, bandOffsets, location); 148 } 149 150 // --------------------------------------------------------------------- 151 // Test ability to create BandedRaster 152 // --------------------------------------------------------------------- 153 int[] bankIndices = new int[numBands]; 154 bankIndices[0] = 0; 155 156 int[] bandedInputDataTypes = { 157 DataBuffer.TYPE_BYTE, 158 DataBuffer.TYPE_USHORT, 159 DataBuffer.TYPE_INT 160 }; 161 162 for (int i : bandedInputDataTypes) { 163 Raster.createBandedRaster(i, width, height, 1, location); 164 Raster.createBandedRaster(i, width, height, width, 165 bankIndices, bandOffsets, location); 166 } 167 168 for (int i = 0; i < bandedInputDataTypes.length; i++) { 169 DataBuffer d1 = inputDataBuffer[i]; 170 DataBuffer d2 = myDataBuffer[i]; 171 172 Raster.createBandedRaster(d1, width, height, width, 173 bankIndices, bandOffsets, location); 174 Raster.createBandedRaster(d2, width, height, width, 175 bankIndices, bandOffsets, location); 176 } 177 178 // --------------------------------------------------------------------- 179 // Test ability to create PackedRaster 180 // --------------------------------------------------------------------- 181 int[] bandMasks = new int[numBands]; 182 bandMasks[0] = 0; 183 184 int packedInputDataTypes[] = { 185 DataBuffer.TYPE_BYTE, 186 DataBuffer.TYPE_USHORT, 187 DataBuffer.TYPE_INT 188 }; 189 190 for (int i : packedInputDataTypes) { 191 Raster.createPackedRaster(i, width, height, bandMasks, location); 192 193 for (int bits = 1; bits < 5; bits *= 2) { 194 Raster.createPackedRaster(i, width, height, 1, bits, location); 195 } 196 } 197 198 for (int i = 0; i < packedInputDataTypes.length; i++) { 199 DataBuffer d1 = inputDataBuffer[i]; 200 DataBuffer d2 = myDataBuffer[i]; 201 202 for (int bits = 1; bits < 5; bits *= 2) { 203 Raster.createPackedRaster(d1, width, height, bits, location); 204 Raster.createPackedRaster(d2, width, height, bits, location); 205 } 206 207 Raster.createPackedRaster(d1, width, height, 1,bandMasks, location); 208 Raster.createPackedRaster(d2, width, height, 1,bandMasks, location); 209 } 210 } 211 } 212 213 // --------------------------------------------------------------------- 214 // Custom DataBuffer classes for testing purpose 215 // --------------------------------------------------------------------- 216 final class MyDataBufferByte extends DataBuffer { 217 218 byte[] data; 219 byte[][] bankdata; 220 221 public MyDataBufferByte(int size) { 222 super(TYPE_BYTE, size); 223 data = new byte[size]; 224 bankdata = new byte[1][]; 225 bankdata[0] = data; 226 } 227 228 @Override 229 public int getElem(int bank, int i) { 230 return bankdata[bank][i + offsets[bank]]; 231 } 232 233 @Override 234 public void setElem(int bank, int i, int val) { 235 bankdata[bank][i + offsets[bank]] = (byte) val; 236 } 237 } 238 239 final class MyDataBufferDouble extends DataBuffer { 240 241 double[] data; 242 double[][] bankdata; 243 244 public MyDataBufferDouble(int size) { 245 super(TYPE_DOUBLE, size); 246 data = new double[size]; 247 bankdata = new double[1][]; 248 bankdata[0] = data; 249 } 250 251 @Override 252 public int getElem(int bank, int i) { 253 return (int) bankdata[bank][i + offsets[bank]]; 254 } 255 256 @Override 257 public void setElem(int bank, int i, int val) { 258 bankdata[bank][i + offsets[bank]] = (double) val; 259 } 260 } 261 262 final class MyDataBufferFloat extends DataBuffer { 263 264 float[] data; 265 float[][] bankdata; 266 267 public MyDataBufferFloat(int size) { 268 super(TYPE_FLOAT, size); 269 data = new float[size]; 270 bankdata = new float[1][]; 271 bankdata[0] = data; 272 } 273 274 @Override 275 public int getElem(int bank, int i) { 276 return (int) bankdata[bank][i + offsets[bank]]; 277 } 278 279 @Override 280 public void setElem(int bank, int i, int val) { 281 bankdata[bank][i + offsets[bank]] = (float) val; 282 } 283 } 284 285 final class MyDataBufferShort extends DataBuffer { 286 287 short[] data; 288 short[][] bankdata; 289 290 public MyDataBufferShort(int size) { 291 super(TYPE_SHORT, size); 292 data = new short[size]; 293 bankdata = new short[1][]; 294 bankdata[0] = data; 295 } 296 297 @Override 298 public int getElem(int bank, int i) { 299 return bankdata[bank][i + offsets[bank]]; 300 } 301 302 @Override 303 public void setElem(int bank, int i, int val) { 304 bankdata[bank][i + offsets[bank]] = (short) val; 305 } 306 } 307 308 final class MyDataBufferUShort extends DataBuffer { 309 310 short[] data; 311 short[][] bankdata; 312 313 public MyDataBufferUShort(int size) { 314 super(TYPE_USHORT, size); 315 data = new short[size]; 316 bankdata = new short[1][]; 317 bankdata[0] = data; 318 } 319 320 @Override 321 public int getElem(int bank, int i) { 322 return bankdata[bank][i + offsets[bank]]; 323 } 324 325 @Override 326 public void setElem(int bank, int i, int val) { 327 bankdata[bank][i + offsets[bank]] = (short) val; 328 } 329 } 330 331 final class MyDataBufferInt extends DataBuffer { 332 333 int[] data; 334 int[][] bankdata; 335 336 public MyDataBufferInt(int size) { 337 super(TYPE_INT, size); 338 data = new int[size]; 339 bankdata = new int[1][]; 340 bankdata[0] = data; 341 } 342 343 @Override 344 public int getElem(int bank, int i) { 345 return bankdata[bank][i + offsets[bank]]; 346 } 347 348 @Override 349 public void setElem(int bank, int i, int val) { 350 bankdata[bank][i + offsets[bank]] = (int) val; 351 } 352 }