package mil.nga.giat.geowave.adapter.raster.adapter; import javax.media.jai.JAI; import javax.media.jai.OperationRegistry; import javax.media.jai.ParameterListDescriptor; import javax.media.jai.ParameterListDescriptorImpl; import javax.media.jai.PropertyGenerator; import javax.media.jai.operator.MosaicDescriptor; import com.sun.media.jai.opimage.MosaicRIF; /** * * this is a workaround because GeoTools resampling will force the source * threshold to be 1.0 on Mosaic operations, which will mask all values under * 1.0. org.geotools.coverage.processing.operation.Resample2D line 631 in * gt-coverage-12.1 * * This is mostly the same as MosaicDescriptor with the one key difference being * that the default source threshold is Double.MIN_VALUE instead of 1.0 * */ public class SourceThresholdFixMosaicDescriptor extends MosaicDescriptor { /** * An array of <code>ParameterListDescriptor</code> for each mode. */ private final ParameterListDescriptor defaultParamListDescriptor; /** * */ private static final long serialVersionUID = 1L; /** The parameter class list for this operation. */ private static final Class[] paramClasses = { javax.media.jai.operator.MosaicType.class, javax.media.jai.PlanarImage[].class, javax.media.jai.ROI[].class, double[][].class, double[].class }; /** The parameter name list for this operation. */ private static final String[] paramNames = { "mosaicType", "sourceAlpha", "sourceROI", "sourceThreshold", "backgroundValues" }; /** The parameter default value list for this operation. */ private static final Object[] paramDefaults = { MOSAIC_TYPE_OVERLAY, null, null, new double[][] { { Double.MIN_VALUE // if this is less than or equal to 0, it will only work on the // first band because of a bug with the source extender within JAI's // Mosaic operation } }, new double[] { 0.0 } }; static boolean registered = false; public synchronized static void register( final boolean force ) { if (!registered || force) { final OperationRegistry registry = JAI.getDefaultInstance().getOperationRegistry(); registry.unregisterDescriptor(new MosaicDescriptor()); registry.registerDescriptor(new SourceThresholdFixMosaicDescriptor()); // there seems to be a bug in jai-ext, line 1211 of // concurrentoperationregistry null pointer exception registry.registerFactory( "rendered", "Mosaic", "com.sun.media.jai", new MosaicRIF()); registered = true; } } public SourceThresholdFixMosaicDescriptor() { super(); defaultParamListDescriptor = new ParameterListDescriptorImpl( this, paramNames, paramClasses, paramDefaults, null); } @Override public PropertyGenerator[] getPropertyGenerators( final String modeName ) { return new PropertyGenerator[] { new MosaicPropertyGenerator() }; } @Override public ParameterListDescriptor getParameterListDescriptor( final String modeName ) { return defaultParamListDescriptor; } }