Blob


1 %
2 % Stuff used to draw or set text along a baseline specified by parametric equations
3 % for x and y.
4 %
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
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
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
156 end