Main Page   Class Hierarchy   Data Structures   File List   Data Fields   Globals  

symbl.f

Go to the documentation of this file.
00001 
00002 c
00003 c       Copyright (c) 1986,1987,1988,1989,1990,1991,1992,1993,
00004 c       by Steve McMillan, Drexel University, Philadelphia, PA.
00005 c
00006 c       All rights reserved.
00007 c
00008 c       Redistribution and use in source and binary forms are permitted
00009 c       provided that the above copyright notice and this paragraph are
00010 c       duplicated in all such forms and that any documentation,
00011 c       advertising materials, and other materials related to such
00012 c       distribution and use acknowledge that the software was developed
00013 c       by the author named above.
00014 c
00015 c       THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
00016 c       IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
00017 c       WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00018 c
00019 
00020         subroutine symbl(rinput,sinput,ht,string,theta,numch)
00021         save
00022 c
00023 c       Use the local string drawer to mimic "simbol."
00024 c       (Not guaranteed to work in all circumstances!)
00025 c
00026         character*80 device
00027         common /plot device/ device,aspect,idev
00028         common /plot sizes/ xsize,ysize
00029         common /plot origin/ ro,so
00030         common /fontc1/ offx,offy,lastinc,xp,yp,xmax,xmin,ymax,ymin
00031         common /numsym int/ rs,ss,dx,dy,sint,cost
00032         common /str posn/ i pos set,frx,fry
00033 c
00034         common /plain font/ wid
00035 c               ( = ratio of character width to height.)
00036 c
00037         common /framesize/ nxpix,nx0,xfac,nypix,ny0,yfac
00038         common /ncar/ nxpix1,nypix1,nx01,ny01,xfac1,yfac1
00039         common /dev init/ init
00040         common /dev status/ idevon,idevpen,idevwt
00041         common /fr int/ iframe
00042         common /numbr on/ inumbr
00043 
00044         character*200 temp
00045 c
00046         character*40 font
00047         common /ps font/ font,ifsize
00048         save /ps font/
00049 c
00050         external mcdxtext !$pragma C (mcdxtext)
00051 c
00052         character*(*) string
00053         integer*2 ichars(100)
00054 c
00055         r = rinput
00056         s = sinput
00057         go to 1
00058 c
00059         entry csymbl(ht,string,theta,numch)
00060         call simwhe(r,s)
00061 c
00062 1       if (init.eq.0) then
00063             init = -1
00064             call mcinit
00065             call devon
00066             call clear
00067         end if
00068 c
00069         if (idevon.eq.0)call devon
00070         nn = abs(numch)
00071         if (nn.eq.0)nn = len(string)
00072         if (nn.gt.len(string)) then
00073             do 5 i = 1,len(string)-1
00074                 if (string(i:i).eq.'%') then
00075                     if (string(i+1:i+1).eq.'%') then
00076                         nn = i-1
00077                         go to 6
00078                     end if
00079                 end if
00080 5           continue
00081 6       end if
00082         th = .017453293*theta
00083         sint = sin(th)
00084         cost = cos(th)
00085 c
00086 c       Get/estimate size of string.
00087 c
00088         if (idev.eq.15) then
00089 c
00090 c           SunCore calls!
00091 c           -------------
00092 c
00093             call setcharsize(abs(ht*wid),abs(ht))
00094             call inqtextextent2(string(1:nn),dx,dy)
00095 c
00096             dy = abs(ht)
00097             width = dx/nn
00098             sint = 0.
00099             cost = 1.
00100 c
00101 c           (The SUN raster font used has fixed orientation.)
00102 c
00103         else
00104             dy = abs(ht)
00105             width = wid*dy
00106             dx = width*nn
00107         end if
00108 c
00109         if (idev.eq.2) then
00110 c
00111 c           NCAR output:
00112 c           -----------
00113 c
00114             rs = r+ro
00115             ss = s+so
00116             if (numch.lt.0) then
00117                 n = 1
00118                 write(ichars(1),'(2a1)')char(-numch),' '
00119             else
00120                 n = numch
00121             end if
00122             isiz = yfac1*dy*wid
00123             icent = -1
00124             rs1 = rs
00125             ss1 = ss
00126             if (ht.lt.0..or.(iframe.eq.1.and.i pos set.eq.0)) then
00127                 icent = 0
00128             else if (i pos set.ne.0) then
00129                 dxs = 0.
00130                 if (frx.ge.0..and.frx.le.1.)dxs = dx*frx
00131                 dys = 0.
00132                 if (fry.ge.0..and.fry.le.1.)dys = dy*fry
00133                 rs1 = rs1-(dxs*cost-dys*sint)
00134                 ss1 = ss1-(dxs*sint+dys*cost)
00135             end if
00136             rs = rs1
00137             ss = ss1
00138             if (icent.eq.-1) then
00139                 rs1 = rs1-.5*dy*sint
00140                 ss1 = ss1+.5*dy*cost
00141             end if
00142             ir = nx01+xfac1*rs1
00143             js = ny01+yfac1*ss1
00144             ith = theta
00145             if (numch.ge.0) then
00146                 n = min(n,200)
00147                 do 209 i = 1,n
00148 209             if (string(i:i).ge.'a'.and.string(i:i).le.'z')
00149      +          string(i:i) = char(ichar(string(i:i))-32)
00150                 i1 = -1
00151                 do 210 i = 1,n/2
00152                     i1 = i1+1
00153                     i2 = i1+1
00154                     write(ichars(i),'(2a1)')string(i1:i1),string(i2:i2)
00155 210             continue
00156                 if (i2.lt.n)write(ichars(n/2+1),'(2a1)')string(n:n),' '
00157             end if
00158 c
00159 c           NCAR call!!!
00160 c           ------------
00161 c
00162             if (n.ne.0) call pwrit(ir,js,ichars,n,isiz,ith,icent)
00163 c
00164             rs = rs-ro
00165             ss = ss-so
00166 c
00167         else
00168 c
00169 c           Attempt to determine the offset of the string.
00170 c
00171             fx = 0.
00172             fy = 0.
00173             if (i pos set.ne.0) then
00174                 if (frx.gt.0..and.frx.le.1.)fx = frx
00175                 if (fry.gt.0..and.fry.le.1.)fy = fry
00176             else if (numch.lt.0.or.(inumbr.eq.1.and.iframe.eq.1)) then
00177                 fx = .5
00178                 fy = .5
00179             end if
00180 c
00181             dxs = dx*fx
00182             dys = dy*fy
00183             rs = r-(dxs*cost-dys*sint)
00184             ss = s-(dxs*sint+dys*cost)
00185 c
00186             if (idev.eq.15) then
00187                 rs = rs-.5*dy*sint
00188                 ss = ss+.5*dy*cost
00189             end if
00190 c
00191 c           (rs,ss) is the bottom left corner of the output string.
00192 c
00193             if (idev.eq.5.or.idev.eq.6) then
00194 c
00195 c               HP plotter:
00196 c               ----------
00197 c
00198                 l = index(string(1:nn),'%%')
00199                 if (l.gt.0)nn = l-1
00200                 dx = width*nn
00201                 ntilde = 0
00202                 if (nn.le.0)go to 700
00203                 call plot(rs,ss,3)
00204                 fac = 2.5e-4*nxpix
00205 c
00206 c               (Each pixel is 1/40 mm, x-width is 10 units, "si"
00207 c                below wants string dimensions specified in cm!)
00208 c
00209                 write(6,610).6666667*fac*width,fac*dy,cost,sint
00210 610             format(' SI',f8.4,',',f8.4,';DI',f6.4,',',f6.4)
00211                 islant = 1
00212                 i1 = 1
00213 650             if (i1.gt.nn)go to 700
00214                 i2 = index(string(i1:nn),'~')+i1-1
00215                 if (i2.lt.i1)i2 = nn+1
00216                 i3 = i2-1
00217                 if (i2.lt.nn.and.string(i2+1:i2+1).eq.'~')i3 = i2
00218                 if (i3.ge.i1)call hp sym out(string(i1:i3),islant)
00219                 ntilde = ntilde+1
00220                 islant = 1-islant
00221                 i1 = i3+2
00222                 go to 650
00223 700             dx = dx-width*max(0,ntilde-1)
00224 c
00225             else if (idev.eq.15) then
00226 c
00227 c               SunCore:
00228 c               -------
00229 c
00230                 call plot(rs,ss,3)
00231                 call text(string(1:nn))
00232 c
00233             else if (idev.eq.16) then
00234 c
00235 c               Postscript:
00236 c               ----------
00237 c
00238 c               We can do better than the above guesses of string size
00239 c               and offset.  Recall that r and s still represent the
00240 c               input string coordinates, and fx and fy determine the offset.
00241 c
00242                 call plot(r,s,3)
00243                 write(42,*)
00244 c               write(42,*)'gsave %%%% Begin symbl output'
00245                 write(42,*)'%%%% Begin symbl output'
00246 c
00247 c               The leading factor seems to be necessary to make a
00248 c               (say) 72-point font come out 1 inch high...
00249 c
00250                 fheight = 0.645*ifsize
00251                 scale = abs(ht)*yfac/fheight
00252 c
00253 c               Determine the length of the string -- stringlen:
00254 c
00255                 write(42,*)'/stringlen'
00256                 write(42,800)'(',(string(i:i),i = 1,nn),')'
00257 800             format(500a1)
00258                 write(42,*)'stringwidth pop def'
00259 c
00260 c               Determine the r and s offsets (relative to string):
00261 c
00262                 write(42,810)fx,scale
00263 810             format('/roffset stringlen ',f9.4,' mul ',
00264      &                  f9.3,' mul def')
00265 c
00266                 write(42,820)fheight,fy,scale
00267 820             format('/soffset ',2f9.4,' mul ',f9.3,' mul def')
00268 c
00269 c               Determine the x and y offsets (rotated):
00270 c
00271                 write(42,830)-cost,' r',sint,' s'
00272                 write(42,830)-sint,' r',-cost,' s'
00273 830             format(f9.5,a,'offset mul ',f9.5,a,'offset mul add')
00274 c
00275 c               Move to the correct offset point:
00276 c
00277                 write(42,*)'rmoveto'
00278 c
00279 c               Show the string:
00280 c
00281                 write(42,800)'(',(string(i:i),i = 1,nn),')'
00282 c
00283 c               Scale the string:
00284 c
00285                 write(42,'(2f9.3,'' scale'')')scale,scale
00286 c
00287 c               Rotate the string:
00288 c
00289                 write(42,'(f9.3,'' rotate'')')theta
00290 c
00291 c               Finish up:
00292 c
00293 c               write(42,*)'show grestore %%%% End symbl output'
00294                 write(42,*)'show %%%% End symbl output'
00295                 write(42,*)
00296 c
00297             else if (idev.eq.17) then
00298 c
00299 c               X-windows:
00300 c               ---------
00301 c
00302                 call plot(rs,ss,3)
00303                 do i=1,nn
00304                     temp(i:i) = string(i:i)
00305                 end do
00306                 temp(nn+1:nn+1) = char(0)
00307                 call mcdxtext(abs(ht),theta,
00308      &                        temp(1:nn+1))
00309 c
00310             end if
00311         end if
00312 c
00313         call mc sym lims
00314 c
00315         end

Generated at Sun Feb 24 09:57:18 2002 for STARLAB by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001