package mil.nga.giat.geowave.adapter.raster.adapter.warp; import java.awt.RenderingHints; import java.awt.image.RenderedImage; import java.awt.image.renderable.ParameterBlock; import java.awt.image.renderable.RenderedImageFactory; import javax.media.jai.ImageLayout; import javax.media.jai.Interpolation; import javax.media.jai.JAI; import javax.media.jai.OperationRegistry; import javax.media.jai.PlanarImage; import javax.media.jai.ROI; import javax.media.jai.Warp; import javax.media.jai.operator.MosaicDescriptor; import javax.media.jai.registry.RenderedRegistryMode; import com.sun.media.jai.opimage.MosaicRIF; import com.sun.media.jai.opimage.RIFUtil; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import it.geosolutions.jaiext.interpolators.InterpolationNearest; import it.geosolutions.jaiext.range.Range; import it.geosolutions.jaiext.range.RangeFactory; import mil.nga.giat.geowave.adapter.raster.adapter.SourceThresholdFixMosaicDescriptor; /** * * This is code entirely intended to get around an issue on line 265 of * WarpOpImage in jai-ext. The following code does not work if the source is * significant lower resolution than the destination and seems unnecessary in * general: * * roiTile = roi.intersect(new ROIShape(srcRectExpanded)); * */ @SuppressFBWarnings public class WarpRIF extends it.geosolutions.jaiext.warp.WarpRIF { static boolean registered = false; public synchronized static void register( final boolean force ) { if (!registered || force) { final OperationRegistry registry = JAI.getDefaultInstance().getOperationRegistry(); final RenderedImageFactory rif = new WarpRIF(); registry.registerFactory( RenderedRegistryMode.MODE_NAME, "Warp", "it.geosolutions.jaiext", rif); registered = true; } } /** Constructor. */ public WarpRIF() {} /** * Creates a new instance of warp operator according to the warp object and * interpolation method. * * @param paramBlock * The warp and interpolation objects. */ public RenderedImage create( ParameterBlock paramBlock, RenderingHints renderHints ) { Interpolation interp = (Interpolation) paramBlock.getObjectParameter(1); if (interp instanceof InterpolationNearest || interp instanceof javax.media.jai.InterpolationNearest) { // Get ImageLayout from renderHints if any. ImageLayout layout = RIFUtil.getImageLayoutHint(renderHints); RenderedImage source = paramBlock.getRenderedSource(0); Warp warp = (Warp) paramBlock.getObjectParameter(0); double[] backgroundValues = (double[]) paramBlock.getObjectParameter(2); ROI roi = null; Object roi_ = paramBlock.getObjectParameter(3); if (roi_ instanceof ROI) { roi = (ROI) roi_; PlanarImage temp = PlanarImage.wrapRenderedImage(source); temp.setProperty( "ROI", roi); source = temp; } Range noData = (Range) paramBlock.getObjectParameter(4); noData = RangeFactory.convert( noData, source.getSampleModel().getDataType()); return new WarpNearestOpImage( source, renderHints, layout, warp, interp, roi, noData, backgroundValues); } return super.create( paramBlock, renderHints); } }