/* JAI-Ext - OpenSource Java Advanced Image Extensions Library * http://www.geo-solutions.it/ * Copyright 2014 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; import static org.junit.Assert.assertTrue; import it.geosolutions.jaiext.ConcurrentOperationRegistry.OperationCollection; import it.geosolutions.jaiext.ConcurrentOperationRegistry.OperationItem; import it.geosolutions.jaiext.interpolators.InterpolationBicubic; import it.geosolutions.jaiext.interpolators.InterpolationBilinear; import it.geosolutions.jaiext.interpolators.InterpolationNearest; import it.geosolutions.jaiext.testclasses.TestData; import java.awt.image.renderable.ParameterBlock; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import javax.media.jai.JAI; import javax.media.jai.operator.ScaleDescriptor; import org.apache.commons.io.FileUtils; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import com.sun.media.jai.mlib.MlibScaleRIF; import com.sun.media.jai.opimage.ScaleCRIF; public class JAIEXTTest { private final static String SCALE = "Scale"; private static File newJAIFile; @BeforeClass public static void setup() throws FileNotFoundException, IOException { final File inputJAIFile = TestData.file(JAIEXTTest.class, "META-INF" + File.separator + "registryFile2.jaiext"); newJAIFile = new File(inputJAIFile.getParentFile().getParentFile().getParentFile() .getParentFile().getParentFile().getParentFile(), "META-INF" + File.separator + "registryFile.jaiext"); FileUtils.copyFile(inputJAIFile, newJAIFile); // Setting of the operation registry JAIExt.initJAIEXT(); } @Test public void testJAIEXT() { // Getting the registry ConcurrentOperationRegistry registry = JAIExt.getRegistry(); // Ensure that the "Scale" operation is described by the dummy descriptor OperationCollection operations = registry.getOperationCollection(); OperationItem operationItem = operations.get(SCALE); // First check that the scale operation is present assertTrue(operationItem != null); // Using JAI-EXT for changing the descriptor from JAI to JAI-EXT JAIExt.registerJAIEXTDescriptor(SCALE); // Ensure that the "Scale" operation is described by the dummy descriptor operations = registry.getOperationCollection(); operationItem = operations.get(SCALE); // Then check that the descriptor is an instance of the DummyScaleDescriptor class assertTrue(operationItem.getDescriptor().getClass() .isAssignableFrom(DummyScaleDescriptor.class)); // Also check that the associated RIF is an instance of the DummyScaleCRIF class assertTrue(operationItem.getCurrentFactory().getClass() .isAssignableFrom(DummyScaleCRIF.class)); // Using JAI-EXT for changing the descriptor from JAI-EXT to JAI JAIExt.registerJAIDescriptor(SCALE); // Then check that the descriptor is an instance of the ScaleDescriptor class operations = registry.getOperationCollection(); operationItem = operations.get(SCALE); assertTrue(operationItem.getDescriptor().getClass().isAssignableFrom(ScaleDescriptor.class)); // Also check that the associated RIF is an instance of the ScaleCRIF class assertTrue(operationItem.getCurrentFactory().getClass().isAssignableFrom(ScaleCRIF.class)); // Using JAI-EXT class for setting the MediaLib Factory // Setting the JAI operation JAIExt.registerJAIDescriptor(SCALE); // Check if the Medialib acceleration is present otherwise no test is done if (JAIExt.isMedialibavailable()) { // Set the acceleration JAIExt.setJAIAcceleration(SCALE, true); // Then check that the descriptor is an instance of the ScaleDescriptor class operations = registry.getOperationCollection(); operationItem = operations.get(SCALE); // Also check that the associated RIF is an instance of the ScaleCRIF class assertTrue(operationItem.getCurrentFactory().getClass() .isAssignableFrom(MlibScaleRIF.class)); // Unset the acceleration JAIExt.setJAIAcceleration(SCALE, false); // Then check that the descriptor is an instance of the ScaleDescriptor class operations = registry.getOperationCollection(); operationItem = operations.get(SCALE); // Also check that the associated RIF is an instance of the ScaleCRIF class assertTrue(operationItem.getCurrentFactory().getClass() .isAssignableFrom(ScaleCRIF.class)); } } @Test public void testInterpolation() { // Getting the registry ConcurrentOperationRegistry registry = JAIExt.getRegistry(); // Using JAI-EXT for changing the descriptor from JAI-EXT to JAI JAIExt.registerJAIDescriptor(SCALE); // NEAREST INTERPOLATION // Trying to execute the Scale operation by passing JAI-EXT interpolation objects // and checking if the registry is able to convert them to JAI interpolation objects Object[] args = new Object[1]; ParameterBlock block = new ParameterBlock(); // Setting of a JAIEXT interpolation object block.set(new InterpolationNearest(null, false, 0, 0), 0); // Setting of the parameterblock args[0] = block; registry.checkInterpolation(SCALE, args); // Ensure that the modified parameterblock contains a JAI interpolation object Object interp = block.getObjectParameter(0); assertTrue(interp.getClass().isAssignableFrom(javax.media.jai.InterpolationNearest.class)); // BILINEAR INTERPOLATION // Trying to execute the Scale operation by passing JAI-EXT interpolation objects // and checking if the registry is able to convert them to JAI interpolation objects args = new Object[1]; block = new ParameterBlock(); // Setting of a JAIEXT interpolation object int subsampleBits = 8; block.set(new InterpolationBilinear(subsampleBits, null, false, 0, 0), 0); // Setting of the parameterblock args[0] = block; registry.checkInterpolation(SCALE, args); // Ensure that the modified parameterblock contains a JAI interpolation object interp = block.getObjectParameter(0); assertTrue(interp.getClass().isAssignableFrom(javax.media.jai.InterpolationBilinear.class)); assertTrue(((javax.media.jai.InterpolationBilinear)interp).getSubsampleBitsH() == subsampleBits); // BICUBIC INTERPOLATION // Trying to execute the Scale operation by passing JAI-EXT interpolation objects // and checking if the registry is able to convert them to JAI interpolation objects args = new Object[1]; block = new ParameterBlock(); // Setting of a JAIEXT interpolation object block.set(new InterpolationBicubic(subsampleBits, null, false, 0, 0, true, subsampleBits), 0); // Setting of the parameterblock args[0] = block; registry.checkInterpolation(SCALE, args); // Ensure that the modified parameterblock contains a JAI interpolation object interp = block.getObjectParameter(0); assertTrue(interp.getClass().isAssignableFrom(javax.media.jai.InterpolationBicubic.class)); assertTrue(((javax.media.jai.InterpolationBicubic)interp).getSubsampleBitsH() == subsampleBits); assertTrue(((javax.media.jai.InterpolationBicubic)interp).getPrecisionBits() == subsampleBits); // BICUBIC 2 INTERPOLATION // Trying to execute the Scale operation by passing JAI-EXT interpolation objects // and checking if the registry is able to convert them to JAI interpolation objects args = new Object[1]; block = new ParameterBlock(); // Setting of a JAIEXT interpolation object block.set(new InterpolationBicubic(subsampleBits, null, false, 0, 0, false, subsampleBits), 0); // Setting of the parameterblock args[0] = block; registry.checkInterpolation(SCALE, args); // Ensure that the modified parameterblock contains a JAI interpolation object interp = block.getObjectParameter(0); assertTrue(interp.getClass().isAssignableFrom(javax.media.jai.InterpolationBicubic2.class)); assertTrue(((javax.media.jai.InterpolationBicubic2)interp).getSubsampleBitsH() == subsampleBits); assertTrue(((javax.media.jai.InterpolationBicubic2)interp).getPrecisionBits() == subsampleBits); } @AfterClass public static void fileDisposal() { FileUtils.deleteQuietly(newJAIFile); FileUtils.deleteQuietly(newJAIFile.getParentFile()); } }