Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagejava
titleMulti-level Source Image
linenumberstrue
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);

    final MultiLevelModel multiLevelModel = ImageManager.getMultiLevelModel(realBand);

   final 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);
        }
    }
}

...