#!/usr/bin/perl
#
# create a animation (standard is an animated gif) from the given files
#
# written by Michael Panhorst


use warnings;
use strict;
use Getopt::Long;
use Image::Magick;


our $VERSION = 0.3 ;

my $fontpath = "/usr/X11R6/lib/X11/fonts/TTF/luxisr.ttf" ;
#my $fontpath = "/usr/X11R6/lib/X11/fonts/truetype/arial.ttf" ;

my $crop = "" ;
my $delay = "100" ;
my $text = "" ;
my $special = "" ;
my $output = "anim.gif" ;
my $pointsize = "" ;
my $verbose = "" ;
my $keep = "" ;


my $Options = GetOptions("crop=s" => \$crop,
			 "delay=i" => \$delay,
			 "text" => \$text,
			 "special" => \$special,
			 "output=s" => \$output,
			 "pointsize=i" => \$pointsize,
			 "verbose" => \$verbose,
			 "keep" => \$keep);


my @Files = @ARGV ;
my @GifFiles ;
my $Status ;


# Help and error subroutine

sub printerror {

my $Usage = <<'_USAGE';


USAGE: anim -crop [-delay|-text|-special|
              -pointsize|-output|-verbose|-keep] <filenames>

            -crop <width>x<height>{+-}<x>{+-}<y>{%}
            -delay <1/100ths of a second> (Standard is 100)
            -text
            -special
	    -pointsize <font-size>
            -output <filename> (Standard is anim.gif)
	    -verbose
	    -keep

_USAGE

print "\n   *** ERROR: @_ ***\n\n" if @_ ;
print "anim - Version: $VERSION\n       written by Michael Panhorst <Michael\@Panhorst.com>" unless @_ ;
print $Usage unless @_ ;
exit 1;

}

# calculate pointsize subroutine:
# Input : Text, cropoption
# Output: Maximum pointsize

sub calculate_pointsize {
    my $Text = shift ;
    my $CropOption = shift ; 

    $CropOption =~ s/x.*$//;

    print " >> Calculated pointsize:" if $verbose ;


    my $TestImage = new Image::Magick ;
    $Status = $TestImage->read($Files[0]);
    printerror($Status) if $Status ;

    my $i ;

    for ( $i = 8 ; $i < 80 ; $i++ ) {
	my ($w, $h, $ascend, $descend, $text_w, $text_h, $max) = 
	    $TestImage->QueryFontMetrics(font => $fontpath,
					 pointsize => $i,
					 text => $Text);

	my $MaxText = $text_w + 20 ;

	if ( $MaxText > $CropOption ) {
	    print " $i\n" if $verbose ;
	    return $i ;
	}

    }
    print " $i (Maximum PointSize)\n" if $verbose ;
    return $i ;

}




printerror() unless @ARGV ;

printerror("You must give the -crop option!\n              Use the height an width of your picture,\n              if you want the full picture (e.g. '-crop 1024x1024').") unless $crop ;

print "\n" if $verbose ;



unless ( $pointsize ) {
    if ( $text ) {
	
	my $Text = $Files[0] ;
	$Text =~ s/\..*$// ;
	
	$pointsize = calculate_pointsize($Text,$crop);
	
    }
    elsif ( $special ) {
	
	my $Text = $Files[0] ;
	$Text =~ /(\d{7}msec.*)\..*$/ ;
	$Text = $1 ;
	
	$pointsize = calculate_pointsize($Text,$crop);
	
    }
}

print " >> Creating gifs for each of the " if $verbose ;
print  $#Files+1 if $verbose ;
print " Input-Files\n" if $verbose ;

foreach my $File ( @Files ) {

    my $GifFile = $File ;
#    $GifFile =~ s/\..*$/\.gif/ ;
    $GifFile = "$File.gif" ;

    my $Source = new Image::Magick;

    $Status = $Source->Read($File) ;
    printerror $Status if $Status ;
    
    $Status = $Source->Crop(geometry => $crop);
    printerror $Status if $Status ;

    $Status = $Source->Set(page => '+0+0');
    printerror $Status if $Status ;

    if ( $text ) {

	my $Text = $File ;
	$Text =~ s/\..*$// ;
	
	$Status = $Source->Annotate(text => $Text ,
				    font => $fontpath,
				    stroke => 'orange',
				    fill => 'orange',
				    pointsize => $pointsize ,
				    gravity => 'south' );
	printerror $Status if $Status ;
    }
    elsif ( $special ) {

	my $Text = $File ;
	$Text =~ /(\d{7}msec.*)\..*$/ ;
	$Text = $1 ;

	$Status = $Source->Annotate(text => $Text ,
				    font => $fontpath,
				    stroke => 'orange',
				    fill => 'orange',
				    pointsize => $pointsize ,
				    gravity => 'south' );
	printerror $Status if $Status ;
    }

    $Status = $Source->Write($GifFile) ;

    push @GifFiles, $GifFile ;


}

print " >> Creating animation: $output\n" if $verbose ;

my $Image = new Image::Magick ;

$Status = $Image->Read(@GifFiles) ;
printerror $Status if $Status ;

$Status = $Image->Write(delay => $delay,
			filename => $output);
printerror $Status if $Status ;

unless ( $keep ) {
    print " >> Deleting created gifs\n" if $verbose ;
    unlink $_ foreach @GifFiles ;
}
