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 plot details 00021 save 00022 c 00023 c ***************************************************************** 00024 c * * 00025 c * PLOT DETAILS: Translate plot commands for * 00026 c * specific output devices. * 00027 c * * 00028 c * * 00029 c * "Essential" commands are: * 00030 c * * 00031 c * weight set pen weight * 00032 c * color set pen color * 00033 c * background set background color * 00034 c * devon/off enable/disable output * 00035 c * to graphics device * 00036 c * graphin get graphic input * 00037 c * gfxin check if GIN is enabled * 00038 c * clear/erase erase all or part of screen * 00039 c * invert set foreground = background * 00040 c * point plot a single point/pixel * 00041 c * polydraw plot a polygon * 00042 c * polyfill plot a filled polygon * 00043 c * eop/newpage take new page * 00044 c * mcquit clean up and terminate graphics * 00045 c * * 00046 c * num_win number of open windows * 00047 c * set_win set (X) window * 00048 c * kill_win kill (X) window * 00049 c * curr_win current (X) window * 00050 c * iconify_win iconify current (X) window * 00051 c * iconify_all iconify all (X) windows * 00052 c * win_read_line get input from the current * 00053 c * (X) window * 00054 c * * 00055 c * Other routines (stored elsewhere): * 00056 c * * 00057 c * mcinit initialize graphics * 00058 c * plot move/draw a line * 00059 c * setfill set color for polyfill * 00060 c * * 00061 c ***************************************************************** 00062 c 00063 external mcdxlinew !$pragma C (mcdxlinew) 00064 external mcdxcolor !$pragma C (mcdxcolor) 00065 external mcdxbackg !$pragma C (mcdxbackg) 00066 external mcdxpoint !$pragma C (mcdxpoint) 00067 external mcdxgin !$pragma C (mcdxgin) 00068 external mcdxpolyf !$pragma C (mcdxpolyf) 00069 external mcdxclear !$pragma C (mcdxclear) 00070 external mcdxreset !$pragma C (mcdxreset) 00071 external mcdxquit !$pragma C (mcdxquit) 00072 external mcdxidle !$pragma C (mcdxidle) 00073 external mcdxsetwin !$pragma C (mcdxsetwin) 00074 external mcdxkillwin !$pragma C (mcdxkillwin) 00075 external mcdxnopen !$pragma C (mcdxnopen) 00076 external mcdxread_line !$pragma C (mcdxread_line) 00077 external mcdxiconifywin !$pragma C (mcdxiconifywin) 00078 external mcdxiconifyall !$pragma C (mcdxiconifyall) 00079 external mcdxsetwincolormap !$pragma C (mcdxsetwincolormap) 00080 c 00081 dimension rpoly(1),spoly(1) 00082 c 00083 character*80 device 00084 character*10 chtekin,chout 00085 character*1 leadin 00086 character*1 tekin(10),tekout(10) 00087 character*1 vec(4) 00088 equivalence (chtekin,tekin),(chout,tekout) 00089 c 00090 character*1 ctrl(0:31), 00091 & null,ctrla,tab,lf,ff,cr,ctrlx,ctrlz,esc,gs,del 00092 common /ctrlch/ ctrl, 00093 & null,ctrla,tab,lf,ff,cr,ctrlx,ctrlz,esc,gs,del 00094 character*1 tekc(4),hpc(3),hpon(3),hpoff(6) 00095 common /dev controls/ tekc,hpc,hpon,hpoff 00096 c 00097 c Internal plotting variables: 00098 c 00099 common /dev status/ idevon,idevpen,idevwt 00100 common /dev details/ itek,ivers 00101 common /framesize/ nxpix,nx0,xfac,nypix,ny0,yfac 00102 common /last point/ rl,sl 00103 common /pen posn/ npo 00104 common /plain font/ wid 00105 common /plot device/ device,aspect,idev 00106 common /plot origin/ ro,so 00107 common /plot sizes/ xsize,ysize 00108 common /dev init/ init 00109 common /plot offset/ iin 00110 common /plot invert/ inv,ipensto 00111 save /plot invert/ 00112 common /backgcolor/ ibackgcolor 00113 save /backgcolor/ 00114 c 00115 c HP options: 00116 c ---------- 00117 c 00118 common /hp plot/ ivdef 00119 c 00120 c TEK options: 00121 c ----------- 00122 c 00123 common /input character/ leadin /input posn/ iposn,jposn 00124 c 00125 c PS option: 00126 c --------- 00127 c 00128 parameter (NSMAX = 100) 00129 common /ps strokes/ nstroke,nstrpage,nstroketot 00130 common /ps enforced/ ibounds,ps rmax,ps smax 00131 common /ps bounding box/ ixleft,iybot,ixright,iytop 00132 character*(*) id string 00133 c 00134 c SUN options: 00135 c ----------- 00136 c 00137 00138 c 00139 common /graphproc/ igp 00140 common /mcpak_colormap/ ncolor,red(0:255),green(0:255), 00141 & blue(0:255) 00142 common /sunscreen/ isun 00143 common /findex/ index 00144 dimension xbox(4),ybox(4) 00145 c 00146 c X options: 00147 c --------- 00148 c 00149 logical gfxin 00150 character*(*) filename 00151 c 00152 data ibounds/1/ 00153 c 00154 c----------------------------------------------------------------------- 00155 c 00156 entry getstatus(jgdevice,jgdevon,jgdevpen,jgdevwt) 00157 c *************** 00158 c Return overall device status. * GETSTATUS * 00159 c *************** 00160 jgdevice = idev 00161 jgdevon = idevon 00162 jgdevpen = idevpen 00163 jgdevwt = idevwt 00164 c 00165 return 00166 c 00167 c----------------------------------------------------------------------- 00168 c 00169 entry weight(iwt) 00170 c ************ 00171 c Adjust pen width/weight, if appropriate. * WEIGHT * 00172 c ************ 00173 c 00174 c CONVENTION: Fiddle with details so that 1 is a "thin" line, 00175 c 10 is a "double weight" line, 20 is a "heavy" 00176 c line, etc., independent of the device. 00177 c 00178 if(idev.eq.1)then 00179 write(60,500)4,char(modulo(iwt,64)+32) 00180 500 format(i1,a1) 00181 else if((idev.eq.5.or.idev.eq.6).and.iwt.ne.idevwt)then 00182 c 00183 c HP GL (what does "weight" mean here?) 00184 c 00185 if(idevon.le.0)write(6,510)hpon 00186 510 format(1x,10a1) 00187 jpen = max(0,min(7,iwt)) 00188 write(6,520)jpen+1,ivdef*(11-jpen) 00189 520 format(' FS',i1,';VS',i2,';') 00190 if(idevon.le.0)write(6,510)hpoff 00191 c 00192 else if((idev.eq.7.or.idev.eq.8.or.idev.eq.11.or.idev.eq.12) 00193 & .and.iwt.gt.0)then 00194 c 00195 c Tek/Versaterm -- pensize specifies pen size in pixels. 00196 c 00197 iw = (iwt+4)/10+1 00198 call pensize(iw,iw) 00199 c 00200 else if((idev.eq.15))then 00201 c 00202 c SunCore ideosyncrasies: 00203 c 00204 c setlinewidth(x) --> single for 0.0 to 0.3 00205 c double for 0.4, 0.5 00206 c heavy for 0.6 00207 c heavier for 0.7 00208 c heavier still for 0.8, 0.9 00209 c ... 00210 c 00211 if (iwt.le.5) then 00212 ww = 0.1 00213 else if (iwt.le.15) then 00214 ww = 0.4 + 0.01*(iwt-5) 00215 else 00216 ww = 0.6 + 0.01*(iwt-15) 00217 end if 00218 call setlinewidth(ww) 00219 c 00220 else if(idev.eq.16)then 00221 c 00222 c PostScript. 00223 c 00224 call ps stroke 00225 write(42,'(f5.1,'' setlinewidth'')').1*iwt 00226 write(42,'(''2 setlinejoin 2 setlinecap'')') 00227 c 00228 c N.B. PS weight applies to SUBSEQUENT lines only. 00229 c 00230 else if (idev.eq.17) then 00231 jwt = max(0, nint(.1*iwt+.5)) 00232 call mcdxlinew(jwt) 00233 end if 00234 c 00235 idevwt = iwt 00236 c 00237 return 00238 c 00239 c----------------------------------------------------------------------- 00240 c 00241 entry pen(ipenin) 00242 c *************** 00243 c Set pen characteristics ("color"). * PEN/COLOR * 00244 c *************** 00245 ipen = ipenin 00246 525 if(idev.eq.1)then 00247 write(60,500)5,char(modulo(ipen,64)+32) 00248 else if((idev.eq.5.or.idev.eq.6).and.ipen.ne.idevpen)then 00249 if(idevon.le.0)write(6,510)hpon 00250 write(6,530)max(0,min(8,ipen)) 00251 530 format(' SP',i1,';') 00252 if(idevon.le.0)write(6,510)hpoff 00253 idevpen = ipen 00254 else if(idev.eq.13.or.idev.eq.14)then 00255 call output char(esc) 00256 write(chout,531)min(7,max(0,ipen)) 00257 531 format('ML',i1) 00258 call type string(tekout,3) 00259 else if(idev.eq.15)then 00260 call setlineindex(ipen) 00261 call settextindex(ipen) 00262 c Note that ipen = 0 erases 00263 else if(idev.eq.16)then 00264 call ps color(ipen) 00265 c 00266 c N.B. PS pen color applies to SUBSEQUENT lines only. 00267 c 00268 else if (idev.eq.17) then 00269 c 00270 c For now, just wrap the colormap... 00271 c 00272 jpen = ipen/ncolor 00273 if (jpen.gt.0) ipen = ipen - ncolor*jpen 00274 call mcdxcolor(ipen) 00275 end if 00276 idevpen = ipen 00277 c 00278 return 00279 c 00280 entry color(icolor) 00281 c 00282 ipen = icolor 00283 go to 525 00284 c 00285 entry getcolor(jcolor) 00286 jcolor = idevpen 00287 return 00288 c 00289 c----------------------------------------------------------------------- 00290 c 00291 entry background(iback) 00292 c **************** 00293 c Set background color. * BACKGROUND * 00294 c **************** 00295 if (idev.eq.15) then 00296 call corebackg(iback) 00297 else if (idev.eq.17) then 00298 c 00299 c For now, just wrap the colormap... 00300 c 00301 jback = iback/ncolor 00302 if (jback.gt.0) iback = iback - ncolor*jback 00303 call mcdxbackg(iback) 00304 end if 00305 c 00306 ibackgcolor = iback 00307 c 00308 return 00309 c 00310 c----------------------------------------------------------------------- 00311 c 00312 entry devon 00313 c *********** 00314 c Explicitly initiate output to graphics device. * DEVON * 00315 c *********** 00316 if (idevon.ne.1) then 00317 if(itek.eq.1)then 00318 if(ivers.eq.0)then 00319 if (idev.eq.9.or.idev.eq.10) then 00320 c 00321 c Xterm escape sequences: 00322 c 00323 call output char(esc) 00324 call output char('[') 00325 call output char('?') 00326 call output char('3') 00327 call output char('8') 00328 call output char('h') 00329 else 00330 call output char(esc) 00331 call output char(';') 00332 write(6,*) 00333 end if 00334 end if 00335 call output char(gs) 00336 else if(idev.eq.5.or.idev.eq.6)then 00337 write(6,510)hpon 00338 end if 00339 idevon = 1 00340 end if 00341 return 00342 c 00343 c----------------------------------------------------------------------- 00344 c 00345 entry devoff 00346 c ************ 00347 c Explicitly terminate output to graphics device. * DEVOFF * 00348 c ************ 00349 iquit = 0 00350 c 00351 200 if (idevon.ne.0) then 00352 c 00353 if (itek.eq.1) then 00354 if (ivers.eq.0) then 00355 if (idev.eq.9.or.idev.eq.10) then 00356 c 00357 c Xterm escape sequences: 00358 c 00359 c Flush the buffer (100 may be overkill, but...). 00360 c 00361 call plot(-10.,-10.,3) 00362 do 210 i=1,100 00363 call plot(-10.,-10.,2) 00364 210 continue 00365 c 00366 call output char(esc) 00367 call output char(char(3)) 00368 c 00369 else 00370 call plot(-10.,-10.,3) 00371 call plot(-10.,-10.,2) 00372 end if 00373 end if 00374 call output char(esc) 00375 call output char('2') 00376 c 00377 else if(idev.eq.5.or.idev.eq.6)then 00378 write(6,510)hpoff 00379 npo = 3 00380 end if 00381 c 00382 idevon = 0 00383 c 00384 end if 00385 c 00386 if (iquit.eq.1) then 00387 c 00388 c Complete MCQUIT operations. 00389 c 00390 init = 0 00391 idev = 0 00392 device = ' ' 00393 iin = 0 00394 end if 00395 c 00396 return 00397 c 00398 c----------------------------------------------------------------------- 00399 c 00400 entry graphin(r,s) 00401 c 00402 c Return the location of the graphics pointer relative ************* 00403 c to the current origin (implemented for Tektronix, X, * GRAPHIN * 00404 c and SUN options only). ************* 00405 c 00406 if (.not.gfxin()) return 00407 c 00408 if(idev.eq.15)then 00409 kount = 0 00410 400 call awtbuttongetloc2(0,1,ibutton,xx,yy) 00411 if(ibutton.eq.0)then 00412 kount = kount+1 00413 if(kount.lt.12000)then 00414 call uwait(5000) 00415 go to 400 00416 end if 00417 write(6,*)'timed out...' 00418 xx = 0. 00419 yy = 0. 00420 end if 00421 c 00422 r = xsize*xx-ro 00423 s = xsize*yy-so 00424 c Yes, this SHOULD be xsize!! 00425 c 00426 iposn = 1000*xx 00427 jposn = 1000*yy 00428 return 00429 else if (idev.eq.17) then 00430 call mcdxgin(r,s) 00431 iposn = nxpix*r/xsize 00432 jposn = nypix*s/ysize 00433 r = r - ro 00434 s = s - so 00435 return 00436 end if 00437 c 00438 if (itek.eq.0) return 00439 c 00440 c The rest is for Tektronix mode(s). 00441 c 00442 if (idevon.eq.0) then 00443 if (idev.eq.9.or.idev.eq.10) then 00444 call output char(esc) 00445 call output char('[') 00446 call output char('?') 00447 call output char('3') 00448 call output char('8') 00449 call output char('h') 00450 else 00451 call output char(gs) 00452 end if 00453 idevon = 1 00454 end if 00455 c 00456 c enter gin mode... 00457 c 00458 call output char(esc) 00459 call output char(ctrlz) 00460 c 00461 c ...read the pointer address, preceded by a lead-in character... 00462 c 00463 if(nxpix.gt.1023)then 00464 kmax = 6 00465 else 00466 kmax = 5 00467 end if 00468 c do 95 k=1,kmax 00469 do 95 k=1,kmax 00470 call input char(tekin(k)) 00471 if((tekin(k).eq.lf.or.tekin(k).eq.cr).and.k.gt.1)go to 96 00472 95 continue 00473 k = kmax+1 00474 96 kmax = k-1 00475 c 00476 c ...and exit gin mode. 00477 c 00478 if (idev.ne.9.and.idev.ne.10) then 00479 call output char(cr) 00480 else 00481 c 00482 c Xterm version -- leave GFX mode: 00483 c 00484 call output char(esc) 00485 call output char(char(3)) 00486 idevon = 0 00487 end if 00488 c 00489 c Each use of graphin causes the tektronix to go out of graph 00490 c mode momentarily, so we must reposition the pointer: 00491 c 00492 call plot(rl,sl,3) 00493 c 00494 c This will also undo VersaTerm "inverted" mode, so reset, if necessary: 00495 c 00496 if(inv.eq.1)then 00497 call output char(esc) 00498 if(idev.eq.14)then 00499 chout = 'ML0' 00500 call type string(tekout,3) 00501 else 00502 call output char(del) 00503 end if 00504 end if 00505 c 00506 c Now decode the address from tekin(2),...,tekin(kmax). 00507 c note that the input string is encoded differently from the 00508 c corresponding output in plot or pixel. 00509 c 00510 i32 = 32 00511 c (force integer*4 arithmetic below) 00512 c 00513 if(kmax.eq.5)then 00514 i = (ichar(tekin(2))-32)*i32 + (ichar(tekin(3))-32) 00515 j = (ichar(tekin(4))-32)*i32 + (ichar(tekin(5))-32) 00516 if(nxpix.gt.1023)then 00517 i = 4*i 00518 j = 4*j 00519 end if 00520 else 00521 c 00522 c This possibility might not actually be legal. It is 00523 c not yet tested. 00524 c 00525 ii = ichar(tekin(5))-32 00526 jj = ii/4 00527 ii = ii-4*jj 00528 i = 4*((ichar(tekin(2))-32)*i32 + (ichar(tekin(3))-32)) + ii 00529 j = 4*((ichar(tekin(4))-32)*i32 + (ichar(tekin(6))-32)) + jj 00530 end if 00531 r = (i-nx0)/xfac-ro 00532 s = (j-ny0)/yfac-so 00533 iposn = i 00534 jposn = j 00535 leadin = chtekin(1:1) 00536 if(idevon.le.0)then 00537 call output char(esc) 00538 call output char('2') 00539 end if 00540 return 00541 c 00542 c----------------------------------------------------------------------- 00543 c 00544 entry erase(rmin,rmax,smin,smax) 00545 c *********** 00546 c Clear a rectangular region of the display (for * ERASE * 00547 c SUN, X, PostScript and "Versaterm" options only) *********** 00548 c 00549 if(idev.eq.15.or.idev.eq.16.or.idev.eq.17)then 00550 xbox(1) = rmin 00551 xbox(2) = rmax 00552 xbox(3) = rmax 00553 xbox(4) = rmin 00554 ybox(1) = smin 00555 ybox(2) = smin 00556 ybox(3) = smax 00557 ybox(4) = smax 00558 call polyerase(xbox,ybox,4) 00559 end if 00560 c 00561 if(ivers.eq.0)return 00562 c 00563 if(idevon.le.0)then 00564 call output char(gs) 00565 idevon = 1 00566 end if 00567 c 00568 if(1.eq.0.and.idev.ge.8.and.idev.le.12)then 00569 c 00570 c if pensize doesn't work, use this... 00571 c 00572 i1 = (rmin+ro)*xfac+nx0 00573 i2 = (rmax+ro)*xfac+nx0 00574 j1 = (smin+so)*yfac+ny0 00575 j2 = (smax+so)*yfac+ny0 00576 call output char(esc) 00577 call output char(del) 00578 if(i2-i1.gt.j2-j1)then 00579 do 11001 j=j1,j2 00580 call pixel(i1,j,3) 00581 call pixel(i2,j,2) 00582 11001 continue 00583 else 00584 do 11002 i=i1,i2 00585 call pixel(i,j1,3) 00586 call pixel(i,j2,2) 00587 11002 continue 00588 end if 00589 call output char(cr) 00590 return 00591 else if(idev.lt.13)then 00592 i = 0 00593 j = (smax-smin)*yfac+1 00594 call pensize(i,j) 00595 c 00596 c turn on erase mode: 00597 c 00598 call output char(esc) 00599 call output char(del) 00600 c 00601 c draw the line: 00602 c 00603 call plot(rmin,smax,3) 00604 call plot(rmax,smax,2) 00605 c 00606 c reset: 00607 c 00608 call output char(cr) 00609 else if(idev.eq.14)then 00610 call output char(esc) 00611 chout = 'MP0' 00612 call type string(tekout,3) 00613 call output char(esc) 00614 chout = 'LP' 00615 call type string(tekout,2) 00616 call xyencode(rmin,smin,vec) 00617 call type string(vec,5) 00618 call type string(tekout,2) 00619 call plot(rmin,smax,2) 00620 call plot(rmax,smax,2) 00621 call plot(rmax,smin,2) 00622 call plot(rmin,smin,2) 00623 call output char(esc) 00624 chout = 'LE' 00625 call type string(tekout,2) 00626 end if 00627 return 00628 c 00629 c----------------------------------------------------------------------- 00630 c 00631 entry clear 00632 c *********** 00633 c clear entire screen, if any,... * CLEAR * 00634 c *********** 00635 if (idev.eq.1) then 00636 write(60,500)6 00637 else if (idev.eq.15) then 00638 call plframe 00639 else if (idev.eq.16) then 00640 c 00641 c Old version: 00642 c 00643 c write(42,'(''erasepage'')') 00644 c 00645 c New version (saves unnecessary output to the printer): 00646 c Close the output file, and copy it to a new file, omitting 00647 c all "plot" commands. 00648 c 00649 write(42,'(/''%Re-writing...''/)') 00650 call ps rewrite 00651 ixleft = 10000 00652 iybot = 10000 00653 ixright = 0 00654 iytop = 0 00655 c 00656 nstroke = 0 00657 nstrpage = 0 00658 nstroketot = 0 00659 else if (idev.eq.17) then 00660 call mcdxclear 00661 else if (itek.eq.1) then 00662 if(idev.eq.12.or.idev.eq.14)then 00663 call output char(esc) 00664 call output char(ff) 00665 else 00666 call type string(tekc,4) 00667 end if 00668 if(ivers.eq.0)then 00669 call plot(-10.,10.,3) 00670 call plot(-10.,10.,2) 00671 end if 00672 end if 00673 return 00674 c 00675 c----------------------------------------------------------------------- 00676 c 00677 entry invert 00678 c ************ 00679 c Toggle between draw and undraw modes (SUN, * INVERT * 00680 c PostScript, X and Versaterm modes only). ************ 00681 c 00682 if (idev.eq.15.or.idev.eq.16.or.idev.eq.17) then 00683 if(idevpen.gt.0)then 00684 ipensto = idevpen 00685 idevpen = 0 00686 else 00687 idevpen = ipensto 00688 end if 00689 c 00690 if(idev.eq.15)then 00691 call setlineindex(idevpen) 00692 else if (idev.eq.16) then 00693 call ps color(idevpen) 00694 else if (idev.eq.17) then 00695 call mcdxcolor(idevpen) 00696 end if 00697 return 00698 end if 00699 c 00700 if (idev.ne.7.and.idev.ne.8.and.idev.ne.10 00701 & .and.idev.ne.12.and.idev.ne.14) return 00702 c 00703 if(idevon.le.0)then 00704 call output char(gs) 00705 idevon = 1 00706 end if 00707 if(inv.eq.0)then 00708 call output char(esc) 00709 if(idev.eq.14)then 00710 chout = 'ML0' 00711 call type string(tekout,3) 00712 else 00713 call output char(del) 00714 end if 00715 inv = 1 00716 else 00717 if(idev.eq.14)then 00718 call output char(esc) 00719 chout = 'ML1' 00720 call type string(tekout,3) 00721 else 00722 call output char(cr) 00723 end if 00724 inv = 0 00725 end if 00726 c 00727 c Note that we have probably lost track of the graphics pointer 00728 c through this action. 00729 c 00730 return 00731 c 00732 c----------------------------------------------------------------------- 00733 c 00734 entry point(r,s) 00735 c *********** 00736 c Plot a single point. * POINT * 00737 c *********** 00738 if(idev.eq.16)then 00739 rr = nx0+xfac*(r+ro) 00740 ss = ny0+yfac*(s+so) 00741 if(ibounds.ne.0)then 00742 rr = max(0.,min(ps rmax,rr)) 00743 ss = max(0.,min(ps smax,ss)) 00744 end if 00745 write(42,'(f7.3,f8.3,'' p%'')')rr,ss 00746 if(nstroke.ge.NSMAX/2)then 00747 call ps stroke 00748 write(42,'(f7.3,f8.3,'' m%'')')rr,ss 00749 end if 00750 nstroke = nstroke+1 00751 nstrpage = nstrpage+1 00752 nstroketot = nstroketot+1 00753 else if (idev.eq.17) then 00754 call mcdxpoint(r+ro,s+so) 00755 else 00756 call plot(r,s,3) 00757 call plot(r,s,2) 00758 end if 00759 c 00760 return 00761 c 00762 c----------------------------------------------------------------------- 00763 c 00764 entry polydraw(rpoly,spoly,npoly) 00765 c ************** 00766 c Draw a regular polygon. * POLYDRAW * 00767 c ************** 00768 call plot(rpoly(npoly),spoly(npoly),3) 00769 do 10 i = 1,npoly 00770 call plot(rpoly(i),spoly(i),2) 00771 10 continue 00772 c 00773 return 00774 c 00775 c----------------------------------------------------------------------- 00776 c 00777 entry polyfill(rpoly,spoly,npoly) 00778 c ************** 00779 c Draw a filled regular polygon. * POLYFILL * 00780 c ************** 00781 if((idev.ne.15.and.idev.ne.16.and.idev.ne.17) 00782 & .or.index.lt.0) return 00783 c 00784 if (idev.eq.15.or.idev.eq.17) then 00785 c 00786 c SunCore/X want absolute coordinates. 00787 c 00788 do 110 i=1,npoly 00789 rpoly(i) = rpoly(i) + ro 00790 spoly(i) = spoly(i) + so 00791 110 continue 00792 end if 00793 c 00794 if(idev.eq.15)then 00795 c 00796 call polygonabs2(rpoly,spoly,npoly) 00797 c 00798 else if (idev.eq.16) then 00799 c 00800 call ps color(index) 00801 c 00802 call plot(rpoly(npoly),spoly(npoly),3) 00803 do 120 i=1,npoly 00804 call plot(rpoly(i),spoly(i),2) 00805 120 continue 00806 write(42,'(''fill'')') 00807 call ps color(ipen) 00808 c 00809 else if (idev.eq.17) then 00810 c 00811 call mcdxpolyf(rpoly,spoly,npoly,index) 00812 c 00813 end if 00814 c 00815 if (idev.eq.15.or.idev.eq.17) then 00816 do 130 i=1,npoly 00817 rpoly(i) = rpoly(i) - ro 00818 spoly(i) = spoly(i) - so 00819 130 continue 00820 end if 00821 c 00822 return 00823 c 00824 c----------------------------------------------------------------------- 00825 c 00826 entry bounded 00827 entry bounds 00828 c ************* 00829 c Enforce/don't enforce xsize x ysize bounds * BOUNDED * 00830 c on (currently, only PostScript) output. ************* 00831 c 00832 ibounds = 1 00833 return 00834 c 00835 entry unbounded 00836 entry nobounds 00837 ibounds = 0 00838 return 00839 c 00840 c----------------------------------------------------------------------- 00841 c 00842 entry eop 00843 entry newp 00844 entry newplot 00845 entry nextplot 00846 entry newpage 00847 c *************** 00848 c End plot, prepare for new one (flush buffer, * EOP, etc. * 00849 c clear screen, etc.),... *************** 00850 c 00851 if(idev.eq.1)then 00852 write(60,500)7 00853 else if(idev.eq.2)then 00854 call frame 00855 else if(itek.eq.1)then 00856 call display text( 00857 & 'Enter <CR> to clear screen. ',40) 00858 read(5,350)idummy 00859 350 format(a1) 00860 if(idev.ne.13.and.idev.ne.14)then 00861 call type string(tekc,4) 00862 else 00863 call output char(esc) 00864 call output char(ff) 00865 end if 00866 else if(idev.eq.5.or.idev.eq.6)then 00867 if(idevon.le.0)write(6,510)hpon 00868 write(6,510)hpc 00869 if(idevon.le.0)write(6,510)hpoff 00870 else if(idev.eq.15)then 00871 call sunwait 00872 call plframe 00873 else if(idev.eq.16)then 00874 call ps page(1) 00875 else if (idev.eq.17) then 00876 write(6,6000) 00877 6000 format('Click right-hand mouse button' 00878 $ ' in window to exit X.') 00879 call mcdxidle 00880 call mcdxreset 00881 end if 00882 go to 200 00883 c 00884 c----------------------------------------------------------------------- 00885 c 00886 entry set_win(iwin, iret) 00887 c *************** 00888 c Choose output window. * SET_WIN * 00889 c *************** 00890 c 00891 if (idev.eq.17) then 00892 iret = mcdxsetwin(iwin) 00893 c 00894 c Return status is -1 on error. 00895 c 00896 end if 00897 c 00898 return 00899 c 00900 c----------------------------------------------------------------------- 00901 c 00902 entry kill_win(iwin) 00903 c *************** 00904 c Kill output window. * KILL_WIN * 00905 c *************** 00906 c 00907 if (idev.eq.17) then 00908 call mcdxkillwin(iwin) 00909 if (mcdxnopen().le.0) then 00910 c 00911 c No windows left! 00912 c 00913 idev = 0 00914 device = ' ' 00915 iin = 0 00916 idevon = 0 00917 end if 00918 end if 00919 c 00920 return 00921 c 00922 c----------------------------------------------------------------------- 00923 c 00924 entry iconify_win(iwin) 00925 c *************** 00926 c Iconify an output X window. * ICONIFY_WIN * 00927 c *************** 00928 c 00929 call mcdxiconifywin(iwin) 00930 c 00931 return 00932 c 00933 c----------------------------------------------------------------------- 00934 c 00935 entry iconify_all 00936 c *************** 00937 c Iconify all output X windows. * ICONIFY_ALL * 00938 c *************** 00939 c 00940 call mcdxiconifyall() 00941 c 00942 return 00943 c 00944 c----------------------------------------------------------------------- 00945 c 00946 entry set_colormap(filename,ier) 00947 c *************** 00948 c Load a colormap from a file. * SET_COLORMAP* 00949 c *************** 00950 c 00951 nf = 0 00952 do i=len(filename),1,-1 00953 if (nf.eq.0.and.filename(i:i).gt.' ') nf = i 00954 end do 00955 c 00956 c HP fortran doesn't understand '\0'... 00957 c 00958 call mcdxsetwincolormap(filename(1:nf) ) 00959 c 00960 return 00961 c 00962 c----------------------------------------------------------------------- 00963 c 00964 entry win_read_line(string) 00965 c ***************** 00966 c Read a line of text from the (X) window system. * WIN_READ_LINE * 00967 c ***************** 00968 c 00969 if (mcdxnopen().gt.0) then 00970 call mcdxread_line(string) 00971 end if 00972 c 00973 return 00974 c 00975 c----------------------------------------------------------------------- 00976 c 00977 entry routine id(id string) 00978 c **************** 00979 c Identify key routines. * ROUTINE ID * 00980 c **************** 00981 c 00982 if (idev.eq.16) then 00983 do 450 i=len(id string),1,-1 00984 if (id string(i:i).gt.' ') go to 455 00985 450 continue 00986 return 00987 455 write(42,'(''%%% Routine '',a,'':'')')id string(1:i) 00988 end if 00989 c 00990 return 00991 c 00992 c----------------------------------------------------------------------- 00993 c 00994 entry mcquit 00995 iquit = 0 00996 go to 1000 00997 c 00998 entry mcquit1 00999 iquit = 1 01000 c ************ 01001 c Terminate graphics session. * MCQUIT * 01002 c ************ 01003 1000 if (isun.gt.0) then 01004 write(6,'(''Enter <CR> to terminate graphics.'')') 01005 call plstop 01006 isun = 0 01007 end if 01008 c 01009 c NOTE: The system call in psquit apparently requires that SunCore 01010 c graphics be terminated before attempting to print any PostScript file. 01011 c 01012 call psquit 01013 c 01014 c Call to psquit does nothing if no PS device is open. 01015 c 01016 if (mcdxnopen().gt.0) then 01017 if (iquit.eq.1) then 01018 write(6,6001) 01019 6001 format('Click right-hand mouse button in current' 01020 $ ' window to exit X.') 01021 call mcdxidle 01022 end if 01023 end if 01024 c 01025 call mcdxquit 01026 c 01027 c Remaining termination is done by devoff (label 200). 01028 c 01029 iquit = 1 01030 go to 200 01031 c 01032 end 01033 01034 01035 logical function gfxin() 01036 save 01037 c *********** 01038 c Return TRUE iff graphin will work. * GFXIN * 01039 c *********** 01040 character*80 device 01041 common /plot device/ device,aspect,idev 01042 common /dev details/ itek,ivers 01043 c 01044 if (idev.eq.15.or.idev.eq.17.or.itek.eq.1 01045 c & .or.(itek.eq.1.and.idev.ne.9.and.idev.ne.10) 01046 & ) then 01047 gfxin = .true. 01048 else 01049 gfxin = .false. 01050 end if 01051 c 01052 end 01053 01054 01055 integer function num_win(id) 01056 save 01057 c *********** 01058 c Return the number of open windows associated with id. * NUM_WIN * 01059 c *********** 01060 character*80 device 01061 common /plot device/ device,aspect,idev 01062 c 01063 logical ps_open 01064 external mcdxnopen !$pragma C (mcdxnopen) 01065 c 01066 num_win = 0 01067 if (id.gt.0) then 01068 c 01069 c PostScript and X can be open without being active. 01070 c 01071 if (id.eq.16) then 01072 if (ps_open()) num_win = 1 01073 else if (id.eq.17) then 01074 num_win = mcdxnopen() 01075 else 01076 if (id.eq.idev) num_win = 1 01077 end if 01078 end if 01079 c 01080 end 01081 01082 01083 integer function curr_win() 01084 save 01085 c ************ 01086 c Return the current output window. * CURR_WIN * 01087 c ************ 01088 character*80 device 01089 common /plot device/ device,aspect,idev 01090 c 01091 external mcdxcurrwin !$pragma C (mcdxcurrwin) 01092 c 01093 if (idev.le.0) then 01094 curr_win = -1 01095 else 01096 curr_win = 0 01097 if (idev.eq.17) curr_win = mcdxcurrwin() 01098 end if 01099 c 01100 end 01101 01102 01103 subroutine polyerase(r,s,n) 01104 save 01105 c 01106 c Erase the specified polygonal area. 01107 c 01108 external mcdxpolyf !$pragma C (mcdxpolyf) 01109 c 01110 dimension r(1),s(1) 01111 character*80 device 01112 common /plot device/ device,aspect,idev 01113 common /plot origin/ ro,so 01114 common /backgcolor/ ibackgcolor 01115 save /backgcolor/ 01116 c 01117 if(idev.eq.15)then 01118 c 01119 c Switch to absolute coordinates: 01120 c 01121 do k=1,n 01122 r(k) = r(k) + ro 01123 s(k) = s(k) + so 01124 end do 01125 c 01126 call setfillindex(0) 01127 call polygonabs2(r,s,n) 01128 c 01129 do k=1,n 01130 r(k) = r(k) - ro 01131 s(k) = s(k) - so 01132 end do 01133 c 01134 else if(idev.eq.16)then 01135 c 01136 call ps stroke 01137 call plot(r(n),s(n),3) 01138 do i=1,n 01139 call plot(r(i),s(i),2) 01140 end do 01141 write(42,'(''1.0 setgray''/''fill''/f5.3,'' setgray'')') 01142 & ipen/256. 01143 call ps color(ipen) 01144 c 01145 else if (idev.eq.17) then 01146 c 01147 c Switch to absolute coordinates: 01148 c 01149 do k=1,n 01150 r(k) = r(k) + ro 01151 s(k) = s(k) + so 01152 end do 01153 c 01154 call mcdxpolyf(r,s,n,ibackgcolor) 01155 c 01156 do k=1,n 01157 r(k) = r(k) - ro 01158 s(k) = s(k) - so 01159 end do 01160 c 01161 end if 01162 c 01163 end 01164 01165 01166 c 01167 c Copyright (c) 1986,1987,1988,1989,1990,1991,1992,1993, 01168 c by Steve McMillan, Drexel University, Philadelphia, PA. 01169 c 01170 c All rights reserved. 01171 c 01172 c Redistribution and use in source and binary forms are permitted 01173 c provided that the above copyright notice and this paragraph are 01174 c duplicated in all such forms and that any documentation, 01175 c advertising materials, and other materials related to such 01176 c distribution and use acknowledge that the software was developed 01177 c by the author named above. 01178 c 01179 c THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 01180 c IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 01181 c WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 01182 c 01183 01184 subroutine plot details 01185 save 01186 c 01187 c ***************************************************************** 01188 c * * 01189 c * PLOT DETAILS: Translate plot commands for * 01190 c * specific output devices. * 01191 c * * 01192 c * * 01193 c * "Essential" commands are: * 01194 c * * 01195 c * weight set pen weight * 01196 c * color set pen color * 01197 c * background set background color * 01198 c * devon/off enable/disable output * 01199 c * to graphics device * 01200 c * graphin get graphic input * 01201 c * gfxin check if GIN is enabled * 01202 c * clear/erase erase all or part of screen * 01203 c * invert set foreground = background * 01204 c * point plot a single point/pixel * 01205 c * polydraw plot a polygon * 01206 c * polyfill plot a filled polygon * 01207 c * eop/newpage take new page * 01208 c * mcquit clean up and terminate graphics * 01209 c * * 01210 c * num_win number of open windows * 01211 c * set_win set (X) window * 01212 c * kill_win kill (X) window * 01213 c * curr_win current (X) window * 01214 c * iconify_win iconify current (X) window * 01215 c * iconify_all iconify all (X) windows * 01216 c * win_read_line get input from the current * 01217 c * (X) window * 01218 c * * 01219 c * Other routines (stored elsewhere): * 01220 c * * 01221 c * mcinit initialize graphics * 01222 c * plot move/draw a line * 01223 c * setfill set color for polyfill * 01224 c * * 01225 c ***************************************************************** 01226 c 01227 external mcdxlinew !$pragma C (mcdxlinew) 01228 external mcdxcolor !$pragma C (mcdxcolor) 01229 external mcdxbackg !$pragma C (mcdxbackg) 01230 external mcdxpoint !$pragma C (mcdxpoint) 01231 external mcdxgin !$pragma C (mcdxgin) 01232 external mcdxpolyf !$pragma C (mcdxpolyf) 01233 external mcdxclear !$pragma C (mcdxclear) 01234 external mcdxreset !$pragma C (mcdxreset) 01235 external mcdxquit !$pragma C (mcdxquit) 01236 external mcdxidle !$pragma C (mcdxidle) 01237 external mcdxsetwin !$pragma C (mcdxsetwin) 01238 external mcdxkillwin !$pragma C (mcdxkillwin) 01239 external mcdxnopen !$pragma C (mcdxnopen) 01240 external mcdxread_line !$pragma C (mcdxread_line) 01241 external mcdxiconifywin !$pragma C (mcdxiconifywin) 01242 external mcdxiconifyall !$pragma C (mcdxiconifyall) 01243 external mcdxsetwincolormap !$pragma C (mcdxsetwincolormap) 01244 c 01245 dimension rpoly(1),spoly(1) 01246 c 01247 character*80 device 01248 character*10 chtekin,chout 01249 character*1 leadin 01250 character*1 tekin(10),tekout(10) 01251 character*1 vec(4) 01252 equivalence (chtekin,tekin),(chout,tekout) 01253 c 01254 character*1 ctrl(0:31), 01255 & null,ctrla,tab,lf,ff,cr,ctrlx,ctrlz,esc,gs,del 01256 common /ctrlch/ ctrl, 01257 & null,ctrla,tab,lf,ff,cr,ctrlx,ctrlz,esc,gs,del 01258 character*1 tekc(4),hpc(3),hpon(3),hpoff(6) 01259 common /dev controls/ tekc,hpc,hpon,hpoff 01260 c 01261 c Internal plotting variables: 01262 c 01263 common /dev status/ idevon,idevpen,idevwt 01264 common /dev details/ itek,ivers 01265 common /framesize/ nxpix,nx0,xfac,nypix,ny0,yfac 01266 common /last point/ rl,sl 01267 common /pen posn/ npo 01268 common /plain font/ wid 01269 common /plot device/ device,aspect,idev 01270 common /plot origin/ ro,so 01271 common /plot sizes/ xsize,ysize 01272 common /dev init/ init 01273 common /plot offset/ iin 01274 common /plot invert/ inv,ipensto 01275 save /plot invert/ 01276 common /backgcolor/ ibackgcolor 01277 save /backgcolor/ 01278 c 01279 c HP options: 01280 c ---------- 01281 c 01282 common /hp plot/ ivdef 01283 c 01284 c TEK options: 01285 c ----------- 01286 c 01287 common /input character/ leadin /input posn/ iposn,jposn 01288 c 01289 c PS option: 01290 c --------- 01291 c 01292 parameter (NSMAX = 100) 01293 common /ps strokes/ nstroke,nstrpage,nstroketot 01294 common /ps enforced/ ibounds,ps rmax,ps smax 01295 common /ps bounding box/ ixleft,iybot,ixright,iytop 01296 character*(*) id string 01297 c 01298 c SUN options: 01299 c ----------- 01300 c 01301 01302 c 01303 common /graphproc/ igp 01304 common /mcpak_colormap/ ncolor,red(0:255),green(0:255), 01305 & blue(0:255) 01306 common /sunscreen/ isun 01307 common /findex/ index 01308 dimension xbox(4),ybox(4) 01309 c 01310 c X options: 01311 c --------- 01312 c 01313 logical gfxin 01314 character*(*) filename 01315 c 01316 data ibounds/1/ 01317 c 01318 c----------------------------------------------------------------------- 01319 c 01320 entry getstatus(jgdevice,jgdevon,jgdevpen,jgdevwt) 01321 c *************** 01322 c Return overall device status. * GETSTATUS * 01323 c *************** 01324 jgdevice = idev 01325 jgdevon = idevon 01326 jgdevpen = idevpen 01327 jgdevwt = idevwt 01328 c 01329 return 01330 c 01331 c----------------------------------------------------------------------- 01332 c 01333 entry weight(iwt) 01334 c ************ 01335 c Adjust pen width/weight, if appropriate. * WEIGHT * 01336 c ************ 01337 c 01338 c CONVENTION: Fiddle with details so that 1 is a "thin" line, 01339 c 10 is a "double weight" line, 20 is a "heavy" 01340 c line, etc., independent of the device. 01341 c 01342 if(idev.eq.1)then 01343 write(60,500)4,char(modulo(iwt,64)+32) 01344 500 format(i1,a1) 01345 else if((idev.eq.5.or.idev.eq.6).and.iwt.ne.idevwt)then 01346 c 01347 c HP GL (what does "weight" mean here?) 01348 c 01349 if(idevon.le.0)write(6,510)hpon 01350 510 format(1x,10a1) 01351 jpen = max(0,min(7,iwt)) 01352 write(6,520)jpen+1,ivdef*(11-jpen) 01353 520 format(' FS',i1,';VS',i2,';') 01354 if(idevon.le.0)write(6,510)hpoff 01355 c 01356 else if((idev.eq.7.or.idev.eq.8.or.idev.eq.11.or.idev.eq.12) 01357 & .and.iwt.gt.0)then 01358 c 01359 c Tek/Versaterm -- pensize specifies pen size in pixels. 01360 c 01361 iw = (iwt+4)/10+1 01362 call pensize(iw,iw) 01363 c 01364 else if((idev.eq.15))then 01365 c 01366 c SunCore ideosyncrasies: 01367 c 01368 c setlinewidth(x) --> single for 0.0 to 0.3 01369 c double for 0.4, 0.5 01370 c heavy for 0.6 01371 c heavier for 0.7 01372 c heavier still for 0.8, 0.9 01373 c ... 01374 c 01375 if (iwt.le.5) then 01376 ww = 0.1 01377 else if (iwt.le.15) then 01378 ww = 0.4 + 0.01*(iwt-5) 01379 else 01380 ww = 0.6 + 0.01*(iwt-15) 01381 end if 01382 call setlinewidth(ww) 01383 c 01384 else if(idev.eq.16)then 01385 c 01386 c PostScript. 01387 c 01388 call ps stroke 01389 write(42,'(f5.1,'' setlinewidth'')').1*iwt 01390 write(42,'(''2 setlinejoin 2 setlinecap'')') 01391 c 01392 c N.B. PS weight applies to SUBSEQUENT lines only. 01393 c 01394 else if (idev.eq.17) then 01395 jwt = max(0, nint(.1*iwt+.5)) 01396 call mcdxlinew(jwt) 01397 end if 01398 c 01399 idevwt = iwt 01400 c 01401 return 01402 c 01403 c----------------------------------------------------------------------- 01404 c 01405 entry pen(ipenin) 01406 c *************** 01407 c Set pen characteristics ("color"). * PEN/COLOR * 01408 c *************** 01409 ipen = ipenin 01410 525 if(idev.eq.1)then 01411 write(60,500)5,char(modulo(ipen,64)+32) 01412 else if((idev.eq.5.or.idev.eq.6).and.ipen.ne.idevpen)then 01413 if(idevon.le.0)write(6,510)hpon 01414 write(6,530)max(0,min(8,ipen)) 01415 530 format(' SP',i1,';') 01416 if(idevon.le.0)write(6,510)hpoff 01417 idevpen = ipen 01418 else if(idev.eq.13.or.idev.eq.14)then 01419 call output char(esc) 01420 write(chout,531)min(7,max(0,ipen)) 01421 531 format('ML',i1) 01422 call type string(tekout,3) 01423 else if(idev.eq.15)then 01424 call setlineindex(ipen) 01425 call settextindex(ipen) 01426 c Note that ipen = 0 erases 01427 else if(idev.eq.16)then 01428 call ps color(ipen) 01429 c 01430 c N.B. PS pen color applies to SUBSEQUENT lines only. 01431 c 01432 else if (idev.eq.17) then 01433 c 01434 c For now, just wrap the colormap... 01435 c 01436 jpen = ipen/ncolor 01437 if (jpen.gt.0) ipen = ipen - ncolor*jpen 01438 call mcdxcolor(ipen) 01439 end if 01440 idevpen = ipen 01441 c 01442 return 01443 c 01444 entry color(icolor) 01445 c 01446 ipen = icolor 01447 go to 525 01448 c 01449 entry getcolor(jcolor) 01450 jcolor = idevpen 01451 return 01452 c 01453 c----------------------------------------------------------------------- 01454 c 01455 entry background(iback) 01456 c **************** 01457 c Set background color. * BACKGROUND * 01458 c **************** 01459 if (idev.eq.15) then 01460 call corebackg(iback) 01461 else if (idev.eq.17) then 01462 c 01463 c For now, just wrap the colormap... 01464 c 01465 jback = iback/ncolor 01466 if (jback.gt.0) iback = iback - ncolor*jback 01467 call mcdxbackg(iback) 01468 end if 01469 c 01470 ibackgcolor = iback 01471 c 01472 return 01473 c 01474 c----------------------------------------------------------------------- 01475 c 01476 entry devon 01477 c *********** 01478 c Explicitly initiate output to graphics device. * DEVON * 01479 c *********** 01480 if (idevon.ne.1) then 01481 if(itek.eq.1)then 01482 if(ivers.eq.0)then 01483 if (idev.eq.9.or.idev.eq.10) then 01484 c 01485 c Xterm escape sequences: 01486 c 01487 call output char(esc) 01488 call output char('[') 01489 call output char('?') 01490 call output char('3') 01491 call output char('8') 01492 call output char('h') 01493 else 01494 call output char(esc) 01495 call output char(';') 01496 write(6,*) 01497 end if 01498 end if 01499 call output char(gs) 01500 else if(idev.eq.5.or.idev.eq.6)then 01501 write(6,510)hpon 01502 end if 01503 idevon = 1 01504 end if 01505 return 01506 c 01507 c----------------------------------------------------------------------- 01508 c 01509 entry devoff 01510 c ************ 01511 c Explicitly terminate output to graphics device. * DEVOFF * 01512 c ************ 01513 iquit = 0 01514 c 01515 200 if (idevon.ne.0) then 01516 c 01517 if (itek.eq.1) then 01518 if (ivers.eq.0) then 01519 if (idev.eq.9.or.idev.eq.10) then 01520 c 01521 c Xterm escape sequences: 01522 c 01523 c Flush the buffer (100 may be overkill, but...). 01524 c 01525 call plot(-10.,-10.,3) 01526 do 210 i=1,100 01527 call plot(-10.,-10.,2) 01528 210 continue 01529 c 01530 call output char(esc) 01531 call output char(char(3)) 01532 c 01533 else 01534 call plot(-10.,-10.,3) 01535 call plot(-10.,-10.,2) 01536 end if 01537 end if 01538 call output char(esc) 01539 call output char('2') 01540 c 01541 else if(idev.eq.5.or.idev.eq.6)then 01542 write(6,510)hpoff 01543 npo = 3 01544 end if 01545 c 01546 idevon = 0 01547 c 01548 end if 01549 c 01550 if (iquit.eq.1) then 01551 c 01552 c Complete MCQUIT operations. 01553 c 01554 init = 0 01555 idev = 0 01556 device = ' ' 01557 iin = 0 01558 end if 01559 c 01560 return 01561 c 01562 c----------------------------------------------------------------------- 01563 c 01564 entry graphin(r,s) 01565 c 01566 c Return the location of the graphics pointer relative ************* 01567 c to the current origin (implemented for Tektronix, X, * GRAPHIN * 01568 c and SUN options only). ************* 01569 c 01570 if (.not.gfxin()) return 01571 c 01572 if(idev.eq.15)then 01573 kount = 0 01574 400 call awtbuttongetloc2(0,1,ibutton,xx,yy) 01575 if(ibutton.eq.0)then 01576 kount = kount+1 01577 if(kount.lt.12000)then 01578 call uwait(5000) 01579 go to 400 01580 end if 01581 write(6,*)'timed out...' 01582 xx = 0. 01583 yy = 0. 01584 end if 01585 c 01586 r = xsize*xx-ro 01587 s = xsize*yy-so 01588 c Yes, this SHOULD be xsize!! 01589 c 01590 iposn = 1000*xx 01591 jposn = 1000*yy 01592 return 01593 else if (idev.eq.17) then 01594 call mcdxgin(r,s) 01595 iposn = nxpix*r/xsize 01596 jposn = nypix*s/ysize 01597 r = r - ro 01598 s = s - so 01599 return 01600 end if 01601 c 01602 if (itek.eq.0) return 01603 c 01604 c The rest is for Tektronix mode(s). 01605 c 01606 if (idevon.eq.0) then 01607 if (idev.eq.9.or.idev.eq.10) then 01608 call output char(esc) 01609 call output char('[') 01610 call output char('?') 01611 call output char('3') 01612 call output char('8') 01613 call output char('h') 01614 else 01615 call output char(gs) 01616 end if 01617 idevon = 1 01618 end if 01619 c 01620 c enter gin mode... 01621 c 01622 call output char(esc) 01623 call output char(ctrlz) 01624 c 01625 c ...read the pointer address, preceded by a lead-in character... 01626 c 01627 if(nxpix.gt.1023)then 01628 kmax = 6 01629 else 01630 kmax = 5 01631 end if 01632 c do 95 k=1,kmax 01633 do 95 k=1,kmax 01634 call input char(tekin(k)) 01635 if((tekin(k).eq.lf.or.tekin(k).eq.cr).and.k.gt.1)go to 96 01636 95 continue 01637 k = kmax+1 01638 96 kmax = k-1 01639 c 01640 c ...and exit gin mode. 01641 c 01642 if (idev.ne.9.and.idev.ne.10) then 01643 call output char(cr) 01644 else 01645 c 01646 c Xterm version -- leave GFX mode: 01647 c 01648 call output char(esc) 01649 call output char(char(3)) 01650 idevon = 0 01651 end if 01652 c 01653 c Each use of graphin causes the tektronix to go out of graph 01654 c mode momentarily, so we must reposition the pointer: 01655 c 01656 call plot(rl,sl,3) 01657 c 01658 c This will also undo VersaTerm "inverted" mode, so reset, if necessary: 01659 c 01660 if(inv.eq.1)then 01661 call output char(esc) 01662 if(idev.eq.14)then 01663 chout = 'ML0' 01664 call type string(tekout,3) 01665 else 01666 call output char(del) 01667 end if 01668 end if 01669 c 01670 c Now decode the address from tekin(2),...,tekin(kmax). 01671 c note that the input string is encoded differently from the 01672 c corresponding output in plot or pixel. 01673 c 01674 i32 = 32 01675 c (force integer*4 arithmetic below) 01676 c 01677 if(kmax.eq.5)then 01678 i = (ichar(tekin(2))-32)*i32 + (ichar(tekin(3))-32) 01679 j = (ichar(tekin(4))-32)*i32 + (ichar(tekin(5))-32) 01680 if(nxpix.gt.1023)then 01681 i = 4*i 01682 j = 4*j 01683 end if 01684 else 01685 c 01686 c This possibility might not actually be legal. It is 01687 c not yet tested. 01688 c 01689 ii = ichar(tekin(5))-32 01690 jj = ii/4 01691 ii = ii-4*jj 01692 i = 4*((ichar(tekin(2))-32)*i32 + (ichar(tekin(3))-32)) + ii 01693 j = 4*((ichar(tekin(4))-32)*i32 + (ichar(tekin(6))-32)) + jj 01694 end if 01695 r = (i-nx0)/xfac-ro 01696 s = (j-ny0)/yfac-so 01697 iposn = i 01698 jposn = j 01699 leadin = chtekin(1:1) 01700 if(idevon.le.0)then 01701 call output char(esc) 01702 call output char('2') 01703 end if 01704 return 01705 c 01706 c----------------------------------------------------------------------- 01707 c 01708 entry erase(rmin,rmax,smin,smax) 01709 c *********** 01710 c Clear a rectangular region of the display (for * ERASE * 01711 c SUN, X, PostScript and "Versaterm" options only) *********** 01712 c 01713 if(idev.eq.15.or.idev.eq.16.or.idev.eq.17)then 01714 xbox(1) = rmin 01715 xbox(2) = rmax 01716 xbox(3) = rmax 01717 xbox(4) = rmin 01718 ybox(1) = smin 01719 ybox(2) = smin 01720 ybox(3) = smax 01721 ybox(4) = smax 01722 call polyerase(xbox,ybox,4) 01723 end if 01724 c 01725 if(ivers.eq.0)return 01726 c 01727 if(idevon.le.0)then 01728 call output char(gs) 01729 idevon = 1 01730 end if 01731 c 01732 if(1.eq.0.and.idev.ge.8.and.idev.le.12)then 01733 c 01734 c if pensize doesn't work, use this... 01735 c 01736 i1 = (rmin+ro)*xfac+nx0 01737 i2 = (rmax+ro)*xfac+nx0 01738 j1 = (smin+so)*yfac+ny0 01739 j2 = (smax+so)*yfac+ny0 01740 call output char(esc) 01741 call output char(del) 01742 if(i2-i1.gt.j2-j1)then 01743 do 11001 j=j1,j2 01744 call pixel(i1,j,3) 01745 call pixel(i2,j,2) 01746 11001 continue 01747 else 01748 do 11002 i=i1,i2 01749 call pixel(i,j1,3) 01750 call pixel(i,j2,2) 01751 11002 continue 01752 end if 01753 call output char(cr) 01754 return 01755 else if(idev.lt.13)then 01756 i = 0 01757 j = (smax-smin)*yfac+1 01758 call pensize(i,j) 01759 c 01760 c turn on erase mode: 01761 c 01762 call output char(esc) 01763 call output char(del) 01764 c 01765 c draw the line: 01766 c 01767 call plot(rmin,smax,3) 01768 call plot(rmax,smax,2) 01769 c 01770 c reset: 01771 c 01772 call output char(cr) 01773 else if(idev.eq.14)then 01774 call output char(esc) 01775 chout = 'MP0' 01776 call type string(tekout,3) 01777 call output char(esc) 01778 chout = 'LP' 01779 call type string(tekout,2) 01780 call xyencode(rmin,smin,vec) 01781 call type string(vec,5) 01782 call type string(tekout,2) 01783 call plot(rmin,smax,2) 01784 call plot(rmax,smax,2) 01785 call plot(rmax,smin,2) 01786 call plot(rmin,smin,2) 01787 call output char(esc) 01788 chout = 'LE' 01789 call type string(tekout,2) 01790 end if 01791 return 01792 c 01793 c----------------------------------------------------------------------- 01794 c 01795 entry clear 01796 c *********** 01797 c clear entire screen, if any,... * CLEAR * 01798 c *********** 01799 if (idev.eq.1) then 01800 write(60,500)6 01801 else if (idev.eq.15) then 01802 call plframe 01803 else if (idev.eq.16) then 01804 c 01805 c Old version: 01806 c 01807 c write(42,'(''erasepage'')') 01808 c 01809 c New version (saves unnecessary output to the printer): 01810 c Close the output file, and copy it to a new file, omitting 01811 c all "plot" commands. 01812 c 01813 write(42,'(/''%Re-writing...''/)') 01814 call ps rewrite 01815 ixleft = 10000 01816 iybot = 10000 01817 ixright = 0 01818 iytop = 0 01819 c 01820 nstroke = 0 01821 nstrpage = 0 01822 nstroketot = 0 01823 else if (idev.eq.17) then 01824 call mcdxclear 01825 else if (itek.eq.1) then 01826 if(idev.eq.12.or.idev.eq.14)then 01827 call output char(esc) 01828 call output char(ff) 01829 else 01830 call type string(tekc,4) 01831 end if 01832 if(ivers.eq.0)then 01833 call plot(-10.,10.,3) 01834 call plot(-10.,10.,2) 01835 end if 01836 end if 01837 return 01838 c 01839 c----------------------------------------------------------------------- 01840 c 01841 entry invert 01842 c ************ 01843 c Toggle between draw and undraw modes (SUN, * INVERT * 01844 c PostScript, X and Versaterm modes only). ************ 01845 c 01846 if (idev.eq.15.or.idev.eq.16.or.idev.eq.17) then 01847 if(idevpen.gt.0)then 01848 ipensto = idevpen 01849 idevpen = 0 01850 else 01851 idevpen = ipensto 01852 end if 01853 c 01854 if(idev.eq.15)then 01855 call setlineindex(idevpen) 01856 else if (idev.eq.16) then 01857 call ps color(idevpen) 01858 else if (idev.eq.17) then 01859 call mcdxcolor(idevpen) 01860 end if 01861 return 01862 end if 01863 c 01864 if (idev.ne.7.and.idev.ne.8.and.idev.ne.10 01865 & .and.idev.ne.12.and.idev.ne.14) return 01866 c 01867 if(idevon.le.0)then 01868 call output char(gs) 01869 idevon = 1 01870 end if 01871 if(inv.eq.0)then 01872 call output char(esc) 01873 if(idev.eq.14)then 01874 chout = 'ML0' 01875 call type string(tekout,3) 01876 else 01877 call output char(del) 01878 end if 01879 inv = 1 01880 else 01881 if(idev.eq.14)then 01882 call output char(esc) 01883 chout = 'ML1' 01884 call type string(tekout,3) 01885 else 01886 call output char(cr) 01887 end if 01888 inv = 0 01889 end if 01890 c 01891 c Note that we have probably lost track of the graphics pointer 01892 c through this action. 01893 c 01894 return 01895 c 01896 c----------------------------------------------------------------------- 01897 c 01898 entry point(r,s) 01899 c *********** 01900 c Plot a single point. * POINT * 01901 c *********** 01902 if(idev.eq.16)then 01903 rr = nx0+xfac*(r+ro) 01904 ss = ny0+yfac*(s+so) 01905 if(ibounds.ne.0)then 01906 rr = max(0.,min(ps rmax,rr)) 01907 ss = max(0.,min(ps smax,ss)) 01908 end if 01909 write(42,'(f7.3,f8.3,'' p%'')')rr,ss 01910 if(nstroke.ge.NSMAX/2)then 01911 call ps stroke 01912 write(42,'(f7.3,f8.3,'' m%'')')rr,ss 01913 end if 01914 nstroke = nstroke+1 01915 nstrpage = nstrpage+1 01916 nstroketot = nstroketot+1 01917 else if (idev.eq.17) then 01918 call mcdxpoint(r+ro,s+so) 01919 else 01920 call plot(r,s,3) 01921 call plot(r,s,2) 01922 end if 01923 c 01924 return 01925 c 01926 c----------------------------------------------------------------------- 01927 c 01928 entry polydraw(rpoly,spoly,npoly) 01929 c ************** 01930 c Draw a regular polygon. * POLYDRAW * 01931 c ************** 01932 call plot(rpoly(npoly),spoly(npoly),3) 01933 do 10 i = 1,npoly 01934 call plot(rpoly(i),spoly(i),2) 01935 10 continue 01936 c 01937 return 01938 c 01939 c----------------------------------------------------------------------- 01940 c 01941 entry polyfill(rpoly,spoly,npoly) 01942 c ************** 01943 c Draw a filled regular polygon. * POLYFILL * 01944 c ************** 01945 if((idev.ne.15.and.idev.ne.16.and.idev.ne.17) 01946 & .or.index.lt.0) return 01947 c 01948 if (idev.eq.15.or.idev.eq.17) then 01949 c 01950 c SunCore/X want absolute coordinates. 01951 c 01952 do 110 i=1,npoly 01953 rpoly(i) = rpoly(i) + ro 01954 spoly(i) = spoly(i) + so 01955 110 continue 01956 end if 01957 c 01958 if(idev.eq.15)then 01959 c 01960 call polygonabs2(rpoly,spoly,npoly) 01961 c 01962 else if (idev.eq.16) then 01963 c 01964 call ps color(index) 01965 c 01966 call plot(rpoly(npoly),spoly(npoly),3) 01967 do 120 i=1,npoly 01968 call plot(rpoly(i),spoly(i),2) 01969 120 continue 01970 write(42,'(''fill'')') 01971 call ps color(ipen) 01972 c 01973 else if (idev.eq.17) then 01974 c 01975 call mcdxpolyf(rpoly,spoly,npoly,index) 01976 c 01977 end if 01978 c 01979 if (idev.eq.15.or.idev.eq.17) then 01980 do 130 i=1,npoly 01981 rpoly(i) = rpoly(i) - ro 01982 spoly(i) = spoly(i) - so 01983 130 continue 01984 end if 01985 c 01986 return 01987 c 01988 c----------------------------------------------------------------------- 01989 c 01990 entry bounded 01991 entry bounds 01992 c ************* 01993 c Enforce/don't enforce xsize x ysize bounds * BOUNDED * 01994 c on (currently, only PostScript) output. ************* 01995 c 01996 ibounds = 1 01997 return 01998 c 01999 entry unbounded 02000 entry nobounds 02001 ibounds = 0 02002 return 02003 c 02004 c----------------------------------------------------------------------- 02005 c 02006 entry eop 02007 entry newp 02008 entry newplot 02009 entry nextplot 02010 entry newpage 02011 c *************** 02012 c End plot, prepare for new one (flush buffer, * EOP, etc. * 02013 c clear screen, etc.),... *************** 02014 c 02015 if(idev.eq.1)then 02016 write(60,500)7 02017 else if(idev.eq.2)then 02018 call frame 02019 else if(itek.eq.1)then 02020 call display text( 02021 & 'Enter <CR> to clear screen. ',40) 02022 read(5,350)idummy 02023 350 format(a1) 02024 if(idev.ne.13.and.idev.ne.14)then 02025 call type string(tekc,4) 02026 else 02027 call output char(esc) 02028 call output char(ff) 02029 end if 02030 else if(idev.eq.5.or.idev.eq.6)then 02031 if(idevon.le.0)write(6,510)hpon 02032 write(6,510)hpc 02033 if(idevon.le.0)write(6,510)hpoff 02034 else if(idev.eq.15)then 02035 call sunwait 02036 call plframe 02037 else if(idev.eq.16)then 02038 call ps page(1) 02039 else if (idev.eq.17) then 02040 write(6,'(''Click right-hand mouse button' 02041 $ ' in window to exit X.'')') 02042 call mcdxidle 02043 call mcdxreset 02044 end if 02045 go to 200 02046 c 02047 c----------------------------------------------------------------------- 02048 c 02049 entry set_win(iwin, iret) 02050 c *************** 02051 c Choose output window. * SET_WIN * 02052 c *************** 02053 c 02054 if (idev.eq.17) then 02055 iret = mcdxsetwin(iwin) 02056 c 02057 c Return status is -1 on error. 02058 c 02059 end if 02060 c 02061 return 02062 c 02063 c----------------------------------------------------------------------- 02064 c 02065 entry kill_win(iwin) 02066 c *************** 02067 c Kill output window. * KILL_WIN * 02068 c *************** 02069 c 02070 if (idev.eq.17) then 02071 call mcdxkillwin(iwin) 02072 if (mcdxnopen().le.0) then 02073 c 02074 c No windows left! 02075 c 02076 idev = 0 02077 device = ' ' 02078 iin = 0 02079 idevon = 0 02080 end if 02081 end if 02082 c 02083 return 02084 c 02085 c----------------------------------------------------------------------- 02086 c 02087 entry iconify_win(iwin) 02088 c *************** 02089 c Iconify an output X window. * ICONIFY_WIN * 02090 c *************** 02091 c 02092 call mcdxiconifywin(iwin) 02093 c 02094 return 02095 c 02096 c----------------------------------------------------------------------- 02097 c 02098 entry iconify_all 02099 c *************** 02100 c Iconify all output X windows. * ICONIFY_ALL * 02101 c *************** 02102 c 02103 call mcdxiconifyall() 02104 c 02105 return 02106 c 02107 c----------------------------------------------------------------------- 02108 c 02109 entry set_colormap(filename,ier) 02110 c *************** 02111 c Load a colormap from a file. * SET_COLORMAP* 02112 c *************** 02113 c 02114 nf = 0 02115 do i=len(filename),1,-1 02116 if (nf.eq.0.and.filename(i:i).gt.' ') nf = i 02117 end do 02118 c 02119 c HP fortran doesn't understand '\0'... 02120 c 02121 call mcdxsetwincolormap(filename(1:nf) 02122 c 02123 return 02124 c 02125 c----------------------------------------------------------------------- 02126 c 02127 entry win_read_line(string) 02128 c ***************** 02129 c Read a line of text from the (X) window system. * WIN_READ_LINE * 02130 c ***************** 02131 c 02132 if (mcdxnopen().gt.0) then 02133 call mcdxread_line(string) 02134 end if 02135 c 02136 return 02137 c 02138 c----------------------------------------------------------------------- 02139 c 02140 entry routine id(id string) 02141 c **************** 02142 c Identify key routines. * ROUTINE ID * 02143 c **************** 02144 c 02145 if (idev.eq.16) then 02146 do 450 i=len(id string),1,-1 02147 if (id string(i:i).gt.' ') go to 455 02148 450 continue 02149 return 02150 455 write(42,'(''%%% Routine '',a,'':'')')id string(1:i) 02151 end if 02152 c 02153 return 02154 c 02155 c----------------------------------------------------------------------- 02156 c 02157 entry mcquit 02158 iquit = 0 02159 go to 1000 02160 c 02161 entry mcquit1 02162 iquit = 1 02163 c ************ 02164 c Terminate graphics session. * MCQUIT * 02165 c ************ 02166 1000 if (isun.gt.0) then 02167 write(6,'(''Enter <CR> to terminate graphics.'')') 02168 call plstop 02169 isun = 0 02170 end if 02171 c 02172 c NOTE: The system call in psquit apparently requires that SunCore 02173 c graphics be terminated before attempting to print any PostScript file. 02174 c 02175 call psquit 02176 c 02177 c Call to psquit does nothing if no PS device is open. 02178 c 02179 if (mcdxnopen().gt.0) then 02180 if (iquit.eq.1) then 02181 write(6, 02182 $ '(''Click right-hand mouse button in current' 02183 $ ' window to exit X.'')') 02184 call mcdxidle 02185 end if 02186 end if 02187 c 02188 call mcdxquit 02189 c 02190 c Remaining termination is done by devoff (label 200). 02191 c 02192 iquit = 1 02193 go to 200 02194 c 02195 end 02196 02197 02198 logical function gfxin() 02199 save 02200 c *********** 02201 c Return TRUE iff graphin will work. * GFXIN * 02202 c *********** 02203 character*80 device 02204 common /plot device/ device,aspect,idev 02205 common /dev details/ itek,ivers 02206 c 02207 if (idev.eq.15.or.idev.eq.17.or.itek.eq.1 02208 c & .or.(itek.eq.1.and.idev.ne.9.and.idev.ne.10) 02209 & ) then 02210 gfxin = .true. 02211 else 02212 gfxin = .false. 02213 end if 02214 c 02215 end 02216 02217 02218 integer function num_win(id) 02219 save 02220 c *********** 02221 c Return the number of open windows associated with id. * NUM_WIN * 02222 c *********** 02223 character*80 device 02224 common /plot device/ device,aspect,idev 02225 c 02226 logical ps_open 02227 external mcdxnopen !$pragma C (mcdxnopen) 02228 c 02229 num_win = 0 02230 if (id.gt.0) then 02231 c 02232 c PostScript and X can be open without being active. 02233 c 02234 if (id.eq.16) then 02235 if (ps_open()) num_win = 1 02236 else if (id.eq.17) then 02237 num_win = mcdxnopen() 02238 else 02239 if (id.eq.idev) num_win = 1 02240 end if 02241 end if 02242 c 02243 end 02244 02245 02246 integer function curr_win() 02247 save 02248 c ************ 02249 c Return the current output window. * CURR_WIN * 02250 c ************ 02251 character*80 device 02252 common /plot device/ device,aspect,idev 02253 c 02254 external mcdxcurrwin !$pragma C (mcdxcurrwin) 02255 c 02256 if (idev.le.0) then 02257 curr_win = -1 02258 else 02259 curr_win = 0 02260 if (idev.eq.17) curr_win = mcdxcurrwin() 02261 end if 02262 c 02263 end 02264 02265 02266 subroutine polyerase(r,s,n) 02267 save 02268 c 02269 c Erase the specified polygonal area. 02270 c 02271 external mcdxpolyf !$pragma C (mcdxpolyf) 02272 c 02273 dimension r(1),s(1) 02274 character*80 device 02275 common /plot device/ device,aspect,idev 02276 common /plot origin/ ro,so 02277 common /backgcolor/ ibackgcolor 02278 save /backgcolor/ 02279 c 02280 if(idev.eq.15)then 02281 c 02282 c Switch to absolute coordinates: 02283 c 02284 do k=1,n 02285 r(k) = r(k) + ro 02286 s(k) = s(k) + so 02287 end do 02288 c 02289 call setfillindex(0) 02290 call polygonabs2(r,s,n) 02291 c 02292 do k=1,n 02293 r(k) = r(k) - ro 02294 s(k) = s(k) - so 02295 end do 02296 c 02297 else if(idev.eq.16)then 02298 c 02299 call ps stroke 02300 call plot(r(n),s(n),3) 02301 do i=1,n 02302 call plot(r(i),s(i),2) 02303 end do 02304 write(42,'(''1.0 setgray''/''fill''/f5.3,'' setgray'')') 02305 & ipen/256. 02306 call ps color(ipen) 02307 c 02308 else if (idev.eq.17) then 02309 c 02310 c Switch to absolute coordinates: 02311 c 02312 do k=1,n 02313 r(k) = r(k) + ro 02314 s(k) = s(k) + so 02315 end do 02316 c 02317 call mcdxpolyf(r,s,n,ibackgcolor) 02318 c 02319 do k=1,n 02320 r(k) = r(k) - ro 02321 s(k) = s(k) - so 02322 end do 02323 c 02324 end if 02325 c 02326 end