/* 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.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.BorderExtender; import javax.media.jai.ImageLayout; import javax.media.jai.Interpolation; import javax.media.jai.PlanarImage; import javax.media.jai.ROI; import javax.media.jai.Warp; import com.sun.media.jai.opimage.RIFUtil; import it.geosolutions.jaiext.interpolators.InterpolationBicubic; import it.geosolutions.jaiext.interpolators.InterpolationBilinear; import it.geosolutions.jaiext.interpolators.InterpolationNearest; import it.geosolutions.jaiext.range.Range; import it.geosolutions.jaiext.range.RangeFactory; /** * A <code>RIF</code> supporting the "Warp" operation in the rendered image layer. * * @since EA2 * @see javax.media.jai.operator.WarpDescriptor * @see GeneralWarpOpImage * */ public class WarpRIF implements RenderedImageFactory { /** 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) { // Get ImageLayout from renderHints if any. ImageLayout layout = RIFUtil.getImageLayoutHint(renderHints); // Get BorderExtender from renderHints if any. BorderExtender extender = RIFUtil.getBorderExtenderHint(renderHints); RenderedImage source = paramBlock.getRenderedSource(0); Warp warp = (Warp) paramBlock.getObjectParameter(0); Interpolation interp = (Interpolation) paramBlock.getObjectParameter(1); 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()); if (interp instanceof InterpolationNearest || interp instanceof javax.media.jai.InterpolationNearest) { return new WarpNearestOpImage(source, renderHints, layout, warp, interp, roi, noData, backgroundValues); } else if (interp instanceof InterpolationBilinear || interp instanceof javax.media.jai.InterpolationBilinear) { return new WarpBilinearOpImage(source, extender, renderHints, layout, warp, interp, roi, noData, backgroundValues); } else if (interp instanceof InterpolationBicubic || interp instanceof javax.media.jai.InterpolationBicubic || interp instanceof javax.media.jai.InterpolationBicubic2) { return new WarpBicubicOpImage(source, extender, renderHints, layout, warp, interp, roi, noData, backgroundValues); } else { return new WarpGeneralOpImage(source, extender, renderHints, layout, warp, interp, backgroundValues, roi, noData); } } }