#!/bin/sh

#
# PostScript/pdf viewer for the linux framebuffer console
# (c) 1999-2012 Gerd Hoffmann <gerd@kraxel.org>
#


# tmp dir
DIR="$(mktemp -dtp ${TMPDIR-/var/tmp} fbgs-XXXXXX)"
test -d "$DIR" || exit 1
trap "rm -rf $DIR" EXIT

# parse options
fbiopts=""
gsopts=""
passwd=""
device="png16m"
opt=1
bell="off"
helptext="\
This program displays PostScript/pdf files using the linux framebuffer device.
It is a simple wrapper script for GhostScript and fbi.

usage: fbgs [fbgs options] [fbi options] file

   -b    --bell              emit a beep when the document is ready
   -h    --help              print this help text
   -p    --password <arg>    a <password> passed to the PDF
   -fp   --firstpage <arg>   begins on the <arg> page
   -lp	 --lastpage <arg>    stops on the <arg> page
   -c    --(no)color         pages in color
   -l                        pages rendered with 100 dpi
   -xl                       pages rendered with 120 dpi
   -xxl                      pages rendered with 150 dpi
   -r    --resolution <arg>  choose resolution of <arg> dpi

Read the fbgs(1) and fbi(1) manpages for more details.
"

[ $# -ne 0 ] ||  set -- -h
while test "$opt" = "1"; do
	case "$1" in
		# fbgs options
		-b | --bell)
			bell="on"
			shift
			;;
		-h | --help)
			printf "$helptext"
			exit 1
			;;
		-p | --password)
			password="$2"
			shift; shift
			;;
		-fp | --firstpage)
			gsopts="$gsopts -dFirstPage=$2"
			shift; shift
			;;
		-lp | --lastpage)
			gsopts="$gsopts -dLastPage=$2"
			shift; shift
			;;
		-c | --color)
			device="png16m"
			shift
			;;
		--nocolor)
			device="tiffpack"
			shift
			;;
		-l)	gsopts="$gsopts -r100x100"
			shift
			;;
		-xl)	gsopts="$gsopts -r120x120"
			shift
			;;
		-xxl)	gsopts="$gsopts -r150x150"
			shift
			;;
		-r | --resolution)
			gsopts="$gsopts -r$2x$2"
			shift; shift
			;;
		# fbi options without argument
		-a | --autozoom | \
		--autoup | --noautoup | \
		--autodown | --noautodown | \
		--fitwidth | --nofitwidth | \
		--readahead | --noreadahead | \
		-v | --verbose | --noverbose | \
		-u | --random | --norandom | \
		-1 | --once | --noonce)
			fbiopts="$fbiopts $1"
			shift
			;;
		# fbi options with one argument
		-T | --vt | \
		-s | --scroll | \
		-t | --timeout  | \
		-g | --gamma | \
		-f | --font | \
		-d | --device | \
		-m | --mode)
			fbiopts="$fbiopts $1 $2"
			shift; shift
			;;
		# others options
		-*)	echo "unknown option: $1"
			exit 1
			;;
		*)	opt=0
			;;
	esac
done

if [ ! -f "$1" ]; then
	echo "fbgs: cannot stat '$1': No such file or directory"
	exit 1
fi

# run ghostscript
echo
echo "### rendering pages, please wait ... ###"
echo
gs	-dSAFER -dNOPAUSE -dBATCH			\
	-sPDFPassword="$password"			\
	-sDEVICE=${device} -sOutputFile=$DIR/ps%03d.tiff \
	$gsopts						\
	"$1"

# tell the user we are done :-)
if test "$bell" = "on"; then
	printf "\a"
fi

# sanity check
pages=`ls $DIR/ps*.tiff 2>/dev/null | wc -l`
if test "$pages" -eq "0"; then
	echo
	echo "Oops: ghostscript wrote no pages?"
	echo
	exit 1
fi

# show pages
fbi $fbiopts -P $DIR/ps*.tiff
