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