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 }