#!c:\perl\bin\perl.exe
### ============================================================================
### PST-anim.pl -- Jean-Michel Sarlat (jsarlat@planete.net)
### 5 juin 2002
###               Adaption WIN... d'un script de Syracuse 
###                  http://melusine.eu.org/syracuse/
### Création d'un gif animé à l 'aide de  gifsicle à partir de fichiers produits
### par dvips avec les option -i et -E.
### ex : >dvips -Ei fichier.dvi -o dossier\images.ps
### 
### Ce script doit être activé par un fichier BATCH comme PST-anim.bat
### ============================================================================
### Modif - 12 juin 2002 - passage des paramètres
### usage :
### PST-anim.pl [-c 2|4|8|16|32|64|128|256] [-d n] [-r images] [-R] [-L]
### options :
### -c	:	profondeur de l'image
### -d  :	délai entre chaque vues en millisecondes
### -r  : 	dossier contenant les images GIF
### -R	:	sans argument, on recalcule la BoundingBox
### -L  :	sans argument, l'animation boucle

use Getopt::Std;
getopts("c:d:r:RL");
### ============================================================================
$GIFSICLE = $ENV{'APPGIFSICLE'};
$CONVERT  = $ENV{'APPCONVERT'};
$GS       = $ENV{'APPGS'};

$couleurs = ($opt_c) ? "--colors $opt_c" : "";
$delai    = ($opt_d) ? "--delay $opt_d" : "";
$dossier  = ($opt_r) ? "$opt_r\\" : "";
$retaille = ($opt_R) ? 1 : 0 ;
$boucle   = ($opt_L) ? "--loop" : "";

### Récupérer la première ligne débutant par un chaîne ($chaine) d'un 
### fichier ($fichier)
sub ChercheLigneDebutantPar {
    my ($fichier,$chaine) = @_;
    open(CFICHIERC,$fichier);
    while (<CFICHIERC>) {
        if ($_ =~ /^$chaine/) {
            close(CFICHIERC);
            return $_;
        }    
    }
    close(CFICHIERC);
    return undef;
}
### Substituer une ligne ($remplacement) à une autre ($chaine) dans un 
### fichier ($fichier)
sub ChangeLigneDebutantPar {
    my ($fichier,$chaine,$remplacement) = @_;
    open(CFICHIERC,$fichier);
    open(CFICHIERCTMP,">$fichier.tmp");
    while (<CFICHIERC>) {
        print CFICHIERCTMP (($_ =~ /^$chaine/) ? $remplacement : $_);
    }
    close(CFICHIERCTMP);
    close(CFICHIERC);
    rename("$fichier.tmp",$fichier);
    return 0;
}
### Recalcul de la BoundingBox ...
sub AdapteBBoxPourPSTricks {
    my($ps) = @_;
    my $gsArgs = "-sDEVICE=bbox -dNOPAUSE -dQUIET $ps quit.ps";
    print `$GS $gsArgs >bbox`;
    my $BB = &ChercheLigneDebutantPar("bbox","%%BoundingBox:");
    &ChangeLigneDebutantPar($ps,"%%BoundingBox:",$BB);
}
### Début du traitement
# --> liste du dossier
opendir(REP,"images");
@liste = readdir(REP);
closedir(REP);
# --> conversion au format gif
foreach $f (@liste) {
    if (-f "$dossier$f") {
      my $ft = $f; $ft =~ s/\.//g; # modification 9/06/2002
      print "$f ...\n";
	if ($retaille) {
	    &AdapteBBoxPourPSTricks("$dossier$f");
	}
	print `$CONVERT ps:$dossier$f $dossier$ft.gif`;
    }
}
# --> création du gif animé
print `$GIFSICLE $couleurs $boucle $delai $dossier*.gif > animation.gif`; 
# --> nettoyage
unlink "bbox";
print `del $dossier*.gif`;

### Fin
1;


