/*---------------- FILE HEADER ------------------------------------------
This file is part of deegree.
Copyright (C) 2001-2007 by:
Department of Geography, University of Bonn
http://www.giub.uni-bonn.de/deegree/
lat/lon GmbH
http://www.lat-lon.de
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; either
version 2.1 of the License, or (at your option) any later version.
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.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact:
Andreas Poth
lat/lon GmbH
Aennchenstr. 19
53177 Bonn
Germany
E-Mail: poth@lat-lon.de
Prof. Dr. Klaus Greve
Department of Geography
University of Bonn
Meckenheimer Allee 166
53115 Bonn
Germany
E-Mail: greve@giub.uni-bonn.de
---------------------------------------------------------------------------*/
package org.deegree.igeo.style;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.font.LineMetrics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.imageio.ImageIO;
import org.deegree.datatypes.QualifiedName;
import org.deegree.datatypes.Types;
import org.deegree.framework.log.ILogger;
import org.deegree.framework.log.LoggerFactory;
import org.deegree.graphics.displayelements.DisplayElementFactory;
import org.deegree.graphics.displayelements.Label;
import org.deegree.graphics.displayelements.LabelFactory;
import org.deegree.graphics.displayelements.RasterDisplayElement;
import org.deegree.graphics.sld.Fill;
import org.deegree.graphics.sld.Font;
import org.deegree.graphics.sld.Halo;
import org.deegree.graphics.sld.RasterSymbolizer;
import org.deegree.graphics.sld.TextSymbolizer;
import org.deegree.graphics.transformation.WorldToScreenTransform;
import org.deegree.igeo.i18n.Messages;
import org.deegree.igeo.style.model.SldValues;
import org.deegree.igeo.style.perform.RasterVisualPropertyPerformer;
import org.deegree.model.coverage.grid.ImageGridCoverage;
import org.deegree.model.crs.CRSFactory;
import org.deegree.model.crs.UnknownCRSException;
import org.deegree.model.feature.Feature;
import org.deegree.model.feature.FeatureFactory;
import org.deegree.model.feature.FeatureProperty;
import org.deegree.model.feature.schema.FeatureType;
import org.deegree.model.feature.schema.PropertyType;
import org.deegree.model.filterencoding.FilterEvaluationException;
import org.deegree.model.spatialschema.Envelope;
import org.deegree.model.spatialschema.Geometry;
import org.deegree.model.spatialschema.GeometryFactory;
/**
* <code>ImageFactory</code>
*
* @author <a href="mailto:buesching@lat-lon.de">Lyn Buesching</a>
* @author last edited by: $Author$
*
* @version $Revision$, $Date$
*
*/
public class ImageFactory {
private static final ILogger LOG = LoggerFactory.getLogger( ImageFactory.class );
private static final String LABEL = Messages.getMessage( Locale.getDefault(), "$MD10675" );
/**
* Creates an image out of the given RasterSymbolizer.
*
* @param symbolizer
* @return an image out of the given symbolizer
*/
public static BufferedImage createImage( RasterSymbolizer symbolizer ) {
BufferedImage orig = null;
try {
orig = ImageIO.read( RasterVisualPropertyPerformer.class.getResourceAsStream( "rasterpreview.jpg" ) );
} catch ( IOException e ) {
LOG.logDebug( "could not create preview for RasterSymbolizer" );
}
WorldToScreenTransform t = new WorldToScreenTransform();
Envelope env = GeometryFactory.createEnvelope( -120, -120, 120, 120, null );
ImageGridCoverage coverage = new ImageGridCoverage( null, env, orig );
RasterDisplayElement rde = DisplayElementFactory.buildRasterDisplayElement( coverage, symbolizer );
BufferedImage img = new BufferedImage( orig.getWidth(), orig.getHeight(), BufferedImage.TYPE_INT_ARGB );
rde.paint( img.getGraphics(), t, 1 );
return img;
}
/**
* Creates an image out of the given TextSymbolizer.
*
* @param symbolizer
* @return an image out of the given symbolizer
*/
public static BufferedImage createImage( TextSymbolizer symbolizer ) {
BufferedImage img = null;
Font symbolizerFont = symbolizer.getFont();
int style = java.awt.Font.PLAIN;
try {
if ( Font.STYLE_ITALIC == symbolizerFont.getStyle( null ) ) {
style = java.awt.Font.ITALIC;
}
if ( Font.WEIGHT_BOLD == symbolizerFont.getWeight( null ) ) {
style = style + java.awt.Font.BOLD;
}
BufferedImage biToGetSize = new BufferedImage( 7, 7, BufferedImage.TYPE_INT_ARGB );
Graphics2D gToGetSize = (Graphics2D) biToGetSize.getGraphics();
int fontSize = (int) SldValues.getDefaultFontSize();
try {
fontSize = (int) symbolizerFont.getSize( null );
} catch ( FilterEvaluationException e ) {
LOG.logWarning( "use default size because: ", e );
}
java.awt.Font font = new java.awt.Font( symbolizerFont.getFamily( null ), style, fontSize );
GlyphVector vec = font.createGlyphVector( gToGetSize.getFontRenderContext(), LABEL );
int width = (int) vec.getPixelBounds( null, 0, 0 ).getWidth();
int height = (int) vec.getPixelBounds( null, 0, 0 ).getHeight();
img = new BufferedImage( width, height, BufferedImage.TYPE_INT_ARGB );
Graphics2D g = (Graphics2D) img.getGraphics();
FontRenderContext frc = g.getFontRenderContext();
Halo halo = symbolizer.getHalo();
Fill fill = symbolizer.getFill();
LineMetrics metrics = font.getLineMetrics( LABEL, frc );
Label l = LabelFactory.createLabel( LABEL, font, fill.getFill( null ), metrics, createFeature(), halo, 0,
height, width, height, 0, 0, 0, 0, 0, fill.getOpacity( null ) );
l.paint( g );
} catch ( FilterEvaluationException e ) {
LOG.logDebug( "could not create image for TextSymbolizer", e );
}
return img;
}
private static Feature createFeature() {
PropertyType[] ftpsGeom = new PropertyType[1];
ftpsGeom[0] = FeatureFactory.createSimplePropertyType( new QualifiedName( "GEOM" ), Types.GEOMETRY, false );
FeatureProperty[] featPropGeom = new FeatureProperty[1];
Geometry geom = null;
try {
geom = GeometryFactory.createPoint( 0, 0, CRSFactory.create( "EPSG:4326" ) );
} catch ( UnknownCRSException e1 ) {
e1.printStackTrace();
}
featPropGeom[0] = FeatureFactory.createFeatureProperty( new QualifiedName( "GEOM" ), geom );
FeatureType featureType = FeatureFactory.createFeatureType( "featureTypeGom", false, ftpsGeom );
List<FeatureProperty> properties = new ArrayList<FeatureProperty>();
return FeatureFactory.createFeature( "peview", featureType, properties );
}
}