1 /* 2 * Copyright (c) 1997, 2018, 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. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 /* **************************************************************** 27 ****************************************************************** 28 ****************************************************************** 29 *** COPYRIGHT (c) Eastman Kodak Company, 1997 30 *** As an unpublished work pursuant to Title 17 of the United 31 *** States Code. All rights reserved. 32 ****************************************************************** 33 ****************************************************************** 34 ******************************************************************/ 35 36 package java.awt.image; 37 38 import static sun.java2d.StateTrackable.State.*; 39 40 /** 41 * This class extends {@code DataBuffer} and stores data internally 42 * as integers. 43 * <p> 44 * <a id="optimizations"> 45 * Note that some implementations may function more efficiently 46 * if they can maintain control over how the data for an image is 47 * stored. 48 * For example, optimizations such as caching an image in video 49 * memory require that the implementation track all modifications 50 * to that data. 51 * Other implementations may operate better if they can store the 52 * data in locations other than a Java array. 53 * To maintain optimum compatibility with various optimizations 54 * it is best to avoid constructors and methods which expose the 55 * underlying storage as a Java array as noted below in the 56 * documentation for those methods. 57 * </a> 58 */ 59 public final class DataBufferInt extends DataBuffer 60 { 61 /** The default data bank. */ 62 int[] data; 63 64 /** All data banks */ 65 int[][] bankdata; 66 67 /** 68 * Constructs an integer-based {@code DataBuffer} with a single bank 69 * and the specified size. 70 * 71 * @param size The size of the {@code DataBuffer}. 72 */ 73 public DataBufferInt(int size) { 74 super(STABLE, TYPE_INT, size); 75 data = new int[size]; 76 bankdata = new int[1][]; 77 bankdata[0] = data; 78 } 79 80 /** 81 * Constructs an integer-based {@code DataBuffer} with the specified number of 82 * banks, all of which are the specified size. 83 * 84 * @param size The size of the banks in the {@code DataBuffer}. 85 * @param numBanks The number of banks in the a {@code DataBuffer}. 86 */ 87 public DataBufferInt(int size, int numBanks) { 88 super(STABLE, TYPE_INT, size, numBanks); 89 bankdata = new int[numBanks][]; 90 for (int i= 0; i < numBanks; i++) { 91 bankdata[i] = new int[size]; 92 } 93 data = bankdata[0]; 94 } 95 96 /** 97 * Constructs an integer-based {@code DataBuffer} with a single bank using the 98 * specified array. 99 * Only the first {@code size} elements should be used by accessors of 100 * this {@code DataBuffer}. {@code dataArray} must be large enough to 101 * hold {@code size} elements. 102 * <p> 103 * Note that {@code DataBuffer} objects created by this constructor 104 * may be incompatible with <a href="#optimizations">performance 105 * optimizations</a> used by some implementations (such as caching 106 * an associated image in video memory). 107 * 108 * @param dataArray The integer array for the {@code DataBuffer}. 109 * @param size The size of the {@code DataBuffer} bank. 110 */ 111 public DataBufferInt(int[] dataArray, int size) { 112 super(UNTRACKABLE, TYPE_INT, size); 113 data = dataArray; 114 bankdata = new int[1][]; 115 bankdata[0] = data; 116 } 117 118 /** 119 * Constructs an integer-based {@code DataBuffer} with a single bank using the 120 * specified array, size, and offset. {@code dataArray} must have at least 121 * {@code offset} + {@code size} elements. Only elements {@code offset} 122 * through {@code offset} + {@code size} - 1 123 * should be used by accessors of this {@code DataBuffer}. 124 * <p> 125 * Note that {@code DataBuffer} objects created by this constructor 126 * may be incompatible with <a href="#optimizations">performance 127 * optimizations</a> used by some implementations (such as caching 128 * an associated image in video memory). 129 * 130 * @param dataArray The integer array for the {@code DataBuffer}. 131 * @param size The size of the {@code DataBuffer} bank. 132 * @param offset The offset into the {@code dataArray}. 133 */ 134 public DataBufferInt(int[] dataArray, int size, int offset) { 135 super(UNTRACKABLE, TYPE_INT, size, 1, offset); 136 data = dataArray; 137 bankdata = new int[1][]; 138 bankdata[0] = data; 139 } 140 141 /** 142 * Constructs an integer-based {@code DataBuffer} with the specified arrays. 143 * The number of banks will be equal to {@code dataArray.length}. 144 * Only the first {@code size} elements of each array should be used by 145 * accessors of this {@code DataBuffer}. 146 * <p> 147 * Note that {@code DataBuffer} objects created by this constructor 148 * may be incompatible with <a href="#optimizations">performance 149 * optimizations</a> used by some implementations (such as caching 150 * an associated image in video memory). 151 * 152 * @param dataArray The integer arrays for the {@code DataBuffer}. 153 * @param size The size of the banks in the {@code DataBuffer}. 154 */ 155 public DataBufferInt(int[][] dataArray, int size) { 156 super(UNTRACKABLE, TYPE_INT, size, dataArray.length); 157 bankdata = dataArray.clone(); 158 data = bankdata[0]; 159 } 160 161 /** 162 * Constructs an integer-based {@code DataBuffer} with the specified arrays, size, 163 * and offsets. 164 * The number of banks is equal to {@code dataArray.length}. Each array must 165 * be at least as large as {@code size} + the corresponding offset. There must 166 * be an entry in the offset array for each {@code dataArray} entry. For each 167 * bank, only elements {@code offset} through 168 * {@code offset} + {@code size} - 1 should be 169 * used by accessors of this {@code DataBuffer}. 170 * <p> 171 * Note that {@code DataBuffer} objects created by this constructor 172 * may be incompatible with <a href="#optimizations">performance 173 * optimizations</a> used by some implementations (such as caching 174 * an associated image in video memory). 175 * 176 * @param dataArray The integer arrays for the {@code DataBuffer}. 177 * @param size The size of the banks in the {@code DataBuffer}. 178 * @param offsets The offsets into each array. 179 */ 180 public DataBufferInt(int[][] dataArray, int size, int[] offsets) { 181 super(UNTRACKABLE, TYPE_INT, size, dataArray.length, offsets); 182 bankdata = dataArray.clone(); 183 data = bankdata[0]; 184 } 185 186 /** 187 * Returns the default (first) int data array in {@code DataBuffer}. 188 * <p> 189 * Note that calling this method may cause this {@code DataBuffer} 190 * object to be incompatible with <a href="#optimizations">performance 191 * optimizations</a> used by some implementations (such as caching 192 * an associated image in video memory). 193 * 194 * @return The first integer data array. 195 */ 196 public int[] getData() { 197 theTrackable.setUntrackable(); 198 return data; 199 } 200 201 /** 202 * Returns the data array for the specified bank. 203 * <p> 204 * Note that calling this method may cause this {@code DataBuffer} 205 * object to be incompatible with <a href="#optimizations">performance 206 * optimizations</a> used by some implementations (such as caching 207 * an associated image in video memory). 208 * 209 * @param bank The bank whose data array you want to get. 210 * @return The data array for the specified bank. 211 */ 212 public int[] getData(int bank) { 213 theTrackable.setUntrackable(); 214 return bankdata[bank]; 215 } 216 217 /** 218 * Returns the data arrays for all banks. 219 * <p> 220 * Note that calling this method may cause this {@code DataBuffer} 221 * object to be incompatible with <a href="#optimizations">performance 222 * optimizations</a> used by some implementations (such as caching 223 * an associated image in video memory). 224 * 225 * @return All of the data arrays. 226 */ 227 public int[][] getBankData() { 228 theTrackable.setUntrackable(); 229 return bankdata.clone(); 230 } 231 232 /** 233 * Returns the requested data array element from the first (default) bank. 234 * 235 * @param i The data array element you want to get. 236 * @return The requested data array element as an integer. 237 * @see #setElem(int, int) 238 * @see #setElem(int, int, int) 239 */ 240 public int getElem(int i) { 241 return data[i+offset]; 242 } 243 244 /** 245 * Returns the requested data array element from the specified bank. 246 * 247 * @param bank The bank from which you want to get a data array element. 248 * @param i The data array element you want to get. 249 * @return The requested data array element as an integer. 250 * @see #setElem(int, int) 251 * @see #setElem(int, int, int) 252 */ 253 public int getElem(int bank, int i) { 254 return bankdata[bank][i+offsets[bank]]; 255 } 256 257 /** 258 * Sets the requested data array element in the first (default) bank 259 * to the specified value. 260 * 261 * @param i The data array element you want to set. 262 * @param val The integer value to which you want to set the data array element. 263 * @see #getElem(int) 264 * @see #getElem(int, int) 265 */ 266 public void setElem(int i, int val) { 267 data[i+offset] = val; 268 theTrackable.markDirty(); 269 } 270 271 /** 272 * Sets the requested data array element in the specified bank 273 * to the integer value {@code i}. 274 * @param bank The bank in which you want to set the data array element. 275 * @param i The data array element you want to set. 276 * @param val The integer value to which you want to set the specified data array element. 277 * @see #getElem(int) 278 * @see #getElem(int, int) 279 */ 280 public void setElem(int bank, int i, int val) { 281 bankdata[bank][i+offsets[bank]] = val; 282 theTrackable.markDirty(); 283 } 284 }