#!/bin/zsh
#
# NOM         : pstogif
# DESCRIPTION : .ps castem -> mickey animé (Gif)
# LANGAGE     : Shell script (zsh 4.1.0-dev-5 (i586-mandrake-linux-gnu))
# AUTEUR      : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF)
#               mél : gounand@semt2.smts.cea.fr
# DEPENDANCES : sed (GNU sed version 4.0.3), 
#               gs (GPL Ghostscript 8.61 (2007-11-21)
#               convert (Version: ImageMagick 5.5.4 02/01/03 Q16 
#                        http://www.imagemagick.org), 
#               gifsicle
# VERSION    : v1, 19/03/2007, version initiale
# Debugging
#set -x
#                -c : no pretreatment of castem postscript file
function usage
{
echo "$SCRIPT [-c] [-l] (0,1) [-s] (0, 1, 2) [-d i] [-o] (0, 1, 2) 
              [-a] arguments.ps
this script maps .ps files from Castem 2000 into animated .gifs files
        Arguments:
                -c : white background instead of black background
                -l : linewidth (0=small (default) ; 1=thick)
                -s : resolution (0=small ; 1=normal (default) ; 2=big)
                -d : delay (in 1/100 s) (default i=3)
                -o : size optimization level (0, 1, 2 (default))
                -a : append q s n parameters to output filename
"
exit 0
}
function error
{
rm -fr $TMPDIR 
echo "Error or interruption in $SCRIPT"
exit 1
}
SCRIPT=${0##*/}
currdir=`pwd`
# Mettre un chemin absolu...
#TMPDIR=/tmp/tmp$$
TMPDIR=$currdir/tmp$$
#
if [ $# = 0 ] ;  then 
    usage
fi
#
Cflag=1
Lval=0
Sval=1
Dval=3
Oval=2
Aflag=0
while getopts "hcl:s:d:o:a" Arg ; do
  case $Arg in
    h) usage ;;
    c) Cflag=0 ;;
    l) Lval=$OPTARG ;;
    s) Sval=$OPTARG ;;
    d) Dval=$OPTARG ;;
    o) Oval=$OPTARG ;;
    a) Aflag=1 ;;
    *) usage ;;
  esac
done
shift $(( OPTIND - 1 ))
# Traitement des options
case $Lval in
    0) Lw=1 ;;
    1) Lw=10 ;;
    *) echo "Lval=$Lval" not allowed ; error ;;
esac
case $Sval in
    0) Res=75 ;;
    1) Res=100 ;;
    2) Res=135 ;;
    *) echo "Sval=$Sval" not allowed ; error ;;
esac
if [ ! $Dval -ge 1 ] ; then
     echo "Fval=$Fval" should be greater than 1 ; error
fi
case $Oval in
    0) Opt=0 ;;
    1) Opt=1 ;;
    2) Opt=2 ;;
    *) echo "Oval=$Oval" not allowed ; error ;;
esac
# Traitement des exceptions
trap 'error' 2 3
for filename
do
  bfn=`basename $filename .ps`
  if [ ! -f $bfn.ps ] ;  then
      echo "$bfn.ps is not a valid file"
      error
  fi
  case $Aflag in
      0) ofn=$bfn.gif ;;
      1) ofn=${bfn}l${Lval}s${Sval}d${Dval}o${Opt}.gif ;;
      *) echo "Aflag=$Aflag" not allowed ; error ;;
  esac
  mkdir $TMPDIR
  cd $TMPDIR
# sed parameter file for pretreatment of .ps Castem file
#   Bigger bounding box (because of bigger font) resolution should be a multiple of 16 
#   in both directions (MPEG-1 spec)
  sedav='^%%BoundingBox: 0 0 593 841' ; sedap='%%BoundingBox: 0 -16 592 832' ; echo "s/$sedav/$sedap/" >> $bfn.sed
#   Suppression of useless text (in my opinion)
  sedav='^(VAL - ISO)' ; sedap='()' ; echo "s/$sedav/$sedap/" >> $bfn.sed
  sedav='^(<.\{9\})' ; sedap='()' ; echo "s/$sedav/$sedap/" >> $bfn.sed
  sedav='^(>.\{9\})' ; sedap='()' ; echo "s/$sedav/$sedap/" >> $bfn.sed
  sedav='^(GIBI FECIT)' ; sedap='()' ; echo "s/$sedav/$sedap/" >> $bfn.sed
  sedav='^(COMPOSANTES)' ; sedap='()' ; echo "s/$sedav/$sedap/" >> $bfn.sed
  sedav='^(VECTEURS)' ; sedap='()' ; echo "s/$sedav/$sedap/" >> $bfn.sed
  sedav='^(FX FY FZ)' ; sedap='()' ; echo "s/$sedav/$sedap/" >> $bfn.sed
#   Bigger, more readable font
  sedav='\/Courier' ; sedap='\/Courier-Bold' ; echo "s/$sedav/$sedap/" >> $bfn.sed
#  sedav='9 scalefont' ; sedap='10 scalefont' ; echo "s/$sedav/$sedap/" >> $bfn.sed
#   Thicker linewidth
#  sedav='^ 1 setlinewidth' ; sedap='7 setlinewidth' ; echo "s/$sedav/$sedap/" >> $bfn.sed
#  sedav='[0-9][0-9.]* setlinewidth' ; sedap="$Lw setlinewidth" ; echo "s/$sedav/$sedap/" >> $bfn.sed
#   Force ghostscript output to Landscape
# sedav='\(^%%Orientation: Landscape\)' 
# sedap='\1\\n gsave clippath pathbbox grestore \\n 4 dict begin \\n \/ury exch def \/urx exch def \/lly exch def \/llx exch def \\n 90 rotate  llx neg               llx urx sub lly sub  translate \\n end' 
#echo "s/$sedav/$sedap/" >> $bfn.sed
 sedav='23 CM  1 CM translate 90 rotate' 
 sedap='1 CM  1 CM translate' 
 echo "s/$sedav/$sedap/" >> $bfn.sed
#   I personnaly prefer black background and white pen for movies
  sedav='\(^%%EndProlog\)' 
  sedap='\/backgroundColor [0.0 0.0 0.0] def\\n\/SetColor{\\naload pop setrgbcolor\\n} def\\n\/dobg { clippath backgroundColor SetColor fill } def\\n\1' 
  echo "s/$sedav/$sedap/" >> $bfn.sed2
  sedav='\(^StartPage\)' ; sedap='\1\\ndobg\\nD0' ; echo "s/$sedav/$sedap/" >> $bfn.sed2
  sedav='^\/D0 { 0\.0000 0\.0000 0\.0000' 
  sedap='\/D0 { 1\.0000 1\.0000 1\.0000' 
  echo "s/$sedav/$sedap/" >> $bfn.sed2
  sedav='^\/C0 { 0\.' 
  sedap='\/C0 { 1\.' 
  echo "s/$sedav/$sedap/" >> $bfn.sed2
# End of sed parameter file
#      0) ln -sf $currdir/$bfn.ps ./$bfn.ps ;;
#      1) sed -f $bfn.sed $currdir/$bfn.ps > ./$bfn.ps ;;
  case $Cflag in
      0) sed -f $bfn.sed $currdir/$bfn.ps > ./$bfn.ps ;;
      1) cat $bfn.sed $bfn.sed2 > $bfn.sed3 ; sed -f $bfn.sed3 $currdir/$bfn.ps > ./$bfn.ps ;;
      *) echo "Cflag=$Cflag" not allowed ; error ;;
  esac
#
#gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -dDEVICEWIDTHPOINTS=842 -dDEVICEHEIGHTPOINTS=595 -r$Res -dTextAlphaBits=2 -dGraphicsAlphaBits=1 -dDOINTERPOLATE -sOutputFile=$bfn.%06d.png $bfn.ps
gs -dQUIET -dSAFER -dBATCH -dNOPAUSE -sDEVICE=png256 -dDEVICEWIDTHPOINTS=842 -dDEVICEHEIGHTPOINTS=595 -r$Res -dTextAlphaBits=2 -dGraphicsAlphaBits=1 -dDOINTERPOLATE -sOutputFile=$bfn.%06d.png $bfn.ps
for filepng in *.png
do
  bfnp=`basename $filepng .png`
  convert $bfnp.png $bfnp.gif 
done
gifsicle --loopcount --delay $Dval --careful -O$Opt *.gif > $ofn
#gifsicle --delay 3 -O2 *.gif > $ofn
#convert -delay 3 -limit memory 256 -limit map 512 *.png $ofn
#ffmpeg -i $bfn.%06d.png -vcodec msmpeg4v2 -hq $ofn
#ffmpeg -i $bfn.%06d.png $bfn.gif
#ffmpeg -i $bfn.%06d.png -vcodec mpeg2video -hq -b 1000 $ofn
#ffmpeg -i $bfn.%06d.png -vcodec mpeg1video -hq -b 1000 $ofn
#ffmpeg -r $Fval -i $bfn.%06d.png -vcodec mpeg1video -hq -r 30 -b 1000 $ofn
  mv $ofn $currdir
  cd $currdir
  rm -fr $TMPDIR
done
exit 0
