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