diff options
Diffstat (limited to 'src/gui/painting/qpsprinter.ps')
-rw-r--r-- | src/gui/painting/qpsprinter.ps | 449 |
1 files changed, 449 insertions, 0 deletions
diff --git a/src/gui/painting/qpsprinter.ps b/src/gui/painting/qpsprinter.ps new file mode 100644 index 0000000..ef3f429 --- /dev/null +++ b/src/gui/painting/qpsprinter.ps @@ -0,0 +1,449 @@ +% 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 + |