157 lines
2.6 KiB
PostScript
157 lines
2.6 KiB
PostScript
%
|
|
% 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
|