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 337