/usr/share/gEDA/prolog.ps is in libgeda-common 1:1.8.2-6.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 | % Prolog for gEDA, define all the functions needed for rendering
% schematics on Postscript devices
% Draw a line from the second coordinate to the first
% x2 y2 x1 y1 width line -
/line {
setlinewidth
% pop off first element and moveto
moveto
% pop off remaining elements and draw a line segment
lineto
% draw it
stroke
} bind def
% Draw a dot
% x y r dot -
/dot {
0 360 arc fill
} bind def
% Draw a dot-dashed line, a bunch of lined segments,
% if the array element only has length two, draw a dot.
% [ [x2 y2 x1 y1] [x4 y4 x3 y3] [x5 y5] ... ] width dashed -
/width 0 def
/dashed {
dup 2.0 div /width exch def
setlinewidth
% pop off each line segment and draw it as a dot or as a line
{
aload length 2 gt
{ moveto lineto stroke}
{ width dot } ifelse
} forall
} bind def
% Draw an arc segment
% x y r ang1 ang2 width darc -
/darc {
setlinewidth
arc stroke
} bind def
% Draw a series of arc segment bits, if the array element only has a single
% element in it, draw a dot.
% [ [sa1 ea1] [sa2 ea2] ... ] x y r width dashedarc -
/x 0 def
/y 0 def
/dashedarc {
dup /width exch def
setlinewidth
/r exch def
/y exch def
/x exch def
{ aload length 1 gt
{
% this element had two angles in it
% extract start and stop angles
x y r % drop x y and r onto stack
% at this point we have: sa ea x y r
% we need x y r sa ea
% so..
5 -2 roll
% and add it to the current path, and draw it
arc stroke
} {
% this element only had one angle in it, place a
% filled dot at the appropriate place
% compute center point of the arc using the angle
% that is on the top of the stack
dup % angle angle
cos r mul x add % angle x
exch % x angle
sin r mul y add % x y
width % x y width/2
dot % draw the dot
} ifelse
} forall
% Now draw it
stroke
} bind def
% Draw a box
% width height x y linethickness box -
/box {
setlinewidth
moveto
exch dup 0 rlineto % w h, h w w 0 -- Draw bottom line
exch 0 exch rlineto % h w, w h 0, w 0 h -- Draw right line
neg 0 rlineto % w, -w 0 -- Draw Top line
closepath % finish and draw it
stroke
} bind def
% Draw a filled box
% width height x y fbox -
/fbox {
moveto
exch dup 0 rlineto
exch 0 exch rlineto
neg 0 rlineto
closepath
fill
} bind def
% Font reincoding utilities
% ISOLatin1Encoding, extended with remaining uncoded glyphs
/ISOLatin1Extended [
/.notdef /Lslash /lslash /OE /oe /Scaron /scaron /Zcaron /zcaron
/Ydieresis /trademark /bullet /dagger /daggerdbl /ellipsis /emdash
/endash /fi /fl /florin /fraction /guilsinglleft /guilsinglright
/perthousand /quotedblbase /quotedblleft /quotedblright
/quotesinglbase /quotesingle /.notdef /.notdef /.notdef /space
/exclam /quotedbl /numbersign /dollar /percent /ampersand
/quoteright /parenleft /parenright /asterisk /plus /comma /minus
/period /slash /zero /one /two /three /four /five /six /seven /eight
/nine /colon /semicolon /less /equal /greater /question /at /A /B /C
/D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z
/bracketleft /backslash /bracketright /asciicircum /underscore
/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s
/t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /dotlessi /grave /acute /circumflex
/tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla
/.notdef /hungarumlaut /ogonek /caron /space /exclamdown /cent
/sterling /currency /yen /brokenbar /section /dieresis /copyright
/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron
/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph
/periodcentered /cedilla /onesuperior /ordmasculine /guillemotright
/onequarter /onehalf /threequarters /questiondown /Agrave /Aacute
/Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute
/Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth
/Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn
/germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring
/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave
/iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute
/ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute
/ucircumflex /udieresis /yacute /thorn /ydieresis
] def
% `new-font-name' `encoding-vector' `old-font-name' RE -
/RE {
findfont
dup maxlength dict begin {
1 index /FID ne { def } { pop pop } ifelse
} forall
/Encoding exch def
dup /FontName exch def
currentdict end definefont pop
} bind def
% Text handling functions, select the font and scale it, then we need
% only to apply the appropriate transformations to get the text
% justified into the right spots. The bad thing here is that we don't
% do any kerning, so the output may look a bit strange.
% compute the height of one character and return lly and ury
% (char) charheight lly ury
/charheight {
gsave % push graphics state
newpath % clear current path
0 0 moveto % Set current point
false charpath % get path
flattenpath % flatten path
pathbbox % stack = llx lly urx ury
exch pop % stack = llx lly ury
3 -1 roll pop % stack = lly ury
grestore % pop graphics state
} bind def
% compute the height of a string, one character at a time
% (string) stringheight lly ury
/lly 0.0 def
/ury 0.0 def
/stringheight {
/lly 0.0 def % initial value of heightmin
/ury 0.0 def % initial value of heightmax
{ % work through string
( ) dup 0 4 -1 roll put % create one character string
charheight % measure it's height
dup ury gt { % if ury gt heightmax
/ury exch def % update with new value
} {
pop % else discard ury
} ifelse
dup lly lt { % if lly lt heightmin
/lly exch def % update with new value
} {
pop % else discard lly
} ifelse
} forall
lly ury % Return the results
} bind def
% calculate the string width taking into account the escapes.
/mystrx 0.0 def
/mystry 0.0 def
/mystresc false def
/mystringwidth {
/mystrx 0.0 def
/mystry 0.0 def
/mystresc false def
{ % work through string
% did we process the escape character last?
mystresc {
% last character was escape
% handle the escape
% is it an _ = 95?
dup 95 eq {
pop % we don't need the character anymore
% toggle drawing overbars
0.0 0.0 % make it like it never happened...
} {
% otherwise measure the character
(\\ ) dup 1 4 -1 roll put % count a \ and the character
stringwidth
} ifelse
% and reset the flag
/mystresc false def
} {
% last character was not escape
% is this escape
dup 92 eq {
% yes, escape character, set flag
/mystresc true def
pop % drop character
0.0 0.0 % make like this character has no width and height
} {
( ) dup 0 4 -1 roll put % create one character string
stringwidth % measure it's height/width
} ifelse
} ifelse
% accumulate x and y movements
mystry add /mystry exch def
mystrx add /mystrx exch def
} forall
mystrx mystry % drop results on stack
} bind def
% Render a string with overbars
%
/escaped false def
/drawoverbar false def
/fontsize 0.0 def
%string1 string2 append -
/append {
2 copy length exch length add % find new length
string dup % string1 string2 string string
4 2 roll % string string string1 string2
2 index 0 3 index
% string string string1 string2 string 0 string1
putinterval % string string string1 string2
exch length exch putinterval
} bind def
% If drawoverbar is set, draw a line of the same length as the given string
% string overbarshowline -
/overbarshowline {
% print overbar if necessary
stringwidth pop 0
drawoverbar {
rlineto
gsave stroke grestore
} {
rmoveto
} ifelse
} bind def
% Draws overbars for the given string, then shows the string itself
% string overbarshow
/overbarshow {
/overbarshowacc () def
/overbarshowtxt () def
gsave
fontsize 10.0 div setlinewidth
0 fontsize rmoveto % move to (0,overbarheight)
{ % work through string
escaped {
% the last character was the escape
% handle the escape
% is it an _ = 95?
dup 95 eq {
pop % we don't need the character anymore
overbarshowacc overbarshowline
% toggle drawing overbars
/drawoverbar drawoverbar not def
% Append the contents off the accumulator to the text
% string we're eventually going to show
/overbarshowtxt overbarshowtxt overbarshowacc append def
% clear accumulator
/overbarshowacc () def
} {
% add to accumulator
(\\ ) dup 1 4 -1 roll put
overbarshowacc exch append
/overbarshowacc exch def
} ifelse
% and reset the flag
/escaped false def
} {
% check for escape character \ = 92
dup 92 eq {
% yes, escape character, set flag
/escaped true def
pop % drop character
} {
% add to accumulator
( ) dup 0 4 -1 roll put
overbarshowacc exch append
/overbarshowacc exch def
} ifelse
} ifelse
} forall
% Catch any leftovers
overbarshowacc overbarshowline
overbarshowtxt overbarshowacc append
grestore
show
} bind def
%
% hcenter rjustify vcenter vjustify spacing [(line1) (line2) ... ] rot x y size text -
/stringw 0.0 def
/stringh 0.0 def
/spacing 0.0 def
/strings [ ] def
/stringtxt ( ) def
/stringcount 0 def
/rot 0.0 def
/text {
gsave % save state for later
/drawoverbar false def % start by not drawing overbars
dup /fontsize exch def % save font size for corrections later
% do font selection
/gEDAFont findfont
exch scalefont
setfont
% set up coordinates
translate % move origin to given point
rotate % rotate so that text is drawn
0 0 moveto
dup length /stringcount exch def % Get number of strings
/strings exch def % save strings
/spacing exch def
% do we have more than 1 string to render?
stringcount 1 eq {
/stringtxt strings aload pop def % get the string
/stringw stringtxt mystringwidth pop neg def % get the -width
/stringh stringtxt stringheight exch pop neg def% get the -height
% First do vertical calculations
% hcenter rjustify vcenter vjustify
% vertical justification
{ 0 stringh rmoveto } if
% vertical center
{ 0 stringh 0.3571425 mul rmoveto } if % not 0.5, so that
% it looks nicer
% Then do horizontal calculations
% right justify
{ stringw 0 rmoveto } if
% center
{ stringw 2.0 div 0 rmoveto } if
% Draw the text
stringtxt overbarshow
} {
% More than one line, compute bounding box for the text
% vertical height, don't use the actual hieght of the characters
% assume that the user wants to make the baselines line up with two
% text boxes placed side by side
/stringh stringcount spacing mul neg def
% Now figure out horizontal size, this amounts to keeping track
% of the longest string
/stringw 0.0 def
strings {
mystringwidth pop
dup stringw gt {
/stringw exch def
} {
pop
} ifelse
} forall
/stringw stringw neg def % get the -width
% First do vertical calculations
% hcenter rjustify vcenter vjustify
% vertical justification
{ 0 stringh fontsize add rmoveto } if
% vertical center
{ 0 stringh 0.5 mul rmoveto } if
% Then do horizontal calculations
% right justify
{ stringw 0 rmoveto } if
% center
{ stringw 2.0 div 0 rmoveto } if
% now move up to the first line and begin rendering
0 stringcount 1 sub spacing mul rmoveto
strings {
gsave % Save starting point
overbarshow % render the text
grestore
0 spacing neg rmoveto
} forall
} ifelse
grestore % Restore old state
} bind def
|