History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/sun/awt/image/ShortComponentRaster.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/awt/image/ShortComponentRaster.java+836−0
@@ -0,0 +1,836 @@
1/*
2 * Copyright (c) 1997, 2007, 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
26package sun.awt.image;
27import java.awt.image.Raster;
28import java.awt.image.WritableRaster;
29import java.awt.image.RasterFormatException;
30import java.awt.image.SampleModel;
31import java.awt.image.ComponentSampleModel;
32import java.awt.image.SinglePixelPackedSampleModel;
33import java.awt.image.DataBuffer;
34import java.awt.image.DataBufferUShort;
35import java.awt.Rectangle;
36import java.awt.Point;
37
38/**
39 * This class defines a Raster with pixels consisting of one or more 16-bit
40 * data elements stored in close proximity to each other in a short integer
41 * array. The bit precision per data element is that
42 * of the data type (that is, the bit precision for this Raster is 16).
43 * There is only one pixel stride and one scanline stride for all
44 * bands. This type of Raster can be used with a
45 * ComponentColorModel if there are multiple bands, or a
46 * IndexColorModel if there is only one band.
47 * <p>
48 * For example, 5-6-5 RGB image data can be represented by a
49 * ShortComponentRaster using a SinglePixelPackedSampleModel and
50 * a ComponentColorModel.
51 *
52 *
53 */
54public class ShortComponentRaster extends SunWritableRaster {
55
56 /** private band offset for use by native code */
57 protected int bandOffset;
58
59 /** Data offsets for each band of image data. */
60 protected int[] dataOffsets;
61
62 /** Scanline stride of the image data contained in this Raster. */
63 protected int scanlineStride;
64
65 /** Pixel stride of the image data contained in this Raster. */
66 protected int pixelStride;
67
68 /** The image data array. */
69 protected short[] data;
70
71 int type;
72
73 /** A cached copy of minX + width for use in bounds checks. */
74 private int maxX;
75
76 /** A cached copy of minY + height for use in bounds checks. */
77 private int maxY;
78
79 static private native void initIDs();
80 static {
81 /* ensure that the necessary native libraries are loaded */
82 NativeLibLoader.loadLibraries();
83 initIDs();
84 }
85
86 /**
87 * Constructs a ShortComponentRaster with the given SampleModel.
88 * The Raster's upper left corner is origin and it is the same
89 * size as the SampleModel. A DataBuffer large enough to describe the
90 * Raster is automatically created. SampleModel must be of type
91 * ComponentSampleModel or SinglePixelPackedSampleModel.
92 * @param sampleModel The SampleModel that specifies the layout.
93 * @param origin The Point that specified the origin.
94 */
95 public ShortComponentRaster(SampleModel sampleModel, Point origin) {
96 this(sampleModel,
97 sampleModel.createDataBuffer(),
98 new Rectangle(origin.x,
99 origin.y,
100 sampleModel.getWidth(),
101 sampleModel.getHeight()),
102 origin,
103 null);
104 }
105
106 /**
107 * Constructs a ShortComponentRaster with the given SampleModel
108 * and DataBuffer. The Raster's upper left corner is origin and
109 * it is the same sizes the SampleModel. The DataBuffer is not
110 * initialized and must be a DataBufferUShort compatible with SampleModel.
111 * SampleModel must be of type ComponentSampleModel or
112 * SinglePixelPackedSampleModel.
113 * @param sampleModel The SampleModel that specifies the layout.
114 * @param dataBuffer The DataBufferUShort that contains the image data.
115 * @param origin The Point that specifies the origin.
116 */
117 public ShortComponentRaster(SampleModel sampleModel,
118 DataBuffer dataBuffer,
119 Point origin) {
120 this(sampleModel,
121 dataBuffer,
122 new Rectangle(origin.x,
123 origin.y,
124 sampleModel.getWidth(),
125 sampleModel.getHeight()),
126 origin,
127 null);
128 }
129
130 /**
131 * Constructs a ShortComponentRaster with the given SampleModel,
132 * DataBuffer, and parent. DataBuffer must be a DataBufferUShort and
133 * SampleModel must be of type ComponentSampleModel or
134 * SinglePixelPackedSampleModel. When translated into the base Raster's
135 * coordinate system, aRegion must be contained by the base Raster.
136 * Origin is the coodinate in the new Raster's coordinate system of
137 * the origin of the base Raster. (The base Raster is the Raster's
138 * ancestor which has no parent.)
139 *
140 * Note that this constructor should generally be called by other
141 * constructors or create methods, it should not be used directly.
142 * @param sampleModel The SampleModel that specifies the layout.
143 * @param dataBuffer The DataBufferUShort that contains the image data.
144 * @param aRegion The Rectangle that specifies the image area.
145 * @param origin The Point that specifies the origin.
146 * @param parent The parent (if any) of this raster.
147 */
148 public ShortComponentRaster(SampleModel sampleModel,
149 DataBuffer dataBuffer,
150 Rectangle aRegion,
151 Point origin,
152 ShortComponentRaster parent) {
153
154 super(sampleModel, dataBuffer, aRegion, origin, parent);
155 this.maxX = minX + width;
156 this.maxY = minY + height;
157
158 if(!(dataBuffer instanceof DataBufferUShort)) {
159 throw new RasterFormatException("ShortComponentRasters must have "+
160 "short DataBuffers");
161 }
162
163 DataBufferUShort dbus = (DataBufferUShort)dataBuffer;
164 this.data = stealData(dbus, 0);
165 if (dbus.getNumBanks() != 1) {
166 throw new
167 RasterFormatException("DataBuffer for ShortComponentRasters"+
168 " must only have 1 bank.");
169 }
170 int dbOffset = dbus.getOffset();
171
172 if (sampleModel instanceof ComponentSampleModel) {
173 ComponentSampleModel csm = (ComponentSampleModel)sampleModel;
174 this.type = IntegerComponentRaster.TYPE_USHORT_SAMPLES;
175 this.scanlineStride = csm.getScanlineStride();
176 this.pixelStride = csm.getPixelStride();
177 this.dataOffsets = csm.getBandOffsets();
178 int xOffset = aRegion.x - origin.x;
179 int yOffset = aRegion.y - origin.y;
180 for (int i = 0; i < getNumDataElements(); i++) {
181 dataOffsets[i] += dbOffset +
182 xOffset*pixelStride+yOffset*scanlineStride;
183 }
184 } else if (sampleModel instanceof SinglePixelPackedSampleModel) {
185 SinglePixelPackedSampleModel sppsm =
186 (SinglePixelPackedSampleModel)sampleModel;
187 this.type = IntegerComponentRaster.TYPE_USHORT_PACKED_SAMPLES;
188 this.scanlineStride = sppsm.getScanlineStride();
189 this.pixelStride = 1;
190 this.dataOffsets = new int[1];
191 this.dataOffsets[0] = dbOffset;
192 int xOffset = aRegion.x - origin.x;
193 int yOffset = aRegion.y - origin.y;
194 dataOffsets[0] += xOffset+yOffset*scanlineStride;
195 } else {
196 throw new RasterFormatException("ShortComponentRasters must have"+
197 "ComponentSampleModel or SinglePixelPackedSampleModel");
198 }
199 this.bandOffset = this.dataOffsets[0];
200
201 verify(false);
202 }
203
204 /**
205 * Returns a copy of the data offsets array. For each band the data offset
206 * is the index into the band's data array, of the first sample of the
207 * band.
208 */
209 public int[] getDataOffsets() {
210 return (int[]) dataOffsets.clone();
211 }
212
213 /**
214 * Returns the data offset for the specified band. The data offset
215 * is the index into the data array in which the first sample
216 * of the first scanline is stored.
217 * @param band The band whose offset is returned.
218 */
219 public int getDataOffset(int band) {
220 return dataOffsets[band];
221 }
222
223 /**
224 * Returns the scanline stride -- the number of data array elements between
225 * a given sample and the same sample in the same column of the next row.
226 */
227 public int getScanlineStride() {
228 return scanlineStride;
229 }
230
231 /**
232 * Returns pixel stride -- the number of data array elements between two
233 * samples for the same band on the same scanline.
234 */
235 public int getPixelStride() {
236 return pixelStride;
237 }
238
239 /**
240 * Returns a reference to the data array.
241 */
242 public short[] getDataStorage() {
243 return data;
244 }
245
246 /**
247 * Returns the data elements for all bands at the specified
248 * location.
249 * An ArrayIndexOutOfBounds exception will be thrown at runtime
250 * if the pixel coordinate is out of bounds.
251 * A ClassCastException will be thrown if the input object is non null
252 * and references anything other than an array of transferType.
253 * @param x The X coordinate of the pixel location.
254 * @param y The Y coordinate of the pixel location.
255 * @param outData An object reference to an array of type defined by
256 * getTransferType() and length getNumDataElements().
257 * If null an array of appropriate type and size will be
258 * allocated.
259 * @return An object reference to an array of type defined by
260 * getTransferType() with the request pixel data.
261 */
262 public Object getDataElements(int x, int y, Object obj) {
263 if ((x < this.minX) || (y < this.minY) ||
264 (x >= this.maxX) || (y >= this.maxY)) {
265 throw new ArrayIndexOutOfBoundsException
266 ("Coordinate out of bounds!");
267 }
268 short outData[];
269 if (obj == null) {
270 outData = new short[numDataElements];
271 } else {
272 outData = (short[])obj;
273 }
274 int off = (y-minY)*scanlineStride +
275 (x-minX)*pixelStride;
276
277 for (int band = 0; band < numDataElements; band++) {
278 outData[band] = data[dataOffsets[band] + off];
279 }
280
281 return outData;
282 }
283
284 /**
285 * Returns an array of data elements from the specified rectangular
286 * region.
287 * An ArrayIndexOutOfBounds exception will be thrown at runtime
288 * if the pixel coordinates are out of bounds.
289 * A ClassCastException will be thrown if the input object is non null
290 * and references anything other than an array of transferType.
291 * <pre>
292 * short[] bandData = (short[])Raster.getDataElements(x, y, w, h, null);
293 * int numDataElements = Raster.getBands();
294 * short[] pixel = new short[numDataElements];
295 * // To find the data element at location (x2, y2)
296 * System.arraycopy(bandData, ((y2-y)*w + (x2-x))*numDataElements,
297 * pixel, 0, numDataElements);
298 * </pre>
299 * @param x The X coordinate of the upper left pixel location.
300 * @param y The Y coordinate of the upper left pixel location.
301 * @param width Width of the pixel rectangle.
302 * @param height Height of the pixel rectangle.
303 * @param outData An object reference to an array of type defined by
304 * getTransferType() and length w*h*getNumDataElements().
305 * If null an array of appropriate type and size will be
306 * allocated.
307 * @return An object reference to an array of type defined by
308 * getTransferType() with the request pixel data.
309 */
310 public Object getDataElements(int x, int y, int w, int h, Object obj) {
311 if ((x < this.minX) || (y < this.minY) ||
312 (x + w > this.maxX) || (y + h > this.maxY)) {
313 throw new ArrayIndexOutOfBoundsException
314 ("Coordinate out of bounds!");
315 }
316 short outData[];
317 if (obj == null) {
318 outData = new short[w*h*numDataElements];
319 } else {
320 outData = (short[])obj;
321 }
322 int yoff = (y-minY)*scanlineStride +
323 (x-minX)*pixelStride;
324
325 int xoff;
326 int off = 0;
327 int xstart;
328 int ystart;
329
330 for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
331 xoff = yoff;
332 for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
333 for (int c = 0; c < numDataElements; c++) {
334 outData[off++] = data[dataOffsets[c] + xoff];
335 }
336 }
337 }
338
339 return outData;
340 }
341
342 /**
343 * Returns a short integer array of data elements from the
344 * specified rectangular region.
345 * An ArrayIndexOutOfBounds exception will be thrown at runtime
346 * if the pixel coordinates are out of bounds.
347 * <pre>
348 * short[] bandData = Raster.getShortData(x, y, w, h, null);
349 * // To find the data element at location (x2, y2)
350 * short dataElenent = bandData[((y2-y)*w + (x2-x))];
351 * </pre>
352 * @param x The X coordinate of the upper left pixel location.
353 * @param y The Y coordinate of the upper left pixel location.
354 * @param width Width of the sample rectangle.
355 * @param height Height of the sample rectangle.
356 * @param band The band to return.
357 * @param outData If non-null, data elements for all bands
358 * at the specified location are returned in this array.
359 * @return Data array with data elements for all bands.
360 */
361 public short[] getShortData(int x, int y, int w, int h,
362 int band, short[] outData) {
363 // Bounds check for 'band' will be performed automatically
364 if ((x < this.minX) || (y < this.minY) ||
365 (x + w > this.maxX) || (y + h > this.maxY)) {
366 throw new ArrayIndexOutOfBoundsException
367 ("Coordinate out of bounds!");
368 }
369 if (outData == null) {
370 outData = new short[numDataElements*w*h];
371 }
372 int yoff = (y-minY)*scanlineStride +
373 (x-minX)*pixelStride+ dataOffsets[band];
374 int xoff;
375 int off = 0;
376 int xstart;
377 int ystart;
378
379 if (pixelStride == 1) {
380 if (scanlineStride == w) {
381 System.arraycopy(data, yoff, outData, 0, w*h);
382 }
383 else {
384 for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
385 System.arraycopy(data, yoff, outData, off, w);
386 off += w;
387 }
388 }
389 }
390 else {
391 for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
392 xoff = yoff;
393 for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
394 outData[off++] = data[xoff];
395 }
396 }
397 }
398
399 return outData;
400 }
401
402 /**
403 * Returns a short integer array of data elements from the
404 * specified rectangular region.
405 * An ArrayIndexOutOfBounds exception will be thrown at runtime
406 * if the pixel coordinates are out of bounds.
407 * <pre>
408 * short[] bandData = Raster.getShortData(x, y, w, h, null);
409 * int numDataElements = Raster.getNumBands();
410 * short[] pixel = new short[numDataElements];
411 * // To find the data element at location (x2, y2)
412 * System.arraycopy(bandData, ((y2-y)*w + (x2-x))*numDataElements,
413 * pixel, 0, numDataElements);
414 * </pre>
415 * @param x The X coordinate of the upper left pixel location.
416 * @param y The Y coordinate of the upper left pixel location.
417 * @param width Width of the pixel rectangle.
418 * @param height Height of the pixel rectangle.
419 * @param outData If non-null, data elements for all bands
420 * at the specified location are returned in this array.
421 * @return Data array with data elements for all bands.
422 */
423 public short[] getShortData(int x, int y, int w, int h, short[] outData) {
424 if ((x < this.minX) || (y < this.minY) ||
425 (x + w > this.maxX) || (y + h > this.maxY)) {
426 throw new ArrayIndexOutOfBoundsException
427 ("Coordinate out of bounds!");
428 }
429 if (outData == null) {
430 outData = new short[numDataElements*w*h];
431 }
432 int yoff = (y-minY)*scanlineStride +
433 (x-minX)*pixelStride;
434 int xoff;
435 int off = 0;
436 int xstart;
437 int ystart;
438
439 for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
440 xoff = yoff;
441 for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
442 for (int c = 0; c < numDataElements; c++) {
443 outData[off++] = data[dataOffsets[c] + xoff];
444 }
445 }
446 }
447
448 return outData;
449 }
450
451 /**
452 * Stores the data elements for all bands at the specified location.
453 * An ArrayIndexOutOfBounds exception will be thrown at runtime
454 * if the pixel coordinate is out of bounds.
455 * A ClassCastException will be thrown if the input object is non null
456 * and references anything other than an array of transferType.
457 * @param x The X coordinate of the pixel location.
458 * @param y The Y coordinate of the pixel location.
459 * @param inData An object reference to an array of type defined by
460 * getTransferType() and length getNumDataElements()
461 * containing the pixel data to place at x,y.
462 */
463 public void setDataElements(int x, int y, Object obj) {
464 if ((x < this.minX) || (y < this.minY) ||
465 (x >= this.maxX) || (y >= this.maxY)) {
466 throw new ArrayIndexOutOfBoundsException
467 ("Coordinate out of bounds!");
468 }
469 short inData[] = (short[])obj;
470 int off = (y-minY)*scanlineStride +
471 (x-minX)*pixelStride;
472 for (int i = 0; i < numDataElements; i++) {
473 data[dataOffsets[i] + off] = (short) inData[i];
474 }
475
476 markDirty();
477 }
478
479 /**
480 * Stores the Raster data at the specified location.
481 * An ArrayIndexOutOfBounds exception will be thrown at runtime
482 * if the pixel coordinates are out of bounds.
483 * @param x The X coordinate of the pixel location.
484 * @param y The Y coordinate of the pixel location.
485 * @param inRaster Raster of data to place at x,y location.
486 */
487 public void setDataElements(int x, int y, Raster inRaster) {
488 int dstOffX = x + inRaster.getMinX();
489 int dstOffY = y + inRaster.getMinY();
490 int width = inRaster.getWidth();
491 int height = inRaster.getHeight();
492 if ((dstOffX < this.minX) || (dstOffY < this.minY) ||
493 (dstOffX + width > this.maxX) || (dstOffY + height > this.maxY)) {
494 throw new ArrayIndexOutOfBoundsException
495 ("Coordinate out of bounds!");
496 }
497
498 setDataElements(dstOffX, dstOffY, width, height, inRaster);
499 }
500
501 /**
502 * Stores the Raster data at the specified location.
503 * @param dstX The absolute X coordinate of the destination pixel
504 * that will receive a copy of the upper-left pixel of the
505 * inRaster
506 * @param dstY The absolute Y coordinate of the destination pixel
507 * that will receive a copy of the upper-left pixel of the
508 * inRaster
509 * @param width The number of pixels to store horizontally
510 * @param height The number of pixels to store vertically
511 * @param inRaster Raster of data to place at x,y location.
512 */
513 private void setDataElements(int dstX, int dstY,
514 int width, int height,
515 Raster inRaster) {
516 // Assume bounds checking has been performed previously
517 if (width <= 0 || height <= 0) {
518 return;
519 }
520
521 // Write inRaster (minX, minY) to (dstX, dstY)
522
523 int srcOffX = inRaster.getMinX();
524 int srcOffY = inRaster.getMinY();
525 Object tdata = null;
526
527// // REMIND: Do something faster!
528// if (inRaster instanceof ShortComponentRaster) {
529// }
530
531 for (int startY=0; startY < height; startY++) {
532 // Grab one scanline at a time
533 tdata = inRaster.getDataElements(srcOffX, srcOffY+startY,
534 width, 1, tdata);
535 setDataElements(dstX, dstY + startY, width, 1, tdata);
536 }
537 }
538
539 /**
540 * Stores an array of data elements into the specified rectangular
541 * region.
542 * An ArrayIndexOutOfBounds exception will be thrown at runtime
543 * if the pixel coordinates are out of bounds.
544 * A ClassCastException will be thrown if the input object is non null
545 * and references anything other than an array of transferType.
546 * The data elements in the
547 * data array are assumed to be packed. That is, a data element
548 * for the nth band at location (x2, y2) would be found at:
549 * <pre>
550 * inData[((y2-y)*w + (x2-x))*numDataElements + n]
551 * </pre>
552 * @param x The X coordinate of the upper left pixel location.
553 * @param y The Y coordinate of the upper left pixel location.
554 * @param w Width of the pixel rectangle.
555 * @param h Height of the pixel rectangle.
556 * @param inData An object reference to an array of type defined by
557 * getTransferType() and length w*h*getNumDataElements()
558 * containing the pixel data to place between x,y and
559 * x+h, y+h.
560 */
561 public void setDataElements(int x, int y, int w, int h, Object obj) {
562 if ((x < this.minX) || (y < this.minY) ||
563 (x + w > this.maxX) || (y + h > this.maxY)) {
564 throw new ArrayIndexOutOfBoundsException
565 ("Coordinate out of bounds!");
566 }
567 short inData[] = (short[])obj;
568 int yoff = (y-minY)*scanlineStride +
569 (x-minX)*pixelStride;
570 int xoff;
571 int off = 0;
572 int xstart;
573 int ystart;
574
575 for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
576 xoff = yoff;
577 for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
578 for (int c = 0; c < numDataElements; c++) {
579 data[dataOffsets[c] + xoff] = (short) inData[off++];
580 }
581 }
582 }
583
584 markDirty();
585 }
586
587 /**
588 * Stores a short integer array of data elements into the
589 * specified rectangular region.
590 * An ArrayIndexOutOfBounds exception will be thrown at runtime
591 * if the pixel coordinates are out of bounds.
592 * The data elements in the
593 * data array are assumed to be packed. That is, a data element
594 * at location (x2, y2) would be found at:
595 * <pre>
596 * inData[((y2-y)*w + (x2-x))]
597 * </pre>
598 * @param x The X coordinate of the upper left pixel location.
599 * @param y The Y coordinate of the upper left pixel location.
600 * @param w Width of the pixel rectangle.
601 * @param h Height of the pixel rectangle.
602 * @param band The band to set.
603 * @param inData The data elements to be stored.
604 */
605 public void putShortData(int x, int y, int w, int h,
606 int band, short[] inData) {
607 // Bounds check for 'band' will be performed automatically
608 if ((x < this.minX) || (y < this.minY) ||
609 (x + w > this.maxX) || (y + h > this.maxY)) {
610 throw new ArrayIndexOutOfBoundsException
611 ("Coordinate out of bounds!");
612 }
613 int yoff = (y-minY)*scanlineStride +
614 (x-minX)*pixelStride + dataOffsets[band];
615 int xoff;
616 int off = 0;
617 int xstart;
618 int ystart;
619
620 if (pixelStride == 1) {
621 if (scanlineStride == w) {
622 System.arraycopy(inData, 0, data, yoff, w*h);
623 }
624 else {
625 for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
626 System.arraycopy(inData, off, data, yoff, w);
627 off += w;
628 }
629 }
630 }
631 else {
632 for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
633 xoff = yoff;
634 for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
635 data[xoff] = inData[off++];
636 }
637 }
638 }
639
640 markDirty();
641 }
642
643 /**
644 * Stores a short integer array of data elements into the
645 * specified rectangular region.
646 * An ArrayIndexOutOfBounds exception will be thrown at runtime
647 * if the pixel coordinates are out of bounds.
648 * The data elements in the
649 * data array are assumed to be packed. That is, a data element
650 * for the nth band at location (x2, y2) would be found at:
651 * <pre>
652 * inData[((y2-y)*w + (x2-x))*numDataElements + n]
653 * </pre>
654 * @param x The X coordinate of the upper left pixel location.
655 * @param y The Y coordinate of the upper left pixel location.
656 * @param w Width of the pixel rectangle.
657 * @param h Height of the pixel rectangle.
658 * @param inData The data elements to be stored.
659 */
660 public void putShortData(int x, int y, int w, int h, short[] inData) {
661 if ((x < this.minX) || (y < this.minY) ||
662 (x + w > this.maxX) || (y + h > this.maxY)) {
663 throw new ArrayIndexOutOfBoundsException
664 ("Coordinate out of bounds!");
665 }
666 int yoff = (y-minY)*scanlineStride +
667 (x-minX)*pixelStride;
668 int xoff;
669 int off = 0;
670 int xstart;
671 int ystart;
672
673 for (ystart=0; ystart < h; ystart++, yoff += scanlineStride) {
674 xoff = yoff;
675 for (xstart=0; xstart < w; xstart++, xoff += pixelStride) {
676 for (int c = 0; c < numDataElements; c++) {
677 data[dataOffsets[c] + xoff] = inData[off++];
678 }
679 }
680 }
681
682 markDirty();
683 }
684
685 /**
686 * Creates a subraster given a region of the raster. The x and y
687 * coordinates specify the horizontal and vertical offsets
688 * from the upper-left corner of this raster to the upper-left corner
689 * of the subraster. A subset of the bands of the parent Raster may
690 * be specified. If this is null, then all the bands are present in the
691 * subRaster. A translation to the subRaster may also be specified.
692 * Note that the subraster will reference the same
693 * band objects as the parent raster, but using different offsets.
694 * @param x X offset.
695 * @param y Y offset.
696 * @param width Width (in pixels) of the subraster.
697 * @param height Height (in pixels) of the subraster.
698 * @param x0 Translated X origin of the subraster.
699 * @param y0 Translated Y origin of the subraster.
700 * @param bandList Array of band indices.
701 * @exception RasterFormatException
702 * if the specified bounding box is outside of the parent raster.
703 */
704 public Raster createChild (int x, int y,
705 int width, int height,
706 int x0, int y0, int[] bandList) {
707 WritableRaster newRaster = createWritableChild(x, y,
708 width, height,
709 x0, y0,
710 bandList);
711 return (Raster) newRaster;
712 }
713
714 /**
715 * Creates a Writable subRaster given a region of the Raster. The x and y
716 * coordinates specify the horizontal and vertical offsets
717 * from the upper-left corner of this Raster to the upper-left corner
718 * of the subRaster. A subset of the bands of the parent Raster may
719 * be specified. If this is null, then all the bands are present in the
720 * subRaster. A translation to the subRaster may also be specified.
721 * Note that the subRaster will reference the same
722 * DataBuffers as the parent Raster, but using different offsets.
723 * @param x X offset.
724 * @param y Y offset.
725 * @param width Width (in pixels) of the subraster.
726 * @param height Height (in pixels) of the subraster.
727 * @param x0 Translated X origin of the subraster.
728 * @param y0 Translated Y origin of the subraster.
729 * @param bandList Array of band indices.
730 * @exception RasterFormatException
731 * if the specified bounding box is outside of the parent Raster.
732 */
733 public WritableRaster createWritableChild(int x, int y,
734 int width, int height,
735 int x0, int y0,
736 int[] bandList) {
737 if (x < this.minX) {
738 throw new RasterFormatException("x lies outside the raster");
739 }
740 if (y < this.minY) {
741 throw new RasterFormatException("y lies outside the raster");
742 }
743 if ((x+width < x) || (x+width > this.minX + this.width)) {
744 throw new RasterFormatException("(x + width) is outside of Raster");
745 }
746 if ((y+height < y) || (y+height > this.minY + this.height)) {
747 throw new RasterFormatException("(y + height) is outside of Raster");
748 }
749
750 SampleModel sm;
751
752 if (bandList != null)
753 sm = sampleModel.createSubsetSampleModel(bandList);
754 else
755 sm = sampleModel;
756
757 int deltaX = x0 - x;
758 int deltaY = y0 - y;
759
760 return new ShortComponentRaster(sm,
761 dataBuffer,
762 new Rectangle(x0, y0, width, height),
763 new Point(sampleModelTranslateX+deltaX,
764 sampleModelTranslateY+deltaY),
765 this);
766 }
767
768 /**
769 * Creates a Raster with the same layout but using a different
770 * width and height, and with new zeroed data arrays.
771 */
772 public WritableRaster createCompatibleWritableRaster(int w, int h) {
773 if (w <= 0 || h <=0) {
774 throw new RasterFormatException("negative "+
775 ((w <= 0) ? "width" : "height"));
776 }
777
778 SampleModel sm = sampleModel.createCompatibleSampleModel(w, h);
779
780 return new ShortComponentRaster(sm, new Point(0, 0));
781 }
782
783 /**
784 * Creates a Raster with the same layout and the same
785 * width and height, and with new zeroed data arrays. If
786 * the Raster is a subRaster, this will call
787 * createCompatibleRaster(width, height).
788 */
789 public WritableRaster createCompatibleWritableRaster() {
790 return createCompatibleWritableRaster(width,height);
791 }
792
793 /**
794 * Verify that the layout parameters are consistent with
795 * the data. If strictCheck
796 * is false, this method will check for ArrayIndexOutOfBounds conditions. If
797 * strictCheck is true, this method will check for additional error
798 * conditions such as line wraparound (width of a line greater than
799 * the scanline stride).
800 * @return String Error string, if the layout is incompatible with
801 * the data. Otherwise returns null.
802 */
803 private void verify (boolean strictCheck) {
804 // Make sure data for Raster is in a legal range
805 for (int i=0; i < dataOffsets.length; i++) {
806 if (dataOffsets[i] < 0) {
807 throw new RasterFormatException("Data offsets for band "+i+
808 "("+dataOffsets[i]+
809 ") must be >= 0");
810 }
811 }
812
813 int maxSize = 0;
814 int size;
815
816 for (int i=0; i < numDataElements; i++) {
817 size = (height-1)*scanlineStride + (width-1)*pixelStride +
818 dataOffsets[i];
819 if (size > maxSize) {
820 maxSize = size;
821 }
822 }
823 if (data.length < maxSize) {
824 throw new RasterFormatException("Data array too small (should be "+
825 maxSize+" )");
826 }
827 }
828
829 public String toString() {
830 return new String ("ShortComponentRaster: width = "+width
831 +" height = " + height
832 +" #numDataElements "+numDataElements);
833 // +" xOff = "+xOffset+" yOff = "+yOffset);
834 }
835
836}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t