/* JAI-Ext - OpenSource Java Advanced Image Extensions Library * http://www.geo-solutions.it/ * Copyright 2014 - 2015 GeoSolutions * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package it.geosolutions.jaiext.mosaic; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.image.DataBuffer; import java.awt.image.Raster; import java.awt.image.RenderedImage; import java.awt.image.renderable.ParameterBlock; import java.io.Serializable; import java.util.List; import java.util.Vector; import java.util.logging.Level; import java.util.logging.Logger; import javax.media.jai.ImageLayout; import javax.media.jai.JAI; import javax.media.jai.PlanarImage; import javax.media.jai.ROI; import javax.media.jai.ROIShape; import javax.media.jai.RenderedOp; import javax.media.jai.operator.MosaicType; import javax.media.jai.operator.TranslateDescriptor; import javax.media.jai.util.ImagingException; import org.junit.Test; import it.geosolutions.jaiext.range.Range; import it.geosolutions.jaiext.range.RangeFactory; import it.geosolutions.jaiext.testclasses.TestBase; /** * This test class is used for checking the functionality of the MosaicOpImage. * Every test is performed on all the DataBuffer types. The mosaic operations * are calculated in the OVERLAY mode. The first 3 series of tests execute a * mosaic operation between: * <ul> * <li>two image with No Data values</li> * <li>two image with the first having No Data values and the second having * valid Data values</li> * <li>two image with valid Data values</li> * </ul> * * The 4th and 5th series make the same tests but using a ROI. The only * difference is that two images with No Data values are not compared. The 6th * and 7th series make the same ROI tests but using a Alpha channel. The 8th * series performs a test on 3 images which the first image contains only No * Data values, the second image uses a ROI, and the last image has an alpha * channel. The 9th series performs a test on 3 images in the same above * condition but the mosaic type is BLEND, not OVERLAY. The 10th series executes * a simple test on 3 images with only data values. The 11th series checks that * all the Exceptions are thrown in the right conditions. * * <ul> * </ul> * The other surrounding methods belongs to 2 categories: * <ul> * <li>test methods which execute the tests and check if the calculated values * are correct</li> * <li>help methods for creating all the images and ROI with different * structures</li> * </ul> */ public class MosaicTest extends TestBase { // Default initialization set to false public final static boolean DEFAULT_SETUP_INITALIZATION = false; private final static MosaicType DEFAULT_MOSAIC_TYPE = javax.media.jai.operator.MosaicDescriptor.MOSAIC_TYPE_OVERLAY; // the default image dimensions; public final static float DEFAULT_WIDTH = 512; public final static float DEFAULT_HEIGTH = 512; public final static Logger LOGGER = Logger.getLogger(MosaicTest.class .toString()); // default tolerance for comparison public final static double DEFAULT_DELTA = 1.5d; private static RenderingHints hints; public enum DataDisplacement { NODATA_NODATA, NODATA_DATA, DATA_DATA; } // THIS TESTS ARE WITH 2 IMAGES: THE FIRST IS IN THE LEFT SIDE AND THE // SECOND IS TRANSLATED // ON THE RIGHT BY HALF OF ITS WIDTH (HALF IMAGE OVERLAY) // FIRST SERIES // Test No Data: image 1 and 2 only no data @Test public void testByteNoData1NoData2() { int dataType = DataBuffer.TYPE_BYTE; TestBean testBean = createBean(dataType, 0, false, false); testMethodBody(testBean, dataType, null); } @Test public void testUShortNoData1NoData2() { int dataType = DataBuffer.TYPE_USHORT; TestBean testBean = createBean(dataType, 0, false, false); testMethodBody(testBean, dataType, null); } @Test public void testShortNoData1NoData2() { int dataType = DataBuffer.TYPE_SHORT; TestBean testBean = createBean(dataType, 0, false, false); testMethodBody(testBean, dataType, null); } @Test public void testIntNoData1NoData2() { int dataType = DataBuffer.TYPE_INT; TestBean testBean = createBean(dataType, 0, false, false); testMethodBody(testBean, dataType, null); } @Test public void testFloatNoData1NoData2() { int dataType = DataBuffer.TYPE_FLOAT; TestBean testBean = createBean(dataType, 0, false, false); testMethodBody(testBean, dataType, null); } @Test public void testDoubleNoData1NoData2() { int dataType = DataBuffer.TYPE_DOUBLE; TestBean testBean = createBean(dataType, 0, false, false); testMethodBody(testBean, dataType, null); } // SECOND SERIES // Test No Data: image 1 with data and image 2 with no data @Test public void testByteNoData1Data2() { int dataType = DataBuffer.TYPE_BYTE; TestBean testBean = createBean(dataType, 1, false, false); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, valideValueSource2); } @Test public void testUShortNoData1Data2() { int dataType = DataBuffer.TYPE_USHORT; TestBean testBean = createBean(dataType, 1, false, false); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, valideValueSource2); } @Test public void testShortNoData1Data2() { int dataType = DataBuffer.TYPE_SHORT; TestBean testBean = createBean(dataType, 1, false, false); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, valideValueSource2); } @Test public void testIntNoData1Data2() { int dataType = DataBuffer.TYPE_INT; TestBean testBean = createBean(dataType, 1, false, false); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, valideValueSource2); } @Test public void testFloatNoData1Data2() { int dataType = DataBuffer.TYPE_FLOAT; TestBean testBean = createBean(dataType, 1, false, false); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, valideValueSource2); } @Test public void testDoubleNoData1Data2() { int dataType = DataBuffer.TYPE_DOUBLE; TestBean testBean = createBean(dataType, 1, false, false); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, valideValueSource2); } // THIRD SERIES // Test No data: image 1 and 2 with data @Test public void testByteData1Data2() { int dataType = DataBuffer.TYPE_BYTE; TestBean testBean = createBean(dataType, 2, false, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; testMethodBody(testBean, dataType, valideValueSource1); } @Test public void testUShortData1Data2() { int dataType = DataBuffer.TYPE_USHORT; TestBean testBean = createBean(dataType, 2, false, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; testMethodBody(testBean, dataType, valideValueSource1); } @Test public void testShortData1Data2() { int dataType = DataBuffer.TYPE_SHORT; TestBean testBean = createBean(dataType, 2, false, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; testMethodBody(testBean, dataType, valideValueSource1); } @Test public void testIntData1Data2() { int dataType = DataBuffer.TYPE_INT; TestBean testBean = createBean(dataType, 2, false, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; testMethodBody(testBean, dataType, valideValueSource1); } @Test public void testFloatData1Data2() { int dataType = DataBuffer.TYPE_FLOAT; TestBean testBean = createBean(dataType, 2, false, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; testMethodBody(testBean, dataType, valideValueSource1); } @Test public void testDoubleData1Data2() { int dataType = DataBuffer.TYPE_DOUBLE; TestBean testBean = createBean(dataType, 2, false, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; testMethodBody(testBean, dataType, valideValueSource1); } // FOURTH SERIES // Test ROI: image 1 and 2 with data @Test public void testROIByteData1Data2() { int dataType = DataBuffer.TYPE_BYTE; TestBean testBean = createBean(dataType, 2, true, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource1, true, false); } @Test public void testROIUShortData1Data2() { int dataType = DataBuffer.TYPE_USHORT; TestBean testBean = createBean(dataType, 2, true, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource1, true, false); } @Test public void testROIShortData1Data2() { int dataType = DataBuffer.TYPE_SHORT; TestBean testBean = createBean(dataType, 2, true, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource1, true, false); } @Test public void testROIIntData1Data2() { int dataType = DataBuffer.TYPE_INT; TestBean testBean = createBean(dataType, 2, true, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource1, true, false); } @Test public void testROIFloatData1Data2() { int dataType = DataBuffer.TYPE_FLOAT; TestBean testBean = createBean(dataType, 2, true, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource1, true, false); } @Test public void testROIDoubleData1Data2() { int dataType = DataBuffer.TYPE_DOUBLE; TestBean testBean = createBean(dataType, 2, true, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource1, true, false); } // FIFTH SERIES // Test ROI: image 1 with data and 2 with no data @Test public void testROIByteNoData1Data2() { int dataType = DataBuffer.TYPE_BYTE; TestBean testBean = createBean(dataType, 1, true, false); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource2, true, false); } @Test public void testROIUShortNoData1Data2() { int dataType = DataBuffer.TYPE_USHORT; TestBean testBean = createBean(dataType, 1, true, false); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource2, true, false); } @Test public void testROIShortNoData1Data2() { int dataType = DataBuffer.TYPE_SHORT; TestBean testBean = createBean(dataType, 1, true, false); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource2, true, false); } @Test public void testROIIntNoData1Data2() { int dataType = DataBuffer.TYPE_INT; TestBean testBean = createBean(dataType, 1, true, false); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource2, true, false); } @Test public void testROIFloatNoData1Data2() { int dataType = DataBuffer.TYPE_FLOAT; TestBean testBean = createBean(dataType, 1, true, false); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource2, true, false); } @Test public void testROIDoubleNoData1Data2() { int dataType = DataBuffer.TYPE_DOUBLE; TestBean testBean = createBean(dataType, 1, true, false); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource2, true, false); } // SIXTH SERIES // Test Alpha: image 1 and image 2 with data @Test public void testAlphaByteData1Data2() { int dataType = DataBuffer.TYPE_BYTE; TestBean testBean = createBean(dataType, 2, false, true); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, valideValueSource1, valideValueSource1, valideValueSource2, false, true); } @Test public void testAlphaUShortData1Data2() { int dataType = DataBuffer.TYPE_USHORT; TestBean testBean = createBean(dataType, 2, false, true); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, valideValueSource1, valideValueSource1, valideValueSource2, false, true); } @Test public void testAlphaShortData1Data2() { int dataType = DataBuffer.TYPE_SHORT; TestBean testBean = createBean(dataType, 2, false, true); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, valideValueSource1, valideValueSource1, valideValueSource2, false, true); } @Test public void testAlphaIntData1Data2() { int dataType = DataBuffer.TYPE_INT; TestBean testBean = createBean(dataType, 2, false, true); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, valideValueSource1, valideValueSource1, valideValueSource2, false, true); } @Test public void testAlphaFloatData1Data2() { int dataType = DataBuffer.TYPE_FLOAT; TestBean testBean = createBean(dataType, 2, false, true); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, valideValueSource1, valideValueSource1, valideValueSource2, false, true); } @Test public void testAlphaDoubleData1Data2() { int dataType = DataBuffer.TYPE_DOUBLE; TestBean testBean = createBean(dataType, 2, false, true); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, valideValueSource1, valideValueSource1, valideValueSource2, false, true); } // SEVENTH SERIES // Test Alpha: image 1 with no data and image 2 with data @Test public void testAlphaNoByteData1Data2() { int dataType = DataBuffer.TYPE_BYTE; TestBean testBean = createBean(dataType, 1, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource2, false, true); } @Test public void testAlphaNoUShortData1Data2() { int dataType = DataBuffer.TYPE_USHORT; TestBean testBean = createBean(dataType, 1, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource2, false, true); } @Test public void testAlphaNoShortData1Data2() { int dataType = DataBuffer.TYPE_SHORT; TestBean testBean = createBean(dataType, 1, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource2, false, true); } @Test public void testAlphaIntNoData1Data2() { int dataType = DataBuffer.TYPE_INT; TestBean testBean = createBean(dataType, 1, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource2, false, true); } @Test public void testAlphaFloatNoData1Data2() { int dataType = DataBuffer.TYPE_FLOAT; TestBean testBean = createBean(dataType, 1, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource2, false, true); } @Test public void testAlphaDoubleNoData1Data2() { int dataType = DataBuffer.TYPE_DOUBLE; TestBean testBean = createBean(dataType, 1, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; testMethodBody(testBean, dataType, null, valideValueSource2, valideValueSource2, false, true); } // TEST WITH 3 IMAGES: IMAGE 1 WITH NO DATA IN THE UPPER LEFT, IMAGE 2 WITH // ROI IN THE UPPER RIGTH, // IMAGE 3 WITH ALPHA CHANNEL IN THE LOWER LEFT // EIGHTH SERIES @Test public void testByte3ImagesNoDataROIAlpha() { int dataType = DataBuffer.TYPE_BYTE; TestBean testBean = createBean3Images(dataType, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, null, valideValueSource2, null, valideValueSource3, valideValueSource2, valideValueSource3, false, false, true); } @Test public void testUShort3ImagesNoDataROIAlpha() { int dataType = DataBuffer.TYPE_USHORT; TestBean testBean = createBean3Images(dataType, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, null, valideValueSource2, null, valideValueSource3, valideValueSource2, valideValueSource3, false, false, true); } @Test public void testShort3ImagesNoDataROIAlpha() { int dataType = DataBuffer.TYPE_SHORT; TestBean testBean = createBean3Images(dataType, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, null, valideValueSource2, null, valideValueSource3, valideValueSource2, valideValueSource3, false, false, true); } @Test public void testInt3ImagesNoDataROIAlpha() { int dataType = DataBuffer.TYPE_INT; TestBean testBean = createBean3Images(dataType, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, null, valideValueSource2, null, valideValueSource3, valideValueSource2, valideValueSource3, false, false, true); } @Test public void testFloat3ImagesNoDataROIAlpha() { int dataType = DataBuffer.TYPE_FLOAT; TestBean testBean = createBean3Images(dataType, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, null, valideValueSource2, null, valideValueSource3, valideValueSource2, valideValueSource3, false, false, true); } @Test public void testDouble3ImagesNoDataROIAlpha() { int dataType = DataBuffer.TYPE_DOUBLE; TestBean testBean = createBean3Images(dataType, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, null, valideValueSource2, null, valideValueSource3, valideValueSource2, valideValueSource3, false, false, true); } // NINTH SERIES @Test public void testBLENDByte3Images() { int dataType = DataBuffer.TYPE_BYTE; TestBean testBean = createBean3Images(dataType, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, null, valideValueSource2, null, valideValueSource3, valideValueSource2, valideValueSource3, false, false, false); } @Test public void testBLENDUShort3Images() { int dataType = DataBuffer.TYPE_USHORT; TestBean testBean = createBean3Images(dataType, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, null, valideValueSource2, null, valideValueSource3, valideValueSource2, valideValueSource3, false, false, false); } @Test public void testBLENDShort3Images() { int dataType = DataBuffer.TYPE_SHORT; TestBean testBean = createBean3Images(dataType, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, null, valideValueSource2, null, valideValueSource3, valideValueSource2, valideValueSource3, false, false, false); } @Test public void testBLENDInt3Images() { int dataType = DataBuffer.TYPE_INT; TestBean testBean = createBean3Images(dataType, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, null, valideValueSource2, null, valideValueSource3, valideValueSource2, valideValueSource3, false, false, false); } @Test public void testBLENDFloat3Images() { int dataType = DataBuffer.TYPE_FLOAT; TestBean testBean = createBean3Images(dataType, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, null, valideValueSource2, null, valideValueSource3, valideValueSource2, valideValueSource3, false, false, false); } @Test public void testBLENDDouble3Images() { int dataType = DataBuffer.TYPE_DOUBLE; TestBean testBean = createBean3Images(dataType, false, true); Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, null, valideValueSource2, null, valideValueSource3, valideValueSource2, valideValueSource3, false, false, false); } // TENTH SERIES // TEST WITH 3 IMAGES: SAME POSITIONS OF THE THREE IMAGES ABOVE, NULL NO // DATA, NO ROI OR ALPHA CHANNEL @Test public void testByteNullNoData() { int dataType = DataBuffer.TYPE_BYTE; TestBean testBean = createBean3Images(dataType, true, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, valideValueSource1, valideValueSource1, valideValueSource2, valideValueSource1, valideValueSource1, valideValueSource3, false, false, true); } @Test public void testUShortNullNoData() { int dataType = DataBuffer.TYPE_USHORT; TestBean testBean = createBean3Images(dataType, true, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, valideValueSource1, valideValueSource1, valideValueSource2, valideValueSource1, valideValueSource1, valideValueSource3, false, false, true); } @Test public void testShortNullNoData() { int dataType = DataBuffer.TYPE_SHORT; TestBean testBean = createBean3Images(dataType, true, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, valideValueSource1, valideValueSource1, valideValueSource2, valideValueSource1, valideValueSource1, valideValueSource3, false, false, true); } @Test public void testIntNullNoData() { int dataType = DataBuffer.TYPE_INT; TestBean testBean = createBean3Images(dataType, true, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, valideValueSource1, valideValueSource1, valideValueSource2, valideValueSource1, valideValueSource1, valideValueSource3, false, false, true); } @Test public void testFloatNullNoData() { int dataType = DataBuffer.TYPE_FLOAT; TestBean testBean = createBean3Images(dataType, true, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, valideValueSource1, valideValueSource1, valideValueSource2, valideValueSource1, valideValueSource1, valideValueSource3, false, false, true); } @Test public void testDoubleNullNoData() { int dataType = DataBuffer.TYPE_DOUBLE; TestBean testBean = createBean3Images(dataType, true, false); Number valideValueSource1 = testBean.getSourceValidData()[0]; Number valideValueSource2 = testBean.getSourceValidData()[1]; Number valideValueSource3 = testBean.getSourceValidData()[2]; testMethodBody(testBean, dataType, valideValueSource1, valideValueSource1, valideValueSource2, valideValueSource1, valideValueSource1, valideValueSource3, false, false, true); } // ELEVENTH SERIES // EXCEPTION TEST CLASS. THIS TESTS ARE USED FOR CHECKING IF THE MOSAIC // NODATA OPIMAGE // CLASS THROWS THE SELECTED EXCEPTIONS @Test public void testExceptionImagesLayoutNotValid() { TestBean testBean = createBean3Images(0, true, false); // start image array RenderedImage[] mosaicArray = new RenderedImage[3]; // Creates an array for the destination band values double[] destinationValues = { testBean.getDestinationNoData()[0] }; // Getting the rois, alphabands PlanarImage[] alphas = testBean.getAlphas(); ROI[] rois = testBean.getRois(); Range[] nd = testBean.getSourceNoDataRange3Bands(); mosaicArray = new RenderedImage[0]; // MosaicNoData operation RenderedImage image5 = MosaicDescriptor.create(mosaicArray, DEFAULT_MOSAIC_TYPE, alphas, rois, null, destinationValues, nd, null); // ensure exception boolean exception = false; try { image5.getTile(0, 0); } catch (ImagingException e) { LOGGER.log(Level.INFO, "IllegalArgumentException: Layout not valid"); assertTrue(e.getRootCause().getMessage() .contains("Layout not valid")); exception = true; } // check the exception assertTrue(exception); } @Test public void testExceptionImagesNoSampleModelPresent() { ImageLayout layout = new ImageLayout(); layout.setValid(ImageLayout.WIDTH_MASK); layout.setValid(ImageLayout.HEIGHT_MASK); layout.setValid(ImageLayout.SAMPLE_MODEL_MASK); layout.setWidth(4); layout.setHeight(4); TestBean testBean = createBean3Images(0, true, false); // start image array RenderedImage[] mosaicArray = new RenderedImage[3]; // Creates an array for the destination band values double[] destinationValues = { testBean.getDestinationNoData()[0] }; // Setting of the new RenderingHints RenderingHints renderingHints = new RenderingHints( JAI.KEY_IMAGE_LAYOUT, layout); // Getting the rois, alphabands PlanarImage[] alphas = testBean.getAlphas(); ROI[] rois = testBean.getRois(); Range[] nd = testBean.getSourceNoDataRange3Bands(); mosaicArray = new RenderedImage[0]; // MosaicNoData operation RenderedImage image5 = MosaicDescriptor.create(mosaicArray, DEFAULT_MOSAIC_TYPE, alphas, rois, null, destinationValues, nd, renderingHints); // ensure exception boolean exception = false; try { image5.getTile(0, 0); } catch (ImagingException e) { LOGGER.log(Level.INFO, "No sample model present"); assertTrue(e.getRootCause().getMessage() .contains("No sample model present")); exception = true; } // check the exception assertTrue(exception); } @Test public void testExceptionImagesSameSizeSourcesAndNoData() { TestBean testBean = createBean3Images(0, true, false); // start image array RenderedImage[] mosaicArray = new RenderedImage[2]; // Creates an array for the destination band values double[] destinationValues = { testBean.getDestinationNoData()[0] }; ImageLayout layout = (ImageLayout) hints.get(JAI.KEY_IMAGE_LAYOUT); RenderingHints renderingHints = new RenderingHints( JAI.KEY_IMAGE_LAYOUT, layout); Number[] exampleData = { 15, 15 }; mosaicArray[0] = getSyntheticUniformTypeImage(exampleData, null, DataBuffer.TYPE_INT, 1, DataDisplacement.DATA_DATA, true, false); mosaicArray[1] = getSyntheticUniformTypeImage(exampleData, null, DataBuffer.TYPE_INT, 1, DataDisplacement.DATA_DATA, false, false); // Updates the innerBean PlanarImage[] alphas = testBean.getAlphas(); ROI[] rois = testBean.getRois(); Range[] nd = new Range[10]; // MosaicNoData operation RenderedImage image5 = MosaicDescriptor.create(mosaicArray, DEFAULT_MOSAIC_TYPE, alphas, rois, null, destinationValues, nd, renderingHints); // ensure exception boolean exception = false; try { image5.getTile(0, 0); } catch (ImagingException e) { assertTrue(e.getRootCause().getMessage() .contains("no data number is not equal to the source number")); LOGGER.log(Level.INFO, "no data number is not equal to the source number"); exception = true; } // check the exception assertTrue(exception); } @Test public void testExceptionImagesAlphaBandUnic() { TestBean testBean = createBean3Images(0, true, false); // start image array RenderedImage[] mosaicArray = testBean.getImage3Bands(); // Creates an array for the destination band values double[] destinationValues = { testBean.getDestinationNoData()[0] }; ImageLayout layout = (ImageLayout) hints.get(JAI.KEY_IMAGE_LAYOUT); RenderingHints renderingHints = new RenderingHints( JAI.KEY_IMAGE_LAYOUT, layout); // Updates the innerBean PlanarImage[] alphas = new PlanarImage[3]; ROI[] rois = testBean.getRois(); Range[] nd = testBean.getSourceNoDataRange3Bands(); Number[] exampleData = { 15 }; PlanarImage newAlphaChannel = (PlanarImage) getSyntheticUniformTypeImage( exampleData, null, DataBuffer.TYPE_INT, 3, DataDisplacement.DATA_DATA, true, false); alphas[0] = alphas[1] = alphas[2] = newAlphaChannel; // MosaicNoData operation RenderedImage image5 = MosaicDescriptor.create(mosaicArray, DEFAULT_MOSAIC_TYPE, alphas, rois, null, destinationValues, nd, renderingHints); // ensure exception boolean exception = false; try { image5.getTile(0, 0); } catch (ImagingException e) { assertTrue(e.getRootCause().getMessage() .contains("Alpha bands number must be 1")); LOGGER.log(Level.INFO, "Alpha bands number must be 1"); exception = true; } // check the exception assertTrue(exception); } @Test(expected = IllegalArgumentException.class) public void testExceptionImagesMapDestRectNullDest() { int index = 1; exceptionMapRectBody(null, index, false); } @Test(expected = IllegalArgumentException.class) public void testExceptionImagesMapDestRectZeroIndex() { Rectangle testRect = new Rectangle(0, 0, 10, 10); int index = -1; exceptionMapRectBody(testRect, index, false); } @Test(expected = IllegalArgumentException.class) public void testExceptionImagesMapDestRectOverIndex() { Rectangle testRect = new Rectangle(0, 0, 10, 10); int index = 10; exceptionMapRectBody(testRect, index, false); } @Test(expected = IllegalArgumentException.class) public void testExceptionImagesMapSourceRectNullSource() { int index = 1; exceptionMapRectBody(null, index, true); } @Test(expected = IllegalArgumentException.class) public void testExceptionImagesMapSourceRectZeroIndex() { Rectangle testRect = new Rectangle(0, 0, 10, 10); int index = -1; exceptionMapRectBody(testRect, index, true); } @Test(expected = IllegalArgumentException.class) public void testExceptionImagesMapSourceRectOverIndex() { Rectangle testRect = new Rectangle(0, 0, 10, 10); int index = 10; exceptionMapRectBody(testRect, index, true); } private void exceptionMapRectBody(Rectangle testRect, int index, boolean sourceRect) { TestBean testBean = createBean3Images(0, true, true); // start image array RenderedImage[] mosaicArray = testBean.getImage3Bands(); Range[] nd = testBean.getSourceNoDataRange3Bands(); List mosaicList = new Vector(); for (int i = 0; i < mosaicArray.length; i++) { mosaicList.add(mosaicArray[i]); } // Creates an array for the destination band values double[] destinationValues = { testBean.getDestinationNoData()[0] }; ImageLayout layout = (ImageLayout) hints.get(JAI.KEY_IMAGE_LAYOUT); RenderingHints renderingHints = new RenderingHints( JAI.KEY_IMAGE_LAYOUT, layout); // Getting the rois, alphabands PlanarImage[] alphas = testBean.getAlphas(); ROI[] rois = testBean.getRois(); if (sourceRect) { Rectangle rect = new MosaicOpImage(mosaicList, layout, renderingHints, DEFAULT_MOSAIC_TYPE, alphas, rois, null, destinationValues, nd).mapSourceRect(testRect, index); } else { Rectangle rect = new MosaicOpImage(mosaicList, layout, renderingHints, DEFAULT_MOSAIC_TYPE, alphas, rois, null, destinationValues, nd).mapDestRect(testRect, index); } } private void testMethodBody(TestBean testBean, int dataType, Number firstValue) { testMethodBody(testBean, dataType, firstValue, null, null, null, null, null, false, false, false); } private void testMethodBody(TestBean testBean, int dataType, Number firstValue, Number secondValue, Number thirdValue, boolean roiused, boolean alphaused) { testMethodBody(testBean, dataType, firstValue, secondValue, thirdValue, null, null, null, roiused, alphaused, false); } private void testMethodBody(TestBean testBean, int dataType, Number firstValue, Number secondValue, Number thirdValue, Number fourthValue, Number fifthValue, Number sixthValue, boolean roiused, boolean alphaused, boolean overlay) { // Data initialization Number[][] arrayPixel = null; Number[][] arrayPixel3Band = null; if (fourthValue == null) { // Test for image with 1 band Number[][] arrayPixelArr = { testExecution(testBean, 1) }; // Test for image with 3 band Number[][] arrayPixel3BandArr = { testExecution(testBean, 3) }; // simple way for saving the returned values in the same array arrayPixel = arrayPixelArr; arrayPixel3Band = arrayPixel3BandArr; } if (firstValue == null && secondValue == null) { // Check if the pixel has the correct value assertEquality(0, arrayPixel, dataType, testBean.getDestinationNoData()[0]); // Check if the pixel has the correct value assertEquality(0, arrayPixel3Band, dataType, testBean.getDestinationNoData()[0]); assertEquality(1, arrayPixel3Band, dataType, testBean.getDestinationNoData()[1]); assertEquality(2, arrayPixel3Band, dataType, testBean.getDestinationNoData()[2]); } else { if (fourthValue != null) { // Test for image with 1 band arrayPixel = testExecution3Image(testBean, 1, overlay); // Test for image with 3 band arrayPixel3Band = testExecution3Image(testBean, 3, overlay); if (!overlay) { double centerValue = (secondValue.doubleValue() + sixthValue .doubleValue()) / 2; if (dataType < 4) { centerValue += 1; } fifthValue = centerValue; } if (firstValue == null && thirdValue == null) { // Check if the pixel has the correct value assertEquality(0, arrayPixel, dataType, testBean.getDestinationNoData()[0], secondValue, testBean.getDestinationNoData()[0], fourthValue, fifthValue, sixthValue); // Check if the pixel has the correct value assertEquality(0, arrayPixel3Band, dataType, testBean.getDestinationNoData()[0], secondValue, testBean.getDestinationNoData()[0], fourthValue, fifthValue, sixthValue); assertEquality(1, arrayPixel3Band, dataType, testBean.getDestinationNoData()[1], secondValue, testBean.getDestinationNoData()[1], fourthValue, fifthValue, sixthValue); assertEquality(2, arrayPixel3Band, dataType, testBean.getDestinationNoData()[2], secondValue, testBean.getDestinationNoData()[2], fourthValue, fifthValue, sixthValue); } else { // Check if the pixel has the correct value assertEquality(0, arrayPixel, dataType, firstValue, secondValue, thirdValue, fourthValue, fifthValue, sixthValue); // Check if the pixel has the correct value assertEquality(0, arrayPixel3Band, dataType, firstValue, secondValue, thirdValue, fourthValue, fifthValue, sixthValue); assertEquality(1, arrayPixel3Band, dataType, firstValue, secondValue, thirdValue, fourthValue, fifthValue, sixthValue); assertEquality(2, arrayPixel3Band, dataType, firstValue, secondValue, thirdValue, fourthValue, fifthValue, sixthValue); } } else { if (secondValue != null) { if (roiused) { // Test for image with 1 band arrayPixel = testExecutionROI(testBean, 1); // Test for image with 3 band arrayPixel3Band = testExecutionROI(testBean, 3); } else if (alphaused) { // Test for image with 1 band arrayPixel = testExecutionAlpha(testBean, 1); // Test for image with 3 band arrayPixel3Band = testExecutionAlpha(testBean, 3); } if (firstValue == null) { // Check if the pixel has the correct value assertEquality(0, arrayPixel, dataType, testBean.getDestinationNoData()[0], secondValue, thirdValue); // Check if the pixel has the correct value assertEquality(0, arrayPixel3Band, dataType, testBean.getDestinationNoData()[0], secondValue, thirdValue); assertEquality(1, arrayPixel3Band, dataType, testBean.getDestinationNoData()[0], secondValue, thirdValue); assertEquality(2, arrayPixel3Band, dataType, testBean.getDestinationNoData()[0], secondValue, thirdValue); } else { // Check if the pixel has the correct value assertEquality(0, arrayPixel, dataType, firstValue, secondValue, thirdValue); // Check if the pixel has the correct value assertEquality(0, arrayPixel3Band, dataType, firstValue, secondValue, thirdValue); assertEquality(1, arrayPixel3Band, dataType, firstValue, secondValue, thirdValue); assertEquality(2, arrayPixel3Band, dataType, firstValue, secondValue, thirdValue); } } else { assertEquality(0, arrayPixel, dataType, firstValue); // Check if the pixel has the correct value assertEquality(0, arrayPixel3Band, dataType, firstValue); assertEquality(1, arrayPixel3Band, dataType, firstValue); assertEquality(2, arrayPixel3Band, dataType, firstValue); } } } } private void assertEquality(int bandIndex, Number[][] arrayPixel, int dataType, Number firstValue) { assertEquality(bandIndex, arrayPixel, dataType, firstValue, null, null, null, null, null); } private void assertEquality(int bandIndex, Number[][] arrayPixel, int dataType, Number firstValue, Number secondValue, Number thirdValue) { assertEquality(bandIndex, arrayPixel, dataType, firstValue, secondValue, thirdValue, null, null, null); } private void assertEquality(int bandIndex, Number[][] arrayPixel, int dataType, Number firstValue, Number secondValue, Number thirdValue, Number fourthValue, Number fifthValue, Number sixthValue) { switch (dataType) { case DataBuffer.TYPE_BYTE: // Position: if one data = center/if 3 data = upper left/ if 6 data // = upper left if (bandIndex > 0 && secondValue == null) { assertEquals(firstValue.byteValue(), arrayPixel[0][bandIndex].byteValue()); } else { assertEquals(firstValue.byteValue(), arrayPixel[bandIndex][0].byteValue()); } if (secondValue != null) { // Position: if 3 data = upper center left/ if 6 data = upper // center assertEquals(secondValue.byteValue(), arrayPixel[bandIndex][1].byteValue()); // Position: if 3 data = upper center/ if 6 data = upper right assertEquals(thirdValue.byteValue(), arrayPixel[bandIndex][2].byteValue()); } if (fourthValue != null) { // Position: center left assertEquals(fourthValue.byteValue(), arrayPixel[bandIndex][3].byteValue()); // Position: center assertEquals(fifthValue.byteValue(), arrayPixel[bandIndex][4].byteValue()); // Position: lower left assertEquals(sixthValue.byteValue(), arrayPixel[bandIndex][5].byteValue()); } break; case DataBuffer.TYPE_USHORT: case DataBuffer.TYPE_SHORT: if (bandIndex > 0 && secondValue == null) { assertEquals(firstValue.shortValue(), arrayPixel[0][bandIndex].shortValue()); } else { assertEquals(firstValue.shortValue(), arrayPixel[bandIndex][0].shortValue()); } if (secondValue != null) { assertEquals(secondValue.shortValue(), arrayPixel[bandIndex][1].shortValue()); assertEquals(thirdValue.shortValue(), arrayPixel[bandIndex][2].shortValue()); } if (fourthValue != null) { assertEquals(fourthValue.shortValue(), arrayPixel[bandIndex][3].shortValue()); assertEquals(fifthValue.shortValue(), arrayPixel[bandIndex][4].shortValue()); assertEquals(sixthValue.shortValue(), arrayPixel[bandIndex][5].shortValue()); } break; case DataBuffer.TYPE_INT: if (bandIndex > 0 && secondValue == null) { assertEquals(firstValue.intValue(), arrayPixel[0][bandIndex].intValue()); } else { assertEquals(firstValue.intValue(), arrayPixel[bandIndex][0].intValue()); } if (secondValue != null) { assertEquals(secondValue.intValue(), arrayPixel[bandIndex][1].intValue()); assertEquals(thirdValue.intValue(), arrayPixel[bandIndex][2].intValue()); } if (fourthValue != null) { assertEquals(fourthValue.intValue(), arrayPixel[bandIndex][3].intValue()); assertEquals(fifthValue.intValue(), arrayPixel[bandIndex][4].intValue()); assertEquals(sixthValue.intValue(), arrayPixel[bandIndex][5].intValue()); } break; case DataBuffer.TYPE_FLOAT: if (bandIndex > 0 && secondValue == null) { assertEquals(firstValue.floatValue(), arrayPixel[0][bandIndex].floatValue(), DEFAULT_DELTA); } else { assertEquals(firstValue.floatValue(), arrayPixel[bandIndex][0].floatValue(), DEFAULT_DELTA); } if (secondValue != null) { assertEquals(secondValue.floatValue(), arrayPixel[bandIndex][1].floatValue(), DEFAULT_DELTA); assertEquals(thirdValue.floatValue(), arrayPixel[bandIndex][2].floatValue(), DEFAULT_DELTA); } if (fourthValue != null) { assertEquals(fourthValue.floatValue(), arrayPixel[bandIndex][3].floatValue(), DEFAULT_DELTA); assertEquals(fifthValue.floatValue(), arrayPixel[bandIndex][4].floatValue(), DEFAULT_DELTA); assertEquals(sixthValue.floatValue(), arrayPixel[bandIndex][5].floatValue(), DEFAULT_DELTA); } break; case DataBuffer.TYPE_DOUBLE: if (bandIndex > 0 && secondValue == null) { assertEquals(firstValue.doubleValue(), arrayPixel[0][bandIndex].doubleValue(), DEFAULT_DELTA); } else { assertEquals(firstValue.doubleValue(), arrayPixel[bandIndex][0].doubleValue(), DEFAULT_DELTA); } if (secondValue != null) { assertEquals(secondValue.doubleValue(), arrayPixel[bandIndex][1].doubleValue(), DEFAULT_DELTA); assertEquals(thirdValue.doubleValue(), arrayPixel[bandIndex][2].doubleValue(), DEFAULT_DELTA); } if (fourthValue != null) { assertEquals(fourthValue.doubleValue(), arrayPixel[bandIndex][3].doubleValue(), DEFAULT_DELTA); assertEquals(fifthValue.doubleValue(), arrayPixel[bandIndex][4].doubleValue(), DEFAULT_DELTA); assertEquals(sixthValue.doubleValue(), arrayPixel[bandIndex][5].doubleValue(), DEFAULT_DELTA); } break; default: break; } } // Method for creating a 3 image element with the associated ROI and Alphas private static TestBean imageSettings3Images(Number[] validData, Number[] sourceNodata, double[] destinationNoDataValue, int dataType, boolean roiAlphaNotNull, boolean nullNoData) { if (dataType == DataBuffer.TYPE_FLOAT && !nullNoData) { for (int j = 0; j < sourceNodata.length; j++) { sourceNodata[j] = Float.NaN; } } else if (dataType == DataBuffer.TYPE_DOUBLE && !nullNoData) { for (int j = 0; j < sourceNodata.length; j++) { sourceNodata[j] = Double.NaN; } } TestBean tempMosaicBean = new TestBean(); RenderedImage image1 = null; RenderedImage image3Band1 = null; if (sourceNodata[0] == null) { image1 = getSyntheticUniformTypeImage(validData, sourceNodata, dataType, 1, DataDisplacement.DATA_DATA, true, false); image3Band1 = getSyntheticUniformTypeImage(validData, sourceNodata, dataType, 3, DataDisplacement.DATA_DATA, true, false); } else { image1 = getSyntheticUniformTypeImage(validData, sourceNodata, dataType, 1, DataDisplacement.NODATA_DATA, true, false); image3Band1 = getSyntheticUniformTypeImage(validData, sourceNodata, dataType, 3, DataDisplacement.NODATA_DATA, true, false); } RenderedImage image2 = getSyntheticUniformTypeImage(validData, sourceNodata, dataType, 1, DataDisplacement.DATA_DATA, false, false); RenderedImage image3 = getSyntheticUniformTypeImage(validData, sourceNodata, dataType, 1, DataDisplacement.DATA_DATA, false, true); RenderedImage image3Band2 = getSyntheticUniformTypeImage(validData, sourceNodata, dataType, 3, DataDisplacement.DATA_DATA, false, false); RenderedImage image3Band3 = getSyntheticUniformTypeImage(validData, sourceNodata, dataType, 3, DataDisplacement.DATA_DATA, false, true); RenderedImage[] array1Band = { image1, image2, image3 }; RenderedImage[] array3Band = { image3Band1, image3Band2, image3Band3 }; // new layout that double the image both in length and width ImageLayout layout = new ImageLayout(0, 0, array1Band[0].getWidth() + array1Band[1].getWidth(), array1Band[0].getHeight() + array1Band[1].getHeight()); layout.setTileHeight(array1Band[0].getHeight() / 16); layout.setTileWidth(array1Band[0].getWidth() / 16); // create the rendering hints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout); // All the data are saved in a mosaic bean tempMosaicBean.setDestinationNoData(destinationNoDataValue); tempMosaicBean.setImage(array1Band); tempMosaicBean.setImage3Bands(array3Band); Range[] nd = new Range[array1Band.length]; Range[] nd3Bands = new Range[array1Band.length]; ROI[] rois = new ROI[array1Band.length]; PlanarImage[] alphas = new PlanarImage[array1Band.length]; for (int k = 0; k < array1Band.length; k++) { if (sourceNodata[k] != null) { switch (dataType) { case DataBuffer.TYPE_BYTE: nd[k] = RangeFactory.create(sourceNodata[k].byteValue(), true, sourceNodata[k].byteValue(), true); nd3Bands[k] = RangeFactory.create( sourceNodata[k].byteValue(), true, sourceNodata[k].byteValue(), true); break; case DataBuffer.TYPE_USHORT: case DataBuffer.TYPE_SHORT: nd[k] = RangeFactory.createU(sourceNodata[k].shortValue(), true, sourceNodata[k].shortValue(), true); nd3Bands[k] = RangeFactory.createU( sourceNodata[k].shortValue(), true, sourceNodata[k].shortValue(), true); break; case DataBuffer.TYPE_INT: nd[k] = RangeFactory.create(sourceNodata[k].intValue(), true, sourceNodata[k].intValue(), true); nd3Bands[k] = RangeFactory.create( sourceNodata[k].intValue(), true, sourceNodata[k].intValue(), true); break; case DataBuffer.TYPE_FLOAT: nd[k] = RangeFactory.create(sourceNodata[k].floatValue(), true, sourceNodata[k].floatValue(), true, true); nd3Bands[k] = RangeFactory.create( sourceNodata[k].floatValue(), true, sourceNodata[k].floatValue(), true, true); break; case DataBuffer.TYPE_DOUBLE: nd[k] = RangeFactory.create(sourceNodata[k].doubleValue(), true, sourceNodata[k].doubleValue(), true, true); nd3Bands[k] = RangeFactory.create( sourceNodata[k].doubleValue(), true, sourceNodata[k].doubleValue(), true, true); break; } } if (roiAlphaNotNull) { // roi creation if (k == 1) { int imageWidth = image1.getWidth(); int imageHeigth = image1.getHeight(); int startRoiXPixelImage1 = imageWidth / 2; int startRoiYPixel = 0; int roiWidth = imageWidth / 2; int roiHeigth = imageHeigth; // Creation of 2 ROI Rectangle roiImage1 = new Rectangle(startRoiXPixelImage1, startRoiYPixel, roiWidth, roiHeigth); ROIShape roiData1 = new ROIShape(roiImage1); // Only 1 ROI is set to the ImageMosaicBean for the second // image rois[k] = roiData1; } // alpha channel creation if (k == 2) { Number[] alphaChannelData = { 30 }; PlanarImage alphaChannel = (PlanarImage) getSyntheticUniformTypeImage( alphaChannelData, null, dataType, 1, DataDisplacement.DATA_DATA, true, false); alphaChannel = TranslateDescriptor .create(alphaChannel, 0F, (float) (alphaChannel.getHeight() / 2), null, hints); alphas[k] = alphaChannel; } } } if (roiAlphaNotNull) { tempMosaicBean.setAlphas(alphas); tempMosaicBean.setRois(rois); } if (!nullNoData) { tempMosaicBean.setSourceNoDataRange(nd); tempMosaicBean.setSourceNoDataRange3Bands(nd3Bands); } tempMosaicBean.setSourceValidData(validData); return tempMosaicBean; } private Number[][] testExecution3Image(TestBean testBean, int numBands, boolean overlay) { // Pre-allocated array for saving the pixel values Number[][] arrayPixel = new Number[3][6]; RenderedImage image5 = null; RenderedImage[] sourceArray = null; // start image array Range[] nd = null; if (numBands == 3) { sourceArray = testBean.getImage3Bands(); nd = testBean.getSourceNoDataRange(); } else { sourceArray = testBean.getImage(); nd = testBean.getSourceNoDataRange3Bands(); } // start image array RenderedImage[] mosaicArray = new RenderedImage[3]; // Translation of the second image of half of its dimension // IMAGE ON THE UPPER RIGHT mosaicArray[1] = TranslateDescriptor.create(sourceArray[1], (float) (sourceArray[1].getWidth() / 2), 0F, null, hints); // The First image is only put in the new layout // IMAGE ON THE UPPER LEFT mosaicArray[0] = TranslateDescriptor.create(sourceArray[0], 0F, 0F, null, hints); // IMAGE ON THE LOWER LEFT mosaicArray[2] = TranslateDescriptor.create(sourceArray[2], 0F, (float) (sourceArray[2].getHeight() / 2), null, hints); // Getting the nodata, rois, alphabands PlanarImage[] alphas = testBean.getAlphas(); ROI[] rois = testBean.getRois(); // Creates an array for the destination band values double[] destinationValues = testBean.getDestinationNoData(); if (overlay) { // MosaicNoData operation image5 = MosaicDescriptor.create(mosaicArray, DEFAULT_MOSAIC_TYPE, alphas, rois, null, destinationValues, nd, hints); } else { image5 = MosaicDescriptor .create(mosaicArray, javax.media.jai.operator.MosaicDescriptor.MOSAIC_TYPE_BLEND, alphas, rois, null, destinationValues, nd, hints); } int dataType = image5.getSampleModel().getDataType(); int minXTile = image5.getMinTileX(); int minYTile = image5.getMinTileY(); int numXTile = image5.getNumXTiles(); int numYTile = image5.getNumYTiles(); int maxXTile = minXTile + (numXTile - 1); int maxYTile = minYTile + (numYTile - 1); // TILE SELECTION // minimun X coordinate tile selection int minXTileCoord = minXTile; // minimun Y coordinate tile selection int minYTileCoord = minYTile; // medium X coordinate between the first image and the second image int medXCoord12 = (maxXTile / 2) - 1; // medium Y coordinate between the first image and the third image int medYCoord13 = (maxYTile / 2) - 1; // medium X coordinate in the second image int medXCoord2 = (maxXTile / 2) + ((maxXTile) / 4 - 1); // medium Y coordinate in the third image int medYCoord3 = (maxYTile / 2) + ((maxYTile) / 4 - 1); // Raster Array Raster[] rasterArray = new Raster[6]; // Selection of the upper left image tile rasterArray[0] = image5.getTile(minXTileCoord, minYTileCoord); // Selection of the upperCenter image tile rasterArray[1] = image5.getTile(medXCoord12, minYTileCoord); // Selection of the upperRight image tile rasterArray[2] = image5.getTile(medXCoord2, minYTileCoord); // Selection of the centerLeft image tile rasterArray[3] = image5.getTile(minXTileCoord, medYCoord13); // selection of a tile in the middle of the total image rasterArray[4] = image5.getTile(medXCoord12, medYCoord13); // Selection of the lowerLeft image tile rasterArray[5] = image5.getTile(minXTileCoord, medYCoord3); int[] arrayPixelInt = null; float[] arrayPixelFloat = null; double[] arrayPixelDouble = null; switch (dataType) { case DataBuffer.TYPE_BYTE: case DataBuffer.TYPE_USHORT: case DataBuffer.TYPE_SHORT: case DataBuffer.TYPE_INT: arrayPixelInt = new int[6]; // first iteration : selection of the first pixel of the first image // (no data) // second iteration : selection of the pixel in ROI(second image) // but no data(first image) // third iteration : selection of the pixel not in ROI but in the // second image // fourth iteration : selection of the pixel in alpha channel(third // image) but no data(first image) // fifth iteration : selection of the pixel in alpha channel(third // image), in ROI(second image) but no data(first image) // sixth iteration : selection of the pixel in alpha channel(third // image) // Iteration around the bands for (int i = 0; i < numBands; i++) { // Iteration around the image for (int j = 0; j < 6; j++) { arrayPixel[i][j] = rasterArray[j].getPixel( rasterArray[j].getMinX(), rasterArray[j].getMinY(), arrayPixelInt)[i]; } } break; case DataBuffer.TYPE_FLOAT: arrayPixelFloat = new float[6]; // Iteration around the bands for (int i = 0; i < numBands; i++) { // Iteration around the image for (int j = 0; j < 6; j++) { arrayPixel[i][j] = rasterArray[j].getPixel( rasterArray[j].getMinX(), rasterArray[j].getMinY(), arrayPixelFloat)[i]; } } break; case DataBuffer.TYPE_DOUBLE: arrayPixelDouble = new double[3]; // Iteration around the bands for (int i = 0; i < numBands; i++) { // Iteration around the image for (int j = 0; j < 6; j++) { arrayPixel[i][j] = rasterArray[j].getPixel( rasterArray[j].getMinX(), rasterArray[j].getMinY(), arrayPixelDouble)[i]; } } break; } // Final Image disposal if (image5 instanceof RenderedOp) { ((RenderedOp) image5).dispose(); } return arrayPixel; } private Number[][] testExecutionAlpha(TestBean testBean, int numBands) { // Pre-allocated array for saving the pixel values Number[][] arrayPixel = new Number[3][3]; RenderedImage[] sourceArray = null; Range[] nd = null; if (numBands == 3) { sourceArray = testBean.getImage3Bands(); nd = testBean.getSourceNoDataRange(); } else { sourceArray = testBean.getImage(); nd = testBean.getSourceNoDataRange3Bands(); } // start image array RenderedImage[] mosaicArray = new RenderedImage[2]; // Translation of the second image of half of its dimension // IMAGE ON THE RIGHT mosaicArray[1] = TranslateDescriptor.create(sourceArray[1], (float) (sourceArray[1].getWidth() / 2), 0F, null, hints); // The First image is only put in the new layout // IMAGE ON THE LEFT mosaicArray[0] = TranslateDescriptor.create(sourceArray[0], 0F, 0F, null, hints); // Getting the nodata, rois, alphabands PlanarImage[] alphas = testBean.getAlphas(); ROI[] rois = testBean.getRois(); // Creates an array for the destination band values double[] destinationValues = testBean.getDestinationNoData(); // MosaicNoData operation RenderedImage image5 = MosaicDescriptor.create(mosaicArray, DEFAULT_MOSAIC_TYPE, alphas, rois, null, destinationValues, nd, hints); int dataType = image5.getSampleModel().getDataType(); int minXTile = image5.getMinTileX(); int minYTile = image5.getMinTileY(); int numXTile = image5.getNumXTiles(); int maxXTile = minXTile + (numXTile - 1); // RasterArray Raster[] rasterArray = new Raster[3]; // Selection of the first image tile rasterArray[0] = image5.getTile(0, 0); // selection of a tile in the middle of the total image rasterArray[1] = image5.getTile((maxXTile + 1) / 2 - 1, minYTile); // selection of the last tile of the second image rasterArray[2] = image5.getTile((maxXTile + 1) / 2 - 1 + (maxXTile + 1) / 4, minYTile); // X coordinates array int[] coordinateXarray = new int[3]; coordinateXarray[0] = 0; int tileCenterWidth = rasterArray[1].getWidth(); // selection of the first pixel of the tile coordinateXarray[1] = rasterArray[1].getMinX() + (tileCenterWidth / 2); // int minYCoordCenter = rasterArray[1].getMinY(); int tileRightSecondImWidth = rasterArray[2].getWidth(); // selection of the last pixel of the tile coordinateXarray[2] = rasterArray[2].getMinX() + tileRightSecondImWidth - 1; // int minYCoordRightSecondIm = rasterArray[2].getMinY(); int[] arrayPixelInt = null; float[] arrayPixelFloat = null; double[] arrayPixelDouble = null; switch (dataType) { case DataBuffer.TYPE_BYTE: case DataBuffer.TYPE_USHORT: case DataBuffer.TYPE_SHORT: case DataBuffer.TYPE_INT: arrayPixelInt = new int[3]; // first iteration : selection of the first pixel of the image // second iteration : selection of the pixel in the second ROI but // not in the first ROI // third iteration : selection of the last pixel // Iteration around the bands for (int i = 0; i < numBands; i++) { // Iteration around the image for (int j = 0; j < 3; j++) { arrayPixel[i][j] = rasterArray[j].getPixel( coordinateXarray[j], 0, arrayPixelInt)[i]; } } break; case DataBuffer.TYPE_FLOAT: arrayPixelFloat = new float[3]; // Iteration around the bands for (int i = 0; i < numBands; i++) { // Iteration around the image for (int j = 0; j < 3; j++) { arrayPixel[i][j] = rasterArray[j].getPixel( coordinateXarray[j], 0, arrayPixelFloat)[i]; } } break; case DataBuffer.TYPE_DOUBLE: arrayPixelDouble = new double[3]; // Iteration around the bands for (int i = 0; i < numBands; i++) { // Iteration around the image for (int j = 0; j < 3; j++) { arrayPixel[i][j] = rasterArray[j].getPixel( coordinateXarray[j], 0, arrayPixelDouble)[i]; } } break; } // Final Image disposal if (image5 instanceof RenderedOp) { ((RenderedOp) image5).dispose(); } return arrayPixel; } private Number[] testExecution(TestBean testBean, int numBands) { // Pre-allocated array for saving the pixel values Number[] arrayPixel = new Number[3]; // start image array RenderedImage[] sourceArray = null; Range[] nd = null; if (numBands == 3) { sourceArray = testBean.getImage3Bands(); nd = testBean.getSourceNoDataRange(); } else { sourceArray = testBean.getImage(); nd = testBean.getSourceNoDataRange3Bands(); } RenderedImage[] mosaicArray = new RenderedImage[2]; // Translation of the second image of half of its dimension // IMAGE ON THE RIGHT mosaicArray[1] = TranslateDescriptor.create(sourceArray[1], (float) (sourceArray[1].getWidth() / 2), 0F, null, hints); // The First image is only put in the new layout // IMAGE ON THE LEFT mosaicArray[0] = TranslateDescriptor.create(sourceArray[0], 0F, 0F, null, hints); // Creates an array for the destination band values double[] destinationValues = testBean.getDestinationNoData(); // Getting the nodata, rois, alphabands PlanarImage[] alphas = testBean.getAlphas(); ROI[] rois = testBean.getRois(); // MosaicNoData operation RenderedImage image5 = MosaicDescriptor.create(mosaicArray, DEFAULT_MOSAIC_TYPE, alphas, rois, null, destinationValues, nd, hints); int minXTile = image5.getMinTileX(); int minYTile = image5.getMinTileY(); int numXTile = image5.getNumXTiles(); int maxXTile = minXTile + (numXTile - 1); Raster upperCenter = image5.getTile(maxXTile / 2, minYTile); // Raster pixel coordinates int minXCoord = upperCenter.getMinX(); // Raster dimension in pixel int numXPixel = upperCenter.getWidth(); // Raster last pixel coordinates int mediumXPixelCoord = minXCoord + (numXPixel / 2); int[] arrayPixelInt = null; float[] arrayPixelFloat = null; double[] arrayPixelDouble = null; int dataType = image5.getSampleModel().getDataType(); switch (dataType) { case DataBuffer.TYPE_BYTE: case DataBuffer.TYPE_USHORT: case DataBuffer.TYPE_SHORT: case DataBuffer.TYPE_INT: arrayPixelInt = new int[3]; // Iteration around the bands for (int i = 0; i < numBands; i++) { arrayPixel[i] = upperCenter.getPixel(mediumXPixelCoord, 0, arrayPixelInt)[i]; } break; case DataBuffer.TYPE_FLOAT: arrayPixelFloat = new float[3]; // Iteration around the bands for (int i = 0; i < numBands; i++) { arrayPixel[i] = upperCenter.getPixel(mediumXPixelCoord, 0, arrayPixelFloat)[i]; } break; case DataBuffer.TYPE_DOUBLE: arrayPixelDouble = new double[3]; // Iteration around the bands for (int i = 0; i < numBands; i++) { arrayPixel[i] = upperCenter.getPixel(mediumXPixelCoord, 0, arrayPixelDouble)[i]; } break; } // Final Image disposal if (image5 instanceof RenderedOp) { ((RenderedOp) image5).dispose(); } return arrayPixel; } private Number[][] testExecutionROI(TestBean testBean, int numBands) { // Pre-allocated array for saving the pixel values Number[][] arrayPixel = new Number[3][3]; RenderedImage[] sourceArray = null; Range[] nd = null; if (numBands == 3) { sourceArray = testBean.getImage3Bands(); nd = testBean.getSourceNoDataRange(); } else { sourceArray = testBean.getImage(); nd = testBean.getSourceNoDataRange3Bands(); } // start image array RenderedImage[] mosaicArray = new RenderedImage[2]; // Translation of the second image of half of its dimension // IMAGE ON THE RIGHT mosaicArray[1] = TranslateDescriptor.create(sourceArray[1], (float) (sourceArray[1].getWidth() / 2), 0F, null, hints); // The First image is only put in the new layout // IMAGE ON THE LEFT mosaicArray[0] = TranslateDescriptor.create(sourceArray[0], 0F, 0F, null, hints); // Getting the nodata, rois, alphabands PlanarImage[] alphas = testBean.getAlphas(); ROI[] rois = testBean.getRois(); // Creates an array for the destination band values double[] destinationValues = testBean.getDestinationNoData(); // MosaicNoData operation // MosaicNoData operation RenderedImage image5 = MosaicDescriptor.create(mosaicArray, DEFAULT_MOSAIC_TYPE, alphas, rois, null, destinationValues, nd, hints); int dataType = image5.getSampleModel().getDataType(); int minXTile = image5.getMinTileX(); int minYTile = image5.getMinTileY(); int numXTile = image5.getNumXTiles(); int maxXTile = minXTile + (numXTile - 1); // RasterArray Raster[] rasterArray = new Raster[3]; // Selection of the first image tile rasterArray[0] = image5.getTile(0, 0); // selection of a tile in the middle of the first image rasterArray[1] = image5.getTile((maxXTile / 4) + 1, minYTile); // selection of the center tile rasterArray[2] = image5.getTile(((maxXTile + 1) / 2) - 1, minYTile); // X coordinates array int[] coordinateXarray = new int[3]; coordinateXarray[0] = 0; // selection of the first pixel of the second tile coordinateXarray[1] = rasterArray[1].getMinX(); int tileWidth = rasterArray[2].getWidth(); // selection of the first pixel of the third tile coordinateXarray[2] = rasterArray[2].getMinX() + tileWidth - 1; int[] arrayPixelInt = null; float[] arrayPixelFloat = null; double[] arrayPixelDouble = null; switch (dataType) { case DataBuffer.TYPE_BYTE: case DataBuffer.TYPE_USHORT: case DataBuffer.TYPE_SHORT: case DataBuffer.TYPE_INT: arrayPixelInt = new int[3]; // first iteration : selection of the first pixel of the image // second iteration : selection of the first pixel in the middle of // the first image // third iteration : selection of the first pixel of the center tile // of the global image // Iteration around the bands for (int i = 0; i < numBands; i++) { // Iteration around the image for (int j = 0; j < 3; j++) { arrayPixel[i][j] = rasterArray[j].getPixel( coordinateXarray[j], 0, arrayPixelInt)[i]; } } break; case DataBuffer.TYPE_FLOAT: arrayPixelFloat = new float[3]; // Iteration around the bands for (int i = 0; i < numBands; i++) { // Iteration around the image for (int j = 0; j < 3; j++) { arrayPixel[i][j] = rasterArray[j].getPixel( coordinateXarray[j], 0, arrayPixelFloat)[i]; } } break; case DataBuffer.TYPE_DOUBLE: arrayPixelDouble = new double[3]; // Iteration around the bands for (int i = 0; i < numBands; i++) { // Iteration around the image for (int j = 0; j < 3; j++) { arrayPixel[i][j] = rasterArray[j].getPixel( coordinateXarray[j], 0, arrayPixelDouble)[i]; } } break; } // Final Image disposal if (image5 instanceof RenderedOp) { ((RenderedOp) image5).dispose(); } return arrayPixel; } // Static method for adding the Alpha bands on the test images private static void creationAlpha(TestBean bean, int dataType) { // definition of the alpha band variables Number[] alphaChannelData = new Number[2]; alphaChannelData[0] = 30; alphaChannelData[1] = 70; PlanarImage alphaChannel0 = null; PlanarImage alphaChannel1 = null; // Creation of the planar images alphaChannel0 = (PlanarImage) getSyntheticUniformTypeImage( alphaChannelData, null, dataType, 1, DataDisplacement.DATA_DATA, true, false); alphaChannel1 = (PlanarImage) getSyntheticUniformTypeImage( alphaChannelData, null, dataType, 1, DataDisplacement.DATA_DATA, false, false); alphaChannel1 = TranslateDescriptor.create(alphaChannel1, (float) (alphaChannel1.getWidth() / 2), 0F, null, hints); PlanarImage[] alphas = new PlanarImage[] { alphaChannel0, alphaChannel1 }; bean.setAlphas(alphas); } // Static method for adding the ROI on the test images private static void creationROI(TestBean bean) { int imageWidth = bean.getImage()[0].getWidth(); int startRoiXPixelImage1 = imageWidth - 2; int startRoiYPixel = 0; int roiWidth = imageWidth; int roiHeigth = 50; // Creation of 2 ROI Rectangle roiImage1 = new Rectangle(startRoiXPixelImage1, startRoiYPixel, roiWidth, roiHeigth); ROIShape roiData1 = new ROIShape(roiImage1); // the second ROI is translated towards the X direction int startRoiXPixelImage2 = imageWidth / 2; Rectangle roiImage2 = new Rectangle(startRoiXPixelImage2, startRoiYPixel, roiWidth, roiHeigth); ROIShape roiData2 = new ROIShape(roiImage2); ROI[] rois = new ROI[] { roiData1, roiData2 }; // setting ROI bean.setRois(rois); } private static TestBean imageSettings(Number[] validData, Number[] sourceNodata, double[] destinationNoDataValue, int dataType, int imageDataNoData) { DataDisplacement dd = DataDisplacement.values()[imageDataNoData]; TestBean tempMosaicBean = new TestBean(); if (dataType == DataBuffer.TYPE_FLOAT) { for (int i = 0; i < sourceNodata.length; i++) { sourceNodata[i] = Float.NaN; } } else if (dataType == DataBuffer.TYPE_DOUBLE) { for (int i = 0; i < sourceNodata.length; i++) { sourceNodata[i] = Double.NaN; } } // no data-no data // no data- data // data-data RenderedImage image1 = getSyntheticUniformTypeImage(validData, sourceNodata, dataType, 1, dd, true, false); RenderedImage image2 = getSyntheticUniformTypeImage(validData, sourceNodata, dataType, 1, dd, false, false); RenderedImage image3Band1 = getSyntheticUniformTypeImage(validData, sourceNodata, dataType, 3, dd, true, false); RenderedImage image3Band2 = getSyntheticUniformTypeImage(validData, sourceNodata, dataType, 3, dd, false, false); RenderedImage[] array1Band = { image1, image2 }; RenderedImage[] array3Band = { image3Band1, image3Band2 }; // new layout that double the image ImageLayout layout = new ImageLayout(0, 0, array1Band[0].getWidth() + array1Band[1].getWidth(), array1Band[0].getHeight()); layout.setTileHeight(array1Band[0].getHeight() / 16); layout.setTileWidth(array1Band[0].getWidth() / 16); // create the rendering hints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout); // All the data are saved in a mosaic bean tempMosaicBean.setDestinationNoData(destinationNoDataValue); tempMosaicBean.setImage(array1Band); tempMosaicBean.setImage3Bands(array3Band); Range[] nd = new Range[array1Band.length]; Range[] nd3Bands = new Range[array1Band.length]; for (int k = 0; k < array1Band.length; k++) { switch (dataType) { case DataBuffer.TYPE_BYTE: nd[k] = RangeFactory.create(sourceNodata[k].byteValue(), true, sourceNodata[k].byteValue(), true); nd3Bands[k] = RangeFactory.create(sourceNodata[k].byteValue(), true, sourceNodata[k].byteValue(), true); break; case DataBuffer.TYPE_USHORT: case DataBuffer.TYPE_SHORT: nd[k] = RangeFactory.createU(sourceNodata[k].shortValue(), true, sourceNodata[k].shortValue(), true); nd3Bands[k] = RangeFactory.createU( sourceNodata[k].shortValue(), true, sourceNodata[k].shortValue(), true); break; case DataBuffer.TYPE_INT: nd[k] = RangeFactory.create(sourceNodata[k].intValue(), true, sourceNodata[k].intValue(), true); nd3Bands[k] = RangeFactory.create(sourceNodata[k].intValue(), true, sourceNodata[k].intValue(), true); break; case DataBuffer.TYPE_FLOAT: nd[k] = RangeFactory.create(sourceNodata[k].floatValue(), true, sourceNodata[k].floatValue(), true, true); nd3Bands[k] = RangeFactory.create(sourceNodata[k].floatValue(), true, sourceNodata[k].floatValue(), true, true); break; case DataBuffer.TYPE_DOUBLE: nd[k] = RangeFactory.create(sourceNodata[k].doubleValue(), true, sourceNodata[k].doubleValue(), true, true); nd3Bands[k] = RangeFactory.create( sourceNodata[k].doubleValue(), true, sourceNodata[k].doubleValue(), true, true); break; } } tempMosaicBean.setSourceNoDataRange(nd); tempMosaicBean.setSourceNoDataRange3Bands(nd3Bands); tempMosaicBean.setSourceValidData(validData); return tempMosaicBean; } // creates all the Mosaic Bean per datatype and with the // combination(nodata-nodata,data-nodata,data-data) private static TestBean createBean(int dataType, int imageDataNoData, boolean useROI, boolean useAlpha) { // Data definition Number[] sourceND = new Number[2]; Number[] validData = new Number[2]; double[] destinationND = new double[3]; // source no data values sourceND[0] = 50; sourceND[1] = 50; // source possible valid data validData[0] = 15; validData[1] = 80; // destination no data destinationND[0] = 100; destinationND[1] = 100; destinationND[2] = 100; // Bean creation TestBean bean = imageSettings(validData, sourceND, destinationND, dataType, imageDataNoData); if (useROI) { creationROI(bean); } if (useAlpha) { creationAlpha(bean, dataType); } return bean; } // creates all the Mosaic Bean per datatype and with the // combination(nodata-nodata,data-nodata,data-data) private static TestBean createBean3Images(int dataType, boolean nullNoData, boolean roiAlphaNotNull) { // one sourceND or valid data for source(same for every band) Number[] sourceND = new Number[3]; Number[] validData = new Number[3]; // one destination ND value for band(destination is only one image) double[] destinationND = new double[3]; // source no data values if (nullNoData) { sourceND[0] = null; sourceND[1] = null; sourceND[2] = null; } else { sourceND[0] = 50; sourceND[1] = 50; sourceND[2] = 50; } // source possible valid data validData[0] = 15; validData[1] = 65; validData[2] = 80; // destination no data destinationND[0] = 100; destinationND[1] = 100; destinationND[2] = 100; // Bean creation TestBean bean = imageSettings3Images(validData, sourceND, destinationND, dataType, roiAlphaNotNull, nullNoData); return bean; } // Method for image creation public static RenderedImage getSyntheticUniformTypeImage( Number[] valueData, Number[] valueNoData, int dataType, int numBands, DataDisplacement dd, boolean isFirstImage, boolean isLastOf3) { Number value = 0; switch (dd) { case DATA_DATA: if (isFirstImage) { value = valueData[0]; } else { value = valueData[1]; } break; case NODATA_DATA: if (isFirstImage) { value = valueNoData[0]; } else { value = valueData[1]; } break; case NODATA_NODATA: if (isFirstImage) { value = valueNoData[0]; } else { value = valueNoData[1]; } break; default: break; } if (valueData.length == 3 && isLastOf3) { value = valueData[2]; } // parameter block initialization ParameterBlock pb = new ParameterBlock(); pb.add(DEFAULT_WIDTH); pb.add(DEFAULT_HEIGTH); if (numBands == 3) { switch (dataType) { case DataBuffer.TYPE_BYTE: byte valueByte = value.byteValue(); Byte[] arraybyte = new Byte[] { valueByte, valueByte, valueByte }; pb.add(arraybyte); break; case DataBuffer.TYPE_USHORT: short valueUShort = value.shortValue(); Short[] arrayUShort = new Short[] { (short) (valueUShort & 0xffff), (short) (valueUShort & 0xffff), (short) (valueUShort & 0xffff) }; pb.add(arrayUShort); break; case DataBuffer.TYPE_SHORT: short valueShort = value.shortValue(); Short[] arrayShort = new Short[] { valueShort, valueShort, valueShort }; pb.add(arrayShort); break; case DataBuffer.TYPE_INT: int valueInt = value.intValue(); Integer[] arrayInteger = new Integer[] { valueInt, valueInt, valueInt }; pb.add(arrayInteger); break; case DataBuffer.TYPE_FLOAT: float valueFloat = value.floatValue(); Float[] arrayFloat = new Float[] { valueFloat, valueFloat, valueFloat }; pb.add(arrayFloat); break; case DataBuffer.TYPE_DOUBLE: double valueDouble = value.doubleValue(); Double[] arrayDouble = new Double[] { valueDouble, valueDouble, valueDouble }; pb.add(arrayDouble); break; } } else { switch (dataType) { case DataBuffer.TYPE_BYTE: byte valueByte = value.byteValue(); Byte[] arraybyte = new Byte[] { valueByte }; pb.add(arraybyte); break; case DataBuffer.TYPE_USHORT: short valueUShort = value.shortValue(); Short[] arrayUShort = new Short[] { (short) (valueUShort & 0xffff) }; pb.add(arrayUShort); break; case DataBuffer.TYPE_SHORT: short valueShort = value.shortValue(); Short[] arrayShort = new Short[] { valueShort }; pb.add(arrayShort); break; case DataBuffer.TYPE_INT: int valueInt = value.intValue(); Integer[] arrayInteger = new Integer[] { valueInt }; pb.add(arrayInteger); break; case DataBuffer.TYPE_FLOAT: float valueFloat = value.floatValue(); Float[] arrayFloat = new Float[] { valueFloat }; pb.add(arrayFloat); break; case DataBuffer.TYPE_DOUBLE: double valueDouble = value.doubleValue(); Double[] arrayDouble = new Double[] { valueDouble }; pb.add(arrayDouble); break; } } // Create the constant operation. return JAI.create("constant", pb); } // Help-class for storing all the various data in a single container private static class TestBean implements Serializable { /** serialVersionUID */ private static final long serialVersionUID = 1L; // 1 band image private RenderedImage[] image; // 3 band image private RenderedImage[] image3Bands; // destination no data values private double[] destinationNoData; // source valid data values private Number[] sourceValidData; // source NoData Range useful for testing private Range[] sourceNoDataRange; // source NoData Range useful for testing 3 bands imgs private Range[] sourceNoDataRange3Bands; // input ROIs used for testing private ROI[] rois; // input Alpha used for testing private PlanarImage[] alphas; TestBean() { } public RenderedImage[] getImage() { return image; } public void setImage(RenderedImage[] image) { this.image = image; } public double[] getDestinationNoData() { return destinationNoData; } public void setDestinationNoData(double[] destinationNoData) { this.destinationNoData = destinationNoData; } public Number[] getSourceValidData() { return sourceValidData; } public void setSourceValidData(Number[] sourceValidData) { this.sourceValidData = sourceValidData; } public RenderedImage[] getImage3Bands() { return image3Bands; } public void setImage3Bands(RenderedImage[] image3Bands) { this.image3Bands = image3Bands; } public Range[] getSourceNoDataRange() { return sourceNoDataRange; } public void setSourceNoDataRange(Range[] sourceNoDataRange) { this.sourceNoDataRange = sourceNoDataRange; } public Range[] getSourceNoDataRange3Bands() { return sourceNoDataRange3Bands; } public void setSourceNoDataRange3Bands(Range[] sourceNoDataRange3Bands) { this.sourceNoDataRange3Bands = sourceNoDataRange3Bands; } public ROI[] getRois() { return rois; } public void setRois(ROI[] rois) { this.rois = rois; } public PlanarImage[] getAlphas() { return alphas; } public void setAlphas(PlanarImage[] alphas) { this.alphas = alphas; } } }