% the postscript header we use for our qpsprinter in uncompressed and commented form.+ −
% use the makepsheader perl script to generate a compressed version of this header+ −
% you can then paste into qpsprinter.cpp+ −
%+ −
% some compression of the code is done by the makepsheader script, so we don't need to + −
% write too criptically here. + −
+ −
/BD {bind def} bind def+ −
/d2 {dup dup} BD+ −
/ED {exch def} BD+ −
/D0 {0 ED} BD+ −
+ −
/F {setfont} BD+ −
/RL {rlineto} BD+ −
/CM {currentmatrix} BD+ −
/SM {setmatrix} BD+ −
/TR {translate} BD+ −
/SD {setdash} BD+ −
/SC {aload pop setrgbcolor} BD+ −
/CR {currentfile read pop} BD+ −
/i {index} BD+ −
/scs {setcolorspace} BD+ −
/DB {dict dup begin} BD+ −
/DE {end def} BD+ −
/ie {ifelse} BD+ −
/gs {gsave} BD+ −
/gr {grestore} BD+ −
+ −
% these use PDF syntax+ −
/w {setlinewidth} BD+ −
/d {setdash} BD+ −
/J {setlinecap} BD+ −
/j {setlinejoin} BD+ −
/scn {3 array astore /BCol exch def} BD+ −
/SCN {3 array astore /PCol exch def} BD+ −
/cm {6 array astore concat} BD+ −
+ −
/m {moveto} BD+ −
/l {lineto} BD+ −
/c {curveto} BD+ −
/h {closepath} BD+ −
+ −
/W {clip} BD+ −
/W* {eoclip} BD+ −
/n {newpath} BD+ −
% ENDUNCOMPRESSED: Warning: leave this line in. + −
% Everything before this line will be left untouched by the compression+ −
+ −
/q {gsave 10 dict begin} BD+ −
/Q {end grestore} BD+ −
+ −
% PDF operators+ −
/re { % PDF re operator+ −
4 2 roll % w h x y+ −
moveto % w h+ −
dup % w h h+ −
0 exch rlineto % w h+ −
exch 0 rlineto % h+ −
0 exch neg rlineto+ −
closepath+ −
} bind def+ −
+ −
/S {+ −
gsave+ −
PCol SC stroke+ −
grestore+ −
newpath+ −
} BD+ −
+ −
% PDF text operators+ −
/BT {gsave 10 dict begin /_m matrix currentmatrix def BCol SC} BD+ −
/ET {end grestore} BD+ −
/Tf {+ −
/_fs exch def+ −
findfont+ −
[ _fs 0 0 _fs 0 0 ] + −
makefont+ −
setfont+ −
} BD+ −
/Tm {6 array astore concat} BD+ −
/Td {translate} BD+ −
/Tj {0 0 moveto show} BD+ −
/BDC {pop pop} BD+ −
/EMC {} BD+ −
+ −
% old operators+ −
+ −
/BSt 0 def % brush style+ −
/WFi false def % winding fill+ −
+ −
/BCol [ 1 1 1 ] def % brush color+ −
/PCol [ 0 0 0 ] def % pen color+ −
/BDArr [ % Brush dense patterns+ −
0.94+ −
0.88+ −
0.63+ −
0.50+ −
0.37 + −
0.12 + −
0.06 + −
] def+ −
+ −
% -- level3 true/false+ −
/level3 {+ −
/languagelevel where {+ −
pop+ −
languagelevel 3 ge + −
} { false } ifelse+ −
} bind def+ −
+ −
+ −
%% image drawing routines+ −
+ −
% defines for QCI+ −
/QCIgray D0 /QCIcolor D0 /QCIindex D0+ −
+ −
% this method prints color images if colorimage is available, otherwise+ −
% converts the string to a grayscale image and uses the reular postscript image+ −
% operator for printing.+ −
% Arguments are the same as for the image operator:+ −
% + −
% width height bits/sample matrix datasrc QCI -+ −
/QCI {+ −
/colorimage where {+ −
pop+ −
false 3 colorimage+ −
}{ % the hard way, based on PD code by John Walker <kelvin@autodesk.com>+ −
exec /QCIcolor exch def+ −
/QCIgray QCIcolor length 3 idiv string def+ −
0 1 QCIcolor length 3 idiv 1 sub+ −
{ /QCIindex exch def+ −
/_x QCIindex 3 mul def+ −
QCIgray QCIindex+ −
QCIcolor _x get 0.30 mul+ −
QCIcolor _x 1 add get 0.59 mul+ −
QCIcolor _x 2 add get 0.11 mul+ −
add add cvi+ −
put+ −
} for+ −
QCIgray image+ −
} ifelse+ −
} bind def+ −
+ −
% general image drawing routine, used from the postscript driver+ −
%+ −
% Draws images with and without mask with 1, 8 and 24(rgb) bits depth.+ −
%+ −
% width height matrix image 1|8|24 mask|false x y di+ −
%+ −
% width and height specify the width/height of the image,+ −
% matrix a transformation matrix, image a procedure holding the image data+ −
% (same for mask) and x/y an additional translation.+ −
%+ −
% ### should move the translation into the matrix!!!+ −
/di + −
{+ −
gsave+ −
translate+ −
1 index 1 eq { % bitmap+ −
pop pop % get rid of mask and depth+ −
false 3 1 roll % width height false matrix image+ −
BCol SC+ −
imagemask+ −
} { + −
dup false ne { + −
% have a mask, see if we can use it+ −
level3+ −
} { + −
false + −
} ifelse+ −
+ −
{+ −
% languagelevel3, we can use image mask and dicts+ −
+ −
% store the image mask+ −
/_ma exch def+ −
% select colorspace according to 8|24 bit depth and set the decode array /dc+ −
8 eq {+ −
/_dc [0 1] def+ −
/DeviceGray+ −
} {+ −
/_dc [0 1 0 1 0 1] def+ −
/DeviceRGB+ −
} ifelse+ −
setcolorspace+ −
% the image data+ −
/_im exch def+ −
% transformation matrix+ −
/_mt exch def+ −
% width and height+ −
/_h exch def+ −
/_w exch def+ −
% and the combined image dict+ −
<<+ −
/ImageType 3+ −
% the image dict+ −
/DataDict <<+ −
/ImageType 1+ −
/Width _w+ −
/Height _h+ −
/ImageMatrix _mt+ −
/DataSource _im+ −
/BitsPerComponent 8+ −
/Decode _dc+ −
>> + −
% the mask dictionary+ −
/MaskDict <<+ −
/ImageType 1+ −
/Width _w+ −
/Height _h+ −
/ImageMatrix _mt+ −
/DataSource _ma+ −
/BitsPerComponent 1+ −
/Decode [0 1]+ −
>> + −
/InterleaveType 3+ −
>> + −
image+ −
} {+ −
pop % no mask or can't use it, get rid of it+ −
8 % width height image 8|24 8 matrix+ −
4 1 roll+ −
8 eq { % grayscale+ −
image+ −
} { %color+ −
QCI+ −
} ifelse+ −
} ifelse+ −
} ifelse+ −
grestore + −
} bind def+ −
+ −
+ −
/BF { % brush fill+ −
gsave+ −
BSt 1 eq % solid brush?+ −
{+ −
BCol SC+ −
WFi { fill } { eofill } ifelse+ −
} if+ −
BSt 2 ge BSt 8 le and % dense pattern?+ −
{+ −
BDArr BSt 2 sub get /_sc exch def + −
% the following line scales the brush color according to the pattern. the higher the pattern the lighter the color.+ −
BCol + −
{ + −
1. exch sub _sc mul 1. exch sub + −
} forall + −
3 array astore+ −
SC + −
WFi { fill } { eofill } ifelse+ −
} if+ −
BSt 9 ge BSt 14 le and % brush pattern?+ −
{+ −
WFi { clip } { eoclip } ifelse+ −
pathbbox % left upper right lower+ −
3 index 3 index translate+ −
4 2 roll % right lower left upper+ −
3 2 roll % right left upper lower+ −
exch % left right lower upper+ −
sub /_h exch def+ −
sub /_w exch def+ −
BCol SC+ −
0.3 setlinewidth+ −
newpath+ −
BSt 9 eq BSt 11 eq or % horiz or cross pattern+ −
{ 0 4 _h+ −
{ dup 0 exch moveto _w exch lineto } for+ −
} if+ −
BSt 10 eq BSt 11 eq or % vert or cross pattern+ −
{ 0 4 _w+ −
{ dup 0 moveto _h lineto } for+ −
} if+ −
BSt 12 eq BSt 14 eq or % F-diag or diag cross+ −
{ _w _h gt+ −
{ 0 6 _w _h add+ −
{ dup 0 moveto _h sub _h lineto } for+ −
} { 0 6 _w _h add+ −
{ dup 0 exch moveto _w sub _w exch lineto } for+ −
} ifelse+ −
} if+ −
BSt 13 eq BSt 14 eq or % B-diag or diag cross+ −
{ _w _h gt+ −
{ 0 6 _w _h add+ −
{ dup _h moveto _h sub 0 lineto } for+ −
} { 0 6 _w _h add+ −
{ dup _w exch moveto _w sub 0 exch lineto } for+ −
} ifelse+ −
} if+ −
stroke+ −
} if+ −
BSt 15 eq+ −
{+ −
} if+ −
BSt 24 eq % TexturePattern+ −
{+ −
} if+ −
grestore+ −
} bind def+ −
+ −
% more PDF operators+ −
/f { /WFi true def BF newpath } bind def+ −
/f* { /WFi false def BF newpath } bind def+ −
/B { /WFi true def BF S newpath } bind def+ −
/B* { /WFi false def BF S newpath } bind def+ −
+ −
%% start of page+ −
/QI {+ −
/C save def+ −
pageinit+ −
q+ −
newpath+ −
} bind def+ −
+ −
%% end of page+ −
/QP {+ −
Q % show page+ −
C restore+ −
showpage+ −
} bind def+ −
+ −
% merges one key value pair into the page device dict+ −
%+ −
% key value SPD -+ −
/SPD {+ −
/setpagedevice where {+ −
<< 3 1 roll >>+ −
setpagedevice+ −
} { pop pop } ifelse+ −
} bind def+ −
+ −
+ −
% font handling+ −
+ −
/T1AddMapping { % basefont [glyphname ...] T1AddMapping -+ −
10 dict begin+ −
/glyphs exch def+ −
/fnt exch def+ −
/current fnt /NumGlyphs get def+ −
/CMap fnt /CMap get def+ −
+ −
0 1 glyphs length 1 sub % 0 1 (num glyphs - 1)+ −
{+ −
glyphs exch get /gn exch def+ −
+ −
current dup % glyph_index glyph_index+ −
256 mod /min exch def % glyph_index+ −
256 idiv /maj exch def % -+ −
CMap dup maj get dup % cmap cmap_maj cmap_maj+ −
null eq {+ −
pop 256 array + −
0 1 255 {1 index exch /.notdef put} for+ −
} if+ −
dup % cmap cmap_maj cmap_maj+ −
min gn put % cmap cmap_maj+ −
maj exch put % -+ −
+ −
/current current 1 add def+ −
} for+ −
+ −
fnt /CMap CMap put+ −
fnt /NumGlyphs current put+ −
end + −
} def+ −
+ −
/T1AddGlyphs { % basefont [glyphname charstring ...] T1AddGlyphs -+ −
10 dict begin+ −
/glyphs exch def+ −
/fnt exch def+ −
/current fnt /NumGlyphs get def+ −
/CMap fnt /CMap get def+ −
/CharStrings fnt /CharStrings get def+ −
+ −
0 1 glyphs length 2 idiv 1 sub % 0 1 (num glyphs - 1)+ −
{+ −
2 mul dup+ −
glyphs exch get /gn exch def+ −
1 add+ −
glyphs exch get /cs exch def+ −
+ −
current dup % glyph_index glyph_index+ −
256 mod /min exch def % glyph_index+ −
256 idiv /maj exch def % -+ −
CMap dup maj get dup % cmap cmap_maj cmap_maj+ −
null eq {+ −
pop 256 array + −
0 1 255 {1 index exch /.notdef put} for+ −
} if+ −
dup % cmap cmap_maj cmap_maj+ −
min gn put % cmap cmap_maj+ −
maj exch put % -+ −
+ −
CharStrings gn cs put+ −
/current current 1 add def+ −
} for+ −
+ −
fnt /CharStrings CharStrings put+ −
fnt /CMap CMap put+ −
fnt /NumGlyphs current put+ −
end + −
} def+ −
+ −
+ −
+ −
/StringAdd { % string1 string2 stringadd result+ −
1 index length 1 index length add+ −
string+ −
3 1 roll+ −
2 index 0 3 index putinterval+ −
2 index 2 index length 2 index putinterval + −
pop pop+ −
} def+ −
+ −
+ −
/T1Setup { % fontname T1Setup -+ −
10 dict begin+ −
dup /FontName exch def+ −
(-Base) StringAdd cvx cvn /Font exch def+ −
/MaxPage Font /NumGlyphs get 1 sub 256 idiv def+ −
+ −
/FDepVector MaxPage 1 add array def+ −
/Encoding MaxPage 1 add array def+ −
+ −
0 1 MaxPage {+ −
dup Encoding exch dup put+ −
+ −
+ −
dup /Page exch def+ −
FontName (-) StringAdd + −
exch + −
20 string cvs StringAdd % page fontname+ −
cvn+ −
+ −
Font 0 dict copy dup dup /CMap get + −
Page get + −
/Encoding exch put definefont + −
FDepVector exch Page exch put+ −
} for + −
+ −
FontName cvn <<+ −
/FontType 0+ −
/FMapType 2+ −
/FontMatrix[1 0 0 1 0 0]+ −
/Encoding Encoding+ −
/FDepVector FDepVector+ −
>> definefont pop+ −
end+ −
} def+ −
+ −