summaryrefslogtreecommitdiff
path: root/contrib/pic2graph/pic2graph.sh
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/pic2graph/pic2graph.sh')
-rw-r--r--contrib/pic2graph/pic2graph.sh111
1 files changed, 111 insertions, 0 deletions
diff --git a/contrib/pic2graph/pic2graph.sh b/contrib/pic2graph/pic2graph.sh
new file mode 100644
index 00000000..3b15c721
--- /dev/null
+++ b/contrib/pic2graph/pic2graph.sh
@@ -0,0 +1,111 @@
+#!/bin/sh
+#
+# pic2graph -- compile PIC image descriptions to bitmap images
+#
+# by Eric S. Raymond <esr@thyrsus.com>, July 2001
+#
+#
+# Copyright (C) 2001 Free Software Foundation, Inc.
+#
+# This file is part of groff.
+#
+# groff is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2, or (at your option) any later
+# version.
+#
+# groff is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with groff; see the file COPYING. If not, write to the Free Software
+# Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+
+# In Unixland, the magic is in knowing what to string together...
+#
+# Take a pic/eqn diagram on stdin, emit cropped bitmap on stdout.
+# The pic markup should *not* be wrapped in .PS/.PE, this script will do that.
+# A -U option on the command line enables gpic/groff "unsafe" mode.
+# All other options are passed to pnmtopng (or whichever back end is selected
+# by the format option). The default format in PNG.
+#
+# Requires groff, ghostscript, and the pnm tools. All are open source.
+# Use, modify, and redistribute freely. Send me fixes and enhancements.
+#
+# Here are the assumptions behind the option processing:
+#
+# 1. Only the -U option of gpic(1) is relevant. -C doesn't matter because
+# we're generating our own .PS/.PE, -[ntcz] are irrelevant because we're
+# generating Postscript.
+#
+# 2. Ditto for groff(1), though it's a longer and more tedious demonstration.
+#
+# 3. No options of pnmcrop are relevant. We can assume the generated image
+# is going to be black-on-white because that's what pic generates. Even
+# if pic were somehow coerced into generating a non-white background,
+# pnmcrop's algorithm (look at the top corners) will find the right
+# thing because gs(1) is generating a full page.
+#
+# 4. Many options of pnmtopng(1) or other pnm converters are potentially
+# relevant, (especially -interlace, -transparent, -background, -text, and
+# -compression.
+#
+# Thus, we pass -U to gpic and groff, and everything else to pnmtopng.
+#
+# We don't have complete option coverage on eqn because this is primarily
+# intended as a pic translator; we can live with eqn defaults.
+#
+# $Id: pic2graph.sh,v 1.1 2001/08/10 22:16:12 wlemb Exp $
+#
+groffpic_opts=""
+gs_opts=""
+pnmtopng_opts=""
+format="png"
+resolution=""
+eqndelim='$$'
+
+while [ "$1" ]
+do
+ case $1 in
+ -unsafe)
+ groffpic_opts="-U"; pngtopnm_opts="$pngtopnm_opts -U";;
+ -format)
+ format=$2; shift;;
+ -eqn)
+ eqndelim=$2; shift;;
+ -resolution)
+ gs_opts="-r$2"; shift;;
+ -v | --version)
+ echo "GNU pic2graph (groff) version @VERSION@"
+ exit 0;;
+ --help)
+ echo "usage: pic2graph [ option ...] < in > out"
+ exit 0;;
+ *)
+ pnmtopmg_opts="$pnmtopmg_opts $1" ;;
+ esac
+ shift;
+done
+
+if [ "$eqndelim" ]
+then
+ eqndelim="delim $eqndelim"
+fi
+
+# Here goes:
+# 1. Wrap the input in dummy .PS/PE macros
+# 2. Process through eqn and pic to emit troff markup
+# 3. Process through groff to emit Postscript
+# 4. Process through ghostscript to emit a ppm bitmap
+# 5. Crop the ppm bitmap
+# 6. Turn the ppm into PNG
+(echo ".EQ"; echo $eqndelim; echo ".EN"; echo ".PS"; cat; echo ".PE") \
+ | groff -e -p $groffpic_opts -Tps \
+ | gs -q $gs_opts -sDEVICE='ppmraw' -sOutputFile='-' -dNOPAUSE -dBATCH - \
+ | pnmcrop \
+ | pnmto${format} $pnmtopng_opts
+
+# End