diff --git a/deegree-core/deegree-core-rendering-2d/src/main/java/org/deegree/rendering/r2d/SvgImageTranscoder.java b/deegree-core/deegree-core-rendering-2d/src/main/java/org/deegree/rendering/r2d/SvgImageTranscoder.java new file mode 100644 index 0000000000..90597c232c --- /dev/null +++ b/deegree-core/deegree-core-rendering-2d/src/main/java/org/deegree/rendering/r2d/SvgImageTranscoder.java @@ -0,0 +1,90 @@ +/*---------------------------------------------------------------------------- + This file is part of deegree, http://deegree.org/ + Copyright (C) 2001-2010 by: + - Department of Geography, University of Bonn - + and + - lat/lon GmbH - + and + - grit graphische Informationstechnik Beratungsgesellschaft mbH - + + 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 information: + + grit graphische Informationstechnik Beratungsgesellschaft mbH + Landwehrstr. 143, 59368 Werne + Germany + http://www.grit.de/ + + lat/lon GmbH + Aennchenstr. 19, 53177 Bonn + Germany + http://lat-lon.de/ + + Department of Geography, University of Bonn + Prof. Dr. Klaus Greve + Postfach 1147, 53001 Bonn + Germany + http://www.geographie.uni-bonn.de/deegree/ + + e-mail: info@deegree.org + ----------------------------------------------------------------------------*/ +package org.deegree.rendering.r2d; + +import java.awt.image.BufferedImage; + +import org.apache.batik.transcoder.TranscoderException; +import org.apache.batik.transcoder.TranscoderOutput; +import org.apache.batik.transcoder.image.ImageTranscoder; + +public class SvgImageTranscoder extends ImageTranscoder { + + public class SvgImageOutput extends TranscoderOutput { + + private BufferedImage image; + + public SvgImageOutput() { + } + + public BufferedImage getBufferedImage() { + return this.image; + } + + public void setImage( BufferedImage image ) { + this.image = image; + } + } + + public SvgImageTranscoder() { + super(); + } + + @Override + public BufferedImage createImage( int w, int h ) { + return new BufferedImage( w, h, BufferedImage.TYPE_INT_ARGB ); + } + + @Override + public void writeImage( BufferedImage image, TranscoderOutput output ) + throws TranscoderException { + if ( !( output instanceof SvgImageOutput ) ) { + throw new TranscoderException( "TranscoderOutput has to be of type SvgImageOutput" ); + } + + ( (SvgImageOutput) output ).setImage( image ); + } + + public SvgImageOutput createOutput() { + return new SvgImageOutput(); + } +} \ No newline at end of file diff --git a/deegree-core/deegree-core-rendering-2d/src/main/java/org/deegree/rendering/r2d/SvgRenderer.java b/deegree-core/deegree-core-rendering-2d/src/main/java/org/deegree/rendering/r2d/SvgRenderer.java index e5bd5586d7..395d2f2c97 100644 --- a/deegree-core/deegree-core-rendering-2d/src/main/java/org/deegree/rendering/r2d/SvgRenderer.java +++ b/deegree-core/deegree-core-rendering-2d/src/main/java/org/deegree/rendering/r2d/SvgRenderer.java @@ -40,34 +40,22 @@ Occam Labs UG (haftungsbeschränkt) package org.deegree.rendering.r2d; -import static javax.media.jai.JAI.create; import static org.apache.batik.transcoder.SVGAbstractTranscoder.KEY_HEIGHT; import static org.apache.batik.transcoder.SVGAbstractTranscoder.KEY_WIDTH; -import static org.apache.commons.io.IOUtils.closeQuietly; import static org.deegree.commons.utils.math.MathUtils.round; import static org.slf4j.LoggerFactory.getLogger; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; import java.util.LinkedHashMap; import java.util.Map; -import javax.media.jai.RenderedOp; - import org.apache.batik.transcoder.TranscoderException; import org.apache.batik.transcoder.TranscoderInput; -import org.apache.batik.transcoder.TranscoderOutput; -import org.apache.batik.transcoder.image.PNGTranscoder; -import org.deegree.commons.utils.ComparablePair; import org.deegree.commons.utils.TunableParameter; import org.deegree.style.styling.components.Graphic; import org.slf4j.Logger; -import com.sun.media.jai.codec.MemoryCacheSeekableStream; /** * Renders svg images onto buffered images. @@ -95,7 +83,7 @@ BufferedImage prepareSvg( Rectangle2D.Double rect, Graphic g ) { if ( svgCache.containsKey( cacheKey ) ) { img = svgCache.get( cacheKey ); } else { - PNGTranscoder t = new PNGTranscoder(); + SvgImageTranscoder t = new SvgImageTranscoder(); if ( rect.width > 0.0d ) { t.addTranscodingHint( KEY_WIDTH, new Float( rect.width ) ); @@ -105,28 +93,14 @@ BufferedImage prepareSvg( Rectangle2D.Double rect, Graphic g ) { } TranscoderInput input = new TranscoderInput( g.imageURL ); - - // TODO improve performance by writing a custom transcoder output directly rendering on an image, or - // even on the target graphics - ByteArrayOutputStream out = new ByteArrayOutputStream(); - TranscoderOutput output = new TranscoderOutput( out ); - InputStream in = null; + SvgImageTranscoder.SvgImageOutput output = t.createOutput(); try { t.transcode( input, output ); - out.flush(); - in = new ByteArrayInputStream( out.toByteArray() ); - MemoryCacheSeekableStream mcss = new MemoryCacheSeekableStream( in ); - RenderedOp rop = create( "stream", mcss ); - img = rop.getAsBufferedImage(); + img = output.getBufferedImage(); svgCache.put( cacheKey, img ); } catch ( TranscoderException e ) { LOG.warn( "Could not rasterize svg '{}': {}", g.imageURL, e.getLocalizedMessage() ); - } catch ( IOException e ) { - LOG.warn( "Could not rasterize svg '{}': {}", g.imageURL, e.getLocalizedMessage() ); - } finally { - closeQuietly( out ); - closeQuietly( in ); } } return img;