#!/bin/sh
#    foo2kyo-wrapper - wrapper script for executing foo2kyo
#    Copyright (C) 2006, Florian Demski
#
#    This program 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 of the License, or
#    (at your option) any later version.
#
#    This program 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 this program; if not, write to the Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA



VERSION="foo2kyo-wrapper 0.1.0"
PROGNAME="$0"
BASENAME=`basename $PROGNAME`

if [ -x /usr/bin/logger ]; then
    logger -t "$BASENAME" - p lpr.info -- "foo2kyo-wrapper $@" < /dev/null
fi

usage() {
    cat << EOF
Usage:
    $BASENAME [options] [ps-file]

    Foomatic printer wrapper for the foo2kyo printer driver.
    This script reads a Postscript ps-file or standard input
    and converts it to Kyocera GDI printer format.

Normal Options:
-m media         Media code to send to printer [$MEDIA]
                   0=plainPaper, 1=transparency, 2=preprinted,
                   3=labels, 4=bond, 5=recycled, 6=vellum,
                   7=rough, 8=letterhead, 9=color, 10=prepunched,
                   11=envelope, 12=cardStock, 13=thickPaper,
                   14=highQuality, 15=customType
-p paper         Paper code [$PAPER]
                   0=A4, 1=letter, 2=legal, 3=A5, 4=B5(JIS),
                   5=oficioII, 6=executive, 7=statement,
                   8=folio, 9=B6(JIS), 10=A6, 11=B5(ISO),
                   12=envC5, 13=env#10, 14=envCL, 15=env#9,
                   16=envMonarch, 17=env#6, 18=16K
-n copies        Number of copies [$COPIES]
-e               ECO mode
-b brightness    Set brightness 1=light ... 7=dark [$BRIGHTNESS]
-2 / -4 / -9     2-up, 4-up, 9-up
-o orient        For N-up: -op is portrait, -ol is landscape, -os is seascape

Tweaking Options:
-g gsopts        Additional options to pass to Ghostscript, such as
                 -dDITHERPPI=nnn, etc. May appear more than once. []

Debugging Options:
-D lvl           Set Debug level [$DEBUG]
-V               $VERSION
EOF

    exit 1
}

error() {
    echo "$BASENAME: $1" >&2
    exit 1
}

dbgcmd() {
    if [ $DEBUG -ge 1 ]; then
        echo "$@" >&2
    fi
    "$@"
}

nup2() {
    tr '\r' '\n' | psnup $NUP_ORIENT -d2 -2 -m.3in -p$paper -q
}

nup4() {
    tr '\r' '\n' | psnup $NUP_ORIENT -d2 -4 -m.5in -p$paper -q
}

nup9() {
    tr '\r' '\n' | psnup $NUP_ORIENT -d2 -9 -m.5in -p$paper -q
}

if gs8 -v > /dev/null 2>&1; then
    GSBIN=${GSBIN:-gs8}
else
    GSBIN=${GSBIN:-gs}
fi

CMDLINE="$*"
MEDIA=0
PAPER=0
COPIES=1
ECO=0
BRIGHTNESS=4
DEBUG=0
NUP=
GSOPTS=
NUP_ORIENT=
GSDEV=-sDEVICE=pbmraw

while getopts "249em:p:n:b:o:g:D:Vh?" opt
do
    case $opt in
    2) NUP="2";;
    4) NUP="4";;
    9) NUP="9";;
    e) ECO="1";;
    m) MEDIA="$OPTARG";;
    p) PAPER="$OPTARG";;
    n) COPIES="$OPTARG";;
    b) BRIGHTNESS="$OPTARG";;
    o) case "$OPTARG" in
       l*)    NUP_ORIENT=-l;;
       s*)    NUP_ORIENT=-r;;
       p*|*)  NUP_ORIENT=;;
       esac;;
    g) GSOPTS="$GSOPTS $OPTARG";;
    D) DEBUG="$OPTARG";;
    V) echo "$VERSION"; foo2kyo -V; exit 0;;
    h|\?)
       if [ "$CMDLINE" != "-?" -a "$CMDLINE" != "-h" ]; then
           echo "Illegal command:"
           echo "        $0 $CMDLINE"
           echo
       fi
       usage;;
    esac
done

shift `expr $OPTIND - 1`

case "$MEDIA" in
0|plainPaper)        MEDIA=0;;
1|transparency)      MEDIA=1;;
2|preprinted)        MEDIA=2;;
3|labels)            MEDIA=3;;
4|bond)              MEDIA=4;;
5|recycled)          MEDIA=5;;
6|vellum)            MEDIA=6;;
7|rough)             MEDIA=7;;
8|letterhead)        MEDIA=8;;
9|color)             MEDIA=9;;
10|prepunched)       MEDIA=10;;
11|envelope)         MEDIA=11;;
12|cardStock)        MEDIA=12;;
13|thickPaper)       MEDIA=13;;
14|highQuality)      MEDIA=14;;
15|customType)       MEDIA=15;;
*)                   error "Unknown media code $MEDIA";;
esac

case "$PAPER" in
0|a4|A4)             PAPER=0;        paper=a4;                 XDIM="4768"; YDIM="6816";;
1|letter)            PAPER=1;        paper=letter;             XDIM="4896"; YDIM="6400";;
2|legal)             PAPER=2;        paper=legal;              XDIM="4896"; YDIM="8192";;
3|a5|A5)             PAPER=3;        paper=a5;                 XDIM="3296"; YDIM="4768";;
4|"B5(JIS)")         PAPER=4;        paper=jisb5;              XDIM="4096"; YDIM="5856";;
5|oficioII)          PAPER=5;        paper="oficioII(8.5x13)"; XDIM="4896"; YDIM="7584";;
6|executive)         PAPER=6;        paper=executive;          XDIM="4160"; YDIM="6080";;
7|statement)         PAPER=7;        paper=statement;          XDIM="3104"; YDIM="4896";;
8|folio)             PAPER=8;        paper=folio;              XDIM="4768"; YDIM="7584";;
9|"B6(JIS)")         PAPER=9;        paper=jisb6;              XDIM="2816"; YDIM="4096";;
10|a6|A6)            PAPER=10;       paper=a6;                 XDIM="2272"; YDIM="3296";;
11|"B5(ISO)")        PAPER=11;       paper=isob5;              XDIM="3968"; YDIM="5969";;
12|envC5)            PAPER=12;       paper=EnvC5;              XDIM="3616"; YDIM="5216";;
13|env#10)           PAPER=13;       paper=Env#10;             XDIM="2272"; YDIM="5504";;
14|envCL)            PAPER=14;       paper="EnvCL(4.33x8.66)"; XDIM="2400"; YDIM="4992";;
15|env#9)            PAPER=15;       paper="Env#9(3.88x8.88)"; XDIM="2112"; YDIM="5120";;
16|envMonarch)       PAPER=16;       paper=EnvMonarch;         XDIM="2112"; YDIM="4288";;
17|env#6)            PAPER=17;       paper"=Env#6(3.63x6.5)";  XDIM="1984"; YDIM="3680";;
18|16K)              PAPER=18;       paper="16K(7.56x10.75)";  XDIM="4448"; YDIM="6240";;
*)                   error "Unknown paper code $PAPER";;
esac

if [ "" != "$paper" ]; then
    PAPERSIZE="-sPAPERSIZE=$paper"
fi

DIM="${XDIM}x${YDIM}"

if [ $# -ge 1 ]; then
    exec < $1
fi

case $NUP in
2)    PREFILTER="nup2";;
4)    PREFILTER="nup4";;
9)    PREFILTER="nup9";;
*)    PREFILTER=cat;;
esac

GS="$GSBIN -q -dBATCH -dSAFER -dQUIET -dNOPAUSE"

$PREFILTER \
| ($GS $PAPERSIZE -g$DIM -r600x600 $GSDEV $GSOPTS \
    -sOutputFile="|cat 1>&3" - > /dev/null) 3>&1  \
| foo2kyo -g$DIM -p$PAPER -m$MEDIA -n$COPIES -D$DEBUG -b$BRIGHTNESS -e$ECO

if [ -x /usr/bin/logger ]; then
    logger -t "$BASENAME" -p lpr.info -- \
    "$GSBIN $PAPERSIZE -g$DIM -r600x600 $GSDEV $GSOPTS"
    logger -t "$BASENAME" -p lpr.info -- \
    "foo2kyo -g$DIM -p$PAPER -m$MEDIA -n$COPIES -D$DEBUG -b$BRIGHTNESS -e$ECO"
fi

exit 0
