Skip to content

Commit

Permalink
Merge pull request #1428 from gritGmbH/enhancement/speedup-svg-transc…
Browse files Browse the repository at this point in the history
…oding

Speed up transcoding SVG to Image
  • Loading branch information
tfr42 authored Dec 7, 2022
2 parents 8f74ab4 + e592827 commit 9f61f26
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 29 deletions.
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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 ) );
Expand All @@ -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;
Expand Down

0 comments on commit 9f61f26

Please sign in to comment.