: # -*-Perl-*- eval 'exec perl -w -S $0 ${1+"$@"}' # Portability kludge if 0; # # pstogif.pl v1.0, July 1994, by Nikos Drakos # Computer Based Learning Unit, University of Leeds. # # Accompanies LaTeX2HTML Version 96.1 # # 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 WWW browsers. # # 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 argument has no effect unless the # color depth (set with the -depth argument) is equal to 1. # - Valid arguments for -depth are 1,8, or 24. # # This software is provided as is without any guarantee. # # Nikos Drakos (ND), nikos@cbl.leeds.ac.uk # Computer Based Learning Unit, University of Leeds. # # 15 Jan 96 HS Call ppmquant only if needed. Fixed bug relative to # V 95.3 . # # 15 Dec 95 HS (Herbert Swan Added support for # the flip=option. This allows images to be oriented differently # in the paper versus the electronic media # # 1 Nov 95 jmn - modified for use with gs ppm driver - from jhrg's patches # note that ppmtops.ps and ppmtops3.ps are no longer needed # # 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'; # 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 library $PNMCROP=$ENV{'PNMCROP'} || 'pnmcrop' ; # Also in PBMPLUS $PNMFLIP=$ENV{'PNMFLIP'} || 'pnmflip' ; # Also in PBMPPLUS $PPMTOGIF=$ENV{'PPMTOGIF'} || 'ppmtogif' ; # Also in PBMPPLUS $REDUCE_COLOR=$ENV{'PPMQUANT'} || 'ppmquant 256' ; $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 $PAPERSIZE = $ENV{'PAPERSIZE'} || $papersize; # No default value; $DEBUG = $ENV{'DEBUG'} || $DEBUG || 0; ###################################################################### &main; sub read_args { local($_); local($color); 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 $ } } } sub main { local($base, $outfile, $i, $j); $base = &test_args; $outfile = $OUTFILE || "$base.gif"; open(STDERR, ">/dev/null") unless $DEBUG; &convert($base); if (-f "$base.ppm") { &crop_scale_etc("$base.ppm", $outfile); } 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) = @_; local($tmp) = $in . ".tmp"; open(STDERR, ">/dev/null") unless $DEBUG; if ($flip) { rename($tmp, $in) unless system("$PNMFLIP -$flip $in > $tmp"); } system("$PNMCROP $in > $tmp"); if (system("$PPMTOGIF $tmp > $out")) { print "Running ppmquant for $out\n"; system("$REDUCE_COLOR < $tmp|$PPMTOGIF - > $out"); } unlink $tmp; 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 * $DENSITY)} else { print "Error: The scale must be greater than 0.\n" . "You specified $SCALE\n"; exit} } $file; } sub convert { local($base) = @_; local($paperopt) = "-sPAPERSIZE=$PAPERSIZE" if $PAPERSIZE; local($ppmtype) = join('', "ppm",$DEPTH,"run"); local($density) = "-r$DENSITY" if ($DENSITY != 72); open (GS, "|$GS -q -dNOPAUSE -dNO_PAUSE -sDEVICE=ppmraw $density -sOutputFile=$base.ppm $paperopt $base.ps"); close GS; } sub cleanup { local($base) = @_; unlink <$base[0-9.]*ppm>; } sub usage { print "Usage: pstogif [-h(elp)] [-out ] [-depth ] [-flip ] [-density ] .ps\n\n"; }