diff options
Diffstat (limited to 'converter/other/pstopnm.csh')
-rwxr-xr-x | converter/other/pstopnm.csh | 301 |
1 files changed, 301 insertions, 0 deletions
diff --git a/converter/other/pstopnm.csh b/converter/other/pstopnm.csh new file mode 100755 index 00000000..adde3e6f --- /dev/null +++ b/converter/other/pstopnm.csh @@ -0,0 +1,301 @@ +#!/bin/csh -f +# +# Uses ghostscript to translate an Encapsulated PostScript file to +# Portable Anymap format file(s). +# pstopnm will create as many files as the number of pages in +# the Postscript document. The name of the files will be +# psfile001.ppm, psfile002.ppm, etc. +# The ouput files will contain the area inside the BoundingBox. +# If BoundingBox parameters are not found in the PostScript +# document, default values are used. +# +# +# Usage: pstopnm [-forceplain] [-help] [-llx s] [-lly s] +# [-urx s] [-ury s] [-nocrop] [-pbm|-pgm|-ppm] +# [-verbose] [-xborder n] [-xmax n] [-xsize n] +# [-yborder n] [-ymax n] [-ysize n] +# [-portrait] [-landscape] psfile[.ps] +# +# Copyright (C) 1992 by Alberto Accomazzi, Smithsonian Astrophysical +# Observatory (alberto@cfa.harvard.edu). +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose and without fee is hereby granted, +# provided that the above copyright notice appear in all copies and +# that both that copyright notice and this permission notice appear +# in supporting documentation. This software is provided "as is" +# without express or implied warranty. +# +set noglob + +set progname = $0 +set progname = $progname:t +set filtertail = "raw" +set filterhead = "ppm" +set xsize = 0 +set ysize = 0 +set xres = "" +set yres = "" + +# default values: max image x and y sizes +set xmax = 612 +set ymax = 792 +# default values: image area fits in a 8.5x11 sheet with 1 inch border +set llx = 72 +set lly = 72 +set urx = 540 +set ury = 720 +# default values: x and y borders are 10% of x and y size +set xborder = "0.1" +set yborder = "0.1" +# default values: orientation is unknown +set orient = 0 + +set psfile = "" +set USAGE = "Usage: $progname [-forceplain] [-help] [-llx s] [-lly s]\ +[-urx s] [-ury s] [-landscape] [-portrait]\ +[-nocrop] [-pbm|-pgm|-ppm] [-verbose] [-xborder s] [-xmax s]\ +[-xsize s] [-yborder s] [-ymax s] [-ysize s] psfile[.ps]" +alias usage 'echo $USAGE; exit 1' + +while ($#argv > 0) + switch ($argv[1]) + case -h*: # -help + usage + breaksw + case -pbm: + case -pgm: + case -ppm: + set filterhead = `echo "$argv[1]" | sed "s/-//1"` + breaksw + case -llx: + shift argv + if ($#argv == 0) eval usage + set llx = `(echo "scale=4";echo "$argv[1] * 72")|bc -l` + set nobb + breaksw + case -lly: + shift argv + if ($#argv == 0) eval usage + set lly = `(echo "scale=4";echo "$argv[1] * 72")|bc -l` + set nobb + breaksw + case -urx: + shift argv + if ($#argv == 0) eval usage + set urx = `(echo "scale=4";echo "$argv[1] * 72")|bc -l` + set nobb + breaksw + case -ury: + shift argv + if ($#argv == 0) eval usage + set ury = `(echo "scale=4";echo "$argv[1] * 72")|bc -l` + set nobb + breaksw + case -no*: # -nocrop + set nocrop + breaksw + case -xs*: # -xsize + shift argv + if ($#argv == 0) eval usage + @ xsize = $argv[1] + breaksw + case -ys*: # -ysize + shift argv + if ($#argv == 0) eval usage + @ ysize = $argv[1] + breaksw + case -xm*: # -xmax + shift argv + if ($#argv == 0) eval usage + @ xmax = $argv[1] + breaksw + case -ym*: # -ymax + shift argv + if ($#argv == 0) eval usage + @ ymax = $argv[1] + breaksw + case -xb*: # -xborder + shift argv + if ($#argv == 0) eval usage + set xborder = $argv[1] + breaksw + case -yb*: # -yborder + shift argv + if ($#argv == 0) eval usage + set yborder = $argv[1] + breaksw + case -f*: # -forceplain + set filtertail = "" + breaksw + case -s*: # -stdout + set goto_stdout + breaksw + case -v*: # -verbose + set verb + breaksw + case -po*: # -portrait + set orient = 1 + breaksw + case -la*: # -landscape + set orient = 2 + breaksw + case -*: + echo "${progname}: Unknown option $argv[1]" + usage + breaksw + default: # input file + set psfile = $argv[1] + set ppmfile = `basename $argv[1] .ps` + breaksw + endsw + shift argv +end + +if ($psfile =~ "") eval usage +if (! -f $psfile) then + echo "${progname}: file $psfile not found" + usage +endif + +set bb = `grep "%%BoundingBox" $psfile` +if ($?nobb == 0 && $#bb == 5) then + set llx = $bb[2] + set lly = $bb[3] + set urx = $bb[4] + set ury = $bb[5] +else + if ($?nobb == 0) \ + echo "${progname}: warning: BoundingBox not found in input file" +endif + +set tmpsx = `(echo "scale=4";echo "$urx - $llx")|bc -l` +set tmpsy = `(echo "scale=4";echo "$ury - $lly")|bc -l` + +# see if orientation was specified +if ($orient == 0) then + # no orientation was specified; compute default orientation + set tmpx = 0 + set tmpy = 0 + set tmpsx1 = $tmpsx:r + set tmpsy1 = $tmpsy:r + # default is landscape mode + set orient = 2 + if ($xsize == 0 && $ysize == 0) then + set tmpx = $xmax + set tmpy = $ymax + else + if ($xsize != 0) set tmpx = $xsize + if ($ysize != 0) set tmpy = $ysize + endif + if ($tmpx == 0 || $tmpy == 0) then + # only one size was specified + if ($tmpsy1 > $tmpsx1) set orient = 1 + else + # no size or both sizes were specified + if ($tmpsy1 > $tmpsx1 && $tmpy > $tmpx) set orient = 1 + if ($tmpsx1 > $tmpsy1 && $tmpx > $tmpy) set orient = 1 + endif +endif + +# now reset BoundingBox llc and total size to take into account margin +set llx = `(echo "scale=4";echo "$llx - $tmpsx * $xborder")|bc -l` +set lly = `(echo "scale=4";echo "$lly - $tmpsy * $yborder")|bc -l` +set urx = `(echo "scale=4";echo "$urx + $tmpsx * $xborder")|bc -l` +set ury = `(echo "scale=4";echo "$ury + $tmpsy * $yborder")|bc -l` +# compute image area size +set sx = `(echo "scale=4";echo "$tmpsx + 2 * $xborder * $tmpsx")|bc -l` +set sy = `(echo "scale=4";echo "$tmpsy + 2 * $yborder * $tmpsy")|bc -l` + +if ($orient != 1) then + # render image in landscape mode + set tmpsx = $sx + set sx = $sy + set sy = $tmpsx +endif + +# if xsize or ysize was specified, compute resolution from them +if ($xsize != 0) set xres = `(echo "scale=4";echo "$xsize *72 / $sx")|bc -l` +if ($ysize != 0) set yres = `(echo "scale=4";echo "$ysize *72 / $sy")|bc -l` + +if ($xres =~ "" && $yres !~ "") then + # ysize was specified, xsize was not; compute xsize based on ysize + set xres = $yres + set xsize = `(echo "scale=4";echo "$sx * $xres /72 + 0.5")|bc -l` + set xsize = $xsize:r +else + if ($yres =~ "" && $xres !~ "") then + # xsize was specified, ysize was not; compute ysize based on xsize + set yres = $xres + set ysize = `(echo "scale=4";echo "$sy * $yres /72 + 0.5")|bc -l` + set ysize = $ysize:r + else + if ($xres =~ "" && $yres =~ "") then + # neither xsize nor ysize was specified; compute them from + # xmax and ymax + set xres = `(echo "scale=4";echo "$xmax *72/$sx")|bc -l` + set yres = `(echo "scale=4";echo "$ymax *72/$sy")|bc -l` + set xres = `(echo "scale=4";echo "if($xres>$yres)$yres";echo "if($yres>$xres)$xres";echo "if($xres==$yres)$xres")|bc -l` + set yres = $xres + if ($?nocrop) then + # keep output file dimensions equal to xmax and ymax + set xsize = $xmax + set ysize = $ymax + else + set xsize = `(echo "scale=4";echo "$sx * $xres /72+0.5")|bc -l` + set ysize = `(echo "scale=4";echo "$sy * $yres /72+0.5")|bc -l` + endif + set xsize = $xsize:r + set ysize = $ysize:r + endif + endif +endif + +# translate + rotate image, if necessary +if ($orient == 1) then + # portrait mode + # adjust offsets + set llx = `(echo "scale=4";echo "$llx - ($xsize *72/$xres - $sx)/2")|bc -l` + set lly = `(echo "scale=4";echo "$lly - ($ysize *72/$yres - $sy)/2")|bc -l` + set pstrans = "$llx neg $lly neg translate" +else + # landscape mode + # adjust offsets + set llx = `(echo "scale=4";echo "$llx - ($ysize *72/$yres - $sy)/2")|bc -l` + set ury = `(echo "scale=4";echo "$ury + ($xsize *72/$xres - $sx)/2")|bc -l` + set pstrans = "90 rotate $llx neg $ury neg translate" +endif + +if ($?goto_stdout) then + set outfile = "-" +else + set outfile = $ppmfile%03d.$filterhead +endif + +if ($?verb) then + echo "sx = $sx" + echo "sy = $sy" + echo "xres = $xres" + echo "yres = $yres" + echo "xsize = $xsize" + echo "ysize = $ysize" + echo -n "orientation " + if ($orient == 1) then + echo "portrait" + else + echo "landscape" + endif + echo "PS header: $pstrans" +endif + +echo "${progname}: writing $filterhead file(s)" 1>&2 + +echo $pstrans | \ + gs -sDEVICE=${filterhead}${filtertail} \ + -sOutputFile=$outfile \ + -g${xsize}x${ysize} \ + -r${xres}x${yres} \ + -q - $psfile + + + |