| 1 7 8 17 18 19 package java.awt.image; 20 import java.awt.Rectangle ; 21 import java.awt.Point ; 22 23 import sun.awt.image.ByteInterleavedRaster; 24 import sun.awt.image.ShortInterleavedRaster; 25 import sun.awt.image.IntegerInterleavedRaster; 26 import sun.awt.image.ByteBandedRaster; 27 import sun.awt.image.ShortBandedRaster; 28 import sun.awt.image.BytePackedRaster; 29 import sun.awt.image.SunWritableRaster; 30 31 108 public class Raster { 109 110 114 protected SampleModel sampleModel; 115 116 117 protected DataBuffer dataBuffer; 118 119 120 protected int minX; 121 122 123 protected int minY; 124 125 126 protected int width; 127 128 129 protected int height; 130 131 135 protected int sampleModelTranslateX; 136 137 141 protected int sampleModelTranslateY; 142 143 144 protected int numBands; 145 146 147 protected int numDataElements; 148 149 150 protected Raster parent; 151 152 static private native void initIDs(); 153 static { 154 ColorModel.loadLibraries(); 155 initIDs(); 156 } 157 158 186 public static WritableRaster createInterleavedRaster(int dataType, 187 int w, int h, 188 int bands, 189 Point location) { 190 int[] bandOffsets = new int[bands]; 191 for (int i = 0; i < bands; i++) { 192 bandOffsets[i] = i; 193 } 194 return createInterleavedRaster(dataType, w, h, w*bands, bands, 195 bandOffsets, location); 196 } 197 198 235 public static WritableRaster createInterleavedRaster(int dataType, 236 int w, int h, 237 int scanlineStride, 238 int pixelStride, 239 int bandOffsets[], 240 Point location) { 241 DataBuffer d; 242 int bands = bandOffsets.length; 243 244 int maxBandOff = bandOffsets[0]; 245 for (int i=1; i < bands; i++) { 246 if (bandOffsets[i] > maxBandOff) { 247 maxBandOff = bandOffsets[i]; 248 } 249 } 250 int size = maxBandOff + scanlineStride*(h-1) + pixelStride*(w-1) + 1; 251 switch(dataType) { 252 case DataBuffer.TYPE_BYTE: 253 d = new DataBufferByte (size); 254 break; 255 256 case DataBuffer.TYPE_USHORT: 257 d = new DataBufferUShort (size); 258 break; 259 260 default: 261 throw new IllegalArgumentException ("Unsupported data type " + 262 dataType); 263 } 264 265 SunWritableRaster raster = (SunWritableRaster) 266 createInterleavedRaster(d, w, h, scanlineStride, 267 pixelStride, bandOffsets, location); 268 raster.setStolen(false); 269 return raster; 270 } 271 272 298 public static WritableRaster createBandedRaster(int dataType, 299 int w, int h, 300 int bands, 301 Point location) { 302 if (bands < 1) { 303 throw new ArrayIndexOutOfBoundsException ("Number of bands ("+ 304 bands+") must"+ 305 " be greater than 0"); 306 } 307 int[] bankIndices = new int[bands]; 308 int[] bandOffsets = new int[bands]; 309 for (int i = 0; i < bands; i++) { 310 bankIndices[i] = i; 311 bandOffsets[i] = 0; 312 } 313 314 return createBandedRaster(dataType, w, h, w, 315 bankIndices, bandOffsets, 316 location); 317 } 318 319 355 public static WritableRaster createBandedRaster(int dataType, 356 int w, int h, 357 int scanlineStride, 358 int bankIndices[], 359 int bandOffsets[], 360 Point location) { 361 DataBuffer d; 362 int bands = bandOffsets.length; 363 364 if (bankIndices == null) { 365 throw new 366 ArrayIndexOutOfBoundsException ("Bank indices array is null"); 367 } 368 if (bandOffsets == null) { 369 throw new 370 ArrayIndexOutOfBoundsException ("Band offsets array is null"); 371 } 372 373 int maxBank = bankIndices[0]; 375 int maxBandOff = bandOffsets[0]; 376 for (int i = 1; i < bands; i++) { 377 if (bankIndices[i] > maxBank) { 378 maxBank = bankIndices[i]; 379 } 380 if (bandOffsets[i] > maxBandOff) { 381 maxBandOff = bandOffsets[i]; 382 } 383 } 384 int banks = maxBank + 1; 385 int size = maxBandOff + scanlineStride*(h-1) + (w-1) + 1; 386 387 switch(dataType) { 388 case DataBuffer.TYPE_BYTE: 389 d = new DataBufferByte (size, banks); 390 break; 391 392 case DataBuffer.TYPE_USHORT: 393 d = new DataBufferUShort (size, banks); 394 break; 395 396 case DataBuffer.TYPE_INT: 397 d = new DataBufferInt (size, banks); 398 break; 399 400 default: 401 throw new IllegalArgumentException ("Unsupported data type " + 402 dataType); 403 } 404 405 SunWritableRaster raster = (SunWritableRaster) 406 createBandedRaster(d, w, h, scanlineStride, 407 bankIndices, bandOffsets, location); 408 raster.setStolen(false); 409 return raster; 410 } 411 412 442 public static WritableRaster createPackedRaster(int dataType, 443 int w, int h, 444 int bandMasks[], 445 Point location) { 446 DataBuffer d; 447 448 switch(dataType) { 449 case DataBuffer.TYPE_BYTE: 450 d = new DataBufferByte (w*h); 451 break; 452 453 case DataBuffer.TYPE_USHORT: 454 d = new DataBufferUShort (w*h); 455 break; 456 457 case DataBuffer.TYPE_INT: 458 d = new DataBufferInt (w*h); 459 break; 460 461 default: 462 throw new IllegalArgumentException ("Unsupported data type " + 463 dataType); 464 } 465 466 SunWritableRaster raster = (SunWritableRaster) 467 createPackedRaster(d, w, h, w, bandMasks, location); 468 raster.setStolen(false); 469 return raster; 470 } 471 472 516 public static WritableRaster createPackedRaster(int dataType, 517 int w, int h, 518 int bands, 519 int bitsPerBand, 520 Point location) { 521 DataBuffer d; 522 523 if (bands <= 0) { 524 throw new IllegalArgumentException ("Number of bands ("+bands+ 525 ") must be greater than 0"); 526 } 527 528 if (bitsPerBand <= 0) { 529 throw new IllegalArgumentException ("Bits per band ("+bitsPerBand+ 530 ") must be greater than 0"); 531 } 532 533 if (bands != 1) { 534 int[] masks = new int[bands]; 535 int mask = (1 << bitsPerBand) - 1; 536 int shift = (bands-1)*bitsPerBand; 537 538 539 if (shift+bitsPerBand > DataBuffer.getDataTypeSize(dataType)) { 540 throw new IllegalArgumentException ("bitsPerBand("+ 541 bitsPerBand+") * bands is "+ 542 " greater than data type "+ 543 "size."); 544 } 545 switch(dataType) { 546 case DataBuffer.TYPE_BYTE: 547 case DataBuffer.TYPE_USHORT: 548 case DataBuffer.TYPE_INT: 549 break; 550 default: 551 throw new IllegalArgumentException ("Unsupported data type " + 552 dataType); 553 } 554 555 for (int i = 0; i < bands; i++) { 556 masks[i] = mask << shift; 557 shift = shift - bitsPerBand; 558 } 559 560 return createPackedRaster(dataType, w, h, masks, location); 561 } 562 else { 563 double fw = w; 564 switch(dataType) { 565 case DataBuffer.TYPE_BYTE: 566 d = new DataBufferByte ((int)(Math.ceil(fw/(8/bitsPerBand)))*h); 567 break; 568 569 case DataBuffer.TYPE_USHORT: 570 d = new DataBufferUShort ((int)(Math.ceil(fw/(16/bitsPerBand)))*h); 571 break; 572 573 case DataBuffer.TYPE_INT: 574 d = new DataBufferInt ((int)(Math.ceil(fw/(32/bitsPerBand)))*h); 575 break; 576 577 default: 578 throw new IllegalArgumentException ("Unsupported data type " + 579 dataType); 580 } 581 582 SunWritableRaster raster = (SunWritableRaster) 583 createPackedRaster(d, w, h, bitsPerBand, location); 584 raster.setStolen(false); 585 return raster; 586 } 587 } 588 589 624 public static WritableRaster createInterleavedRaster(DataBuffer dataBuffer, 625 int w, int h, 626 int scanlineStride, 627 int pixelStride, 628 int bandOffsets[], 629 Point location) { 630 if (dataBuffer == null) { 631 throw new NullPointerException ("DataBuffer cannot be null"); 632 } 633 if (location == null) { 634 location = new Point (0, 0); 635 } 636 int dataType = dataBuffer.getDataType(); 637 638 PixelInterleavedSampleModel csm = 639 new PixelInterleavedSampleModel (dataType, w, h, 640 pixelStride, 641 scanlineStride, 642 bandOffsets); 643 switch(dataType) { 644 case DataBuffer.TYPE_BYTE: 645 return new ByteInterleavedRaster(csm, dataBuffer, location); 646 647 case DataBuffer.TYPE_USHORT: 648 return new ShortInterleavedRaster(csm, dataBuffer, location); 649 650 default: 651 throw new IllegalArgumentException ("Unsupported data type " + 652 dataType); 653 } 654 } 655 656 686 public static WritableRaster createBandedRaster(DataBuffer dataBuffer, 687 int w, int h, 688 int scanlineStride, 689 int bankIndices[], 690 int bandOffsets[], 691 Point location) { 692 if (dataBuffer == null) { 693 throw new NullPointerException ("DataBuffer cannot be null"); 694 } 695 if (location == null) { 696 location = new Point (0,0); 697 } 698 int dataType = dataBuffer.getDataType(); 699 700 int bands = bankIndices.length; 701 if (bandOffsets.length != bands) { 702 throw new IllegalArgumentException ( 703 "bankIndices.length != bandOffsets.length"); 704 } 705 706 BandedSampleModel bsm = 707 new BandedSampleModel (dataType, w, h, 708 scanlineStride, 709 bankIndices, bandOffsets); 710 711 switch(dataType) { 712 case DataBuffer.TYPE_BYTE: 713 return new ByteBandedRaster(bsm, dataBuffer, location); 714 715 case DataBuffer.TYPE_USHORT: 716 return new ShortBandedRaster(bsm, dataBuffer, location); 717 718 case DataBuffer.TYPE_INT: 719 return new SunWritableRaster(bsm, dataBuffer, location); 720 721 default: 722 throw new IllegalArgumentException ("Unsupported data type " + 723 dataType); 724 } 725 } 726 727 757 public static WritableRaster createPackedRaster(DataBuffer dataBuffer, 758 int w, int h, 759 int scanlineStride, 760 int bandMasks[], 761 Point location) { 762 if (dataBuffer == null) { 763 throw new NullPointerException ("DataBuffer cannot be null"); 764 } 765 if (location == null) { 766 location = new Point (0,0); 767 } 768 int dataType = dataBuffer.getDataType(); 769 770 SinglePixelPackedSampleModel sppsm = 771 new SinglePixelPackedSampleModel (dataType, w, h, scanlineStride, 772 bandMasks); 773 774 switch(dataType) { 775 case DataBuffer.TYPE_BYTE: 776 return new ByteInterleavedRaster(sppsm, dataBuffer, location); 777 778 case DataBuffer.TYPE_USHORT: 779 return new ShortInterleavedRaster(sppsm, dataBuffer, location); 780 781 case DataBuffer.TYPE_INT: 782 |