001 //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/graphics/sld/Halo.java $
002 /*----------------------------------------------------------------------------
003 This file is part of deegree, http://deegree.org/
004 Copyright (C) 2001-2009 by:
005 Department of Geography, University of Bonn
006 and
007 lat/lon GmbH
008
009 This library is free software; you can redistribute it and/or modify it under
010 the terms of the GNU Lesser General Public License as published by the Free
011 Software Foundation; either version 2.1 of the License, or (at your option)
012 any later version.
013 This library is distributed in the hope that it will be useful, but WITHOUT
014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
016 details.
017 You should have received a copy of the GNU Lesser General Public License
018 along with this library; if not, write to the Free Software Foundation, Inc.,
019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020
021 Contact information:
022
023 lat/lon GmbH
024 Aennchenstr. 19, 53177 Bonn
025 Germany
026 http://lat-lon.de/
027
028 Department of Geography, University of Bonn
029 Prof. Dr. Klaus Greve
030 Postfach 1147, 53001 Bonn
031 Germany
032 http://www.geographie.uni-bonn.de/deegree/
033
034 e-mail: info@deegree.org
035 ----------------------------------------------------------------------------*/
036 package org.deegree.graphics.sld;
037
038 import org.deegree.framework.xml.Marshallable;
039 import org.deegree.model.feature.Feature;
040 import org.deegree.model.filterencoding.FilterEvaluationException;
041
042 /**
043 * Incarnation of a sld:Halo-element. A Halo is a type of Fill that is applied to the backgrounds of
044 * font glyphs. The use of halos greatly improves the readability of text labels.
045 * <p>
046 *
047 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth </a>
048 * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider </a>
049 * @version $Revision: 18195 $ $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
050 */
051
052 public class Halo implements Marshallable {
053
054 private Fill fill = null;
055
056 private ParameterValueType radius = null;
057
058 private Stroke stroke = null;
059
060 /**
061 * Create a new <tt>Halo</tt> -instance.
062 * <p>
063 *
064 * @param radius
065 * radius to be used for the halo, use null for a rectangle styled halo
066 * @param fill
067 * defines the fill style, use null for default style
068 * @param stroke
069 * defines the stroke style, use null for default style
070 */
071 Halo( ParameterValueType radius, Fill fill, Stroke stroke ) {
072 setRadius( radius );
073 setFill( fill );
074 setStroke( stroke );
075 }
076
077 /**
078 * A Fill allows area geometries to be filled. There are two types of fills: solid-color and
079 * repeated GraphicFill. In general, if a Fill element is omitted in its containing element, no
080 * fill will be rendered. The default is a solid 50%-gray (color "#808080") opaque fill.
081 * <p>
082 *
083 * @return the underlying <tt>Fill</tt> -object or null
084 *
085 */
086 public Fill getFill() {
087 return fill;
088 }
089
090 /**
091 * Sets the underlying <tt>Fill</tt> -instance.
092 * <p>
093 *
094 * @param fill
095 * defines the fill color and pattern
096 *
097 */
098 public void setFill( Fill fill ) {
099 this.fill = fill;
100 }
101
102 /**
103 * The Radius element gives the absolute size of a halo radius in pixels encoded as a
104 * floating-point number. The radius is taken from the outside edge of a font glyph to extend
105 * the area of coverage of the glyph (and the inside edge of holes in the glyphs). The halo of a
106 * text label is considered to be a single shape. The default radius is one pixel. Negative
107 * values are not allowed.
108 * <p>
109 *
110 * @return the radius definition as <tt>ParameterValueType</tt>, or null if it has not been
111 * specified
112 *
113 */
114 public ParameterValueType getRadius() {
115 return radius;
116 }
117
118 /**
119 * Sets the value for the radius of the halo.
120 * <p>
121 *
122 * @param radius
123 * radius to be used for the halo, use null for a rectangle styled halo
124 *
125 */
126 public void setRadius( ParameterValueType radius ) {
127 this.radius = radius;
128 }
129
130 /**
131 * The Radius element gives the absolute size of a halo radius in pixels encoded as a
132 * floating-point number. The radius is taken from the outside edge of a font glyph to extend
133 * the area of coverage of the glyph (and the inside edge of holes in the glyphs). The halo of a
134 * text label is considered to be a single shape. The default radius is one pixel. Negative
135 * values are not allowed.
136 * <p>
137 *
138 * @param feature
139 * specifies the <tt>Feature</tt> to be used for evaluation of the underlying
140 * 'sld:ParameterValueType'
141 * @return the radius value, or -1 if it has not been specified
142 * @throws FilterEvaluationException
143 * if the evaluation fails
144 */
145 public double getRadius( Feature feature )
146 throws FilterEvaluationException {
147 if ( radius == null ) {
148 return -1.0;
149 }
150
151 String stringValue = null;
152 double radiusVal;
153
154 try {
155 stringValue = radius.evaluate( feature );
156 radiusVal = Double.parseDouble( stringValue );
157 } catch ( NumberFormatException e ) {
158 throw new FilterEvaluationException( "Given value ('" + stringValue
159 + "') for radius of Halo does not denote a number." );
160 }
161
162 return radiusVal;
163 }
164
165 /**
166 * @see org.deegree.graphics.sld.Halo#getRadius(Feature)
167 * <p>
168 * @param radius
169 * radius to be set for the halo
170 */
171 public void setRadius( double radius ) {
172 ParameterValueType pvt = null;
173 if ( radius > 0 ) {
174 pvt = StyleFactory.createParameterValueType( "" + radius );
175 this.radius = pvt;
176 }
177 }
178
179 /**
180 * Returns the underlying <tt>Stroke</tt> -instance.
181 * <p>
182 *
183 * @return the underlying <tt>Stroke</tt> -object or null
184 *
185 */
186 public Stroke getStroke() {
187 return stroke;
188 }
189
190 /**
191 * Sets the underlying <tt>Stroke</tt> -instance.
192 * <p>
193 *
194 * @param stroke
195 * defines the stroke color and pattern
196 */
197 public void setStroke( Stroke stroke ) {
198 this.stroke = stroke;
199 }
200
201 /**
202 * exports the content of the Halo as XML formated String
203 *
204 * @return xml representation of the Halo
205 */
206 public String exportAsXML() {
207
208 StringBuffer sb = new StringBuffer( 1000 );
209 sb.append( "<Halo>" );
210 if ( radius != null ) {
211 sb.append( "<Radius>" );
212 sb.append( ( (Marshallable) radius ).exportAsXML() );
213 sb.append( "</Radius>" );
214 }
215 if ( fill != null ) {
216 sb.append( ( (Marshallable) fill ).exportAsXML() );
217 }
218 if ( stroke != null ) {
219 sb.append( ( (Marshallable) stroke ).exportAsXML() );
220 }
221 sb.append( "</Halo>" );
222
223 return sb.toString();
224 }
225
226 }