WritableRaster dest = createTile(tileX, tileY);
/* Clip the raster bound to image bounds. */
Rectangle destRect = dest.getBounds().intersection(getBounds());
PlanarImage srcUnder = getSource(0);
PlanarImage srcOver = getSource(1);
Rectangle srcUnderBounds = srcUnder.getBounds();
Rectangle srcOverBounds = srcOver.getBounds();
/* In case of PointOpImage, mapDestRect(destRect, i) = destRect). */
Raster[] sources = new Raster[1];
if (srcOverBounds.contains(destRect)) {
/* Tile is entirely inside sourceOver. */
sources[0] = srcOver.getData(destRect);
computeRect(sources, dest, destRect);
// Recycle the source tile
if(srcOver.overlapsMultipleTiles(destRect)) {
recycleTile(sources[0]);
}
return dest;
} else if (srcUnderBounds.contains(destRect) &&
!srcOverBounds.intersects(destRect)) {
/* Tile is entirely inside sourceUnder. */
sources[0] = srcUnder.getData(destRect);
computeRect(sources, dest, destRect);
// Recycle the source tile
if(srcUnder.overlapsMultipleTiles(destRect)) {
recycleTile(sources[0]);
}
return dest;
} else {
/* Tile is inside both sources. */
Rectangle isectUnder = destRect.intersection(srcUnderBounds);
sources[0] = srcUnder.getData(isectUnder);
computeRect(sources, dest, isectUnder);
// Recycle the source tile
if(srcUnder.overlapsMultipleTiles(isectUnder)) {
recycleTile(sources[0]);
}
if (srcOverBounds.intersects(destRect)) {
Rectangle isectOver = destRect.intersection(srcOverBounds);
sources[0] = srcOver.getData(isectOver);
computeRect(sources, dest, isectOver);
// Recycle the source tile
if(srcOver.overlapsMultipleTiles(isectOver)) {
recycleTile(sources[0]);
}
}
return dest;