#!/usr/bin/perl -w # animate.pl - Don Yang (uguu.org) # # Generate GIF animation from source. # # Requires: enscript gs netpbm gifsicle # # 12/09/07 use strict; die "$0 \n" unless $#ARGV == 1; my $input_source = $ARGV[0]; my $final_output = $ARGV[1]; my $output_source = "anim.gen.pl"; my $output_prefix = "anim.gen"; sub Exec($) { my ($cmd) = @_; system $cmd; if( $? != 0 ) { die "$cmd failed: $?\n"; } } sub GenerateAnimation() { # Load input my $file; open $file, "< $input_source" or die $!; my $code = join '', <$file>; close $file; # Generate output frames my $color_map = undef; my $gifsicle_cmd = "gifsicle -d1 -lforever -O -o $final_output"; for(my $i = 0; $i < 100; $i++) { print "Frame $i\n"; # Generate code open $file, "> $output_source" or die $!; print $file "use subs 'time';sub time{return $i;}\n$code\n"; close $file; # Run code my $output_txt = $output_prefix . ".txt"; Exec("perl $output_source > $output_txt"); # Convert text to postscript my $output_ps = $output_prefix . ".ps"; Exec("enscript -q -f Courier-Bold10 -o $output_ps $output_txt"); unlink $output_txt; # Convert postscript to image my $output_pgm = $output_prefix . ".pgm"; Exec("gs -q -dNOPAUSE -dBATCH -sDEVICE=pgmraw " . "-dTextAlphaBits=4 -dGraphicsAlphaBits=4 -r300 " . "-sOutputFile=$output_pgm $output_ps"); unlink $output_ps; my $output_processed = $output_prefix . ".ppm"; Exec("pnmcut -left 84 -top 220 -width 2000 -height 1125 $output_pgm |" . "pnmscale -xsize=320 > $output_processed"); unlink $output_pgm; # If this is the first image, generate a 8 color map unless( defined $color_map ) { $color_map = "colormap.ppm"; Exec("pnmcolormap 8 $output_processed > $color_map"); } # Quantize image without dithering my $output_reduced = $output_prefix . "q.ppm"; Exec("pnmremap -mapfile=$color_map $output_processed > $output_reduced"); unlink $output_processed; my $output_gif = sprintf('%s.%02d.gif', $output_prefix, $i); Exec("ppmtogif $output_reduced > $output_gif"); unlink $output_reduced; $gifsicle_cmd .= " $output_gif"; } # Generate output animation unlink $final_output; Exec($gifsicle_cmd); # Cleanup unlink $output_source; defined $color_map or die; unlink $color_map; for(my $i = 0; $i < 100; $i++) { unlink (sprintf '%s.%02d.gif', $output_prefix, $i); } } GenerateAnimation();