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 }