Import GNU Enscript version 1.6.4
[enscript.git] / lib / enscript.pro
1 %
2 % PostScript prolog.
3 % Copyright (c) 1995-1998 Markku Rossi.
4 %
5 % Author: Markku Rossi <mtr@iki.fi>
6 %
7 %
8 % This file is part of GNU enscript.
9 %
10 % This program is free software; you can redistribute it and/or modify
11 % it under the terms of the GNU General Public License as published by
12 % the Free Software Foundation; either version 2, or (at your option)
13 % any later version.
14 %
15 % This program is distributed in the hope that it will be useful,
16 % but WITHOUT ANY WARRANTY; without even the implied warranty of
17 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 % GNU General Public License for more details.
19 %
20 % You should have received a copy of the GNU General Public License
21 % along with this program; see the file COPYING.  If not, write to
22 % the Free Software Foundation, 59 Temple Place - Suite 330,
23 % Boston, MA 02111-1307, USA.
24 %
25
26 % -- code follows this line --
27 %
28 % Procedures.
29 %
30
31 /_S {   % save current state
32   /_s save def
33 } def
34 /_R {   % restore from saved state
35   _s restore
36 } def
37
38 /S {    % showpage protecting gstate
39   gsave
40   showpage
41   grestore
42 } bind def
43
44 /MF {   % fontname newfontname -> -     make a new encoded font
45   /newfontname exch def
46   /fontname exch def
47
48   /fontdict fontname findfont def
49   /newfont fontdict maxlength dict def
50
51   fontdict {
52     exch
53     dup /FID eq {
54       % skip FID pair
55       pop pop
56     } {
57       % copy to the new font dictionary
58       exch newfont 3 1 roll put
59     } ifelse
60   } forall
61
62   newfont /FontName newfontname put
63
64   % insert only valid encoding vectors
65   encoding_vector length 256 eq {
66     newfont /Encoding encoding_vector put
67   } if
68
69   newfontname newfont definefont pop
70 } def
71
72 /MF_PS { % fontname newfontname -> -    make a new font preserving its enc
73   /newfontname exch def
74   /fontname exch def
75
76   /fontdict fontname findfont def
77   /newfont fontdict maxlength dict def
78
79   fontdict {
80     exch
81     dup /FID eq {
82       % skip FID pair
83       pop pop
84     } {
85       % copy to the new font dictionary
86       exch newfont 3 1 roll put
87     } ifelse
88   } forall
89
90   newfont /FontName newfontname put
91
92   newfontname newfont definefont pop
93 } def
94
95 /SF { % fontname width height -> -      set a new font
96   /height exch def
97   /width exch def
98
99   findfont
100   [width 0 0 height 0 0] makefont setfont
101 } def
102
103 /SUF { % fontname width height -> -     set a new user font
104   /height exch def
105   /width exch def
106
107   /F-gs-user-font MF
108   /F-gs-user-font width height SF
109 } def
110
111 /SUF_PS { % fontname width height -> -  set a new user font preserving its enc
112   /height exch def
113   /width exch def
114
115   /F-gs-user-font MF_PS
116   /F-gs-user-font width height SF
117 } def
118
119 /M {moveto} bind def
120 /s {show} bind def
121
122 /Box {  % x y w h -> -                  define box path
123   /d_h exch def /d_w exch def /d_y exch def /d_x exch def
124   d_x d_y  moveto
125   d_w 0 rlineto
126   0 d_h rlineto
127   d_w neg 0 rlineto
128   closepath
129 } def
130
131 /bgs {  % x y height blskip gray str -> -       show string with bg color
132   /str exch def
133   /gray exch def
134   /blskip exch def
135   /height exch def
136   /y exch def
137   /x exch def
138
139   gsave
140     x y blskip sub str stringwidth pop height Box
141     gray setgray
142     fill
143   grestore
144   x y M str s
145 } def
146
147 /bgcs { % x y height blskip red green blue str -> -  show string with bg color
148   /str exch def
149   /blue exch def
150   /green exch def
151   /red exch def
152   /blskip exch def
153   /height exch def
154   /y exch def
155   /x exch def
156
157   gsave
158     x y blskip sub str stringwidth pop height Box
159     red green blue setrgbcolor
160     fill
161   grestore
162   x y M str s
163 } def
164
165 % Highlight bars.
166 /highlight_bars {       % nlines lineheight output_y_margin gray -> -
167   gsave
168     setgray
169     /ymarg exch def
170     /lineheight exch def
171     /nlines exch def
172
173     % This 2 is just a magic number to sync highlight lines to text.
174     0 d_header_y ymarg sub 2 sub translate
175
176     /cw d_output_w cols div def
177     /nrows d_output_h ymarg 2 mul sub lineheight div cvi def
178
179     % for each column
180     0 1 cols 1 sub {
181       cw mul /xp exch def
182
183       % for each rows
184       0 1 nrows 1 sub {
185         /rn exch def
186         rn lineheight mul neg /yp exch def
187         rn nlines idiv 2 mod 0 eq {
188           % Draw highlight bar.  4 is just a magic indentation.
189           xp 4 add yp cw 8 sub lineheight neg Box fill
190         } if
191       } for
192     } for
193
194   grestore
195 } def
196
197 % Line highlight bar.
198 /line_highlight {       % x y width height gray -> -
199   gsave
200     /gray exch def
201     Box gray setgray fill
202   grestore
203 } def
204
205 % Column separator lines.
206 /column_lines {
207   gsave
208     .1 setlinewidth
209     0 d_footer_h translate
210     /cw d_output_w cols div def
211     1 1 cols 1 sub {
212       cw mul 0 moveto
213       0 d_output_h rlineto stroke
214     } for
215   grestore
216 } def
217
218 % Column borders.
219 /column_borders {
220   gsave
221     .1 setlinewidth
222     0 d_footer_h moveto
223     0 d_output_h rlineto
224     d_output_w 0 rlineto
225     0 d_output_h neg rlineto
226     closepath stroke
227   grestore
228 } def
229
230 % Do the actual underlay drawing
231 /draw_underlay {
232   ul_style 0 eq {
233     ul_str true charpath stroke
234   } {
235     ul_str show
236   } ifelse
237 } def
238
239 % Underlay
240 /underlay {     % - -> -
241   gsave
242     0 d_page_h translate
243     d_page_h neg d_page_w atan rotate
244
245     ul_gray setgray
246     ul_font setfont
247     /dw d_page_h dup mul d_page_w dup mul add sqrt def
248     ul_str stringwidth pop dw exch sub 2 div ul_h_ptsize -2 div moveto
249     draw_underlay
250   grestore
251 } def
252
253 /user_underlay {        % - -> -
254   gsave
255     ul_x ul_y translate
256     ul_angle rotate
257     ul_gray setgray
258     ul_font setfont
259     0 0 ul_h_ptsize 2 div sub moveto
260     draw_underlay
261   grestore
262 } def
263
264 % Page prefeed
265 /page_prefeed {         % bool -> -
266   statusdict /prefeed known {
267     statusdict exch /prefeed exch put
268   } {
269     pop
270   } ifelse
271 } def
272
273 % Wrapped line markers
274 /wrapped_line_mark {    % x y charwith charheight type -> -
275   /type exch def
276   /h exch def
277   /w exch def
278   /y exch def
279   /x exch def
280
281   type 2 eq {
282     % Black boxes (like TeX does)
283     gsave
284       0 setlinewidth
285       x w 4 div add y M
286       0 h rlineto w 2 div 0 rlineto 0 h neg rlineto
287       closepath fill
288     grestore
289   } {
290     type 3 eq {
291       % Small arrows
292       gsave
293         .2 setlinewidth
294         x w 2 div add y h 2 div add M
295         w 4 div 0 rlineto
296         x w 4 div add y lineto stroke
297
298         x w 4 div add w 8 div add y h 4 div add M
299         x w 4 div add y lineto
300         w 4 div h 8 div rlineto stroke
301       grestore
302     } {
303       % do nothing
304     } ifelse
305   } ifelse
306 } def
307
308 % EPSF import.
309
310 /BeginEPSF {
311   /b4_Inc_state save def                % Save state for cleanup
312   /dict_count countdictstack def        % Count objects on dict stack
313   /op_count count 1 sub def             % Count objects on operand stack
314   userdict begin
315   /showpage { } def
316   0 setgray 0 setlinecap
317   1 setlinewidth 0 setlinejoin
318   10 setmiterlimit [ ] 0 setdash newpath
319   /languagelevel where {
320     pop languagelevel
321     1 ne {
322       false setstrokeadjust false setoverprint
323     } if
324   } if
325 } bind def
326
327 /EndEPSF {
328   count op_count sub { pos } repeat     % Clean up stacks
329   countdictstack dict_count sub { end } repeat
330   b4_Inc_state restore
331 } bind def
332
333 % Check PostScript language level.
334 /languagelevel where {
335   pop /gs_languagelevel languagelevel def
336 } {
337   /gs_languagelevel 1 def
338 } ifelse