package org.openslx.taskmanager.tasks; import java.awt.Color; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; import org.apache.commons.io.FilenameUtils; import org.openslx.satserver.util.Archive; import org.openslx.satserver.util.Ppm; import org.openslx.satserver.util.Util; import org.openslx.taskmanager.api.AbstractTask; import com.google.gson.annotations.Expose; import com.kitfox.svg.SVGDiagram; import com.kitfox.svg.SVGUniverse; public class BrandingGenerator extends AbstractTask { @Expose private String tarFile = null; @Expose private String svgFile = null; private Output status = new Output(); @Override protected boolean initTask() { this.setStatusObject( status ); if ( this.svgFile == null || this.svgFile.isEmpty() ) { status.error = "svgFile empty"; return false; } if ( this.tarFile == null || this.tarFile.isEmpty() ) { status.error = "tarFile empty"; return false; } this.svgFile = FilenameUtils.normalize( this.svgFile ); this.tarFile = FilenameUtils.normalize( this.tarFile ); if ( !Util.isAllowedDir( this.svgFile ) || !Util.isAllowedDir( this.tarFile ) ) { status.error = "svgFile or tarFile not in allowed dir"; return false; } return true; } @Override protected boolean execute() { // Try to rasterize to png first - just to test if this is really an SVG image // if this fails we still continue File f = new File( this.svgFile ); SVGUniverse svgUniverse = new SVGUniverse(); File ppmFile = null; try { SVGDiagram diagram = svgUniverse.getDiagram( svgUniverse.loadSVG( f.toURI().toURL() ) ); float scaling = 1; if ( diagram.getHeight() > diagram.getWidth() ) scaling = 192f / diagram.getHeight(); else scaling = 192f / diagram.getWidth(); BufferedImage bi = new BufferedImage( (int) ( diagram.getWidth() * scaling ), (int) ( diagram.getHeight() * scaling ), BufferedImage.TYPE_INT_ARGB ); Graphics2D rasterImage = bi.createGraphics(); rasterImage.setClip( 0, 0, bi.getWidth(), bi.getHeight() ); //rasterImage.setBackground( Color.WHITE ); rasterImage.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON ); rasterImage.setRenderingHint( RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY ); rasterImage.setRenderingHint( RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR ); rasterImage.setRenderingHint( RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY ); rasterImage.setRenderingHint( RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON ); AffineTransform at = new AffineTransform(); at.setToScale( bi.getWidth() / diagram.getWidth(), bi.getWidth() / diagram.getWidth() ); rasterImage.transform( at ); diagram.render( rasterImage ); rasterImage.dispose(); try { File tmpFile = File.createTempFile( "bwlp-", ".png", null ); ImageIO.write( bi, "PNG", tmpFile ); status.pngFile = tmpFile.getAbsolutePath(); } catch ( Exception e ) { status.error = "Can't create png preview: " + e.toString(); } try { ppmFile = File.createTempFile( "bwlp-", ".ppm", null ); Ppm.write( bi, ppmFile.getAbsolutePath(), Color.WHITE ); } catch ( Exception e ) { status.error = "Can't create png preview: " + e.toString(); ppmFile = null; } } catch ( Throwable e ) { status.error = "Can't rasterize image - maybe this is not a valid SVG file? - " + e.toString(); } TarArchiveOutputStream tar; try { tar = Archive.createTarArchive( this.tarFile ); } catch ( IOException e ) { status.error = "Can't write to " + this.tarFile + ": " + e.toString(); return false; } Archive.tarAddFile( tar, "/etc/branding.svg", f, 0644 ); if ( ppmFile != null ) Archive.tarAddFile( tar, "/etc/branding.ppm", ppmFile, 0644 ); Util.multiClose( tar ); return true; } /** * Output - contains additional status data of this task */ @SuppressWarnings( "unused" ) private static class Output { protected String error = null; protected String pngFile = null; } }