plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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