package org.geotoolkit.pending.demo.rendering.customsymbolizer; import com.jhlabs.image.CrystallizeFilter; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.util.logging.Level; import org.geotoolkit.coverage.grid.GridCoverage2D; import org.geotoolkit.coverage.grid.ViewType; import org.geotoolkit.coverage.io.CoverageStoreException; import org.geotoolkit.coverage.io.GridCoverageReadParam; import org.geotoolkit.coverage.processing.CoverageProcessingException; import org.geotoolkit.coverage.processing.Operations; import org.geotoolkit.display.VisitFilter; import org.geotoolkit.display.PortrayalException; import org.geotoolkit.display2d.canvas.RenderingContext2D; import org.geotoolkit.display2d.primitive.ProjectedCoverage; import org.geotoolkit.display2d.primitive.ProjectedObject; import org.geotoolkit.display2d.primitive.SearchAreaJ2D; import org.geotoolkit.display2d.style.renderer.AbstractSymbolizerRenderer; import org.geotoolkit.display2d.style.renderer.SymbolizerRendererService; import org.opengis.metadata.spatial.PixelOrientation; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.operation.MathTransform2D; import org.apache.sis.util.Utilities; public class CrystallizeSymbolizerRenderer extends AbstractSymbolizerRenderer<CrystallizeCachedSymbolizer>{ public CrystallizeSymbolizerRenderer(final SymbolizerRendererService service,CrystallizeCachedSymbolizer cache, RenderingContext2D context){ super(service,cache, context); } @Override public void portray(ProjectedObject graphic) throws PortrayalException { //works only with coverage data, do nothing } @Override public void portray(ProjectedCoverage graphic) throws PortrayalException { //read the coverage //this is a fast way to do it, don't use it in real code GridCoverage2D dataCoverage; try { dataCoverage = graphic.getCoverage(new GridCoverageReadParam()); } catch (CoverageStoreException ex) { monitor.exceptionOccured(ex, Level.WARNING); return; } //reproject coverage final CoordinateReferenceSystem coverageCRS = dataCoverage.getCoordinateReferenceSystem(); if(!Utilities.equalsIgnoreMetadata(coverageCRS,renderingContext.getObjectiveCRS2D()) ){ try{ dataCoverage = (GridCoverage2D) Operations.DEFAULT.resample( dataCoverage.view(ViewType.NATIVE), renderingContext.getObjectiveCRS2D()); dataCoverage = dataCoverage.view(ViewType.RENDERED); } catch (CoverageProcessingException ex) { monitor.exceptionOccured(ex, Level.WARNING); return; } } final RenderedImage img = dataCoverage.getRenderedImage(); final BufferedImage buffer = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB); final Graphics2D g = buffer.createGraphics(); g.drawRenderedImage(img, new AffineTransform()); //we apply our crystal effect final CrystallizeFilter op = new CrystallizeFilter(); op.filter(buffer, buffer); //we switch in objective CRS to render the coverage. renderingContext.switchToObjectiveCRS(); final MathTransform2D trs2D = dataCoverage.getGridGeometry().getGridToCRS2D(PixelOrientation.UPPER_LEFT); if(trs2D instanceof AffineTransform){ g2d.drawImage(buffer, (AffineTransform)trs2D, null); } } @Override public boolean hit(ProjectedObject graphic, SearchAreaJ2D mask, VisitFilter filter) { //works only with coverage data, do nothing return false; } @Override public boolean hit(ProjectedCoverage graphic, SearchAreaJ2D mask, VisitFilter filter) { //not a selectable symbol return false; } }