[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
gEDA-cvs: CVS update: prolog.ps
User: mike
Date: 06/05/18 08:22:09
Added: . prolog.ps
Log:
Added prolog.ps file.
Revision Changes Path
1.1 eda/geda/devel/libgeda/share/prolog.ps
Index: prolog.ps
===================================================================
% 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
% XXX how to handle multiline text....?
%
% hcenter rjustify vcenter vjustify spacing [(line1) (line2) ... ] rot x y size text -
/stringw 0.0 def
/stringh 0.0 def
/spacing 0.0 def
/fontsize 0.0 def
/strings [ ] def
/stringtxt ( ) def
/stringcount 0 def
/rot 0.0 def
/text {
gsave % save state for later
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 stringwidth 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 show
} {
% 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 {
stringwidth 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
show % render the text
grestore
0 spacing neg rmoveto
} forall
} ifelse
grestore % Restore old state
} bind def
% Define an inch conversion.. XXX - remove me
/inch {72 mul} bind def
/mils {1000 div inch} bind def