int endY = YToTileY(rectYend);
//
// Get parameters of destination raster
//
DataBuffer dstDB = dstRaster.getDataBuffer();
float[] dst = DataBufferUtils.getDataFloat(dstDB);
int dstPS = dstSM.getPixelStride();
int dstSS = dstSM.getScanlineStride();
boolean tileParamsSet = false;
ComponentSampleModel srcSM = null;
int srcPS=0, srcSS=0;
int xOrg, yOrg;
int srcX1, srcY1, srcX2, srcY2, srcW, srcH;
for (int y = startY; y <= endY; y++) {
for (int x = startX; x <= endX; x++) {
Raster tile = getTile(x, y);
if (tile == null) {
//
// Out-of-bounds tile. Zero fill will be supplied
// since dstRaster is initialized to zero
//
continue;
}
if (! tileParamsSet) {
//
// These are constant for all tiles,
// so only set them once.
//
srcSM = (ComponentSampleModel)tile.getSampleModel();
srcPS = srcSM.getPixelStride();
srcSS = srcSM.getScanlineStride();
tileParamsSet = true;
}
//
// Intersect the tile and the rectangle
// Avoid use of Math.min/max
//
yOrg = y*tileHeight + tileGridYOffset;
srcY1 = yOrg;
srcY2 = srcY1 + tileHeight - 1;
if (bounds.y > srcY1) srcY1 = bounds.y;
if (rectYend < srcY2) srcY2 = rectYend;
srcH = srcY2 - srcY1 + 1;
xOrg = x*tileWidth + tileGridXOffset;
srcX1 = xOrg;
srcX2 = srcX1 + tileWidth - 1;
if (bounds.x > srcX1) srcX1 = bounds.x;
if (rectXend < srcX2) srcX2 = rectXend;
srcW = srcX2 - srcX1 + 1;
int dstX = srcX1 - bounds.x;
int dstY = srcY1 - bounds.y;
// Get the actual data array
DataBuffer srcDB = tile.getDataBuffer();
float[] src = DataBufferUtils.getDataFloat(srcDB);
int nsamps = srcW * srcPS;
boolean useArrayCopy = (nsamps >= MIN_ARRAYCOPY_SIZE);