mirror of
https://bitbucket.org/smil3y/katie.git
synced 2025-02-26 11:52:57 +00:00
450 lines
10 KiB
PostScript
450 lines
10 KiB
PostScript
![]() |
% 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
|
||
|
|