baseline.ps (2631B)
1 % 2 % Stuff used to draw or set text along a baseline specified by parametric equations 3 % for x and y. 4 % 5 6 /left -1 def 7 /center 0 def 8 /right 1 def 9 10 /baselinedict 50 dict def 11 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 18 19 counttomark 2 eq {/hoffset exch def} if 20 /res exch def 21 22 /t 0 def 23 /s 0 def 24 /voffset false def 25 cleartomark 26 end 27 } bind def 28 29 /drawfunnytext { 30 baselinedict begin 31 /t exch def 32 /mode exch def 33 /str exch def 34 35 mode left eq { 36 /leftstring emptystring def 37 /rightstring str def 38 } if 39 40 mode right eq { 41 /leftstring str reversestring def 42 /rightstring emptystring def 43 } if 44 45 mode center eq { 46 str splitstring 47 /rightstring exch def 48 /leftstring exch reversestring def 49 } if 50 51 gsave currentpoint translate leftstring left t baselineshow grestore 52 gsave currentpoint translate rightstring right t baselineshow grestore 53 54 /t 0 def 55 /s 0 def 56 /voffset false def 57 cleartomark 58 end 59 } bind def 60 61 /setfunnytext { 62 baselinedict begin 63 /vpos exch def 64 /hpos exch def 65 /str exch def 66 67 voffset vpos ne { 68 /voffset vpos def 69 /t 0 def 70 /s hoffset def 71 } if 72 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 84 85 baselinedict begin 86 87 /f {} bind def 88 /g {pop 0} bind def 89 /f' {pop 1} bind def 90 /g' {pop 0} bind def 91 92 /s 0 def 93 /t 0 def 94 /res 72 def 95 96 /onecharstring ( ) def 97 /emptystring () def 98 99 /baselineshow { 100 /t exch def 101 /mode exch def 102 /str exch def 103 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 123 124 /reversestring { 125 /str1 exch def 126 127 /str2 str1 length string def 128 /i 0 def 129 /n str1 length 1 sub def 130 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 139 140 /splitstring { 141 /str1 exch def 142 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 155 156 end