package rabbitescape.ui.swing;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import rabbitescape.engine.util.RealFileSystem;
public class FrameDumper
{
private static final String sep = File.separator;
public final String recordingDir;
public final boolean active;
private int frameI;
public FrameDumper()
{
this.active = true;
RealFileSystem fs = new RealFileSystem();
frameI = 0;
int dirCount = 0;
String recordingDirTmp;
do
{
recordingDirTmp = String.format( ".%srecordings%s%04d%s",
sep, sep, dirCount++, sep );
}
while ( fs.exists( recordingDirTmp ) );
recordingDir = recordingDirTmp;
fs.mkdirs( recordingDir );
System.out.printf( "Dumping %sanim_test_frame_<set>_<frame>.png:", recordingDir );
}
private FrameDumper( boolean active )
{
this.active = active;
this.recordingDir = null;
}
public static FrameDumper createInactiveDumper()
{
return new FrameDumper( false );
}
public void dump( java.awt.Canvas canvas, BufferedDraw drawFrame )
{
if ( !active )
{
return;
}
dump( canvas, drawFrame, String.format( "%07d", frameI++ ) );
}
public void dump( java.awt.Canvas canvas, BufferedDraw drawFrame, String frameID )
{
if ( !active )
{
return;
}
BufferedImage im = new BufferedImage( canvas.getWidth(), canvas.getHeight(),
BufferedImage.TYPE_INT_ARGB );
drawFrame.draw( (Graphics2D)im.getGraphics() );
String fileName = String.format( "%sframe_%s.png", recordingDir, frameID );
System.out.printf( " " + frameID );
try
{
ImageIO.write( im, "PNG", new File( fileName ) );
}
catch ( Exception e )
{
e.printStackTrace();
System.exit( 1 );
}
}
public void framesToGif()
{
if ( !active )
{
return;
}
String cmd = String.format( "convert -delay 10 -loop 0 %s*.png %sanimation.gif",
recordingDir, recordingDir );
try
{
Runtime.getRuntime().exec( cmd );
System.out.printf( "Wrote: %sanimation.gif\n", recordingDir );
}
catch ( IOException e )
{
System.err.println( "convert from ImageMagick is required to make animated gifs" );
e.printStackTrace();
}
}
}