#!/usr/local/bin/perl # # # $version='tgifanime version 0.1'; $copyright='Copyright (C) 2004 Ryuhei Uehara (uehara@jaist.ac.jp)'; $gifmerge_command = '/home/uehara/bin/gifmerge'; $tgif_command = '/usr/X11R6/bin/tgif'; $rm_command = '/bin/rm'; $number=100; $millisecond=10; $debug=0; $debugdebug=0; $usage = "Usage: tgifanime.pl [-h] -f file1.obj -t file2.obj [-n number] [-m number] -f first file (*.obj) -t last file (*.obj) -n the number of pages between first file and last file (default 100) -h show this message -m millisecond per file (default 10) -v verbose -vv very verbose "; if($#ARGV<0 || ($ARGV[0] eq '-h')){ print STDERR "$version\n$copyright\n$usage"; exit; } for (;$#ARGV>=0;shift){ if ($ARGV[0] eq '-f'){ shift; $first = &objfile; } elsif ($ARGV[0] eq '-t'){ shift; $last = &objfile; } elsif ($ARGV[0] eq '-n'){ shift; $number=$ARGV[0]; } elsif ($ARGV[0] eq '-m'){ shift; $millisecond=$ARGV[0]; } elsif ($ARGV[0] eq '-v'){ $debug=1; } elsif ($ARGV[0] eq '-vv'){ $debugdebug=1; } else { print STDERR "$version\n$copyright\n$usage"; } } &main; exit; sub objfile { if ( $ARGV[0]=~ /^(.+)\.obj$/){ return $ARGV[0]; } else { return sprintf("%s.obj",$ARGV[0]); } } sub main{ if($first eq '' || $last eq '' || !(int($number)>0) ){ print STDERR "$version\n$copyright\n$usage"; print $first, $last; exit; } $number = int($number); if ($debug){ print "from: ", $first; print "\n"; print "to: ", $last; print "\n"; print "number: ", $number; print "\n"; } $_ = $first; s/\.obj//g; $head = $_; for ($i=1; $i<=$number; $i++){ $filename[$i]= sprintf(">%s-%03d.obj",$head,$i); $filename_bak[$i]= sprintf("%s-%03d.obj",$head,$i); if ($debugdebug){ printf("%s\n", $filename[$i]); } } open(STARTFILE,$first) && (@startdata=) || die "Can't open the startfile."; open(LASTFILE,$last) && (@lastdata=) || die "Can't open the startfile."; for ($i=1; $i<=$number; $i++){ $TEMPFILE = $filename[$i]; if ($debugdebug){ printf("[%s]\n",$TEMPFILE); } open(TEMPFILE) || die "Can't open the temporary file: $TEMPFILE $!\n"; $numberofline = $#startdata; for ($j=0; $j<=$numberofline; $j++){ @start = @startdata; @last = @lastdata; # handle it line by line. if ($start[$j] eq $last[$j]) { #output the line as is. print TEMPFILE sprintf("%s",$start[$j]); } else { #output token by token. $_ = $start[$j]; s/([^,]*),//; $stoken = $1; $start[$j]=$_; $_ = $last[$j]; s/([^,]*),//; $ltoken = $1; $last[$j]=$_; $_ = $start[$j]; $flag = m/[^,]*,/; while ($flag){ if ($stoken eq $ltoken) { print TEMPFILE sprintf("%s,",$stoken); } else { print TEMPFILE sprintf("%s,", $stoken + int($i * ($ltoken - $stoken)/$number) ); } $_ = $start[$j]; s/([^,]*),//; $stoken = $1; $start[$j]=$_; $_ = $last[$j]; s/([^,]*),//; $ltoken = $1; $last[$j]=$_; $_ = $start[$j]; $flag = m/[^,]*,/; } print TEMPFILE sprintf("%s,%s",$stoken,$start[$j]); } } } for ($i=1; $i<=$number; $i++){ system("$tgif_command -print -gif $filename_bak[$i]"); } system("$gifmerge_command -$millisecond $head-*.gif > ${head}anime.gif"); if (!($debug)){ system("$rm_command $head-*.*"); } }