/* 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.contrastenhancement;
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.RenderableOp;
import javax.media.jai.RenderedOp;
import javax.media.jai.registry.RenderableRegistryMode;
import javax.media.jai.registry.RenderedRegistryMode;
public class SquareRootStretchDescriptor extends OperationDescriptorImpl
{
/**
* The resource strings that provide the general documentation
* and specify the parameter list for this operation.
*/
private static final String[][] resources =
{
{ "GlobalName", "SquareRootStretch" },
{ "LocalName", "SquareRootStretch" },
{ "Vendor", "it.geosolutions.jaiext" },
{ "Description", JaiI18N.getString("SquareRootStretchDescriptor0") },
{ "DocURL", "" },
{ "Version", JaiI18N.getString("DescriptorVersion") },
{ "arg0Desc", JaiI18N.getString("SquareRootStretchDescriptor1") },
{ "arg1Desc", JaiI18N.getString("SquareRootStretchDescriptor2") },
{ "arg2Desc", JaiI18N.getString("SquareRootStretchDescriptor3") },
{ "arg3Desc", JaiI18N.getString("SquareRootStretchDescriptor4") }
};
/**
* The parameter class list for this operation.
* The number of constants provided should be either 1, in which case
* this same constant is applied to all the source bands; or the same
* number as the source bands, in which case one contant is applied
* to each band.
*/
private static final Class[] paramClasses = { int[].class, int[].class, int[].class, int[].class };
/** The parameter name list for this operation. */
private static final String[] paramNames = { "inputMin", "inputMax", "outputMin", "outputMax" };
/** The parameter default value list for this operation. */
private static final Object[] paramDefaults =
{
new int[] { 0 }, new int[] { 65536 }, new int[] { 0 }, new int[] { 255 }
};
/**
* Compute the SquareRoot stretch
*
* <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 source0 <code>RenderedImage</code> source 0.
* @param hints The <code>RenderingHints</code> to use.
* May be <code>null</code>.
* @return The <code>RenderedOp</code> destination.
* @throws IllegalArgumentException if <code>source0</code> is <code>null</code>.
*/
public static RenderedOp create(RenderedImage source0,
int[] inputMin,
int[] inputMax,
int[] outputMin,
int[] outputMax,
RenderingHints hints)
{
ParameterBlockJAI pb = new ParameterBlockJAI("SquareRootStretch",
RenderedRegistryMode.MODE_NAME);
pb.setSource("source0", source0);
pb.setParameter("inputMin", inputMin);
pb.setParameter("inputMax", inputMax);
pb.setParameter("outputMin", outputMin);
pb.setParameter("outputMax", outputMax);
return JAI.create("SquareRootStretch", pb, hints);
}
/**
* Compute the SquareRoot stretch
*
* <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 source0 <code>RenderableImage</code> source 0.
* @param hints The <code>RenderingHints</code> to use.
* May be <code>null</code>.
* @return The <code>RenderableOp</code> destination.
* @throws IllegalArgumentException if <code>source0</code> is <code>null</code>.
*/
public static RenderableOp createRenderable(RenderableImage source0,
int[] inputMin,
int[] inputMax,
int[] outputMin,
int[] outputMax,
RenderingHints hints)
{
ParameterBlockJAI pb = new ParameterBlockJAI("SquareRootStretch",
RenderableRegistryMode.MODE_NAME);
pb.setSource("source0", source0);
pb.setParameter("inputMin", inputMin);
pb.setParameter("inputMax", inputMax);
pb.setParameter("outputMin", outputMin);
pb.setParameter("outputMax", outputMax);
return JAI.createRenderable("SquareRootStretch", pb, hints);
}
/** Constructor. */
public SquareRootStretchDescriptor()
{
super(resources, 1, paramClasses, paramNames, paramDefaults);
}
/** Returns <code>true</code> since renderable operation is supported. */
public boolean isRenderableSupported()
{
return true;
}
/**
* Validates the input parameter.
*
* <p> In addition to the standard checks performed by the
* superclass method, this method checks that the length of the
* provided parameters array is at least 1.
*/
protected boolean validateParameters(ParameterBlock args,
StringBuffer message)
{
if (!super.validateParameters(args, message))
{
return false;
}
int length = ((int[]) args.getObjectParameter(0)).length;
if (length < 1)
{
message.append(getName() + " " + "SquareRootStretchDescriptor5");
return false;
}
length = ((int[]) args.getObjectParameter(1)).length;
if (length < 1)
{
message.append(getName() + " " + "SquareRootStretchDescriptor5");
return false;
}
length = ((int[]) args.getObjectParameter(2)).length;
if (length < 1)
{
message.append(getName() + " " + "SquareRootStretchDescriptor5");
return false;
}
length = ((int[]) args.getObjectParameter(3)).length;
if (length < 1)
{
message.append(getName() + " " + "SquareRootStretchDescriptor5");
return false;
}
return true;
}
}