/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2014-2015, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.coverage.processing.operation; import it.geosolutions.jaiext.range.Range; import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import java.awt.image.RenderedImage; import java.util.HashMap; import java.util.Map; import javax.media.jai.Interpolation; import javax.media.jai.JAI; import javax.media.jai.ParameterBlockJAI; import javax.media.jai.PropertyGenerator; import javax.media.jai.ROI; import javax.media.jai.RenderedOp; import javax.media.jai.registry.RenderedRegistryMode; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.processing.BaseScaleOperationJAI; import org.geotools.coverage.processing.CoverageProcessor; import org.geotools.factory.GeoTools; import org.geotools.image.ImageWorker; import org.geotools.resources.coverage.CoverageUtilities; import org.opengis.parameter.ParameterValueGroup; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.operation.MathTransform; import org.opengis.util.InternationalString; /** * This operation is simply a wrapper for the JAI Affine operation * * @source $URL$ * @version $Id$ * @author Simone Giannecchini * @since 12.0 * * @see javax.media.jai.operator.AffineDescriptor */ public class Affine extends BaseScaleOperationJAI { /** serialVersionUID */ private static final long serialVersionUID = 1699623079343108288L; /** * Default constructor. */ public Affine() { super(AFFINE); } @Override protected RenderedImage createRenderedImage(ParameterBlockJAI parameters, RenderingHints hints) { final RenderedImage source = (RenderedImage) parameters.getSource(0); if(hints== null){ hints= GeoTools.getDefaultHints().clone(); } //// // // Interpolation // //// final Interpolation interpolation; if (parameters.getObjectParameter("interpolation") != null){ interpolation = (Interpolation) parameters.getObjectParameter("interpolation"); }else if (hints.get(JAI.KEY_INTERPOLATION) != null){ interpolation = (Interpolation) hints.get(JAI.KEY_INTERPOLATION); } else { // I am pretty sure this should not happen. However I am not sure we should throw an error interpolation = null; } //// // // ROI // //// ROI roi = null; Object param = CoverageProcessor.getParameter(parameters, ROI); if (param != null){ roi = (ROI) param; } //// // // NoData // //// Range nodata = null; param = CoverageProcessor.getParameter(parameters, "nodata"); if (param != null){ nodata = (Range) param; } //// // // ImageWorker // //// final ImageWorker worker= new ImageWorker(source); worker.setRenderingHints(hints); worker.setROI(roi); worker.setNoData(nodata); worker.affine( (AffineTransform)parameters.getObjectParameter("transform") , interpolation, (double[])parameters.getObjectParameter("backgroundValues")); return worker.getRenderedImage(); } protected void handleJAIEXTParams(ParameterBlockJAI parameters, ParameterValueGroup parameters2) { GridCoverage2D source = (GridCoverage2D) parameters2.parameter("source0").getValue(); handleROINoDataInternal(parameters, source, AFFINE, 3, 6); } protected Map<String, ?> getProperties(RenderedImage data, CoordinateReferenceSystem crs, InternationalString name, MathTransform gridToCRS, GridCoverage2D[] sources, Parameters parameters) { Map props = sources[PRIMARY_SOURCE_INDEX].getProperties(); Map properties = new HashMap<>(); if (props != null) { properties.putAll(props); } // Setting NoData property if needed double[] background = (double[]) parameters.parameters.getObjectParameter(2); if(parameters.parameters.getNumParameters() > 3 && parameters.parameters.getObjectParameter(6) != null){ CoverageUtilities.setNoDataProperty(properties, background); } // Setting ROI if present PropertyGenerator propertyGenerator = null; if(data instanceof RenderedOp){ String operationName = ((RenderedOp)data).getOperationName(); if(operationName.equalsIgnoreCase(AFFINE) || operationName.equalsIgnoreCase(SCALE) || operationName.equalsIgnoreCase(TRANSLATE)){ propertyGenerator = getOperationDescriptor(operationName).getPropertyGenerators(RenderedRegistryMode.MODE_NAME)[0]; } if(propertyGenerator != null){ Object roiProp = propertyGenerator.getProperty(ROI, data); if (roiProp != null && roiProp instanceof ROI) { CoverageUtilities.setROIProperty(properties, (ROI) roiProp); } } } return properties; } }