/* 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.algebra.constant;
import it.geosolutions.jaiext.algebra.AlgebraDescriptor.Operator;
import it.geosolutions.jaiext.range.Range;
import java.awt.RenderingHints;
import java.awt.image.RenderedImage;
import java.awt.image.renderable.ParameterBlock;
import java.awt.image.renderable.RenderableImage;
import javax.media.jai.JAI;
import javax.media.jai.OperationDescriptorImpl;
import javax.media.jai.ParameterBlockJAI;
import javax.media.jai.ROI;
import javax.media.jai.RenderableOp;
import javax.media.jai.RenderedOp;
import javax.media.jai.registry.RenderableRegistryMode;
import javax.media.jai.registry.RenderedRegistryMode;
/**
* {@link OperationDescriptorImpl} describing the OperationConst operation
*
* @author Nicola Lagomarsini geosolutions
*
*/
public class OperationConstDescriptor extends OperationDescriptorImpl {
public final static int OPERATION_INDEX = 0;
public final static int ROI_INDEX = 1;
public final static int RANGE_INDEX = 2;
public final static int DEST_NODATA_INDEX = 4;
public final static int CONSTANT_INDEX = 3;
/**
* The resource strings that provide the general documentation and specify the parameter list for this operation.
*/
private static final String[][] resources = {
{ "GlobalName", "operationConst" },
{ "LocalName", "operationConst" },
{ "Vendor", "it.geosolutions.jaiext" },
{ "Description",
"This class executes the operation selected by the user on each pixel of the source images " },
{ "DocURL", "Not Defined" }, { "Version", "1.0" },
{ "arg0Desc", "Constant Values to Add" }, { "arg1Desc", "Operation to execute" },
{ "arg2Desc", "ROI object used" }, { "arg3Desc", "No Data Range used" },
{ "arg4Desc", "Output value for No Data" } };
/**
* Input Parameter name
*/
private static final String[] paramNames = {"constants", "operation", "roi", "noData",
"destinationNoData" };
/**
* Input Parameter class
*/
private static final Class[] paramClasses = { double[].class, Operator.class,
javax.media.jai.ROI.class, it.geosolutions.jaiext.range.Range.class, Double.class };
/**
* Input Parameter default values
*/
private static final Object[] paramDefaults = { NO_PARAMETER_DEFAULT, NO_PARAMETER_DEFAULT, null, null, 0d };
/** Constructor. */
public OperationConstDescriptor() {
super(resources, 1, paramClasses, paramNames, paramDefaults);
}
/** Returns <code>true</code> since renderable operation is supported. */
public boolean isRenderableSupported() {
return true;
}
@Override
protected boolean validateParameters(String modeName, ParameterBlock args, StringBuffer msg) {
if(modeName.equalsIgnoreCase(RenderedRegistryMode.MODE_NAME)){
// Check for the constants
double[] constants = null;
Object param = args.getObjectParameter(0);
if (param != null) {
if (param instanceof double[]) {
return true;
} else if (param instanceof int[]) {
int[] paramInt = (int[]) param;
constants = new double[paramInt.length];
for (int i = 0; i < paramInt.length; i++) {
constants[i] = paramInt[i];
}
args.set(constants, 0);
return true;
}
}
return false;
}
return true;
}
/**
* Executes the selected operation with a constant on the input image.
*
* <p>
* Creates a <code>ParameterBlockJAI</code> from all supplied arguments except <code>hints</code> and invokes
* {@link JAI#create(String,ParameterBlock,RenderingHints)}.
*
* @see JAI
* @see ParameterBlockJAI
* @see RenderedOp
*
* @param source <code>RenderedImage</code> source.
* @param constants the constants array to apply to the source
* @param op operation to execute
* @param roi optional ROI object
* @param optional nodata range for checking nodata
* @param destinationNoData value to set for destination NoData
* @param hints The <code>RenderingHints</code> to use. May be <code>null</code>.
* @return The <code>RenderedOp</code> destination.
*/
public static RenderedOp create(RenderedImage source, double[] constants, Operator op, ROI roi,
Range noData, double destinationNoData, RenderingHints hints) {
ParameterBlockJAI pb = new ParameterBlockJAI("operationConst", RenderedRegistryMode.MODE_NAME);
pb.setSource(source, 0);
if (pb.getNumSources() == 0) {
throw new IllegalArgumentException("The input images are Null");
}
pb.setParameter("operation", op);
pb.setParameter("roi", roi);
pb.setParameter("constants", constants);
pb.setParameter("noData", noData);
pb.setParameter("destinationNoData", destinationNoData);
return JAI.create("operationConst", pb, hints);
}
/**
* Executes the selected operation with a constant on the input image.
*
* <p>
* Creates a <code>ParameterBlockJAI</code> from all supplied arguments except <code>hints</code> and invokes
* {@link JAI#createRenderable(String,ParameterBlock,RenderingHints)}.
*
* @see JAI
* @see ParameterBlockJAI
* @see RenderableOp
*
* @param source <code>RenderedImage</code> source.
* @param constants the constants array to apply to the source
* @param op operation to execute
* @param roi optional ROI object
* @param optional nodata range for checking nodata
* @param destinationNoData value to set for destination NoData
* @param hints The <code>RenderingHints</code> to use. May be <code>null</code>.
* @return The <code>RenderableOp</code> destination.
*/
public static RenderableOp createRenderable(RenderableImage source, double[] constants,
Operator op, ROI roi, Range noData, double destinationNoData, RenderingHints hints) {
ParameterBlockJAI pb = new ParameterBlockJAI("operationConst", RenderableRegistryMode.MODE_NAME);
pb.setSource(source, 0);
if (pb.getNumSources() == 0) {
throw new IllegalArgumentException("The input images are Null");
}
pb.setParameter("operation", op);
pb.setParameter("roi", roi);
pb.setParameter("constants", constants);
pb.setParameter("noData", noData);
pb.setParameter("destinationNoData", destinationNoData);
return JAI.createRenderable("operationConst", pb, hints);
}
}