static void accumulate(StxOp op, PlanarImage dataImage, PlanarImage maskImage, Shape maskShape, ProgressMonitor pm) {
if (maskImage != null) {
ensureImageCompatibility(dataImage, maskImage);
}
final PixelAccessor dataAccessor = new PixelAccessor(dataImage.getSampleModel(), null);
final PixelAccessor maskAccessor = maskImage != null ? new PixelAccessor(maskImage.getSampleModel(), null) : null;
try {
pm.beginTask("Computing " + op.getName(), dataImage.getNumXTiles() * dataImage.getNumYTiles());
for (int tileY = dataImage.getMinTileY(); tileY <= dataImage.getMaxTileY(); tileY++) {
for (int tileX = dataImage.getMinTileX(); tileX <= dataImage.getMaxTileX(); tileX++) {
if (pm.isCanceled()) {
throw new CancellationException("Process terminated by user.");
}
boolean tileContainsData = true;
if (maskShape != null) {
Rectangle dataRect = dataImage.getTileRect(tileX, tileY);
if (!maskShape.intersects(dataRect)) {
tileContainsData = false;
}
}
if (tileContainsData) {
accumulateTile(op, dataImage, maskImage, dataAccessor, maskAccessor, tileX, tileY);
}
pm.worked(1);
}
}
} finally {
pm.done();
}
}