pic: use troff drawing commands for filling objects
[troff.git] / home / ps / baseline.ps
blob470047c9aaddc997bc4f70098494d0f4acb488b4
2 % Stuff used to draw or set text along a baseline specified by parametric equations
3 % for x and y.
6 /left -1 def
7 /center 0 def
8 /right 1 def
10 /baselinedict 50 dict def
12 /newbaseline {
13         baselinedict begin
14                 /g' exch bind def
15                 /f' exch bind def
16                 /g  exch bind def
17                 /f  exch bind def
19                 counttomark 2 eq {/hoffset exch def} if
20                 /res exch def
22                 /t 0 def
23                 /s 0 def
24                 /voffset false def
25                 cleartomark
26         end
27 } bind def
29 /drawfunnytext {
30         baselinedict begin
31                 /t exch def
32                 /mode exch def
33                 /str exch def
35                 mode left eq {
36                         /leftstring emptystring def
37                         /rightstring str def
38                 } if
40                 mode right eq {
41                         /leftstring str reversestring def
42                         /rightstring emptystring def
43                 } if
45                 mode center eq {
46                         str splitstring
47                         /rightstring exch def
48                         /leftstring exch reversestring def
49                 } if
51                 gsave currentpoint translate leftstring left t baselineshow grestore
52                 gsave currentpoint translate rightstring right t baselineshow grestore
54                 /t 0 def
55                 /s 0 def
56                 /voffset false def
57                 cleartomark
58         end
59 } bind def
61 /setfunnytext {
62         baselinedict begin
63                 /vpos exch def
64                 /hpos exch def
65                 /str  exch def
67                 voffset vpos ne {
68                         /voffset vpos def
69                         /t 0 def
70                         /s hoffset def
71                 } if
73                 gsave
74                         hoffset voffset translate
75                         0 0 moveto
76                         /ds hpos s sub def
77                         /dt ds t f' dup mul t g' dup mul add sqrt res mul div def
78                         /s s ds add def
79                         /t t dt add def
80                         str right t baselineshow
81                 grestore
82         end
83 } bind def
85 baselinedict begin
87 /f  {} bind def
88 /g  {pop 0} bind def
89 /f' {pop 1} bind def
90 /g' {pop 0} bind def
92 /s 0 def
93 /t 0 def
94 /res 72 def
96 /onecharstring ( ) def
97 /emptystring () def
99 /baselineshow {
100         /t exch def
101         /mode exch def
102         /str exch def
104         gsave
105                 t f res mul t g res mul translate
106                 0 0 moveto
107                 t g' t f' atan rotate
108                 {
109                         mode right eq {pop} if
110                         grestore gsave
111                         onecharstring 0 3 -1 roll put onecharstring stringwidth pop
112                         /ds exch mode mul def
113                         /dt ds t f' dup mul t g' dup mul add sqrt res mul div def
114                         /t t dt add def
115                         /s s ds add def
116                         t f res mul t g res mul translate
117                         0 0 moveto
118                         t g' t f' atan rotate
119                         mode left eq {pop} if
120                 } str kshow
121         grestore
122 } bind def
124 /reversestring {
125         /str1 exch def
127         /str2 str1 length string def
128         /i 0 def
129         /n str1 length 1 sub def
131         {
132                 str1 n get str2 exch i exch put
133                 /i i 1 add def
134                 /n n 1 sub def
135                 n 0 lt {exit} if
136         } loop
137         str2
138 } bind def
140 /splitstring {
141         /str1 exch def
143         /len str1 stringwidth pop def
144         /s 0 def
145         /n 0 def
146         str1 length {
147                 str1 n get onecharstring exch 0 exch put
148                 /s onecharstring stringwidth pop s add def
149                 s len 2 div ge {exit} if
150                 /n n 1 add def
151         } repeat
152         str1 0 n 1 add getinterval
153         str1 n str1 length n sub getinterval
154 } bind def