% | |
% Stuff used to draw or set text along a baseline specified by parametric equations | |
% for x and y. | |
% | |
/left -1 def | |
/center 0 def | |
/right 1 def | |
/baselinedict 50 dict def | |
/newbaseline { | |
baselinedict begin | |
/g' exch bind def | |
/f' exch bind def | |
/g exch bind def | |
/f exch bind def | |
counttomark 2 eq {/hoffset exch def} if | |
/res exch def | |
/t 0 def | |
/s 0 def | |
/voffset false def | |
cleartomark | |
end | |
} bind def | |
/drawfunnytext { | |
baselinedict begin | |
/t exch def | |
/mode exch def | |
/str exch def | |
mode left eq { | |
/leftstring emptystring def | |
/rightstring str def | |
} if | |
mode right eq { | |
/leftstring str reversestring def | |
/rightstring emptystring def | |
} if | |
mode center eq { | |
str splitstring | |
/rightstring exch def | |
/leftstring exch reversestring def | |
} if | |
gsave currentpoint translate leftstring left t baselineshow grestore | |
gsave currentpoint translate rightstring right t baselineshow grestore | |
/t 0 def | |
/s 0 def | |
/voffset false def | |
cleartomark | |
end | |
} bind def | |
/setfunnytext { | |
baselinedict begin | |
/vpos exch def | |
/hpos exch def | |
/str exch def | |
voffset vpos ne { | |
/voffset vpos def | |
/t 0 def | |
/s hoffset def | |
} if | |
gsave | |
hoffset voffset translate | |
0 0 moveto | |
/ds hpos s sub def | |
/dt ds t f' dup mul t g' dup mul add sqrt res mul div def | |
/s s ds add def | |
/t t dt add def | |
str right t baselineshow | |
grestore | |
end | |
} bind def | |
baselinedict begin | |
/f {} bind def | |
/g {pop 0} bind def | |
/f' {pop 1} bind def | |
/g' {pop 0} bind def | |
/s 0 def | |
/t 0 def | |
/res 72 def | |
/onecharstring ( ) def | |
/emptystring () def | |
/baselineshow { | |
/t exch def | |
/mode exch def | |
/str exch def | |
gsave | |
t f res mul t g res mul translate | |
0 0 moveto | |
t g' t f' atan rotate | |
{ | |
mode right eq {pop} if | |
grestore gsave | |
onecharstring 0 3 -1 roll put onecharstring stringwidth pop | |
/ds exch mode mul def | |
/dt ds t f' dup mul t g' dup mul add sqrt res mul div def | |
/t t dt add def | |
/s s ds add def | |
t f res mul t g res mul translate | |
0 0 moveto | |
t g' t f' atan rotate | |
mode left eq {pop} if | |
} str kshow | |
grestore | |
} bind def | |
/reversestring { | |
/str1 exch def | |
/str2 str1 length string def | |
/i 0 def | |
/n str1 length 1 sub def | |
{ | |
str1 n get str2 exch i exch put | |
/i i 1 add def | |
/n n 1 sub def | |
n 0 lt {exit} if | |
} loop | |
str2 | |
} bind def | |
/splitstring { | |
/str1 exch def | |
/len str1 stringwidth pop def | |
/s 0 def | |
/n 0 def | |
str1 length { | |
str1 n get onecharstring exch 0 exch put | |
/s onecharstring stringwidth pop s add def | |
s len 2 div ge {exit} if | |
/n n 1 add def | |
} repeat | |
str1 0 n 1 add getinterval | |
str1 n str1 length n sub getinterval | |
} bind def | |
end |