1 /*
   2  * Copyright (c) 1997, 2013, 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 import java.awt.Rectangle;
  38 import java.awt.Point;
  39 
  40 /**
  41  * This class extends Raster to provide pixel writing capabilities.
  42  * Refer to the class comment for Raster for descriptions of how
  43  * a Raster stores pixels.
  44  *
  45  * <p> The constructors of this class are protected.  To instantiate
  46  * a WritableRaster, use one of the createWritableRaster factory methods
  47  * in the Raster class.
  48  */
  49 public class WritableRaster extends Raster {
  50 
  51     /**
  52      *  Constructs a WritableRaster with the given SampleModel.  The
  53      *  WritableRaster's upper left corner is origin and it is the
  54      *  same size as the  SampleModel.  A DataBuffer large enough to
  55      *  describe the WritableRaster is automatically created.
  56      *  @param sampleModel     The SampleModel that specifies the layout.
  57      *  @param origin          The Point that specifies the origin.
  58      *  @throws RasterFormatException if computing either
  59      *          <code>origin.x + sampleModel.getWidth()</code> or
  60      *          <code>origin.y + sampleModel.getHeight()</code> results
  61      *          in integer overflow
  62      */
  63     protected WritableRaster(SampleModel sampleModel,
  64                              Point origin) {
  65         this(sampleModel,
  66              sampleModel.createDataBuffer(),
  67              new Rectangle(origin.x,
  68                            origin.y,
  69                            sampleModel.getWidth(),
  70                            sampleModel.getHeight()),
  71              origin,
  72              null);
  73     }
  74 
  75     /**
  76      *  Constructs a WritableRaster with the given SampleModel and DataBuffer.
  77      *  The WritableRaster's upper left corner is origin and it is the same
  78      *  size as the SampleModel.  The DataBuffer is not initialized and must
  79      *  be compatible with SampleModel.
  80      *  @param sampleModel     The SampleModel that specifies the layout.
  81      *  @param dataBuffer      The DataBuffer that contains the image data.
  82      *  @param origin          The Point that specifies the origin.
  83      *  @throws RasterFormatException if computing either
  84      *          <code>origin.x + sampleModel.getWidth()</code> or
  85      *          <code>origin.y + sampleModel.getHeight()</code> results
  86      *          in integer overflow
  87      */
  88     protected WritableRaster(SampleModel sampleModel,
  89                              DataBuffer dataBuffer,
  90                              Point origin) {
  91         this(sampleModel,
  92              dataBuffer,
  93              new Rectangle(origin.x,
  94                            origin.y,
  95                            sampleModel.getWidth(),
  96                            sampleModel.getHeight()),
  97              origin,
  98              null);
  99     }
 100 
 101     /**
 102      * Constructs a WritableRaster with the given SampleModel, DataBuffer,
 103      * and parent.  aRegion specifies the bounding rectangle of the new
 104      * Raster.  When translated into the base Raster's coordinate
 105      * system, aRegion must be contained by the base Raster.
 106      * (The base Raster is the Raster's ancestor which has no parent.)
 107      * sampleModelTranslate specifies the sampleModelTranslateX and
 108      * sampleModelTranslateY values of the new Raster.
 109      *
 110      * Note that this constructor should generally be called by other
 111      * constructors or create methods, it should not be used directly.
 112      * @param sampleModel     The SampleModel that specifies the layout.
 113      * @param dataBuffer      The DataBuffer that contains the image data.
 114      * @param aRegion         The Rectangle that specifies the image area.
 115      * @param sampleModelTranslate  The Point that specifies the translation
 116      *                        from SampleModel to Raster coordinates.
 117      * @param parent          The parent (if any) of this raster.
 118      * @throws RasterFormatException if <code>aRegion</code> has width
 119      *         or height less than or equal to zero, or computing either
 120      *         <code>aRegion.x + aRegion.width</code> or
 121      *         <code>aRegion.y + aRegion.height</code> results in integer
 122      *         overflow
 123      */
 124     protected WritableRaster(SampleModel sampleModel,
 125                              DataBuffer dataBuffer,
 126                              Rectangle aRegion,
 127                              Point sampleModelTranslate,
 128                              WritableRaster parent){
 129         super(sampleModel,dataBuffer,aRegion,sampleModelTranslate,parent);
 130     }
 131 
 132     /** Returns the parent WritableRaster (if any) of this WritableRaster,
 133      *  or else null.
 134      *  @return the parent of this <code>WritableRaster</code>, or
 135      *          <code>null</code>.
 136      */
 137     public WritableRaster getWritableParent() {
 138         return (WritableRaster)parent;
 139     }
 140 
 141     /**
 142      * Create a WritableRaster with the same size, SampleModel and DataBuffer
 143      * as this one, but with a different location.  The new WritableRaster
 144      * will possess a reference to the current WritableRaster, accessible
 145      * through its getParent() and getWritableParent() methods.
 146      *
 147      * @param childMinX X coord of the upper left corner of the new Raster.
 148      * @param childMinY Y coord of the upper left corner of the new Raster.
 149      * @return a <code>WritableRaster</code> the same as this one except
 150      *         for the specified location.
 151      * @throws RasterFormatException if  computing either
 152      *         <code>childMinX + this.getWidth()</code> or
 153      *         <code>childMinY + this.getHeight()</code> results in integer
 154      *         overflow
 155      */
 156     public WritableRaster createWritableTranslatedChild(int childMinX,
 157                                                         int childMinY) {
 158         return createWritableChild(minX,minY,width,height,
 159                                    childMinX,childMinY,null);
 160     }
 161 
 162     /**
 163      * Returns a new WritableRaster which shares all or part of this
 164      * WritableRaster's DataBuffer.  The new WritableRaster will
 165      * possess a reference to the current WritableRaster, accessible
 166      * through its getParent() and getWritableParent() methods.
 167      *
 168      * <p> The parentX, parentY, width and height parameters form a
 169      * Rectangle in this WritableRaster's coordinate space, indicating
 170      * the area of pixels to be shared.  An error will be thrown if
 171      * this Rectangle is not contained with the bounds of the current
 172      * WritableRaster.
 173      *
 174      * <p> The new WritableRaster may additionally be translated to a
 175      * different coordinate system for the plane than that used by the current
 176      * WritableRaster.  The childMinX and childMinY parameters give
 177      * the new (x, y) coordinate of the upper-left pixel of the
 178      * returned WritableRaster; the coordinate (childMinX, childMinY)
 179      * in the new WritableRaster will map to the same pixel as the
 180      * coordinate (parentX, parentY) in the current WritableRaster.
 181      *
 182      * <p> The new WritableRaster may be defined to contain only a
 183      * subset of the bands of the current WritableRaster, possibly
 184      * reordered, by means of the bandList parameter.  If bandList is
 185      * null, it is taken to include all of the bands of the current
 186      * WritableRaster in their current order.
 187      *
 188      * <p> To create a new WritableRaster that contains a subregion of
 189      * the current WritableRaster, but shares its coordinate system
 190      * and bands, this method should be called with childMinX equal to
 191      * parentX, childMinY equal to parentY, and bandList equal to
 192      * null.
 193      *
 194      * @param parentX    X coordinate of the upper left corner in this
 195      *                   WritableRaster's coordinates.
 196      * @param parentY    Y coordinate of the upper left corner in this
 197      *                   WritableRaster's coordinates.
 198      * @param w          Width of the region starting at (parentX, parentY).
 199      * @param h          Height of the region starting at (parentX, parentY).
 200      * @param childMinX  X coordinate of the upper left corner of
 201      *                   the returned WritableRaster.
 202      * @param childMinY  Y coordinate of the upper left corner of
 203      *                   the returned WritableRaster.
 204      * @param bandList   Array of band indices, or null to use all bands.
 205      * @return a <code>WritableRaster</code> sharing all or part of the
 206      *         <code>DataBuffer</code> of this <code>WritableRaster</code>.
 207      * @exception RasterFormatException if the subregion is outside of the
 208      *                               raster bounds.
 209      * @throws RasterFormatException if <code>w</code> or
 210      *         <code>h</code>
 211      *         is less than or equal to zero, or computing any of
 212      *         <code>parentX + w</code>, <code>parentY + h</code>,
 213      *         <code>childMinX + w</code>, or
 214      *         <code>childMinY + h</code> results in integer
 215      *         overflow
 216      */
 217     public WritableRaster createWritableChild(int parentX, int parentY,
 218                                               int w, int h,
 219                                               int childMinX, int childMinY,
 220                                               int bandList[]) {
 221         if (parentX < this.minX) {
 222             throw new RasterFormatException("parentX lies outside raster");
 223         }
 224         if (parentY < this.minY) {
 225             throw new RasterFormatException("parentY lies outside raster");
 226         }
 227         if ((parentX+w < parentX) || (parentX+w > this.width + this.minX)) {
 228             throw new RasterFormatException("(parentX + width) is outside raster");
 229         }
 230         if ((parentY+h < parentY) || (parentY+h > this.height + this.minY)) {
 231             throw new RasterFormatException("(parentY + height) is outside raster");
 232         }
 233 
 234         SampleModel sm;
 235         // Note: the SampleModel for the child Raster should have the same
 236         // width and height as that for the parent, since it represents
 237         // the physical layout of the pixel data.  The child Raster's width
 238         // and height represent a "virtual" view of the pixel data, so
 239         // they may be different than those of the SampleModel.
 240         if (bandList != null) {
 241             sm = sampleModel.createSubsetSampleModel(bandList);
 242         }
 243         else {
 244             sm = sampleModel;
 245         }
 246 
 247         int deltaX = childMinX - parentX;
 248         int deltaY = childMinY - parentY;
 249 
 250         return new WritableRaster(sm,
 251                                   getDataBuffer(),
 252                                   new Rectangle(childMinX,childMinY,
 253                                                 w, h),
 254                                   new Point(sampleModelTranslateX+deltaX,
 255                                             sampleModelTranslateY+deltaY),
 256                                   this);
 257     }
 258 
 259     /**
 260      * Sets the data for a single pixel from a
 261      * primitive array of type TransferType.  For image data supported by
 262      * the Java 2D(tm) API, this will be one of DataBuffer.TYPE_BYTE,
 263      * DataBuffer.TYPE_USHORT, DataBuffer.TYPE_INT, DataBuffer.TYPE_SHORT,
 264      * DataBuffer.TYPE_FLOAT, or DataBuffer.TYPE_DOUBLE.  Data in the array
 265      * may be in a packed format, thus increasing efficiency for data
 266      * transfers.
 267      * An ArrayIndexOutOfBoundsException may be thrown if the coordinates are
 268      * not in bounds, or if inData is not large enough to hold the pixel data.
 269      * However, explicit bounds checking is not guaranteed.
 270      * A ClassCastException will be thrown if the input object is not null
 271      * and references anything other than an array of TransferType.
 272      * @see java.awt.image.SampleModel#setDataElements(int, int, Object, DataBuffer)
 273      * @param x        The X coordinate of the pixel location.
 274      * @param y        The Y coordinate of the pixel location.
 275      * @param inData   An object reference to an array of type defined by
 276      *                 getTransferType() and length getNumDataElements()
 277      *                 containing the pixel data to place at x,y.
 278      *
 279      * @throws ArrayIndexOutOfBoundsException if the coordinates are not
 280      * in bounds, or if inData is too small to hold the input.
 281      */
 282     public void setDataElements(int x, int y, Object inData) {
 283         sampleModel.setDataElements(x-sampleModelTranslateX,
 284                                     y-sampleModelTranslateY,
 285                                     inData, dataBuffer);
 286     }
 287 
 288     /**
 289      * Sets the data for a rectangle of pixels from an input Raster.
 290      * The input Raster must be compatible with this WritableRaster
 291      * in that they must have the same number of bands, corresponding bands
 292      * must have the same number of bits per sample, the TransferTypes
 293      * and NumDataElements must be the same, and the packing used by
 294      * the getDataElements/setDataElements must be identical.
 295      * An ArrayIndexOutOfBoundsException may be thrown if the coordinates are
 296      * not in bounds.
 297      * However, explicit bounds checking is not guaranteed.
 298      * @param x        The X coordinate of the pixel location.
 299      * @param y        The Y coordinate of the pixel location.
 300      * @param inRaster Raster containing data to place at x,y.
 301      *
 302      * @throws NullPointerException if inRaster is null.
 303      * @throws ArrayIndexOutOfBoundsException if the coordinates are not
 304      * in bounds.
 305      */
 306     public void setDataElements(int x, int y, Raster inRaster) {
 307         int dstOffX = x+inRaster.getMinX();
 308         int dstOffY = y+inRaster.getMinY();
 309         int width  = inRaster.getWidth();
 310         int height = inRaster.getHeight();
 311         if ((dstOffX < this.minX) || (dstOffY < this.minY) ||
 312             (dstOffX + width > this.minX + this.width) ||
 313             (dstOffY + height > this.minY + this.height)) {
 314             throw new ArrayIndexOutOfBoundsException
 315                 ("Coordinate out of bounds!");
 316         }
 317 
 318         int srcOffX = inRaster.getMinX();
 319         int srcOffY = inRaster.getMinY();
 320         Object tdata = null;
 321 
 322         for (int startY=0; startY < height; startY++) {
 323             tdata = inRaster.getDataElements(srcOffX, srcOffY+startY,
 324                                              width, 1, tdata);
 325             setDataElements(dstOffX, dstOffY+startY,
 326                             width, 1, tdata);
 327         }
 328     }
 329 
 330     /**
 331      * Sets the data for a rectangle of pixels from a
 332      * primitive array of type TransferType.  For image data supported by
 333      * the Java 2D API, this will be one of DataBuffer.TYPE_BYTE,
 334      * DataBuffer.TYPE_USHORT, DataBuffer.TYPE_INT, DataBuffer.TYPE_SHORT,
 335      * DataBuffer.TYPE_FLOAT, or DataBuffer.TYPE_DOUBLE.  Data in the array
 336      * may be in a packed format, thus increasing efficiency for data
 337      * transfers.
 338      * An ArrayIndexOutOfBoundsException may be thrown if the coordinates are
 339      * not in bounds, or if inData is not large enough to hold the pixel data.
 340      * However, explicit bounds checking is not guaranteed.
 341      * A ClassCastException will be thrown if the input object is not null
 342      * and references anything other than an array of TransferType.
 343      * @see java.awt.image.SampleModel#setDataElements(int, int, int, int, Object, DataBuffer)
 344      * @param x        The X coordinate of the upper left pixel location.
 345      * @param y        The Y coordinate of the upper left pixel location.
 346      * @param w        Width of the pixel rectangle.
 347      * @param h        Height of the pixel rectangle.
 348      * @param inData   An object reference to an array of type defined by
 349      *                 getTransferType() and length w*h*getNumDataElements()
 350      *                 containing the pixel data to place between x,y and
 351      *                 x+w-1, y+h-1.
 352      *
 353      * @throws NullPointerException if inData is null.
 354      * @throws ArrayIndexOutOfBoundsException if the coordinates are not
 355      * in bounds, or if inData is too small to hold the input.
 356      */
 357     public void setDataElements(int x, int y, int w, int h, Object inData) {
 358         sampleModel.setDataElements(x-sampleModelTranslateX,
 359                                     y-sampleModelTranslateY,
 360                                     w,h,inData,dataBuffer);
 361     }
 362 
 363     /**
 364      * Copies pixels from Raster srcRaster to this WritableRaster.  Each pixel
 365      * in srcRaster is copied to the same x,y address in this raster, unless
 366      * the address falls outside the bounds of this raster.  srcRaster
 367      * must have the same number of bands as this WritableRaster.  The
 368      * copy is a simple copy of source samples to the corresponding destination
 369      * samples.
 370      * <p>
 371      * If all samples of both source and destination Rasters are of
 372      * integral type and less than or equal to 32 bits in size, then calling
 373      * this method is equivalent to executing the following code for all
 374      * <code>x,y</code> addresses valid in both Rasters.
 375      * <pre>{@code
 376      *       Raster srcRaster;
 377      *       WritableRaster dstRaster;
 378      *       for (int b = 0; b < srcRaster.getNumBands(); b++) {
 379      *           dstRaster.setSample(x, y, b, srcRaster.getSample(x, y, b));
 380      *       }
 381      * }</pre>
 382      * Thus, when copying an integral type source to an integral type
 383      * destination, if the source sample size is greater than the destination
 384      * sample size for a particular band, the high order bits of the source
 385      * sample are truncated.  If the source sample size is less than the
 386      * destination size for a particular band, the high order bits of the
 387      * destination are zero-extended or sign-extended depending on whether
 388      * srcRaster's SampleModel treats the sample as a signed or unsigned
 389      * quantity.
 390      * <p>
 391      * When copying a float or double source to an integral type destination,
 392      * each source sample is cast to the destination type.  When copying an
 393      * integral type source to a float or double destination, the source
 394      * is first converted to a 32-bit int (if necessary), using the above
 395      * rules for integral types, and then the int is cast to float or
 396      * double.
 397      * <p>
 398      * @param srcRaster  The  Raster from which to copy pixels.
 399      *
 400      * @throws NullPointerException if srcRaster is null.
 401      */
 402     public void setRect(Raster srcRaster) {
 403         setRect(0,0,srcRaster);
 404     }
 405 
 406     /**
 407      * Copies pixels from Raster srcRaster to this WritableRaster.
 408      * For each (x, y) address in srcRaster, the corresponding pixel
 409      * is copied to address (x+dx, y+dy) in this WritableRaster,
 410      * unless (x+dx, y+dy) falls outside the bounds of this raster.
 411      * srcRaster must have the same number of bands as this WritableRaster.
 412      * The copy is a simple copy of source samples to the corresponding
 413      * destination samples.  For details, see
 414      * {@link WritableRaster#setRect(Raster)}.
 415      *
 416      * @param dx        The X translation factor from src space to dst space
 417      *                  of the copy.
 418      * @param dy        The Y translation factor from src space to dst space
 419      *                  of the copy.
 420      * @param srcRaster The Raster from which to copy pixels.
 421      *
 422      * @throws NullPointerException if srcRaster is null.
 423      */
 424     public void setRect(int dx, int dy, Raster srcRaster) {
 425         int width  = srcRaster.getWidth();
 426         int height = srcRaster.getHeight();
 427         int srcOffX = srcRaster.getMinX();
 428         int srcOffY = srcRaster.getMinY();
 429         int dstOffX = dx+srcOffX;
 430         int dstOffY = dy+srcOffY;
 431 
 432         // Clip to this raster
 433         if (dstOffX < this.minX) {
 434             int skipX = this.minX - dstOffX;
 435             width -= skipX;
 436             srcOffX += skipX;
 437             dstOffX = this.minX;
 438         }
 439         if (dstOffY < this.minY) {
 440             int skipY = this.minY - dstOffY;
 441             height -= skipY;
 442             srcOffY += skipY;
 443             dstOffY = this.minY;
 444         }
 445         if (dstOffX+width > this.minX+this.width) {
 446             width = this.minX + this.width - dstOffX;
 447         }
 448         if (dstOffY+height > this.minY+this.height) {
 449             height = this.minY + this.height - dstOffY;
 450         }
 451 
 452         if (width <= 0 || height <= 0) {
 453             return;
 454         }
 455 
 456         switch (srcRaster.getSampleModel().getDataType()) {
 457         case DataBuffer.TYPE_BYTE:
 458         case DataBuffer.TYPE_SHORT:
 459         case DataBuffer.TYPE_USHORT:
 460         case DataBuffer.TYPE_INT:
 461             int[] iData = null;
 462             for (int startY=0; startY < height; startY++) {
 463                 // Grab one scanline at a time
 464                 iData =
 465                     srcRaster.getPixels(srcOffX, srcOffY+startY, width, 1,
 466                                         iData);
 467                 setPixels(dstOffX, dstOffY+startY, width, 1, iData);
 468             }
 469             break;
 470 
 471         case DataBuffer.TYPE_FLOAT:
 472             float[] fData = null;
 473             for (int startY=0; startY < height; startY++) {
 474                 fData =
 475                     srcRaster.getPixels(srcOffX, srcOffY+startY, width, 1,
 476                                         fData);
 477                 setPixels(dstOffX, dstOffY+startY, width, 1, fData);
 478             }
 479             break;
 480 
 481         case DataBuffer.TYPE_DOUBLE:
 482             double[] dData = null;
 483             for (int startY=0; startY < height; startY++) {
 484                 // Grab one scanline at a time
 485                 dData =
 486                     srcRaster.getPixels(srcOffX, srcOffY+startY, width, 1,
 487                                         dData);
 488                 setPixels(dstOffX, dstOffY+startY, width, 1, dData);
 489             }
 490             break;
 491         }
 492     }
 493 
 494     /**
 495      * Sets a pixel in the DataBuffer using an int array of samples for input.
 496      * An ArrayIndexOutOfBoundsException may be thrown if the coordinates are
 497      * not in bounds.
 498      * However, explicit bounds checking is not guaranteed.
 499      * @param x      The X coordinate of the pixel location.
 500      * @param y      The Y coordinate of the pixel location.
 501      * @param iArray The input samples in a int array.
 502      *
 503      * @throws NullPointerException if iArray is null.
 504      * @throws ArrayIndexOutOfBoundsException if the coordinates are not
 505      * in bounds, or if iArray is too small to hold the input.
 506      */
 507     public void setPixel(int x, int y, int iArray[]) {
 508         sampleModel.setPixel(x-sampleModelTranslateX,y-sampleModelTranslateY,
 509                              iArray,dataBuffer);
 510     }
 511 
 512     /**
 513      * Sets a pixel in the DataBuffer using a float array of samples for input.
 514      * An ArrayIndexOutOfBoundsException may be thrown if the coordinates are
 515      * not in bounds.
 516      * However, explicit bounds checking is not guaranteed.
 517      * @param x      The X coordinate of the pixel location.
 518      * @param y      The Y coordinate of the pixel location.
 519      * @param fArray The input samples in a float array.
 520      *
 521      * @throws NullPointerException if fArray is null.
 522      * @throws ArrayIndexOutOfBoundsException if the coordinates are not
 523      * in bounds, or if fArray is too small to hold the input.
 524      */
 525     public void setPixel(int x, int y, float fArray[]) {
 526         sampleModel.setPixel(x-sampleModelTranslateX,y-sampleModelTranslateY,
 527                              fArray,dataBuffer);
 528     }
 529 
 530     /**
 531      * Sets a pixel in the DataBuffer using a double array of samples for input.
 532      * An ArrayIndexOutOfBoundsException may be thrown if the coordinates are
 533      * not in bounds.
 534      * However, explicit bounds checking is not guaranteed.
 535      * @param x      The X coordinate of the pixel location.
 536      * @param y      The Y coordinate of the pixel location.
 537      * @param dArray The input samples in a double array.
 538      *
 539      * @throws NullPointerException if dArray is null.
 540      * @throws ArrayIndexOutOfBoundsException if the coordinates are not
 541      * in bounds, or if dArray is too small to hold the input.
 542      */
 543     public void setPixel(int x, int y, double dArray[]) {
 544         sampleModel.setPixel(x-sampleModelTranslateX,y-sampleModelTranslateY,
 545                              dArray,dataBuffer);
 546     }
 547 
 548     /**
 549      * Sets all samples for a rectangle of pixels from an int array containing
 550      * one sample per array element.
 551      * An ArrayIndexOutOfBoundsException may be thrown if the coordinates are
 552      * not in bounds.
 553      * However, explicit bounds checking is not guaranteed.
 554      * @param x        The X coordinate of the upper left pixel location.
 555      * @param y        The Y coordinate of the upper left pixel location.
 556      * @param w        Width of the pixel rectangle.
 557      * @param h        Height of the pixel rectangle.
 558      * @param iArray   The input int pixel array.
 559      *
 560      * @throws NullPointerException if iArray is null.
 561      * @throws ArrayIndexOutOfBoundsException if the coordinates are not
 562      * in bounds, or if iArray is too small to hold the input.
 563      */
 564     public void setPixels(int x, int y, int w, int h, int iArray[]) {
 565         sampleModel.setPixels(x-sampleModelTranslateX,y-sampleModelTranslateY,
 566                               w,h,iArray,dataBuffer);
 567     }
 568 
 569     /**
 570      * Sets all samples for a rectangle of pixels from a float array containing
 571      * one sample per array element.
 572      * An ArrayIndexOutOfBoundsException may be thrown if the coordinates are
 573      * not in bounds.
 574      * However, explicit bounds checking is not guaranteed.
 575      * @param x        The X coordinate of the upper left pixel location.
 576      * @param y        The Y coordinate of the upper left pixel location.
 577      * @param w        Width of the pixel rectangle.
 578      * @param h        Height of the pixel rectangle.
 579      * @param fArray   The input float pixel array.
 580      *
 581      * @throws NullPointerException if fArray is null.
 582      * @throws ArrayIndexOutOfBoundsException if the coordinates are not
 583      * in bounds, or if fArray is too small to hold the input.
 584      */
 585     public void setPixels(int x, int y, int w, int h, float fArray[]) {
 586         sampleModel.setPixels(x-sampleModelTranslateX,y-sampleModelTranslateY,
 587                               w,h,fArray,dataBuffer);
 588     }
 589 
 590     /**
 591      * Sets all samples for a rectangle of pixels from a double array containing
 592      * one sample per array element.
 593      * An ArrayIndexOutOfBoundsException may be thrown if the coordinates are
 594      * not in bounds.
 595      * However, explicit bounds checking is not guaranteed.
 596      * @param x        The X coordinate of the upper left pixel location.
 597      * @param y        The Y coordinate of the upper left pixel location.
 598      * @param w        Width of the pixel rectangle.
 599      * @param h        Height of the pixel rectangle.
 600      * @param dArray   The input double pixel array.
 601      *
 602      * @throws NullPointerException if dArray is null.
 603      * @throws ArrayIndexOutOfBoundsException if the coordinates are not
 604      * in bounds, or if dArray is too small to hold the input.
 605      */
 606     public void setPixels(int x, int y, int w, int h, double dArray[]) {
 607         sampleModel.setPixels(x-sampleModelTranslateX,y-sampleModelTranslateY,
 608                               w,h,dArray,dataBuffer);
 609     }
 610 
 611     /**
 612      * Sets a sample in the specified band for the pixel located at (x,y)
 613      * in the DataBuffer using an int for input.
 614      * An ArrayIndexOutOfBoundsException may be thrown if the coordinates are
 615      * not in bounds.
 616      * However, explicit bounds checking is not guaranteed.
 617      * @param x        The X coordinate of the pixel location.
 618      * @param y        The Y coordinate of the pixel location.
 619      * @param b        The band to set.
 620      * @param s        The input sample.
 621      *
 622      * @throws ArrayIndexOutOfBoundsException if the coordinates or
 623      * the band index are not in bounds.
 624      */
 625     public void setSample(int x, int y, int b, int s) {
 626         sampleModel.setSample(x-sampleModelTranslateX,
 627                               y-sampleModelTranslateY, b, s,
 628                               dataBuffer);
 629     }
 630 
 631     /**
 632      * Sets a sample in the specified band for the pixel located at (x,y)
 633      * in the DataBuffer using a float for input.
 634      * An ArrayIndexOutOfBoundsException may be thrown if the coordinates are
 635      * not in bounds.
 636      * However, explicit bounds checking is not guaranteed.
 637      * @param x        The X coordinate of the pixel location.
 638      * @param y        The Y coordinate of the pixel location.
 639      * @param b        The band to set.
 640      * @param s        The input sample as a float.
 641      *
 642      * @throws ArrayIndexOutOfBoundsException if the coordinates or
 643      * the band index are not in bounds.
 644      */
 645     public void setSample(int x, int y, int b, float s){
 646         sampleModel.setSample(x-sampleModelTranslateX,y-sampleModelTranslateY,
 647                               b,s,dataBuffer);
 648     }
 649 
 650     /**
 651      * Sets a sample in the specified band for the pixel located at (x,y)
 652      * in the DataBuffer using a double for input.
 653      * An ArrayIndexOutOfBoundsException may be thrown if the coordinates are
 654      * not in bounds.
 655      * However, explicit bounds checking is not guaranteed.
 656      * @param x        The X coordinate of the pixel location.
 657      * @param y        The Y coordinate of the pixel location.
 658      * @param b        The band to set.
 659      * @param s        The input sample as a double.
 660      *
 661      * @throws ArrayIndexOutOfBoundsException if the coordinates or
 662      * the band index are not in bounds.
 663      */
 664     public void setSample(int x, int y, int b, double s){
 665         sampleModel.setSample(x-sampleModelTranslateX,y-sampleModelTranslateY,
 666                                     b,s,dataBuffer);
 667     }
 668 
 669     /**
 670      * Sets the samples in the specified band for the specified rectangle
 671      * of pixels from an int array containing one sample per array element.
 672      * An ArrayIndexOutOfBoundsException may be thrown if the coordinates are
 673      * not in bounds.
 674      * However, explicit bounds checking is not guaranteed.
 675      * @param x        The X coordinate of the upper left pixel location.
 676      * @param y        The Y coordinate of the upper left pixel location.
 677      * @param w        Width of the pixel rectangle.
 678      * @param h        Height of the pixel rectangle.
 679      * @param b        The band to set.
 680      * @param iArray   The input int sample array.
 681      *
 682      * @throws NullPointerException if iArray is null.
 683      * @throws ArrayIndexOutOfBoundsException if the coordinates or
 684      * the band index are not in bounds, or if iArray is too small to
 685      * hold the input.
 686      */
 687     public void setSamples(int x, int y, int w, int h, int b,
 688                            int iArray[]) {
 689         sampleModel.setSamples(x-sampleModelTranslateX,y-sampleModelTranslateY,
 690                                w,h,b,iArray,dataBuffer);
 691     }
 692 
 693     /**
 694      * Sets the samples in the specified band for the specified rectangle
 695      * of pixels from a float array containing one sample per array element.
 696      * An ArrayIndexOutOfBoundsException may be thrown if the coordinates are
 697      * not in bounds.
 698      * However, explicit bounds checking is not guaranteed.
 699      * @param x        The X coordinate of the upper left pixel location.
 700      * @param y        The Y coordinate of the upper left pixel location.
 701      * @param w        Width of the pixel rectangle.
 702      * @param h        Height of the pixel rectangle.
 703      * @param b        The band to set.
 704      * @param fArray   The input float sample array.
 705      *
 706      * @throws NullPointerException if fArray is null.
 707      * @throws ArrayIndexOutOfBoundsException if the coordinates or
 708      * the band index are not in bounds, or if fArray is too small to
 709      * hold the input.
 710      */
 711     public void setSamples(int x, int y, int w, int h, int b,
 712                            float fArray[]) {
 713         sampleModel.setSamples(x-sampleModelTranslateX,y-sampleModelTranslateY,
 714                                w,h,b,fArray,dataBuffer);
 715     }
 716 
 717     /**
 718      * Sets the samples in the specified band for the specified rectangle
 719      * of pixels from a double array containing one sample per array element.
 720      * An ArrayIndexOutOfBoundsException may be thrown if the coordinates are
 721      * not in bounds.
 722      * However, explicit bounds checking is not guaranteed.
 723      * @param x        The X coordinate of the upper left pixel location.
 724      * @param y        The Y coordinate of the upper left pixel location.
 725      * @param w        Width of the pixel rectangle.
 726      * @param h        Height of the pixel rectangle.
 727      * @param b        The band to set.
 728      * @param dArray   The input double sample array.
 729      *
 730      * @throws NullPointerException if dArray is null.
 731      * @throws ArrayIndexOutOfBoundsException if the coordinates or
 732      * the band index are not in bounds, or if dArray is too small to
 733      * hold the input.
 734      */
 735     public void setSamples(int x, int y, int w, int h, int b,
 736                            double dArray[]) {
 737         sampleModel.setSamples(x-sampleModelTranslateX,y-sampleModelTranslateY,
 738                               w,h,b,dArray,dataBuffer);
 739     }
 740 
 741 }