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.SampleModel;
  33 import java.awt.image.MultiPixelPackedSampleModel;
  34 import java.awt.image.PixelInterleavedSampleModel;
  35 import java.awt.image.SinglePixelPackedSampleModel;
  36 import java.awt.image.Raster;
  37 
  38  /*
  39  * @test
  40  * @bug  6353518
  41  * @summary  Test possible combinations of WritableRaster creation
  42  *           Test fails if Raster.createWritableRaster() throws exception.
  43  */
  44 public class CreateWritableRasterTest {
  45 
  46     public static void main(String[] args) {
  47 
  48         final int width = 20;
  49         final int height = 10;
  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 WritableRaster with DataBuffer classes
  74         // ---------------------------------------------------------------------
  75         DataBuffer inputDataBuffer[] = {
  76             new DataBufferByte(imageSize),
  77             new DataBufferDouble(imageSize),
  78             new DataBufferFloat(imageSize),
  79             new DataBufferShort(imageSize),
  80             new DataBufferUShort(imageSize),
  81             new DataBufferInt(imageSize, 1)
  82         };
  83 
  84         for (SampleModel sm : inputSampleModels) {
  85             for (DataBuffer db : inputDataBuffer) {
  86                 Raster.createWritableRaster(sm, db, location);
  87             }
  88         }
  89 
  90         // ---------------------------------------------------------------------
  91         // Test ability to create WritableRaster with custom DataBuffer classes
  92         // ---------------------------------------------------------------------
  93         DataBuffer myDataBuffer[] = {
  94             new MyDataBufferByte(imageSize),
  95             new MyDataBufferDouble(imageSize),
  96             new MyDataBufferFloat(imageSize),
  97             new MyDataBufferShort(imageSize),
  98             new MyDataBufferUShort(imageSize),
  99             new MyDataBufferInt(imageSize)
 100         };
 101 
 102         for (SampleModel sm : inputSampleModels) {
 103             for (DataBuffer db : myDataBuffer) {
 104                 Raster.createWritableRaster(sm, db, location);
 105             }
 106         }
 107     }
 108 }
 109 
 110 
 111 // ---------------------------------------------------------------------
 112 // Custom DataBuffer classes for testing purpose
 113 // ---------------------------------------------------------------------
 114 final class MyDataBufferByte extends DataBuffer {
 115 
 116     byte data[];
 117     byte bankdata[][];
 118 
 119     public MyDataBufferByte(int size) {
 120         super(TYPE_BYTE, size);
 121         data = new byte[size];
 122         bankdata = new byte[1][];
 123         bankdata[0] = data;
 124     }
 125 
 126     @Override
 127     public int getElem(int bank, int i) {
 128         return bankdata[bank][i + offsets[bank]];
 129     }
 130 
 131     @Override
 132     public void setElem(int bank, int i, int val) {
 133         bankdata[bank][i + offsets[bank]] = (byte) val;
 134     }
 135 }
 136 
 137 final class MyDataBufferDouble extends DataBuffer {
 138 
 139     double data[];
 140     double bankdata[][];
 141 
 142     public MyDataBufferDouble(int size) {
 143         super(TYPE_DOUBLE, size);
 144         data = new double[size];
 145         bankdata = new double[1][];
 146         bankdata[0] = data;
 147     }
 148 
 149     @Override
 150     public int getElem(int bank, int i) {
 151         return (int) bankdata[bank][i + offsets[bank]];
 152     }
 153 
 154     @Override
 155     public void setElem(int bank, int i, int val) {
 156         bankdata[bank][i + offsets[bank]] = (double) val;
 157     }
 158 }
 159 
 160 final class MyDataBufferFloat extends DataBuffer {
 161 
 162     float data[];
 163     float bankdata[][];
 164 
 165     public MyDataBufferFloat(int size) {
 166         super(TYPE_FLOAT, size);
 167         data = new float[size];
 168         bankdata = new float[1][];
 169         bankdata[0] = data;
 170     }
 171 
 172     @Override
 173     public int getElem(int bank, int i) {
 174         return (int) bankdata[bank][i + offsets[bank]];
 175     }
 176 
 177     @Override
 178     public void setElem(int bank, int i, int val) {
 179         bankdata[bank][i + offsets[bank]] = (float) val;
 180     }
 181 }
 182 
 183 final class MyDataBufferShort extends DataBuffer {
 184 
 185     short data[];
 186     short bankdata[][];
 187 
 188     public MyDataBufferShort(int size) {
 189         super(TYPE_SHORT, size);
 190         data = new short[size];
 191         bankdata = new short[1][];
 192         bankdata[0] = data;
 193     }
 194 
 195     @Override
 196     public int getElem(int bank, int i) {
 197         return bankdata[bank][i + offsets[bank]];
 198     }
 199 
 200     @Override
 201     public void setElem(int bank, int i, int val) {
 202         bankdata[bank][i + offsets[bank]] = (short) val;
 203     }
 204 }
 205 
 206 final class MyDataBufferUShort extends DataBuffer {
 207 
 208     short data[];
 209     short bankdata[][];
 210 
 211     public MyDataBufferUShort(int size) {
 212         super(TYPE_USHORT, size);
 213         data = new short[size];
 214         bankdata = new short[1][];
 215         bankdata[0] = data;
 216     }
 217 
 218     @Override
 219     public int getElem(int bank, int i) {
 220         return bankdata[bank][i + offsets[bank]];
 221     }
 222 
 223     @Override
 224     public void setElem(int bank, int i, int val) {
 225         bankdata[bank][i + offsets[bank]] = (short) val;
 226     }
 227 }
 228 
 229 final class MyDataBufferInt extends DataBuffer {
 230 
 231     int data[];
 232     int bankdata[][];
 233 
 234     public MyDataBufferInt(int size) {
 235         super(TYPE_INT, size);
 236         data = new int[size];
 237         bankdata = new int[1][];
 238         bankdata[0] = data;
 239     }
 240 
 241     @Override
 242     public int getElem(int bank, int i) {
 243         return bankdata[bank][i + offsets[bank]];
 244     }
 245 
 246     @Override
 247     public void setElem(int bank, int i, int val) {
 248         bankdata[bank][i + offsets[bank]] = (int) val;
 249     }
 250 }
 251