Mercurial > hg > xemacs-beta
diff lib-src/pstogif @ 10:49a24b4fd526 r19-15b6
Import from CVS: tag r19-15b6
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:47:52 +0200 |
parents | |
children | 6608ceec7cf8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib-src/pstogif Mon Aug 13 08:47:52 2007 +0200 @@ -0,0 +1,187 @@ +#!/usr/local/bin/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 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 <dprhws.edp.Arco.com> 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 libary +$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 $<name> + } + } +} + +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 <output file>] [-depth <color depth 1, 8 or 24>] [-flip <Flip_code>] [-density <pixel density>] <file>.ps\n\n"; +} + +