/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2013, 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.renderer.lite; import org.geotools.factory.CommonFactoryFinder; import org.geotools.renderer.style.GraphicStyle2D; import org.geotools.renderer.style.IconStyle2D; import org.geotools.renderer.style.MarkStyle2D; import org.geotools.renderer.style.SLDStyleFactory; import org.geotools.renderer.style.Style2D; import org.geotools.styling.Graphic; import org.geotools.styling.PointSymbolizer; import org.geotools.styling.StyleFactory; import org.geotools.styling.visitor.DpiRescaleStyleVisitor; import org.geotools.util.Range; import org.opengis.filter.expression.Expression; /** * This class extends {@link DpiRescaleStyleVisitor} to add support for rescaling external graphics * and marks whose size has not been explicitly set. * * Works properly as long as the expression in an eventual dynamic symbolizer are not setting the * size of the symbol, as we don't have the feature here, and there is no way to know which bit * of the url will setup the size * * @author Andrea Aime - GeoSolutions * */ public class GraphicsAwareDpiRescaleStyleVisitor extends DpiRescaleStyleVisitor { static final StyleFactory sf = CommonFactoryFinder.getStyleFactory(); static final Range<Double> INFINITE_RANGE = new Range<Double>(Double.class, 0d, Double.POSITIVE_INFINITY); SLDStyleFactory ssf = new SLDStyleFactory(); public GraphicsAwareDpiRescaleStyleVisitor(double scale) { super(scale); } @Override protected Expression rescaleGraphicSize(Graphic gr) { Expression size = gr.getSize(); if(size == null || size == Expression.NIL) { PointSymbolizer symbolizer = sf.createPointSymbolizer(gr, null); Style2D style = ssf.createStyle(null, symbolizer, INFINITE_RANGE); if(style instanceof IconStyle2D) { IconStyle2D is = (IconStyle2D) style; size = ff.literal(is.getIcon().getIconHeight()); } else if(style instanceof GraphicStyle2D) { GraphicStyle2D gs = (GraphicStyle2D) style; size = ff.literal(gs.getImage().getHeight()); } else if(style instanceof MarkStyle2D) { MarkStyle2D ms = (MarkStyle2D) style; size = ff.literal(ms.getSize()); } } return rescale(size); } }