Replace 'i < len-1 && func(i+1)' by 'i+1 < len && func(i+1)'
[profile/ivi/qtbase.git] / src / gui / painting / qpsprinter.ps
1 % the postscript header we use for our qpsprinter in uncompressed and commented form.
2 % use the makepsheader perl script to generate a compressed version of this header
3 % you can then paste into qpsprinter.cpp
4 %
5 % some compression of the code is done by the makepsheader script, so we don't need to 
6 % write too criptically here. 
7
8 /BD  {bind def} bind def
9 /d2 {dup dup} BD
10 /ED {exch def} BD
11 /D0 {0 ED} BD
12
13 /F  {setfont} BD
14 /RL {rlineto} BD
15 /CM {currentmatrix} BD
16 /SM {setmatrix} BD
17 /TR {translate} BD
18 /SD {setdash} BD
19 /SC {aload pop setrgbcolor} BD
20 /CR {currentfile read pop} BD
21 /i  {index} BD
22 /scs {setcolorspace} BD
23 /DB {dict dup begin} BD
24 /DE {end def} BD
25 /ie {ifelse} BD
26 /gs {gsave} BD
27 /gr {grestore} BD
28
29 % these use PDF syntax
30 /w {setlinewidth} BD
31 /d {setdash} BD
32 /J {setlinecap} BD
33 /j {setlinejoin} BD
34 /scn {3 array astore /BCol exch def} BD
35 /SCN {3 array astore /PCol exch def} BD
36 /cm {6 array astore concat} BD
37
38 /m  {moveto} BD
39 /l  {lineto} BD
40 /c  {curveto} BD
41 /h  {closepath} BD
42
43 /W  {clip} BD
44 /W* {eoclip} BD
45 /n {newpath} BD
46 % ENDUNCOMPRESSED: Warning: leave this line in. 
47 % Everything before this line will be left untouched by the compression
48
49 /q  {gsave 10 dict begin} BD
50 /Q  {end grestore} BD
51
52 % PDF operators
53 /re { % PDF re operator
54   4 2 roll  % w h x y
55   moveto % w h
56   dup % w h h
57   0 exch rlineto % w h
58   exch 0 rlineto % h
59   0 exch neg rlineto
60   closepath
61 } bind def
62
63 /S {
64   gsave
65     PCol SC stroke
66   grestore
67   newpath
68 } BD
69
70 % PDF text operators
71 /BT {gsave 10 dict begin /_m matrix currentmatrix def BCol SC} BD
72 /ET {end grestore} BD
73 /Tf {
74   /_fs exch def
75   findfont
76   [ _fs 0 0 _fs 0 0 ]  
77   makefont
78   setfont
79 } BD
80 /Tm {6 array astore concat} BD
81 /Td {translate} BD
82 /Tj {0 0 moveto show} BD
83 /BDC {pop pop} BD
84 /EMC {} BD
85
86 % old operators
87
88 /BSt 0 def                             % brush style
89 /WFi false def                 % winding fill
90
91 /BCol  [ 1 1 1 ] def                   % brush color
92 /PCol  [ 0 0 0 ] def                   % pen color
93 /BDArr [                             % Brush dense patterns
94   0.94
95   0.88
96   0.63
97   0.50
98   0.37 
99   0.12 
100   0.06 
101 ] def
102
103 % -- level3 true/false
104 /level3 {
105   /languagelevel where {
106     pop
107     languagelevel 3 ge 
108   } { false } ifelse
109 } bind def
110
111
112 %% image drawing routines
113
114 % defines for QCI
115 /QCIgray D0 /QCIcolor D0 /QCIindex D0
116
117 % this method prints color images if colorimage is available, otherwise
118 % converts the string to a grayscale image and uses the reular postscript image
119 % operator for printing.
120 % Arguments are the same as for the image operator:
121
122 %     width height bits/sample matrix datasrc QCI -
123 /QCI {
124   /colorimage where {
125     pop
126     false 3 colorimage
127   }{  % the hard way, based on PD code by John Walker <kelvin@autodesk.com>
128     exec /QCIcolor exch def
129     /QCIgray QCIcolor length 3 idiv string def
130     0 1 QCIcolor length 3 idiv 1 sub
131     { /QCIindex exch def
132       /_x QCIindex 3 mul def
133       QCIgray QCIindex
134       QCIcolor _x       get 0.30 mul
135       QCIcolor _x 1 add get 0.59 mul
136       QCIcolor _x 2 add get 0.11 mul
137       add add cvi
138       put
139     } for
140     QCIgray image
141   } ifelse
142 } bind def
143
144 % general image drawing routine, used from the postscript driver
145 %
146 % Draws images with and without mask with 1, 8 and 24(rgb) bits depth.
147 %
148 %     width height matrix image 1|8|24 mask|false x y di
149 %
150 % width and height specify the width/height of the image,
151 % matrix a transformation matrix, image a procedure holding the image data
152 % (same for mask) and x/y an additional translation.
153 %
154 % ### should move the translation into the matrix!!!
155 /di 
156 {
157   gsave
158     translate
159     1 index 1 eq { % bitmap
160       pop pop % get rid of mask and depth
161       false 3 1 roll % width height false matrix image
162       BCol SC
163       imagemask
164     } { 
165       dup false ne { 
166         % have a mask, see if we can use it
167         level3
168       } { 
169         false 
170       } ifelse
171
172       {
173         % languagelevel3, we can use image mask and dicts
174
175         % store the image mask
176         /_ma exch def
177         % select colorspace according to 8|24 bit depth and set the decode array /dc
178         8 eq {
179           /_dc [0 1] def
180           /DeviceGray
181         } {
182           /_dc [0 1 0 1 0 1] def
183           /DeviceRGB
184         } ifelse
185         setcolorspace
186         % the image data
187         /_im exch def
188         % transformation matrix
189         /_mt exch def
190         % width and height
191         /_h exch def
192         /_w exch def
193         % and the combined image dict
194         <<
195           /ImageType 3
196           % the image dict
197           /DataDict <<
198               /ImageType 1
199               /Width _w
200               /Height _h
201               /ImageMatrix _mt
202               /DataSource _im
203               /BitsPerComponent 8
204               /Decode _dc
205           >> 
206           % the mask dictionary
207           /MaskDict <<
208              /ImageType 1
209              /Width _w
210              /Height _h
211              /ImageMatrix _mt
212              /DataSource _ma
213              /BitsPerComponent 1
214              /Decode [0 1]
215           >> 
216           /InterleaveType 3
217         >> 
218         image
219       } {
220         pop % no mask or can't use it, get rid of it
221         8 % width height image 8|24 8 matrix
222         4 1 roll
223         8 eq { % grayscale
224           image
225         } { %color
226           QCI
227         } ifelse
228       } ifelse
229     } ifelse
230   grestore    
231 } bind def
232
233
234 /BF {                                % brush fill
235   gsave
236     BSt 1 eq                          % solid brush?
237     {
238       BCol SC
239       WFi { fill } { eofill } ifelse
240     } if
241     BSt 2 ge BSt 8 le and             % dense pattern?
242     {
243       BDArr BSt 2 sub get /_sc exch def 
244       % the following line scales the brush color according to the pattern. the higher the pattern the lighter the color.
245       BCol 
246       { 
247         1. exch sub _sc mul 1. exch sub 
248       } forall 
249       3 array astore
250       SC 
251       WFi { fill } { eofill } ifelse
252     } if
253     BSt 9 ge BSt 14 le and            % brush pattern?
254     {
255       WFi { clip } { eoclip } ifelse
256       pathbbox                        % left upper right lower
257       3 index 3 index translate
258       4 2 roll                        % right lower left upper
259       3 2 roll                        % right left upper lower
260       exch                            % left right lower upper
261       sub /_h exch def
262       sub /_w exch def
263       BCol SC
264       0.3 setlinewidth
265       newpath
266       BSt 9 eq BSt 11 eq or           % horiz or cross pattern
267       { 0 4 _h
268         { dup 0 exch moveto _w exch lineto } for
269       } if
270       BSt 10 eq BSt 11 eq or          % vert or cross pattern
271       { 0 4 _w
272         { dup 0 moveto _h lineto } for
273       } if
274       BSt 12 eq BSt 14 eq or          % F-diag or diag cross
275       { _w _h gt
276         { 0 6 _w _h add
277           { dup 0 moveto _h sub _h lineto } for
278         } { 0 6 _w _h add
279           { dup 0 exch moveto _w sub _w exch lineto } for
280         } ifelse
281       } if
282       BSt 13 eq BSt 14 eq or          % B-diag or diag cross
283       { _w _h gt
284         { 0 6 _w _h add
285           { dup _h moveto _h sub 0 lineto } for
286         } { 0 6 _w _h add
287           { dup _w exch moveto _w sub 0 exch lineto } for
288         } ifelse
289       } if
290       stroke
291     } if
292     BSt 15 eq
293     {
294     } if
295     BSt 24 eq                         % TexturePattern
296     {
297     } if
298   grestore
299 } bind def
300
301 % more PDF operators
302 /f { /WFi true def BF newpath } bind def
303 /f* { /WFi false def BF newpath } bind def
304 /B { /WFi true def BF S newpath } bind def
305 /B* { /WFi false def BF S newpath } bind def
306
307 %% start of page
308 /QI {
309   /C save def
310   pageinit
311   q
312   newpath
313 } bind def
314
315 %% end of page
316 /QP {
317   Q                                % show page
318   C restore
319   showpage
320 } bind def
321
322 % merges one key value pair into the page device dict
323 %
324 %    key value SPD -
325 /SPD {
326   /setpagedevice where {
327     << 3 1 roll >>
328     setpagedevice
329   } { pop pop } ifelse
330 } bind def
331
332
333 % font handling
334
335 /T1AddMapping { % basefont [glyphname ...] T1AddMapping -
336   10 dict begin
337     /glyphs exch def
338     /fnt exch def
339     /current fnt /NumGlyphs get def
340     /CMap fnt /CMap get def
341
342     0 1 glyphs length 1 sub % 0 1 (num glyphs - 1)
343     {
344       glyphs exch get /gn exch def
345
346       current dup                                 % glyph_index glyph_index
347       256 mod /min exch def                       % glyph_index
348       256 idiv /maj exch def                      % -
349       CMap dup maj get dup                        % cmap cmap_maj cmap_maj
350       null eq {
351         pop 256 array 
352         0 1 255 {1 index exch /.notdef put} for
353       } if
354       dup                                         % cmap cmap_maj cmap_maj
355       min gn put                                  % cmap cmap_maj
356       maj exch put                                % -
357
358       /current current 1 add def
359     } for
360
361     fnt /CMap CMap put
362     fnt /NumGlyphs current put
363   end 
364 } def
365
366 /T1AddGlyphs { % basefont [glyphname charstring ...] T1AddGlyphs -
367   10 dict begin
368     /glyphs exch def
369     /fnt exch def
370     /current fnt /NumGlyphs get def
371     /CMap fnt /CMap get def
372     /CharStrings fnt /CharStrings get def
373
374     0 1 glyphs length 2 idiv 1 sub % 0 1 (num glyphs - 1)
375     {
376       2 mul dup
377       glyphs exch get /gn exch def
378       1 add
379       glyphs exch get /cs exch def
380
381       current dup                                 % glyph_index glyph_index
382       256 mod /min exch def                       % glyph_index
383       256 idiv /maj exch def                      % -
384       CMap dup maj get dup                        % cmap cmap_maj cmap_maj
385       null eq {
386         pop 256 array 
387         0 1 255 {1 index exch /.notdef put} for
388       } if
389       dup                                         % cmap cmap_maj cmap_maj
390       min gn put                                  % cmap cmap_maj
391       maj exch put                                % -
392
393       CharStrings gn cs put
394       /current current 1 add def
395     } for
396
397     fnt /CharStrings CharStrings put
398     fnt /CMap CMap put
399     fnt /NumGlyphs current put
400   end 
401 } def
402
403
404
405 /StringAdd { % string1 string2 stringadd result
406   1 index length 1 index length add
407   string
408   3 1 roll
409   2 index 0 3 index putinterval
410   2 index 2 index length 2 index putinterval 
411   pop pop
412 } def
413
414
415 /T1Setup { % fontname T1Setup -
416 10 dict begin
417   dup /FontName exch def
418   (-Base) StringAdd cvx cvn /Font exch def
419   /MaxPage Font /NumGlyphs get 1 sub 256 idiv def
420
421   /FDepVector MaxPage 1 add array def
422   /Encoding MaxPage 1 add array def
423
424   0 1 MaxPage {
425     dup Encoding exch dup put
426  
427
428     dup /Page exch def
429     FontName (-) StringAdd 
430     exch 
431     20 string cvs StringAdd % page fontname
432     cvn
433
434     Font 0 dict copy dup dup /CMap get 
435     Page get 
436     /Encoding exch put definefont 
437     FDepVector exch Page exch put
438   } for 
439
440   FontName cvn <<
441     /FontType 0
442     /FMapType 2
443     /FontMatrix[1 0 0 1 0 0]
444     /Encoding Encoding
445     /FDepVector FDepVector
446     >> definefont pop
447   end
448 } def
449