static Product createTestProduct(int width, int height, int tileSize, int numResolutionsMax) {
Product product = new Product("test", "test", width, height);
product.setPreferredTileSize(tileSize, tileSize);
product.setNumResolutionsMax(numResolutionsMax);
Band realBand = product.addBand("real", "X * X - Y * Y", ProductData.TYPE_FLOAT64);
Band imagBand = product.addBand("imag", "2 * X * Y", ProductData.TYPE_FLOAT64);
Band magnitudeBand = product.addBand("magnitude", ProductData.TYPE_FLOAT64);
MultiLevelModel multiLevelModel = ImageManager.getMultiLevelModel(realBand);
MultiLevelSource multiLevelSource = new AbstractMultiLevelSource(multiLevelModel) {
@Override
public void reset() {
super.reset();
magnitudeBand.fireProductNodeDataChanged();
}
@Override
public RenderedImage createImage(int level) {
return new MagnitudeOpImage(magnitudeBand, ResolutionLevel.create(getModel(), level),
realBand, imagBand);
}
};
magnitudeBand.setSourceImage(new DefaultMultiLevelImage(multiLevelSource));
return product;
}
static class MagnitudeOpImage extends RasterDataNodeOpImage {
private final Band realBand;
private final Band imagBand;
public MagnitudeOpImage(Band outputBand, ResolutionLevel level, Band realBand, Band imagBand) {
super(outputBand, level);
this.realBand = realBand;
this.imagBand = imagBand;
}
@Override
protected void computeProductData(ProductData outputData, Rectangle region) throws IOException {
ProductData realData = getRawProductData(realBand, region);
ProductData imagData = getRawProductData(imagBand, region);
int numElems = region.width * region.height;
for (int i = 0; i < numElems; i++) {
double real = realData.getElemDoubleAt(i);
double imag = imagData.getElemDoubleAt(i);
double result = Math.sqrt(real * real + imag * imag);
outputData.setElemDoubleAt(i, result);
}
}
} |