mirror of
https://github.com/koenkooi/foo2zjs.git
synced 2026-01-22 03:34:49 +08:00
972 lines
25 KiB
Bash
Executable File
972 lines
25 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
#* Copyright (C) 2003-2006 Rick Richardson
|
|
#*
|
|
#* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
#*
|
|
#* Authors: Rick Richardson <rick.richardson@comcast.net>
|
|
|
|
VERSION='$Id: foo2zjs-wrapper.in,v 1.154 2012/02/24 01:25:15 rick Exp $'
|
|
|
|
#
|
|
# Printer Notes:
|
|
#
|
|
# Minolta/QMS 2300 DL - Does not need clipping, -X16, or -P. But it doesn't
|
|
# break anything if you use them.
|
|
#
|
|
# Minolta/QMS 2200 DL - Requires -X16 (which is on by default)
|
|
# - Requires clipping
|
|
#
|
|
# HP LaserJet 1000 - Same as 2200 DL, plus needs -P
|
|
# HP LaserJet 1005 - Same as 2200 DL, plus needs -P
|
|
#
|
|
# HP LaserJet 1018 - Same as 2200 DL, plus needs -P -z1 -L0
|
|
# HP LaserJet 1020 - Same as 2200 DL, plus needs -P -z1 -L0
|
|
# HP LaserJet 1022 - Same as 2200 DL, plus needs -P -z1 -L0
|
|
# HP LaserJet M1319 MFP - Same as 2200 DL, plus needs -P -z1 -L0
|
|
# HP LaserJet P2035 - Same as 2200 DL, plus needs -P -z1 -L0
|
|
# HP LaserJet P2035n - Same as 2200 DL, plus needs -P -z1 -L0
|
|
#
|
|
# HP LaserJet Pro P1102 - Same as 2200 DL, plus needs -P -z2 -L0
|
|
# HP LaserJet Pro P1102w- Same as 2200 DL, plus needs -P -z2 -L0
|
|
# HP LaserJet Pro P1566 - Same as 2200 DL, plus needs -P -z2 -L0
|
|
# HP LaserJet Pro P1606dn- Same as 2200 DL, plus needs -P -z2 -L0
|
|
#
|
|
# HP LaserJet Pro CP1025nw- Same as 2200 DL, plus needs -P -z3 -L0
|
|
#
|
|
|
|
PROGNAME="$0"
|
|
BASENAME=`basename $PROGNAME`
|
|
PREFIX=/usr
|
|
SHARE=$PREFIX/share/foo2zjs
|
|
PATH=$PATH:/sw/bin:/opt/local/bin
|
|
|
|
#
|
|
# Log the command line, for debugging and problem reports
|
|
#
|
|
if [ -x /usr/bin/logger -o -x /bin/logger ]; then
|
|
logger -t "$BASENAME" -p lpr.info -- "$BASENAME $@" </dev/null
|
|
fi
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
Usage:
|
|
$BASENAME [options] [ps-file]
|
|
|
|
Foomatic printer wrapper for the foo2zjs printer driver.
|
|
This script reads a Postscript ps-file or standard input
|
|
and converts it to Zenographics ZjStream printer format.
|
|
|
|
Normal Options:
|
|
-c Print in color (else monochrome)
|
|
-C colormode Colormode [$COLORMODE]
|
|
1=Photos, 2=Photo and text, 3=Graphics and text
|
|
10=ICM RGB color profile (using -G *.icm file)
|
|
gs9=New gs9+ ICM CMYK color profile (using -G *.icm file)
|
|
-d duplex Duplex code to send to printer [$DUPLEX]
|
|
1=off, 2=longedge, 3=shortedge
|
|
-m media Media code to send to printer [$MEDIA]
|
|
-z0:
|
|
1=standard, 2=transparency, 3=glossy, 257=envelope,
|
|
259=letterhead, 261=thickstock, 262=postcard, 263=labels
|
|
-z1,-z2,-z3: above plus
|
|
258=light, 261=cardstock, 263=rough, 265=labels,
|
|
267=envelope, 273=vellum, 512=color, 513=letterhead,
|
|
514=preprinted, 515=prepunched, 516=recycled
|
|
-p paper Paper code [$PAPER]
|
|
-z0:
|
|
1=letter, 5=legal, 7=executive, 9=A4, 11=A5, 13=B5jis
|
|
20=env#10, 27=envDL 28=envC5 34=envB5 37=envMonarch
|
|
-z1: -z0 plus
|
|
257=16K 197x273, 258=fanfold german legal, 259=b5iso,
|
|
260=postcard, 261=doublepostcard, 262=A6
|
|
-z2: -z0 plus
|
|
43=postcard, 70=A6, 82=double postcard rotated,
|
|
257=16K 197x273, 263=16K 184x260, 264=16K 195x270,
|
|
258=fanfold german legal
|
|
-z3: -z0 plus
|
|
43=postcard, 70=A6, 82=double postcard rotated,
|
|
257=16K 197x273, 263=16K 184x260, 264=16K 195x270,
|
|
258=fanfold german legal, 268=photo4x6, 269=photo5x8,
|
|
270=photo10x15
|
|
-n copies Number of copies [$COPIES]
|
|
-r <xres>x<yres> Set device resolution in pixels/inch [$RES]
|
|
-s source Source code to send to printer [$SOURCE]
|
|
1=upper, 2=lower, 4=manual, 7=auto
|
|
Code numbers may vary with printer model.
|
|
-t Draft mode. Every other pixel is white.
|
|
-T density Print density (1-5) [$DENSITY]
|
|
-2/-3/-4/-6/-8/-10/-12/-14/-15/-16/-18
|
|
Print with N-up (requires psutils)
|
|
-o orient For N-up: -op is portrait, -ol is landscape, -os is seascape.
|
|
|
|
Printer Tweaking Options:
|
|
-u <xoff>x<yoff> Set offset of upper left printable in pixels [varies]
|
|
-l <xoff>x<yoff> Set offset of lower right printable in pixels [varies]
|
|
-L mask Send logical clipping values from -u/-l in ZjStream [3]
|
|
0=no, 1=Y, 2=X, 3=XY
|
|
-P Do not output START_PLANE codes. May be needed by some
|
|
monochrome-only printers.
|
|
-X padlen Add extra zero padding to the end of BID segments [16]
|
|
-z model Model: [0]
|
|
0=KM 2300DL / HP 1000 / HP 1005
|
|
1=HP 1018 / HP 1020 / HP 1022
|
|
2=HP Pro P1102 / P1566 / P1606dn
|
|
3=HP Pro CP1025nw
|
|
|
|
Color Tweaking Options:
|
|
-g gsopts Additional options to pass to Ghostscript, such as
|
|
-dDITHERPPI=nnn, etc. May appear more than once. []
|
|
-G profile.icm Convert profile.icm to a Postscript CRD using icc2ps and
|
|
adjust colors using the setcolorrendering PS operator.
|
|
$SHARE/icm/ will be searched for profile.icm.
|
|
-I intent Select profile intent from ICM file [$INTENT]
|
|
0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute
|
|
-G gamma-file.ps Prepend gamma-file to the Postscript input to perform
|
|
color correction using the setcolortransfer PS operator.
|
|
|
|
Debugging Options:
|
|
-S plane Output just a single color plane from a color print [all]
|
|
1=Cyan, 2=Magenta, 3=Yellow, 4=Black
|
|
-D lvl Set Debug level [$DEBUG]
|
|
-V $VERSION
|
|
EOF
|
|
|
|
exit 1
|
|
}
|
|
|
|
#
|
|
# Report an error and exit
|
|
#
|
|
error() {
|
|
echo "$BASENAME: $1" >&2
|
|
exit 1
|
|
}
|
|
|
|
dbgcmd() {
|
|
if [ $DEBUG -ge 1 ]; then
|
|
echo "$@" >&2
|
|
fi
|
|
"$@"
|
|
}
|
|
|
|
#
|
|
# N-up-ify the job. Requires psnup from psutils package
|
|
#
|
|
nup() {
|
|
case "$NUP" in
|
|
[2368]|1[0458])
|
|
tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.3in -p$paper -q
|
|
;;
|
|
[49]|1[26])
|
|
tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.5in -p$paper -q
|
|
;;
|
|
*)
|
|
error "Illegal call to nup()."
|
|
;;
|
|
esac
|
|
}
|
|
|
|
#
|
|
# Process the options
|
|
#
|
|
|
|
# Try to use a local copy of GhostScript 8.54, if available. Otherwise,
|
|
# fallback to whatever the Linux distro has installed (usually 7.07)
|
|
#
|
|
# N.B. := operator used here, when :- would be better, because "ash"
|
|
# doesn't have :-
|
|
if eval gs.foo -v >/dev/null 2>&1; then
|
|
GSBIN=${GSBIN:-gs.foo}
|
|
else
|
|
GSBIN=${GSBIN:-gs}
|
|
fi
|
|
GSVER=`$GSBIN --version`
|
|
|
|
CMDLINE="$*"
|
|
DEBUG=0
|
|
DUPLEX=1
|
|
COLOR=
|
|
COLORMODE=default
|
|
MODEL=0
|
|
QUALITY=1
|
|
QUALITY=wts
|
|
MEDIA=1
|
|
COPIES=1
|
|
PAPER=1
|
|
RES=1200x600
|
|
SOURCE=7
|
|
NUP=
|
|
CLIP_UL=
|
|
CLIP_LR=
|
|
CLIP_LOG=
|
|
BC=
|
|
AIB=
|
|
NOPLANES=
|
|
COLOR2MONO=
|
|
GAMMAFILE=
|
|
INTENT=0
|
|
GSOPTS=
|
|
EXTRAPAD=
|
|
SAVETONER=
|
|
DENSITY=3 #Medium
|
|
NUP_ORIENT=
|
|
GSDEV=-sDEVICE=pbmraw
|
|
# What mode to use if the user wants us to pick the "best" mode
|
|
case "$GSVER" in
|
|
7*) DEFAULTCOLORMODE=10
|
|
DEFAULTCOLORMODE=2
|
|
;;
|
|
8.1*)
|
|
DEFAULTCOLORMODE=2
|
|
QUALITY=1
|
|
;;
|
|
*) DEFAULTCOLORMODE=2
|
|
;;
|
|
esac
|
|
while getopts "1:23456789o:b:cC:d:g:l:u:L:m:n:p:q:r:s:tT:z:ABS:D:G:I:PX:Vh?" opt
|
|
do
|
|
case $opt in
|
|
b) GSBIN="$OPTARG";;
|
|
c) COLOR=-c;;
|
|
d) DUPLEX="$OPTARG";;
|
|
g) GSOPTS="$GSOPTS $OPTARG";;
|
|
m) MEDIA="$OPTARG";;
|
|
n) COPIES="$OPTARG";;
|
|
p) PAPER="$OPTARG";;
|
|
q) QUALITY="$OPTARG";;
|
|
r) RES="$OPTARG";;
|
|
s) SOURCE="$OPTARG";;
|
|
t) SAVETONER="-t";;
|
|
T) DENSITY="$OPTARG";;
|
|
z) MODEL="$OPTARG";;
|
|
l) CLIP_LR="-l $OPTARG";;
|
|
u) CLIP_UL="-u $OPTARG";;
|
|
L) CLIP_LOG="-L $OPTARG";;
|
|
A) AIB=-A;;
|
|
B) BC=-B;;
|
|
C) COLORMODE="$OPTARG";;
|
|
S) COLOR2MONO="-S$OPTARG";;
|
|
D) DEBUG="$OPTARG";;
|
|
G) GAMMAFILE="$OPTARG";;
|
|
I) INTENT="$OPTARG";;
|
|
P) NOPLANES=-P;;
|
|
X) EXTRAPAD="-X $OPTARG";;
|
|
[234689]) NUP="$opt";;
|
|
[57]) error "Can't find acceptable layout for $opt-up";;
|
|
1) case "$OPTARG" in
|
|
[024568]) NUP="1$OPTARG";;
|
|
*) error "Can't find acceptable layout for 1$OPTARG-up";;
|
|
esac
|
|
;;
|
|
o) case "$OPTARG" in
|
|
l*) NUP_ORIENT=-l;;
|
|
s*) NUP_ORIENT=-r;;
|
|
p*|*) NUP_ORIENT=;;
|
|
esac;;
|
|
V) echo "$VERSION"; foo2zjs -V; foo2zjs-pstops -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`
|
|
|
|
# Testing for gs9...
|
|
if [ `uname -n` = dual.rkkda.org -a $MODEL = 3 ]; then
|
|
GSBIN=gs904
|
|
GSBIN=gsgit # gs 9.05+
|
|
fi
|
|
|
|
#
|
|
# If there is an argument left, take it as the file to print.
|
|
# Else, the input comes from stdin.
|
|
#
|
|
if [ $# -ge 1 ]; then
|
|
if [ "$LPJOB" = "" ]; then
|
|
: # LPJOB="$1"
|
|
fi
|
|
exec < $1
|
|
fi
|
|
|
|
#
|
|
case "$QUALITY" in
|
|
0)
|
|
GSOPTS="-dCOLORSCREEN $GSOPTS"
|
|
;;
|
|
1)
|
|
GSOPTS="-dCOLORSCREEN $GSOPTS"
|
|
;;
|
|
2)
|
|
GSOPTS="-dMaxBitmap=500000000 $GSOPTS"
|
|
;;
|
|
as)
|
|
GSOPTS="-dCOLORSCREEN -dMaxBitmap=500000000 $GSOPTS"
|
|
;;
|
|
wts)
|
|
GSOPTS="-dCOLORSCREEN -dMaxBitmap=500000000 $GSOPTS"
|
|
;;
|
|
esac
|
|
|
|
#
|
|
# Validate model code
|
|
#
|
|
case "$MODEL" in
|
|
0|1|2|3) ;;
|
|
*) error "Unknown model code $MODEL";;
|
|
esac
|
|
|
|
#
|
|
# Validate media code
|
|
#
|
|
case "$MEDIA" in
|
|
1|standard|plain) MEDIA=1;;
|
|
2|transparency) MEDIA=2;;
|
|
3|glossy) MEDIA=3;;
|
|
257|envelope) MEDIA=257;; # -z0
|
|
258|light) MEDIA=258;; # -z1, -z2
|
|
259|letterhead) MEDIA=259;; # -z0
|
|
261|thickstock|cardstock) MEDIA=261;;
|
|
262|postcard|heavy) MEDIA=262;;
|
|
263|labels|rough) MEDIA=263;; # -z0 labels, -z[12] rough
|
|
265|labels) MEDIA=265;; # -z1, -z2
|
|
267|envelope) MEDIA=267;; # -z1, -z2
|
|
273|vellum) MEDIA=267;; # -z1, -z2
|
|
512|color) MEDIA=512;;
|
|
513|letterhead) MEDIA=513;; # -z1, -z2
|
|
514|preprinted) MEDIA=514;; # -z1, -z2
|
|
515|prepunched) MEDIA=515;; # -z1, -z2
|
|
516|recycled) MEDIA=516;; # -z1, -z2
|
|
[0-9]*) ;;
|
|
*) error "Unknown media code $MEDIA";;
|
|
esac
|
|
|
|
#
|
|
# Validate source (InputSlot) code
|
|
#
|
|
case "$SOURCE" in
|
|
1|upper) SOURCE=1;;
|
|
2|lower) SOURCE=2;;
|
|
4|manual) SOURCE=4;;
|
|
7|auto) SOURCE=7;;
|
|
[0-9]*) ;;
|
|
*) error "Unknown source code $SOURCE";;
|
|
esac
|
|
|
|
#
|
|
# Validate Duplex code
|
|
#
|
|
case "$DUPLEX" in
|
|
1|off|none) DUPLEX=1;;
|
|
2|long*) DUPLEX=2;;
|
|
3|short*) DUPLEX=3;;
|
|
[0-9]*) ;;
|
|
*) error "Unknown duplex code $DUPLEX";;
|
|
esac
|
|
|
|
#
|
|
# Validate Resolution
|
|
#
|
|
case "$RES" in
|
|
600x600) ;;
|
|
1200x600) ;;
|
|
2400x600) ;;
|
|
*) error "Illegal resolution $RES";;
|
|
esac
|
|
|
|
#
|
|
# Validate Print Density
|
|
#
|
|
case "$DENSITY" in
|
|
1|2|3|4|5) ;;
|
|
*) error "Illegal print density (-T) $DENSITY";;
|
|
esac
|
|
|
|
#
|
|
# Figure out the paper dimensions in pixels/inch, and set the
|
|
# default clipping region. Unfortunately, this is a trouble
|
|
# area for ZjStream printers. Various versions of ZjS print
|
|
# engines react differently when asked to print into their
|
|
# unprintable regions.
|
|
#
|
|
# The Minolta 2200 DL is sensitive to its unprintable regions,
|
|
# and will pixel skew if you try to print there.
|
|
#
|
|
# The HP1000 will print blank pages when asked to print into its
|
|
# unprintable region.
|
|
#
|
|
# The Minolta 2300 DL doesn't care if print into the unprintable
|
|
# region. It will do the clipping itself. This is as it should be.
|
|
# But it won't hurt it if we do the clipping here.
|
|
#
|
|
set_clipping() {
|
|
ulx=$1; uly=$2
|
|
lrx=$3; lry=$4
|
|
|
|
# Set clipping region if it isn't already set
|
|
if [ "$CLIP_UL" = "" ]; then
|
|
case "$RES" in
|
|
600x600) ulx=`expr $ulx / 2`;;
|
|
2400x600) ulx=`expr $ulx \* 2`;;
|
|
esac
|
|
CLIP_UL="-u ${ulx}x${uly}"
|
|
fi
|
|
if [ "$CLIP_LR" = "" ]; then
|
|
case "$RES" in
|
|
600x600) lrx=`expr $lrx / 2`;;
|
|
2400x600) lrx=`expr $lrx \* 2`;;
|
|
esac
|
|
CLIP_LR="-l ${lrx}x${lry}"
|
|
fi
|
|
}
|
|
|
|
case "$PAPER" in
|
|
Custom*x*)
|
|
# Command line only
|
|
XDIM=`echo "$PAPER" | sed -e "s/Custom.//" -e "s/x.*//" `
|
|
YDIM=`echo "$PAPER" | sed -e "s/.*x//" `
|
|
if [ "$XDIM" = "" -o "$YDIM" = "" ]; then
|
|
error "Custom page size '$PAPER' != 1-99999"
|
|
fi
|
|
if [ "$XDIM" -eq 0 -o "$YDIM" -eq 0 ]; then
|
|
error "Custom page size '$PAPER' != 1-99999"
|
|
fi
|
|
XDIM=`dc -e "$XDIM 1200* 72/p"`
|
|
YDIM=`dc -e "$YDIM 600* 72/p"`
|
|
PAPER=256; paper=letter;
|
|
MEDIA=261
|
|
set_clipping 2 100 2 100
|
|
;;
|
|
Custom*)
|
|
#%%BeginFeature: *CustomPageSize True
|
|
#216
|
|
#360
|
|
#0
|
|
#0
|
|
#0
|
|
#pop pop pop pop pop
|
|
|
|
#%%BeginFeature: *CustomPageSize True
|
|
#792.000000 612.000000 1 0.000000 0.000000
|
|
#pop pop pop pop pop
|
|
|
|
if [ $DEBUG = 0 ]; then
|
|
TMPFILE=/tmp/cus$$
|
|
else
|
|
TMPFILE=/tmp/custom.ps
|
|
fi
|
|
cat >$TMPFILE
|
|
exec <$TMPFILE
|
|
|
|
tmp=`head -n 10000 $TMPFILE \
|
|
| sed -n '/CustomPageSize/{n;p;n;p;}' \
|
|
| tr '\n' ' '`
|
|
case "$tmp" in
|
|
[0-9]*\ [0-9]*)
|
|
XDIM=`echo "$tmp" | sed 's/ .*//'`
|
|
YDIM=`echo "$tmp" | sed -e 's/^[^ ]* //' -e 's/ .*//'`
|
|
;;
|
|
*)
|
|
if [ $DEBUG = 0 ]; then rm -f $TMPFILE; fi
|
|
error "Custom page size [XY]DIM != 1-99999"
|
|
;;
|
|
esac
|
|
XDIM=`dc -e "$XDIM 1200* 72/p"`
|
|
YDIM=`dc -e "$YDIM 600* 72/p"`
|
|
PAPER=256; paper=letter;
|
|
MEDIA=261
|
|
set_clipping 2 100 2 100
|
|
;;
|
|
1|letter) PAPER=1; paper=letter; XDIM="10200"; YDIM="6600"
|
|
case "$MODEL" in
|
|
0) set_clipping 204 102 204 106;;
|
|
1) set_clipping 192 96 192 96;;
|
|
2) set_clipping 192 96 192 96;;
|
|
3) set_clipping 192 96 192 96;;
|
|
# 1) set_clipping 96 96 288 96;;
|
|
esac
|
|
;;
|
|
5|legal) PAPER=5; paper=legal; XDIM="10200"; YDIM="8400"
|
|
case "$MODEL" in
|
|
0) set_clipping 204 102 204 106;;
|
|
1) set_clipping 192 96 192 96;;
|
|
2) set_clipping 192 96 192 96;;
|
|
3) set_clipping 192 96 192 96;;
|
|
esac
|
|
;;
|
|
7|executive) PAPER=7; paper=executive; XDIM="8700"; YDIM="6300"
|
|
case "$MODEL" in
|
|
0) set_clipping 206 102 206 102;;
|
|
1) set_clipping 192 96 192 96;;
|
|
2) set_clipping 192 96 192 96;;
|
|
3) set_clipping 192 96 192 96;;
|
|
esac
|
|
;;
|
|
9|a4|A4) PAPER=9; paper=a4; XDIM="9920"; YDIM="7016"
|
|
case "$MODEL" in
|
|
0)
|
|
if [ "$NOPLANES" != "" -a "$RES" = 600x600 ]; then
|
|
# Hack fix for LJ1000
|
|
set_clipping 224 100 224 100
|
|
else
|
|
# 2200DL
|
|
set_clipping 200 100 200 100
|
|
fi
|
|
;;
|
|
1) set_clipping 192 96 192 96;;
|
|
2) set_clipping 192 96 192 96;;
|
|
3) set_clipping 192 96 192 96;;
|
|
esac
|
|
;;
|
|
11|a5|A5) PAPER=11; paper=a5; XDIM="6992"; YDIM="4960"
|
|
case "$MODEL" in
|
|
0) set_clipping 200 100 200 100;;
|
|
1) set_clipping 192 96 192 96;;
|
|
2) set_clipping 192 96 192 96;;
|
|
3) set_clipping 192 96 192 96;;
|
|
esac
|
|
;;
|
|
13|b5|B5) PAPER=13; paper=b5; XDIM="8598"; YDIM="6070"
|
|
case "$MODEL" in
|
|
0) set_clipping 207 107 207 107;;
|
|
1) set_clipping 192 96 192 96;;
|
|
2) set_clipping 192 96 192 96;;
|
|
3) set_clipping 192 96 192 96;;
|
|
esac
|
|
;;
|
|
259|b5iso|B5ISO) PAPER=259; paper=b5; XDIM="8316"; YDIM="5904"
|
|
case "$MODEL" in
|
|
1) set_clipping 192 96 192 96;;
|
|
*) error "Unimplemented paper code $PAPER";;
|
|
esac
|
|
;;
|
|
20|"env#10") PAPER=20; paper=env10; XDIM="4950"; YDIM="5700"
|
|
case "$MODEL" in
|
|
0) set_clipping 171 78 171 78;;
|
|
1) set_clipping 171 78 171 78;;
|
|
2) set_clipping 171 78 171 78;;
|
|
3) set_clipping 171 78 171 78;;
|
|
esac
|
|
;;
|
|
27|envDL) PAPER=27; paper=envDL; XDIM="5200"; YDIM="5200"
|
|
case "$MODEL" in
|
|
0) set_clipping 176 84 176 84;;
|
|
1) set_clipping 176 84 176 84;;
|
|
2) set_clipping 176 84 176 84;;
|
|
3) set_clipping 176 84 176 84;;
|
|
esac
|
|
;;
|
|
28|envC5) PAPER=28; paper=envC5; XDIM="7650"; YDIM="5408"
|
|
case "$MODEL" in
|
|
0) set_clipping 170 80 169 80;;
|
|
1) set_clipping 170 80 169 80;;
|
|
2) set_clipping 170 80 169 80;;
|
|
3) set_clipping 170 80 169 80;;
|
|
esac
|
|
;;
|
|
34|envB5) PAPER=34; paper=envB5; XDIM="8316"; YDIM="5892"
|
|
case "$MODEL" in
|
|
0) set_clipping 174 74 174 74;;
|
|
1) set_clipping 174 74 174 74;;
|
|
2) set_clipping 174 74 174 74;;
|
|
3) set_clipping 174 74 174 74;;
|
|
esac
|
|
;;
|
|
37|envMonarch) PAPER=37; paper=envMonarch;XDIM="4650"; YDIM="4500"
|
|
case "$MODEL" in
|
|
0) set_clipping 174 78 173 78;;
|
|
1) set_clipping 174 78 173 78;;
|
|
2) set_clipping 174 78 173 78;;
|
|
3) set_clipping 174 78 173 78;;
|
|
esac
|
|
;;
|
|
70|262|A6) paper=A6; XDIM="4956"; YDIM="3498"
|
|
case "$MODEL" in
|
|
1) PAPER=262; set_clipping 174 78 173 78;;
|
|
2) PAPER=70; set_clipping 174 78 173 78;;
|
|
3) PAPER=70; set_clipping 174 78 173 78;;
|
|
*) error "Unimplemented paper code $PAPER";;
|
|
esac
|
|
;;
|
|
257|16k197x273) PAPER=257; paper=executive;XDIM="9306"; YDIM="6448"
|
|
case "$MODEL" in
|
|
1) set_clipping 173 84 173 84;;
|
|
2) set_clipping 173 84 173 84;;
|
|
3) set_clipping 173 84 173 84;;
|
|
*) error "Unimplemented paper code $PAPER";;
|
|
esac
|
|
;;
|
|
263|16k184x260) PAPER=263; paper=executive;XDIM="8692"; YDIM="6142"
|
|
case "$MODEL" in
|
|
2) set_clipping 122 87 122 87;;
|
|
3) set_clipping 122 87 122 87;;
|
|
*) error "Unimplemented paper code $PAPER";;
|
|
esac
|
|
;;
|
|
264|16k195x270) PAPER=264; paper=executive;XDIM="9212"; YDIM="6378"
|
|
case "$MODEL" in
|
|
2) set_clipping 126 87 126 87;;
|
|
3) set_clipping 126 87 126 87;;
|
|
*) error "Unimplemented paper code $PAPER";;
|
|
esac
|
|
;;
|
|
43|260|postcard) paper=executive;XDIM="4728"; YDIM="3498"
|
|
case "$MODEL" in
|
|
1) PAPER=260; set_clipping 126 87 126 87;;
|
|
2) PAPER=43; set_clipping 126 87 126 87;;
|
|
3) PAPER=43; set_clipping 126 87 126 87;;
|
|
*) error "Unimplemented paper code $PAPER";;
|
|
esac
|
|
;;
|
|
82|261|doublepostcardrotated)
|
|
paper=executive;XDIM="6996"; YDIM="4722"
|
|
case "$MODEL" in
|
|
1) PAPER=261; set_clipping 126 87 126 87;;
|
|
2) PAPER=82; set_clipping 126 87 126 87;;
|
|
3) PAPER=82; set_clipping 126 87 126 87;;
|
|
*) error "Unimplemented paper code $PAPER";;
|
|
esac
|
|
;;
|
|
258|fanfoldgermanlegal)
|
|
PAPER=258; paper=legal; XDIM="10200"; YDIM="7800"
|
|
case "$MODEL" in
|
|
1) set_clipping 192 96 192 96;;
|
|
2) set_clipping 192 96 192 96;;
|
|
3) set_clipping 192 96 192 96;;
|
|
*) error "Unimplemented paper code $PAPER";;
|
|
esac
|
|
;;
|
|
268|photo4x6)
|
|
PAPER=268; paper=a6; XDIM="4800"; YDIM="3600"
|
|
case "$MODEL" in
|
|
3) set_clipping 192 96 192 96;;
|
|
*) error "Unimplemented paper code $PAPER";;
|
|
esac
|
|
;;
|
|
269|photo5x8)
|
|
PAPER=269; paper=statement; XDIM="6000"; YDIM="4800"
|
|
case "$MODEL" in
|
|
3) set_clipping 192 96 192 96;;
|
|
*) error "Unimplemented paper code $PAPER";;
|
|
esac
|
|
;;
|
|
270|photo10x15)
|
|
PAPER=270; paper=postcard; XDIM="4818"; YDIM="3590"
|
|
case "$MODEL" in
|
|
3) set_clipping 192 96 192 96;;
|
|
*) error "Unimplemented paper code $PAPER";;
|
|
esac
|
|
;;
|
|
*) error "Unimplemented paper code $PAPER";;
|
|
esac
|
|
# e.g. /usr/share/ghostscript/7.07/lib/gs_statd.ps
|
|
PAPERSIZE="-sPAPERSIZE=$paper";
|
|
|
|
case "$RES" in
|
|
600x600) XDIM=`expr $XDIM / 2`;;
|
|
1200x600) ;;
|
|
2400x600) XDIM=`expr $XDIM \* 2`;;
|
|
esac
|
|
DIM="${XDIM}x${YDIM}"
|
|
|
|
#
|
|
# Filter thru psnup if N-up printing has been requested
|
|
#
|
|
case $NUP in
|
|
[234689]|1[024568]) PREFILTER="nup";;
|
|
*) PREFILTER=cat;;
|
|
esac
|
|
if [ "$DEBUG" -ge 9 ]; then
|
|
PREFILTER="tee /tmp/$BASENAME.ps"
|
|
fi
|
|
|
|
#
|
|
# Overload -G. If the file name ends with ".icm" or ".ICM"
|
|
# then convert the ICC color profile to a Postscript CRD,
|
|
# then prepend it to the users job. Select the intent
|
|
# using the -I option.
|
|
#
|
|
|
|
create_crd() {
|
|
#
|
|
# Create a Postscript CRD
|
|
#
|
|
ICC2PS=$PREFIX/bin/foo2zjs-icc2ps
|
|
if [ -x $ICC2PS ]; then
|
|
case "$GAMMAFILE" in
|
|
none | none.icm | */none.icm)
|
|
;;
|
|
*)
|
|
if [ -x /usr/bin/logger ]; then
|
|
logger -t "$BASENAME" -p lpr.info -- \
|
|
"`basename $ICC2PS` -o $GAMMAFILE -t$INTENT > $ICCTMP.crd.ps"
|
|
fi
|
|
$ICC2PS -o $GAMMAFILE -t$INTENT > $ICCTMP.crd.ps 2>$ICCTMP.log \
|
|
|| error "Problem converting .ICM file to Postscript"
|
|
;;
|
|
esac
|
|
|
|
PSTOPS_OPTS="$PSTOPS_OPTS -c"
|
|
cat > $ICCTMP.usecie.ps <<-EOF
|
|
%!PS-Adobe-3.0
|
|
<</UseCIEColor true>>setpagedevice
|
|
EOF
|
|
if [ "$QUALITY" = wts -o "$QUALITY" = as ]; then
|
|
if [ "$QUALITY" = wts ]; then
|
|
cat >> $ICCTMP.usecie.ps <<-EOF
|
|
<< /UseWTS true >> setuserparams
|
|
EOF
|
|
else
|
|
cat >> $ICCTMP.usecie.ps <<-EOF
|
|
<< /UseWTS false >> setuserparams
|
|
EOF
|
|
fi
|
|
cat >> $ICCTMP.usecie.ps <<-EOF
|
|
<<
|
|
/AccurateScreens true
|
|
/HalftoneType 1
|
|
/HalftoneName (Round Dot Screen) cvn
|
|
/SpotFunction { 180 mul cos exch 180 mul cos add 2 div}
|
|
/Frequency 137
|
|
/Angle 37
|
|
>> sethalftone
|
|
EOF
|
|
fi
|
|
cat > $ICCTMP.selcrd.ps <<-EOF
|
|
/Current /ColorRendering findresource setcolorrendering
|
|
EOF
|
|
case "$GAMMAFILE" in
|
|
none | none.icm | */none.icm) GAMMAFILE="$ICCTMP.usecie.ps";;
|
|
*) GAMMAFILE="$ICCTMP.usecie.ps $ICCTMP.crd.ps $ICCTMP.selcrd.ps";;
|
|
esac
|
|
else
|
|
GAMMAFILE=
|
|
fi
|
|
}
|
|
|
|
#
|
|
# Print the color space from an ICC file using "dd"
|
|
#
|
|
colorspace() {
|
|
if [ -r "$1" ]; then
|
|
dd if=$1 bs=4c skip=4 count=1 2>/dev/null
|
|
elif [ -r "$SHARE/icm/$1" ]; then
|
|
dd if=$1 bs=4c skip=4 count=1 2>/dev/null
|
|
else
|
|
echo none
|
|
fi
|
|
}
|
|
|
|
if [ $DEBUG -gt 0 ]; then
|
|
ICCTMP=/tmp/icc
|
|
else
|
|
ICCTMP=/tmp/icc$$
|
|
fi
|
|
|
|
PSTOPS_OPTS="-n"
|
|
|
|
if [ "" = "$COLOR" ]; then
|
|
COLORMODE=
|
|
GAMMAFILE=
|
|
else
|
|
case "$COLORMODE" in
|
|
default) COLORMODE=$DEFAULTCOLORMODE;;
|
|
esac
|
|
|
|
case "$GAMMAFILE" in
|
|
default)
|
|
case "$MODEL" in
|
|
3) GAMMAFILE=hp-cp1025-rgb-392-bpp1.icm;;
|
|
*) GAMMAFILE=DL2312.icm;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
case "$GSVER" in
|
|
9.*)
|
|
cs=`colorspace $GAMMAFILE`
|
|
if [ "$cs" = "CMYK" ]; then
|
|
COLORMODE=gs9
|
|
QUALITY=
|
|
PSTOPS_OPTS="$PSTOPS_OPTS -9 -a"
|
|
fi
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
CRDBASE="$PREFIX/share/foo2zjs/crd"
|
|
case "$RES" in
|
|
600x600) SCREEN=screen1200.ps;;
|
|
1200x600) SCREEN=screen1200.ps;;
|
|
2400x600) SCREEN=screen2400.ps;;
|
|
esac
|
|
|
|
case "$COLORMODE" in
|
|
0|"")
|
|
# Monochrome
|
|
;;
|
|
gs9)
|
|
# Use new icc method in gs 9.*
|
|
AIB=
|
|
BC=
|
|
if [ -r "$GAMMAFILE" ]; then
|
|
GAMMAFILE="-sOutputICCProfile=$GAMMAFILE"
|
|
elif [ -r "$SHARE/icm/$GAMMAFILE" ]; then
|
|
GAMMAFILE="-sOutputICCProfile=$SHARE/icm/$GAMMAFILE"
|
|
else
|
|
GAMMAFILE=
|
|
fi
|
|
;;
|
|
10|icm)
|
|
# Use old ICM method
|
|
AIB=-A
|
|
BC=-B
|
|
case "$GAMMAFILE" in
|
|
none | none.icm | */none.icm)
|
|
create_crd
|
|
;;
|
|
*.icm|*.ICM|*.icc|*.ICC)
|
|
#
|
|
# Its really an .ICM file, not a gamma file.
|
|
#
|
|
# The file can be a full path name, or the name of a file in $SHARE/icm/
|
|
#
|
|
if [ -r "$GAMMAFILE" ]; then
|
|
create_crd
|
|
elif [ -r "$SHARE/icm/$GAMMAFILE" ]; then
|
|
GAMMAFILE="$SHARE/icm/$GAMMAFILE"
|
|
create_crd
|
|
else
|
|
GAMMAFILE=
|
|
fi
|
|
;;
|
|
esac
|
|
;;
|
|
1|photo)
|
|
# Photo
|
|
GAMMAFILE="$CRDBASE/prolog.ps"
|
|
GAMMAFILE="$GAMMAFILE $CRDBASE/2300w-1200@150-l250-kx,ucr125,75-per.crd"
|
|
GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
|
|
;;
|
|
2|graphics)
|
|
# Photo and Text
|
|
GAMMAFILE="$CRDBASE/prolog.ps"
|
|
#GAMMAFILE="$GAMMAFILE $CRDBASE/2300w-1200@150-l250-kx,ucr100,75-per.crd"
|
|
GAMMAFILE="$GAMMAFILE $CRDBASE/kh.crd"
|
|
GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
|
|
;;
|
|
3|text)
|
|
# Graphic and Text
|
|
GAMMAFILE="$CRDBASE/prolog.ps"
|
|
#GAMMAFILE="$GAMMAFILE $CRDBASE/2300w-1200@150-l250-kx,ucr100,50-per.crd"
|
|
GAMMAFILE="$GAMMAFILE $CRDBASE/kx.crd"
|
|
GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
|
|
;;
|
|
4|tonersave)
|
|
# Reduced toner
|
|
GAMMAFILE="$CRDBASE/prolog.ps"
|
|
GAMMAFILE="$GAMMAFILE $CRDBASE/2300w-1200@150-l250-kx,ucr100,0-per.crd"
|
|
GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
|
|
;;
|
|
*.crd)
|
|
GAMMAFILE="$CRDBASE/prolog.ps"
|
|
if [ -f $COLORMODE ]; then
|
|
GAMMAFILE="$GAMMAFILE $COLORMODE"
|
|
elif [ -f $CRDBASE/$COLORMODE ]; then
|
|
GAMMAFILE="$GAMMAFILE $CRDBASE/$COLORMODE"
|
|
else
|
|
error "Can't find CRD '$COLORMODE' in . or in $CRDBASE"
|
|
fi
|
|
GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
|
|
;;
|
|
*)
|
|
error "Unknown color method '$COLORMODE'"
|
|
;;
|
|
esac
|
|
|
|
if [ "$COLOR" != "" -a "$QUALITY" = wts ]; then
|
|
PSTOPS_OPTS="$PSTOPS_OPTS -w"
|
|
elif [ "$COLOR" != "" -a "$QUALITY" = as ]; then
|
|
PSTOPS_OPTS="$PSTOPS_OPTS -a"
|
|
fi
|
|
|
|
if [ "" != "$COLOR" ]; then
|
|
if [ "" = "$AIB" -a "" = "$BC" ]; then
|
|
# Faster, but can't handle AllIsBlack or BlackClears
|
|
GSDEV=-sDEVICE=pksmraw
|
|
else
|
|
# Can't handle different size pages
|
|
GSDEV=-sDEVICE=bitcmyk
|
|
fi
|
|
fi
|
|
|
|
#
|
|
# Figure out USERNAME
|
|
#
|
|
if [ "$LPUSER" != "" ]; then
|
|
USER="$LPUSER@$LPHOST"
|
|
else
|
|
USER=""
|
|
fi
|
|
|
|
#
|
|
# Main Program, just cobble together the pipeline and run it
|
|
#
|
|
# The malarky with file descriptors 1 and 3 is to avoid a bug in
|
|
# (some versions?) of Ghostscript where Postscript's stdout gets
|
|
# intermingled with the printer drivers output, resulting in
|
|
# corrupted image data.
|
|
#
|
|
GS="$GSBIN -q -dBATCH -dSAFER -dQUIET -dNOPAUSE"
|
|
|
|
foo2zjs-pstops $PSTOPS_OPTS | \
|
|
$PREFILTER \
|
|
| ($GS $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPTS \
|
|
-sOutputFile="|cat 1>&3" $GAMMAFILE -_ >/dev/null) 3>&1 \
|
|
| foo2zjs -r$RES -g$DIM -p$PAPER -m$MEDIA -n$COPIES -d$DUPLEX -s$SOURCE \
|
|
-z$MODEL $COLOR $CLIP_UL $CLIP_LR $CLIP_LOG $SAVETONER -T$DENSITY \
|
|
-J "$LPJOB" -U "$USER" \
|
|
$BC $AIB $COLOR2MONO $NOPLANES $EXTRAPAD -D$DEBUG
|
|
|
|
#
|
|
# Log the command line, for debugging and problem reports
|
|
#
|
|
if [ -x /usr/bin/logger ]; then
|
|
logger -t "$BASENAME" -p lpr.info -- \
|
|
"$GSBIN $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPTS $GAMMAFILE"
|
|
logger -t "$BASENAME" -p lpr.info -- \
|
|
"foo2zjs -r$RES -g$DIM -p$PAPER -m$MEDIA \
|
|
-n$COPIES -d$DUPLEX -s$SOURCE -z$MODEL $COLOR $CLIP_UL $CLIP_LR $CLIP_LOG \
|
|
$SAVETONER -T$DENSITY $BC $AIB $COLOR2MONO $NOPLANES $EXTRAPAD"
|
|
fi
|
|
|
|
#
|
|
# Remove cruft
|
|
#
|
|
if [ $DEBUG -eq 0 ]; then
|
|
for i in crd.ps log usecie.ps selcrd.ps
|
|
do
|
|
file="$ICCTMP.$i"
|
|
[ -f $file ] && rm -f $file
|
|
done
|
|
[ -f "$TMPFILE" ] && rm -f $TMPFILE
|
|
fi
|
|
|
|
exit 0
|