1 /*
2 * Copyright (c) 1997, 2017, 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 }
285