|
|
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;
}
}
|