#!/afs/athena/contrib/perl/perl
# 
# pstogif.pl v1.0, July 1994, by Nikos Drakos <nikos@cbl.leeds.ac.uk>
# Computer Based Learning Unit, University of Leeds.
#
# Accompanies LaTeX2HTML Version 0.6.4
#
# Script to convert an arbitrary PostScript image to a cropped GIF image
# suitable for incorporation into HTML documents as inlined images to be
# viewed with Xmosaic.
#
# This is based on the pstoepsi script 
# by Doug Crabill dgc@cs.purdue.edu
#
# Please note the following:
# - The source PostScript file must end
#   in a .ps extention.  This is a GhostScript requirement, not mine...
# - The -density and the -quality arguments have no effect unless the 
#   color depth (set with the -depth argument) is equal to 1.
# - Valid arguments for -depth are 1,8, or 24.
# - Valid arguments for -quality are integers between 1 and 10. Higher 
#   numbers will result in much longer processing times and larger
#   intermediate files.
# - The -quality option is particularly useful for converting text or
#   equations.
#  
# This software is provided as is without any guarantee.
#
# Nikos Drakos (ND), nikos@cbl.leeds.ac.uk
# Computer Based Learning Unit, University of Leeds.
#
# 20 JUL 94 ND Converted to Perl and made several changes eg it now accepts 
#    parameters from environment variables or from command line or will use 
#    default ones. 
#      
# 1  APR 94 ND Changed the suffixes of multi-page files from xbm to gif (oops!)
#
# 

#####################################################################
$| =1;
&read_args;

### You may need to specify some pathnames here if you want to
### run the script without LaTeX2HTML


# Ghostscript
$GS= $ENV{'GS'} || 'gs';
print("\n GS = $GS");
# Comes with LaTeX2HTML (For ghostscript versions greater than 3.0 
# you need the newer pstoppm.ps)
$PSTOPPM= $ENV{'PSTOPPM'} ||
    'pstoppm.ps';

# Available in the PBMPLUS libary	   
$PNMCROP=$ENV{'PNMCROP'} || 'pnmcrop' ;

# Also in PBMPPLUS	  
$PPMTOGIF=$ENV{'PPMTOGIF'} || 'ppmtogif' ;

$OUTFILE = $ENV{'OUTFILE'} || $out;
			
# Valid choices for $COLOR_DEPTH are 1, 8 or 24. 
$DEPTH = $ENV{'DEPTH'} || $depth || 24;

#Default density is 72
$DENSITY = $ENV{'DENSITY'} || $density || 72;
    
# Valid choices are any numbers greater than zero
# Useful choices are numbers between 0.1 - 5
# Large numbers may generate very large intermediate files
# and will take longer to process
$SCALE = $ENV{'SCALE'} || $scale; # No default value

$DEBUG = $ENV{'DEBUG'} || 1;

######################################################################

&main;

sub read_args {
    local($_);
    while ($ARGV[0] =~ /^-/) {
	$_ = shift @ARGV;
	if (/^-h(elp)?$/) {
	    &usage; exit}
        elsif (/^-out$/) {
            $out = shift @ARGV;
	}
	elsif (/^-(.*)$/) {
	    eval "\$$1 = shift \@ARGV;"} # Create and set a flag $<name> 
}}		 

sub main {
    local($base, $outfile, $i, $j);
    $base = &test_args;
    $outfile = $OUTFILE || "$base.gif";
    open(STDERR, ">/dev/null") unless $DEBUG;
    &convert($base);
    print("\n $base Converted O.K. now crop");
    if (-f "$base.ppm") {
	&crop_scale_etc("$base.ppm", $outfile);
    print("\n $base.ppm file exists croped O.K.");
    }
    else {
	foreach $i (<$base.[1-9]*ppm>) {
	$j = $i; 
	$j =~ s/\.(.*)ppm/$1.gif/;
	&crop_scale_etc($i, $j)}
    }				
    &cleanup($base);
}

sub crop_scale_etc {
    local($in, $out) = @_;
    open(STDERR, ">/dev/null") unless $DEBUG;
    system("$PNMCROP $in | $PPMTOGIF - > $out");
    print "Writing $out\n";
}

sub test_args {
    local($file) = $ARGV[0];
    if (! ($file =~ s/\.ps$//)) {
	print "The name of the input file must end in '.ps'\n";
	exit}
    elsif (! ( -f "$file.ps")) {
	print "Cannot find file $file.ps\n.";
	exit}
    elsif (! ($DEPTH =~ /^(1|8|24)$/)) {
	print "The color depth must be 1 or 8 or 24. You specified $DEPTH\n";
	exit			
	}
    if (defined $SCALE) {
	if ($SCALE > 0) {
	    $DENSITY = int($SCALE * 72)}
	else {
	    print "Error: The scale must be greater than 0.\n" .
		"You specified $SCALE\n";
	    exit}
    }
    $file;
}
   
sub convert {
    local($base) = @_;
    local($type) = ($depth == 1) ? "pbm" : ($depth == 8) ? "pgm" : "ppm";
    print("\n PSTOGIF converting ps -> ppm with gs $base");
    system("$GS -q -sDEVICE=$type -r$DENSITY -dNOPAUSE -sOutputFile=$base.ppm -- $base.ps");
}

sub cleanup {
    local($base) = @_;
    unlink <$base[0-9.]*ppm>;
}

sub usage {
    print "Usage: pstogif [-h(elp)] [-out <output file>] [-depth <color depth 1, 8 or 24>]  [-density <pixel density>] <file>.ps\n\n";
}



