OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libjava/] [classpath/] [java/] [awt/] [image/] [Raster.java] - Blame information for rev 771

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 771 jeremybenn
/* Copyright (C) 2000, 2002, 2003, 2006,  Free Software Foundation
2
 
3
This file is part of GNU Classpath.
4
 
5
GNU Classpath is free software; you can redistribute it and/or modify
6
it under the terms of the GNU General Public License as published by
7
the Free Software Foundation; either version 2, or (at your option)
8
any later version.
9
 
10
GNU Classpath is distributed in the hope that it will be useful, but
11
WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
General Public License for more details.
14
 
15
You should have received a copy of the GNU General Public License
16
along with GNU Classpath; see the file COPYING.  If not, write to the
17
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18
02110-1301 USA.
19
 
20
Linking this library statically or dynamically with other modules is
21
making a combined work based on this library.  Thus, the terms and
22
conditions of the GNU General Public License cover the whole
23
combination.
24
 
25
As a special exception, the copyright holders of this library give you
26
permission to link this library with independent modules to produce an
27
executable, regardless of the license terms of these independent
28
modules, and to copy and distribute the resulting executable under
29
terms of your choice, provided that you also meet, for each linked
30
independent module, the terms and conditions of the license of that
31
module.  An independent module is a module which is not derived from
32
or based on this library.  If you modify this library, you may extend
33
this exception to your version of the library, but you are not
34
obligated to do so.  If you do not wish to do so, delete this
35
exception statement from your version. */
36
 
37
 
38
package java.awt.image;
39
 
40
import gnu.java.lang.CPStringBuilder;
41
 
42
import java.awt.Point;
43
import java.awt.Rectangle;
44
 
45
/**
46
 * A rectangular collection of pixels composed from a {@link DataBuffer} which
47
 * stores the pixel values, and a {@link SampleModel} which is used to retrieve
48
 * the pixel values.
49
 *
50
 * @author Rolf W. Rasmussen (rolfwr@ii.uib.no)
51
 */
52
public class Raster
53
{
54
  /** The sample model used to access the pixel values. */
55
  protected SampleModel sampleModel;
56
 
57
  /** The data buffer used to store the pixel values. */
58
  protected DataBuffer dataBuffer;
59
 
60
  /** The x-coordinate of the top left corner of the raster. */
61
  protected int minX;
62
 
63
  /** The y-coordinate of the top left corner of the raster. */
64
  protected int minY;
65
 
66
  /** The width of the raster. */
67
  protected int width;
68
 
69
  /** The height of the raster. */
70
  protected int height;
71
 
72
  protected int sampleModelTranslateX;
73
 
74
  protected int sampleModelTranslateY;
75
 
76
  /** The number of bands. */
77
  protected int numBands;
78
 
79
  protected int numDataElements;
80
 
81
  /** The raster's parent. */
82
  protected Raster parent;
83
 
84
  /**
85
   * Creates a new raster.
86
   *
87
   * @param sampleModel  the sample model.
88
   * @param origin  the origin.
89
   */
90
  protected Raster(SampleModel sampleModel, Point origin)
91
  {
92
    this(sampleModel, sampleModel.createDataBuffer(), origin);
93
  }
94
 
95
  /**
96
   * Creates a new raster.
97
   *
98
   * @param sampleModel  the sample model.
99
   * @param dataBuffer  the data buffer.
100
   * @param origin  the origin.
101
   */
102
  protected Raster(SampleModel sampleModel, DataBuffer dataBuffer,
103
                   Point origin)
104
  {
105
    this(sampleModel, dataBuffer, new Rectangle(origin.x, origin.y,
106
         sampleModel.getWidth(), sampleModel.getHeight()), origin, null);
107
  }
108
 
109
  /**
110
   * Creates a new raster.
111
   *
112
   * @param sampleModel  the sample model.
113
   * @param dataBuffer  the data buffer.
114
   * @param aRegion  the raster's bounds.
115
   * @param sampleModelTranslate  the translation (<code>null</code> permitted).
116
   * @param parent  the raster's parent.
117
   */
118
  protected Raster(SampleModel sampleModel, DataBuffer dataBuffer,
119
      Rectangle aRegion, Point sampleModelTranslate, Raster parent)
120
  {
121
    this.sampleModel = sampleModel;
122
    this.dataBuffer = dataBuffer;
123
    this.minX = aRegion.x;
124
    this.minY = aRegion.y;
125
    this.width = aRegion.width;
126
    this.height = aRegion.height;
127
 
128
    // If sampleModelTranslate is null, use (0,0).  Methods such as
129
    // Raster.createRaster are specified to allow for a null argument.
130
    if (sampleModelTranslate != null)
131
    {
132
      this.sampleModelTranslateX = sampleModelTranslate.x;
133
      this.sampleModelTranslateY = sampleModelTranslate.y;
134
    }
135
 
136
    this.numBands = sampleModel.getNumBands();
137
    this.numDataElements = sampleModel.getNumDataElements();
138
    this.parent = parent;
139
  }
140
 
141
  /**
142
   * Creates an interleaved raster using the specified data type.
143
   *
144
   * @param dataType  the data type.
145
   * @param w  the width.
146
   * @param h  the height.
147
   * @param bands  the number of bands.
148
   * @param location
149
   *
150
   * @return The new raster.
151
   */
152
  public static WritableRaster createInterleavedRaster(int dataType,
153
      int w, int h, int bands, Point location)
154
  {
155
    int[] bandOffsets = new int[bands];
156
    // TODO: Maybe not generate this every time.
157
    for (int b = 0; b < bands; b++)
158
      bandOffsets[b] = b;
159
 
160
    int scanlineStride = bands * w;
161
    return createInterleavedRaster(dataType, w, h, scanlineStride, bands,
162
                                   bandOffsets, location);
163
  }
164
 
165
  /**
166
   * Creates an interleaved raster.
167
   *
168
   * @param dataType  the data type.
169
   * @param w  the width.
170
   * @param h  the height.
171
   * @param scanlineStride  the number of data elements from a sample on one
172
   *     row to the corresponding sample on the next row.
173
   * @param pixelStride  the number of elements from a sample in one pixel to
174
   *     the corresponding sample in the next pixel.
175
   * @param bandOffsets  the band offsets.
176
   * @param location
177
   *
178
   * @return The new raster.
179
   */
180
  public static WritableRaster createInterleavedRaster(int dataType,
181
      int w, int h, int scanlineStride, int pixelStride, int[] bandOffsets,
182
      Point location)
183
  {
184
    SampleModel sm = new ComponentSampleModel(dataType, w, h, pixelStride,
185
        scanlineStride, bandOffsets);
186
    return createWritableRaster(sm, location);
187
  }
188
 
189
  /**
190
   * Creates a new banded raster.
191
   *
192
   * @param dataType  the data type.
193
   * @param w  the width.
194
   * @param h  the height.
195
   * @param bands  the number of bands.
196
   * @param location
197
   *
198
   * @return The new raster.
199
   */
200
  public static WritableRaster createBandedRaster(int dataType, int w, int h,
201
      int bands, Point location)
202
  {
203
    SampleModel sm = new BandedSampleModel(dataType, w, h, bands);
204
    return createWritableRaster(sm, location);
205
  }
206
 
207
  /**
208
   * Creates a new banded raster.
209
   *
210
   * @param dataType  the data type.
211
   * @param w  the width.
212
   * @param h  the height.
213
   * @param scanlineStride  the number of data elements from a sample on one
214
   *     row to the corresponding sample on the next row.
215
   * @param bankIndices  the index for each bank.
216
   * @param bandOffsets  the offset for each band.
217
   * @param location
218
   *
219
   * @return The new raster.
220
   */
221
  public static WritableRaster createBandedRaster(int dataType, int w, int h,
222
      int scanlineStride, int[] bankIndices, int[] bandOffsets, Point location)
223
  {
224
    SampleModel sm = new BandedSampleModel(dataType, w, h, scanlineStride,
225
                                           bankIndices, bandOffsets);
226
    return createWritableRaster(sm, location);
227
  }
228
 
229
  /**
230
   * Creates a new packed raster.
231
   *
232
   * @param dataType  the data type.
233
   * @param w  the width.
234
   * @param h  the height.
235
   * @param bandMasks  the bit mask for each band.
236
   * @param location
237
   *
238
   * @return The new raster.
239
   */
240
  public static WritableRaster createPackedRaster(int dataType, int w, int h,
241
      int[] bandMasks, Point location)
242
  {
243
    SampleModel sm = new SinglePixelPackedSampleModel(dataType, w, h,
244
                                                     bandMasks);
245
    return createWritableRaster(sm, location);
246
  }
247
 
248
  /**
249
   * Creates a new raster.
250
   *
251
   * @param dataType  the data type.
252
   * @param w  the width.
253
   * @param h  the height.
254
   * @param bands  the number of bands.
255
   * @param bitsPerBand  the number of bits per band.
256
   * @param location
257
   *
258
   * @return The new raster.
259
   */
260
  public static WritableRaster createPackedRaster(int dataType,
261
      int w, int h, int bands, int bitsPerBand, Point location)
262
  {
263
    if (bands <= 0 || (bands * bitsPerBand > getTypeBits(dataType)))
264
      throw new IllegalArgumentException();
265
 
266
    SampleModel sm;
267
 
268
    if (bands == 1)
269
      sm = new MultiPixelPackedSampleModel(dataType, w, h, bitsPerBand);
270
    else
271
      {
272
        int[] bandMasks = new int[bands];
273
        int mask = 0x1;
274
        for (int bits = bitsPerBand; --bits != 0;)
275
          mask = (mask << 1) | 0x1;
276
        for (int i = 0; i < bands; i++)
277
          {
278
            bandMasks[i] = mask;
279
            mask <<= bitsPerBand;
280
          }
281
 
282
        sm = new SinglePixelPackedSampleModel(dataType, w, h, bandMasks);
283
      }
284
    return createWritableRaster(sm, location);
285
  }
286
 
287
  /**
288
   * Creates a new interleaved raster.
289
   *
290
   * @param dataBuffer  the data buffer.
291
   * @param w  the width.
292
   * @param h  the height.
293
   * @param scanlineStride  the number of data elements from a sample on one
294
   *     row to the corresponding sample on the next row.
295
   * @param pixelStride  the number of elements from a sample in one pixel to
296
   *     the corresponding sample in the next pixel.
297
   * @param bandOffsets  the offset for each band.
298
   * @param location
299
   *
300
   * @return The new raster.
301
   */
302
  public static WritableRaster createInterleavedRaster(DataBuffer dataBuffer,
303
      int w, int h, int scanlineStride, int pixelStride, int[] bandOffsets,
304
      Point location)
305
  {
306
    SampleModel sm = new ComponentSampleModel(dataBuffer.getDataType(),
307
        w, h, pixelStride, scanlineStride, bandOffsets);
308
    return createWritableRaster(sm, dataBuffer, location);
309
  }
310
 
311
  /**
312
   * Creates a new banded raster.
313
   *
314
   * @param dataBuffer  the data buffer.
315
   * @param w  the width.
316
   * @param h  the height.
317
   * @param scanlineStride  the number of data elements from a sample on one
318
   *     row to the corresponding sample on the next row.
319
   * @param bankIndices  the index for each bank.
320
   * @param bandOffsets  the band offsets.
321
   * @param location
322
   *
323
   * @return The new raster.
324
   */
325
  public static WritableRaster createBandedRaster(DataBuffer dataBuffer,
326
      int w, int h, int scanlineStride, int[] bankIndices, int[] bandOffsets,
327
      Point location)
328
  {
329
    SampleModel sm = new BandedSampleModel(dataBuffer.getDataType(),
330
        w, h, scanlineStride, bankIndices, bandOffsets);
331
    return createWritableRaster(sm, dataBuffer, location);
332
  }
333
 
334
  /**
335
   * Creates a new packed raster.
336
   *
337
   * @param dataBuffer  the data buffer.
338
   * @param w  the width.
339
   * @param h  the height.
340
   * @param scanlineStride  the number of data elements from a sample on one
341
   *     row to the corresponding sample on the next row.
342
   * @param bandMasks  the bit mask for each band.
343
   * @param location
344
   *
345
   * @return The new raster.
346
   */
347
  public static WritableRaster createPackedRaster(DataBuffer dataBuffer,
348
      int w, int h, int scanlineStride, int[] bandMasks, Point location)
349
 {
350
    SampleModel sm = new SinglePixelPackedSampleModel(dataBuffer.getDataType(),
351
        w, h, scanlineStride, bandMasks);
352
    return createWritableRaster(sm, dataBuffer, location);
353
  }
354
 
355
  /**
356
   * Creates a new packed raster.
357
   *
358
   * @param dataBuffer  the data buffer.
359
   * @param w  the width.
360
   * @param h  the height.
361
   * @param bitsPerPixel  the number of bits per pixel.
362
   * @param location
363
   *
364
   * @return The new raster.
365
   */
366
  public static WritableRaster createPackedRaster(DataBuffer dataBuffer,
367
      int w, int h, int bitsPerPixel, Point location)
368
  {
369
    SampleModel sm = new MultiPixelPackedSampleModel(dataBuffer.getDataType(),
370
        w, h, bitsPerPixel);
371
    return createWritableRaster(sm, dataBuffer, location);
372
  }
373
 
374
  /**
375
   * Creates a new raster.
376
   *
377
   * @param sm  the sample model.
378
   * @param db  the data buffer.
379
   * @param location
380
   *
381
   * @return The new raster.
382
   */
383
  public static Raster createRaster(SampleModel sm, DataBuffer db,
384
                                    Point location)
385
  {
386
    return new Raster(sm, db, location);
387
  }
388
 
389
  /**
390
   * Creates a new writable raster.
391
   *
392
   * @param sm  the sample model.
393
   * @param location
394
   *
395
   * @return The new writable raster.
396
   */
397
  public static WritableRaster createWritableRaster(SampleModel sm,
398
                                                    Point location)
399
  {
400
    return new WritableRaster(sm, location);
401
  }
402
 
403
  /**
404
   * Creates a new writable raster.
405
   *
406
   * @param sm  the sample model.
407
   * @param db  the data buffer.
408
   * @param location
409
   *
410
   * @return The new writable raster.
411
   */
412
  public static WritableRaster createWritableRaster(SampleModel sm,
413
      DataBuffer db, Point location)
414
  {
415
    return new WritableRaster(sm, db, location);
416
  }
417
 
418
  /**
419
   * Returns the raster's parent.
420
   *
421
   * @return The raster's parent.
422
   */
423
  public Raster getParent()
424
  {
425
    return parent;
426
  }
427
 
428
  /**
429
   * Returns the x-translation.
430
   *
431
   * @return The x-translation.
432
   */
433
  public final int getSampleModelTranslateX()
434
  {
435
    return sampleModelTranslateX;
436
  }
437
 
438
  /**
439
   * Returns the y-translation.
440
   *
441
   * @return The y-translation.
442
   */
443
  public final int getSampleModelTranslateY()
444
  {
445
    return sampleModelTranslateY;
446
  }
447
 
448
  /**
449
   * Creates a new writable raster that is compatible with this raster.
450
   *
451
   * @return A new writable raster.
452
   */
453
  public WritableRaster createCompatibleWritableRaster()
454
  {
455
    return new WritableRaster(getSampleModel(), new Point(minX, minY));
456
  }
457
 
458
  /**
459
   * Creates a new writable raster that is compatible with this raster.
460
   *
461
   * @param w  the width.
462
   * @param h  the height.
463
   *
464
   * @return A new writable raster.
465
   */
466
  public WritableRaster createCompatibleWritableRaster(int w, int h)
467
  {
468
    return createCompatibleWritableRaster(minX, minY, w, h);
469
  }
470
 
471
  /**
472
   * Creates a new writable raster that is compatible with this raster, with
473
   * the specified bounds.
474
   *
475
   * @param rect  the raster bounds.
476
   *
477
   * @return A new writable raster.
478
   */
479
  public WritableRaster createCompatibleWritableRaster(Rectangle rect)
480
  {
481
    return createCompatibleWritableRaster(rect.x, rect.y,
482
                                          rect.width, rect.height);
483
  }
484
 
485
  /**
486
   * Creates a new writable raster that is compatible with this raster, with
487
   * the specified bounds.
488
   *
489
   * @param x  the x-coordinate of the top-left corner of the raster.
490
   * @param y  the y-coordinate of the top-left corner of the raster.
491
   * @param w  the raster width.
492
   * @param h  the raster height.
493
   *
494
   * @return A new writable raster.
495
   */
496
  public WritableRaster createCompatibleWritableRaster(int x, int y,
497
                                                       int w, int h)
498
  {
499
    SampleModel sm = getSampleModel().createCompatibleSampleModel(w, h);
500
    return new WritableRaster(sm, sm.createDataBuffer(), new Point(x, y));
501
  }
502
 
503
  public Raster createTranslatedChild(int childMinX, int childMinY) {
504
    int tcx = sampleModelTranslateX - minX + childMinX;
505
    int tcy = sampleModelTranslateY - minY + childMinY;
506
 
507
    return new Raster(sampleModel, dataBuffer,
508
                      new Rectangle(childMinX, childMinY, width, height),
509
                      new Point(tcx, tcy), this);
510
  }
511
 
512
  public Raster createChild(int parentX, int parentY, int width,
513
                            int height, int childMinX, int childMinY,
514
                            int[] bandList)
515
  {
516
    if (parentX < minX || parentX + width > minX + this.width
517
        || parentY < minY || parentY + height > minY + this.height)
518
      throw new RasterFormatException("Child raster extends beyond parent");
519
 
520
    SampleModel sm = (bandList == null) ?
521
      sampleModel :
522
      sampleModel.createSubsetSampleModel(bandList);
523
 
524
    /*
525
        data origin
526
       /
527
      +-------------------------
528
      |\. __ parent trans
529
      | \`.
530
      |  \ `.    parent origin
531
      |   \  `. /
532
      |   /\   +-------- - -
533
      |trans\ /<\-- deltaTrans
534
      |child +-+-\---- - -
535
      |     /|`|  \__ parent [x, y]
536
      |child | |`. \
537
      |origin| :  `.\
538
      |      |    / `\
539
      |      :   /    +
540
      | child [x, y]
541
 
542
      parent_xy - parent_trans = child_xy - child_trans
543
 
544
      child_trans = parent_trans + child_xy - parent_xy
545
    */
546
 
547
    return new Raster(sm, dataBuffer,
548
        new Rectangle(childMinX, childMinY, width, height),
549
        new Point(sampleModelTranslateX + childMinX - parentX,
550
                  sampleModelTranslateY + childMinY - parentY),
551
        this);
552
  }
553
 
554
  /**
555
   * Returns a new rectangle containing the bounds of this raster.
556
   *
557
   * @return A new rectangle containing the bounds of this raster.
558
   */
559
  public Rectangle getBounds()
560
  {
561
    return new Rectangle(minX, minY, width, height);
562
  }
563
 
564
  /**
565
   * Returns the x-coordinate of the top left corner of the raster.
566
   *
567
   * @return The x-coordinate of the top left corner of the raster.
568
   */
569
  public final int getMinX()
570
  {
571
    return minX;
572
  }
573
 
574
  /**
575
   * Returns the t-coordinate of the top left corner of the raster.
576
   *
577
   * @return The t-coordinate of the top left corner of the raster.
578
   */
579
  public final int getMinY()
580
  {
581
    return minY;
582
  }
583
 
584
  /**
585
   * Returns the width of the raster.
586
   *
587
   * @return The width of the raster.
588
   */
589
  public final int getWidth()
590
  {
591
    return width;
592
  }
593
 
594
  /**
595
   * Returns the height of the raster.
596
   *
597
   * @return The height of the raster.
598
   */
599
  public final int getHeight()
600
  {
601
    return height;
602
  }
603
 
604
  /**
605
   * Returns the number of bands for this raster.
606
   *
607
   * @return The number of bands.
608
   */
609
  public final int getNumBands()
610
  {
611
    return numBands;
612
  }
613
 
614
  public final int getNumDataElements()
615
  {
616
    return numDataElements;
617
  }
618
 
619
  /**
620
   * Returns the transfer type for the raster (this is determined by the
621
   * raster's sample model).
622
   *
623
   * @return The transfer type.
624
   */
625
  public final int getTransferType()
626
  {
627
    return sampleModel.getTransferType();
628
  }
629
 
630
  /**
631
   * Returns the data buffer that stores the pixel data for this raster.
632
   *
633
   * @return The data buffer.
634
   */
635
  public DataBuffer getDataBuffer()
636
  {
637
    return dataBuffer;
638
  }
639
 
640
  /**
641
   * Returns the sample model that accesses the data buffer (to extract pixel
642
   * data) for this raster.
643
   *
644
   * @return The sample model.
645
   */
646
  public SampleModel getSampleModel()
647
  {
648
    return sampleModel;
649
  }
650
 
651
  public Object getDataElements(int x, int y, Object outData)
652
  {
653
    return sampleModel.getDataElements(x - sampleModelTranslateX,
654
        y - sampleModelTranslateY, outData, dataBuffer);
655
  }
656
 
657
  public Object getDataElements(int x, int y, int w, int h, Object outData)
658
  {
659
    return sampleModel.getDataElements(x - sampleModelTranslateX,
660
        y - sampleModelTranslateY, w, h, outData, dataBuffer);
661
  }
662
 
663
  /**
664
   * Returns an array containing the samples for the pixel at (x, y) in the
665
   * raster.  If <code>iArray</code> is not <code>null</code>, it will be
666
   * populated with the sample values and returned as the result of
667
   * this function (this avoids allocating a new array instance).
668
   *
669
   * @param x  the x-coordinate of the pixel.
670
   * @param y  the y-coordinate of the pixel.
671
   * @param iArray  an array to populate with the sample values and return as
672
   *     the result (if <code>null</code>, a new array will be allocated).
673
   *
674
   * @return The pixel sample values.
675
   */
676
  public int[] getPixel(int x, int y, int[] iArray)
677
  {
678
    return sampleModel.getPixel(x - sampleModelTranslateX,
679
        y - sampleModelTranslateY, iArray, dataBuffer);
680
  }
681
 
682
  /**
683
   * Returns an array containing the samples for the pixel at (x, y) in the
684
   * raster.  If <code>fArray</code> is not <code>null</code>, it will be
685
   * populated with the sample values and returned as the result of
686
   * this function (this avoids allocating a new array instance).
687
   *
688
   * @param x  the x-coordinate of the pixel.
689
   * @param y  the y-coordinate of the pixel.
690
   * @param fArray  an array to populate with the sample values and return as
691
   *     the result (if <code>null</code>, a new array will be allocated).
692
   *
693
   * @return The pixel sample values.
694
   */
695
  public float[] getPixel(int x, int y, float[] fArray)
696
  {
697
    return sampleModel.getPixel(x - sampleModelTranslateX,
698
        y - sampleModelTranslateY, fArray, dataBuffer);
699
  }
700
 
701
  /**
702
   * Returns an array containing the samples for the pixel at (x, y) in the
703
   * raster.  If <code>dArray</code> is not <code>null</code>, it will be
704
   * populated with the sample values and returned as the result of
705
   * this function (this avoids allocating a new array instance).
706
   *
707
   * @param x  the x-coordinate of the pixel.
708
   * @param y  the y-coordinate of the pixel.
709
   * @param dArray  an array to populate with the sample values and return as
710
   *     the result (if <code>null</code>, a new array will be allocated).
711
   *
712
   * @return The pixel sample values.
713
   */
714
  public double[] getPixel(int x, int y, double[] dArray)
715
  {
716
    return sampleModel.getPixel(x - sampleModelTranslateX,
717
        y - sampleModelTranslateY, dArray, dataBuffer);
718
  }
719
 
720
  /**
721
   * Returns an array containing the samples for the pixels in the region
722
   * specified by (x, y, w, h) in the raster.  The array is ordered by pixels
723
   * (that is, all the samples for the first pixel are grouped together,
724
   * followed by all the samples for the second pixel, and so on).
725
   * If <code>iArray</code> is not <code>null</code>, it will be populated
726
   * with the sample values and returned as the result of this function (this
727
   * avoids allocating a new array instance).
728
   *
729
   * @param x  the x-coordinate of the top-left pixel.
730
   * @param y  the y-coordinate of the top-left pixel.
731
   * @param w  the width of the region of pixels.
732
   * @param h  the height of the region of pixels.
733
   * @param iArray  an array to populate with the sample values and return as
734
   *     the result (if <code>null</code>, a new array will be allocated).
735
   *
736
   * @return The pixel sample values.
737
   */
738
  public int[] getPixels(int x, int y, int w, int h, int[] iArray)
739
  {
740
    return sampleModel.getPixels(x - sampleModelTranslateX,
741
        y - sampleModelTranslateY, w, h, iArray, dataBuffer);
742
  }
743
 
744
  /**
745
   * Returns an array containing the samples for the pixels in the region
746
   * specified by (x, y, w, h) in the raster.  The array is ordered by pixels
747
   * (that is, all the samples for the first pixel are grouped together,
748
   * followed by all the samples for the second pixel, and so on).
749
   * If <code>fArray</code> is not <code>null</code>, it will be populated
750
   * with the sample values and returned as the result of this function (this
751
   * avoids allocating a new array instance).
752
   *
753
   * @param x  the x-coordinate of the top-left pixel.
754
   * @param y  the y-coordinate of the top-left pixel.
755
   * @param w  the width of the region of pixels.
756
   * @param h  the height of the region of pixels.
757
   * @param fArray  an array to populate with the sample values and return as
758
   *     the result (if <code>null</code>, a new array will be allocated).
759
   *
760
   * @return The pixel sample values.
761
   */
762
  public float[] getPixels(int x, int y, int w, int h, float[] fArray)
763
  {
764
    return sampleModel.getPixels(x - sampleModelTranslateX,
765
        y - sampleModelTranslateY, w, h, fArray, dataBuffer);
766
  }
767
 
768
  /**
769
   * Returns an array containing the samples for the pixels in the region
770
   * specified by (x, y, w, h) in the raster.  The array is ordered by pixels
771
   * (that is, all the samples for the first pixel are grouped together,
772
   * followed by all the samples for the second pixel, and so on).
773
   * If <code>dArray</code> is not <code>null</code>, it will be populated
774
   * with the sample values and returned as the result of this function (this
775
   * avoids allocating a new array instance).
776
   *
777
   * @param x  the x-coordinate of the top-left pixel.
778
   * @param y  the y-coordinate of the top-left pixel.
779
   * @param w  the width of the region of pixels.
780
   * @param h  the height of the region of pixels.
781
   * @param dArray  an array to populate with the sample values and return as
782
   *     the result (if <code>null</code>, a new array will be allocated).
783
   *
784
   * @return The pixel sample values.
785
   */
786
  public double[] getPixels(int x, int y, int w, int h, double[] dArray)
787
  {
788
    return sampleModel.getPixels(x - sampleModelTranslateX,
789
        y - sampleModelTranslateY, w, h, dArray, dataBuffer);
790
  }
791
 
792
  /**
793
   * Returns the sample value for the pixel at (x, y) in the raster.
794
   *
795
   * @param x  the x-coordinate of the pixel.
796
   * @param y  the y-coordinate of the pixel.
797
   * @param b  the band (in the range <code>0</code> to
798
   *     <code>getNumBands() - 1</code>).
799
   *
800
   * @return The sample value.
801
   */
802
  public int getSample(int x, int y, int b)
803
  {
804
    return sampleModel.getSample(x - sampleModelTranslateX,
805
        y - sampleModelTranslateY, b, dataBuffer);
806
  }
807
 
808
  /**
809
   * Returns the sample value for the pixel at (x, y) in the raster.
810
   *
811
   * @param x  the x-coordinate of the pixel.
812
   * @param y  the y-coordinate of the pixel.
813
   * @param b  the band (in the range <code>0</code> to
814
   *     <code>getNumBands() - 1</code>).
815
   *
816
   * @return The sample value.
817
   *
818
   * @see #getSample(int, int, int)
819
   */
820
  public float getSampleFloat(int x, int y, int b)
821
  {
822
    return sampleModel.getSampleFloat(x - sampleModelTranslateX,
823
        y - sampleModelTranslateY, b, dataBuffer);
824
  }
825
 
826
  /**
827
   * Returns the sample value for the pixel at (x, y) in the raster.
828
   *
829
   * @param x  the x-coordinate of the pixel.
830
   * @param y  the y-coordinate of the pixel.
831
   * @param b  the band (in the range <code>0</code> to
832
   *     <code>getNumBands() - 1</code>).
833
   *
834
   * @return The sample value.
835
   *
836
   * @see #getSample(int, int, int)
837
   */
838
  public double getSampleDouble(int x, int y, int b)
839
  {
840
    return sampleModel.getSampleDouble(x - sampleModelTranslateX,
841
        y - sampleModelTranslateY, b, dataBuffer);
842
  }
843
 
844
  /**
845
   * Returns an array containing the samples from one band for the pixels in
846
   * the region specified by (x, y, w, h) in the raster.  If
847
   * <code>iArray</code> is not <code>null</code>, it will be
848
   * populated with the sample values and returned as the result of this
849
   * function (this avoids allocating a new array instance).
850
   *
851
   * @param x  the x-coordinate of the top-left pixel.
852
   * @param y  the y-coordinate of the top-left pixel.
853
   * @param w  the width of the region of pixels.
854
   * @param h  the height of the region of pixels.
855
   * @param b  the band (in the range <code>0</code> to
856
   *     </code>getNumBands() - 1</code>).
857
   * @param iArray  an array to populate with the sample values and return as
858
   *     the result (if <code>null</code>, a new array will be allocated).
859
   *
860
   * @return The sample values.
861
   */
862
  public int[] getSamples(int x, int y, int w, int h, int b,
863
                          int[] iArray)
864
  {
865
    return sampleModel.getSamples(x - sampleModelTranslateX,
866
        y - sampleModelTranslateY, w, h, b, iArray, dataBuffer);
867
  }
868
 
869
  /**
870
   * Returns an array containing the samples from one band for the pixels in
871
   * the region specified by (x, y, w, h) in the raster.  If
872
   * <code>fArray</code> is not <code>null</code>, it will be
873
   * populated with the sample values and returned as the result of this
874
   * function (this avoids allocating a new array instance).
875
   *
876
   * @param x  the x-coordinate of the top-left pixel.
877
   * @param y  the y-coordinate of the top-left pixel.
878
   * @param w  the width of the region of pixels.
879
   * @param h  the height of the region of pixels.
880
   * @param b  the band (in the range <code>0</code> to
881
   *     </code>getNumBands() - 1</code>).
882
   * @param fArray  an array to populate with the sample values and return as
883
   *     the result (if <code>null</code>, a new array will be allocated).
884
   *
885
   * @return The sample values.
886
   */
887
  public float[] getSamples(int x, int y, int w, int h, int b, float[] fArray)
888
  {
889
    return sampleModel.getSamples(x - sampleModelTranslateX,
890
        y - sampleModelTranslateY, w, h, b, fArray, dataBuffer);
891
  }
892
 
893
  /**
894
   * Returns an array containing the samples from one band for the pixels in
895
   * the region specified by (x, y, w, h) in the raster.  If
896
   * <code>dArray</code> is not <code>null</code>, it will be
897
   * populated with the sample values and returned as the result of this
898
   * function (this avoids allocating a new array instance).
899
   *
900
   * @param x  the x-coordinate of the top-left pixel.
901
   * @param y  the y-coordinate of the top-left pixel.
902
   * @param w  the width of the region of pixels.
903
   * @param h  the height of the region of pixels.
904
   * @param b  the band (in the range <code>0</code> to
905
   *     </code>getNumBands() - 1</code>).
906
   * @param dArray  an array to populate with the sample values and return as
907
   *     the result (if <code>null</code>, a new array will be allocated).
908
   *
909
   * @return The sample values.
910
   */
911
  public double[] getSamples(int x, int y, int w, int h, int b,
912
                             double[] dArray)
913
  {
914
    return sampleModel.getSamples(x - sampleModelTranslateX,
915
        y - sampleModelTranslateY, w, h, b, dArray, dataBuffer);
916
  }
917
 
918
  /**
919
   * Create a String representing the state of this Raster.
920
   *
921
   * @return A String representing the stat of this Raster.
922
   */
923
  public String toString()
924
  {
925
    CPStringBuilder result = new CPStringBuilder();
926
 
927
    result.append(getClass().getName());
928
    result.append("[(");
929
    result.append(minX).append(",").append(minY).append("), ");
930
    result.append(width).append(" x ").append(height).append(",");
931
    result.append(sampleModel).append(",");
932
    result.append(dataBuffer);
933
    result.append("]");
934
 
935
    return result.toString();
936
  }
937
 
938
  /**
939
   * Returns the number of bits used to represent the specified data type.
940
   * Valid types are:
941
   * <ul>
942
   *   <li>{@link DataBuffer#TYPE_BYTE};</li>
943
   *   <li>{@link DataBuffer#TYPE_USHORT};</li>
944
   *   <li>{@link DataBuffer#TYPE_SHORT};</li>
945
   *   <li>{@link DataBuffer#TYPE_INT};</li>
946
   *   <li>{@link DataBuffer#TYPE_FLOAT};</li>
947
   *   <li>{@link DataBuffer#TYPE_DOUBLE};</li>
948
   * </ul>
949
   * This method returns 0 for invalid data types.
950
   *
951
   * @param dataType  the data type.
952
   *
953
   * @return The number of bits used to represent the specified data type.
954
   */
955
  private static int getTypeBits(int dataType)
956
  {
957
    switch (dataType)
958
      {
959
      case DataBuffer.TYPE_BYTE:
960
        return 8;
961
      case DataBuffer.TYPE_USHORT:
962
      case DataBuffer.TYPE_SHORT:
963
        return 16;
964
      case DataBuffer.TYPE_INT:
965
      case DataBuffer.TYPE_FLOAT:
966
        return 32;
967
      case DataBuffer.TYPE_DOUBLE:
968
        return 64;
969
      default:
970
        return 0;
971
      }
972
  }
973
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.