in src/main/java/org/apache/commons/imaging/formats/tiff/datareaders/ImageDataReader.java [410:515]
void transferBlockToRaster(final int xBlock, final int yBlock,
final int blockWidth, final int blockHeight, final int[] blockData,
final int xRaster, final int yRaster,
final int rasterWidth, final int rasterHeight, final int samplesPerPixel,
final float[] rasterData) {
// xR0, yR0 are the coordinates within the raster (upper-left corner)
// xR1, yR1 are ONE PAST the coordinates of the lower-right corner
int xR0 = xBlock - xRaster; // xR0, yR0 coordinates relative to
int yR0 = yBlock - yRaster; // the raster
int xR1 = xR0 + blockWidth;
int yR1 = yR0 + blockHeight;
if (xR0 < 0) {
xR0 = 0;
}
if (yR0 < 0) {
yR0 = 0;
}
if (xR1 > rasterWidth) {
xR1 = rasterWidth;
}
if (yR1 > rasterHeight) {
yR1 = rasterHeight;
}
// Recall that the above logic may have adjusted xR0, xY0 so that
// they are not necessarily point to the source pixel at xRaster, yRaster
// we compute xSource = xR0+xRaster.
// xOffset = xSource-xBlock
// since the block cannot be accessed with a negative offset,
// we check for negatives and adjust xR0, yR0 upward as necessary
int xB0 = xR0 + xRaster - xBlock;
int yB0 = yR0 + yRaster - yBlock;
if (xB0 < 0) {
xR0 -= xB0;
xB0 = 0;
}
if (yB0 < 0) {
yR0 -= yB0;
yB0 = 0;
}
int w = xR1 - xR0;
int h = yR1 - yR0;
if (w <= 0 || h <= 0) {
// The call to this method put the block outside the
// bounds of the raster. There is nothing to do. Ideally,
// this situation never arises, because it would mean that
// the data was read from the file unnecessarily.
return;
}
// see if the xR1, yR1 would extend past the limits of the block
if (w > blockWidth) {
w = blockWidth;
}
if (h > blockHeight) {
h = blockHeight;
}
// The TiffRasterData class expects data to be in the order
// corresponding to TiffPlanarConfiguration.PLANAR. So for the
// multivariable case, we must convert CHUNKY data to PLANAR.
if (samplesPerPixel == 1) {
for (int i = 0; i < h; i++) {
final int yR = yR0 + i;
final int yB = yB0 + i;
final int rOffset = yR * rasterWidth + xR0;
final int bOffset = yB * blockWidth + xB0;
for (int j = 0; j < w; j++) {
rasterData[rOffset + j] = Float.intBitsToFloat(blockData[bOffset + j]);
}
}
} else if (this.planarConfiguration == TiffPlanarConfiguration.CHUNKY) {
// The source data is in the interleaved (Chunky) order,
// but the TiffRasterData class expects non-interleaved order.
// So we transcribe the elements as appropriate.
final int pixelsPerPlane = rasterWidth * rasterHeight;
for (int i = 0; i < h; i++) {
final int yR = yR0 + i;
final int yB = yB0 + i;
final int rOffset = yR * rasterWidth + xR0;
final int bOffset = yB * blockWidth + xB0;
for (int j = 0; j < w; j++) {
for (int k = 0; k < samplesPerPixel; k++) {
rasterData[k * pixelsPerPlane + rOffset + j]
= Float.intBitsToFloat(blockData[(bOffset + j) * samplesPerPixel + k]);
}
}
}
} else {
for (int iPlane = 0; iPlane < samplesPerPixel; iPlane++) {
final int rPlanarOffset = iPlane * rasterWidth * rasterHeight;
final int bPlanarOffset = iPlane * blockWidth * blockHeight;
for (int i = 0; i < h; i++) {
final int yR = yR0 + i;
final int yB = yB0 + i;
final int rOffset = rPlanarOffset + yR * rasterWidth + xR0;
final int bOffset = bPlanarOffset + yB * blockWidth + xB0;
for (int j = 0; j < w; j++) {
rasterData[rOffset + j] = Float.intBitsToFloat(blockData[bOffset + j]);
}
}
}
}
}