diff options
Diffstat (limited to 'postscript/prologues/baseline.ps')
-rw-r--r-- | postscript/prologues/baseline.ps | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/postscript/prologues/baseline.ps b/postscript/prologues/baseline.ps new file mode 100644 index 00000000..470047c9 --- /dev/null +++ b/postscript/prologues/baseline.ps @@ -0,0 +1,156 @@ +% +% 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 |