tbaseline.ps - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tbaseline.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