|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T s ┃
Length: 21743 (0x54ef) Types: TextFile Names: »subsc.f«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/utep/subsc.f«
*************************************************************************** * * subroutine dmove does the following: * ( define move) * + explain command m - move and fill * to user * + display commands options ************************************************************************** subroutine dmove c write(0,7) 7 format(5x,'This command is intended to let the user fill',/, * 5x,'user constructed polygon or background of image with',/, * 5x,'color') call mfoptns return end **************************************************************************** * * subroutine mfoptns does the following: * ( command move and fill options) * + display options * + ask user to make a selection **************************************************************************** subroutine mfoptns c write(0,17) 17 format(5x,'u- to color User constructed polygons',/, * 5x,'b- to color Background of image') write(0,27) 27 format(5x,'Input your selection') return end **************************************************************************** * * subroutine mvwhere does the following: * (move where) * + This routine called after displaying * command 'm' options * + read command * + valid command? * - yes--> * * process command * - no--> * * error-try again **************************************************************************** subroutine mvwhere character*1 choice c do 23 i=1,4 read(5,33)choice 33 format(a1) c if(choice.eq.'u'.or.choice.eq.'U')then call splyflg i=5 elseif(choice.eq.'b'.or.choice.eq.'B')then call clrbkgd i=5 else call error(3) call mfoptns endif 23 continue return end **************************************************************************** * * subroutine splyflg does the following: * (set polygon flag) * + user constructed polygon (ucp) * under construction. * + user allowed to build up to 5 (ucp) * + check number of (ucp) in image * - numpoly <= limit * * yes--> * # increment their number (numpoly) * # set (ucp) flag on * # set number of lines in polygon to zero * (lncontr) * # IMPORTANT!-- user responsibility to * construct a CLOSED polygon * using ONLY lines. * * no--> * # display warning message-limit have been * used **************************************************************************** subroutine splyflg common/poly/iflag,numpoly,ifivply(5) common/llist/lnlist(5,2),lncontr common/aucp/iaucp common/num/numitms c numpoly=numpoly+1 if(numpoly.le.5)then iflag=1 lncontr=0 write(0,14) 14 format(5x,'To construct a CLOSED polygon use command',/,5x, * 'l-line ONLY from items menu,coming up!') c c if(iaucp.eq.1)then do 34 i=1,19 if(numitms.lt.20)then if(iflag.eq.1)then call itmmenu call ditem else i=20 endif else write(0,44) 44 format(5x,'WARNING: You have used the limit ' * 'of items/page') i=20 endif 34 continue endif else write(0,24) 24 format(5x,'Warning:You have used the limit of polygons/page') numpoly=numpoly-1 endif return end ***************************************************************************** * * subroutine upolyln does the following: * (line belongs to user constructed polygon) * + set this lines deletion flag to zero * to protect user against accidental * deletion,will be set back to one * after deletion of its (ucp). * + increment (ucp) line counter (lncontr) ***************************************************************************** subroutine upolyln common/num/numitms common/table/tblitms(20,10),icolor(20),items(20) common/llist/lnlist(5,2),lncontr character*1 items c tblitms(numitms,10)=0.0 lncontr=lncontr+1 return end **************************************************************************** * * subroutine sbpovlp(bp,itsnum) does the following: * (set background or user polygon overlapping) * + segment type (bp) * - segment background (bp='b') * * does not overlap any other segment * - segment (ucp) (bp='u') * * segment overlaps all segments * + segment number (itsnum) *************************************************************************** subroutine sbpovlp(bp,itsnum) integer itsnum character*1 bp common/ovlap/iovlap(21,21) c if(bp.eq.'b')then do 25 i=1,21 iovlap(itsnum,i)=0 iovlap(i,itsnum)=0 25 continue else do 50 i=1,21 iovlap(itsnum,i)=1 iovlap(i,itsnum)=1 50 continue endif iovlap(itsnum,itsnum)=0 return end **************************************************************************** * * subroutine usrpoly does the following: * ( user constructed polygon - (ucp)) * + segment type -'u' * + enter segment info in (pwb) * + enter segment info in (ucp)s * common block **************************************************************************** subroutine usrpoly common/poly/iflag,numpoly,ifivply(5) common/num/numitms common/llist/lnlist(5,2),lncontr character*1 uply c uply='u' call enterbp(uply) ifivply(numpoly)=numitms lnlist(numpoly,1)=numitms lnlist(numpoly,2)=lncontr return end *************************************************************************** * * subroutine clrbkgd does the following: * (color background ) * + search if segment background has been * created already * - yes--> * * error--cannot create another background * segment * - no--> * * search if image contain outlined items * - yes--> * # error--cannot change color of background * segment * - no--> * # enter segment info in (pwb) * # show change in color on screen * # list content of segment table to show * changes *************************************************************************** subroutine clrbkgd common/table/tblitms(20,10),icolor(20),items(20) common/num/numitms common/contr/icnt common/space/ifree character*1 bg,items integer kclr c call srchtbl(kclr) if(kclr.ne.0)then call error(11) else bg='b' write(0,10) 10 format(5x,'Now you are going to change the background color') call enterbp(bg) call tempinf(numitms) tblitms(numitms,8)=icnt call showbg tblitms(numitms,9)=icnt-1 ifree=icnt call sendcod(numitms) do 20 i=1,numitms call tempinf(i) call sndscd(i) 20 continue call lsitems endif return end ************************************************************************** * * subroutine enterbp(borp) does the following: * (enter background or (ucp)) * + segment type (borp-'b' or 'u') * + choose segment color * + enter segment info in (pwb) * + enter segment overlapping info * in overlapping table ************************************************************************** subroutine enterbp(borp) common/table/tblitms(20,10),icolor(20),items(20) common/num/numitms integer ioneclr character*1 items,borp c call pickclr(ioneclr) numitms=numitms+1 icolor(numitms)=ioneclr tblitms(numitms,7)=1.0 if(borp.eq.'b')then items(numitms)='b' tblitms(numitms,1)=10.0 tblitms(numitms,2)=0.0 tblitms(numitms,3)=0.0 tblitms(numitms,4)=10.0 tblitms(numitms,5)=10.0 else items(numitms)='u' do 20 i=1,5 tblitms(numitms,i)=0.0 20 continue endif call sbpovlp(borp,numitms) return end ********************************************************************** * * subroutine showbg does the following: * (show background) * + build background segment from (twb). * ********************************************************************* subroutine showbg common/info/color,len,width,x1,y1,x2,y2,item common/minfo/sorhitm character*1 item integer color real x1,y1,x2,y2,len,width c call clr call dfr(color,x1,y1,x2,y2) return end ***************************************************************************** * * subroutine showbp does the following: * ( show a (ucp) ) * + build segment code in (df) * + enter segment info in (pwb) * + show segment on (AED) screen ***************************************************************************** subroutine showbp common/table/tblitms(20,10),icolor(20),items(20) common/contr/icnt common/space/ifree common/num/numitms character*1 items real xbp,ybp integer bpclr c bpclr=icolor(numitms) tblitms(numitms,8)=icnt call clr call sec(bpclr) write(0,10) 10 format(5x,'Need to move to an interior point') call makemov(xbp,ybp) call ifl tblitms(numitms,9)=icnt-1 ifree=icnt tblitms(numitms,2)=xbp tblitms(numitms,3)=ybp call sendcod(numitms) return end **************************************************************************** * * subroutine ispdone does the following: * ( is polygon done with) * + interactivly ask user if current (ucp) * done with? * - yes--> * * enter (ucp) in (pwb) * * show finished (ucp) on (AED) screen * * set (ucp) flag off (ready for next * (ucp)) * - no--> * * continue drawing * - otherwise--> * * error- undefined answer try again **************************************************************************** subroutine ispdone common/poly/iflag,numpoly,ifivply(5) character*1 ans c do 40 j=1,4 write(0,44) 44 format(5x,'Are you done with current polygon,answer:', * /,5x,'y-yes , n-no') read(5,48)ans 48 format(a1) if(ans.eq.'y'.or.ans.eq.'Y')then call usrpoly call showbp iflag=0 j=5 elseif(ans.eq.'n'.or.ans.eq.'N')then j=5 else call error(1) endif 40 continue return end ************************************************************************** * * subroutine uppoly(polyno) does the following: * ( update polygons common block) * + This routine is called after user has * issued a deletion command for (ucp) * number (polyno) * + search for (polyno)s entry in list of (ucp)s * + delete entry and update list * + decrement number of (ucp)s (numpoly) *************************************************************************** subroutine uppoly(polyno) integer polyno common/poly/iflag,numpoly,ifivply(5) common/llist/lnlist(5,2),lncontr integer num1 c call srchlst(polyno,pentry) do 25 k=pentry+1,numpoly lnlist(k,1)=lnlist(k,1)-1 ifivply(k)=ifivply(k)-1 25 continue c if(polyno.eq.1.and.numpoly.eq.1)then num1=1 else num1=numpoly-1 endif c do 45 i=pentry,num1 do 55 j=1,2 lnlist(i,j)=lnlist(i+1,j) 55 continue ifivply(i)=ifivply(i+1) 45 continue numpoly=numpoly-1 return end **************************************************************************** * * subroutine srchlst(numply,ientry) does the following: * ( search list of (ucp)s ) * + search for polygon number (numply)s * entry in list of polygons * + found? * - yes--> * * return value in (ientry) * - no--> * * return zero **************************************************************************** subroutine srchlst(numply,ientry) integer numply,ientry common/llist/lnlist(5,2),lncontr common/poly/iflag,numpoly,ifivply(5) c do 35 i=1,numpoly if(lnlist(i,1).eq.numply)then ientry=i return endif 35 continue ientry=0 return end ***************************************************************************** * * subroutine dfplyln(plynum) does the following: * set(deletion flags of polygon lines). * + This routine is called after user has * issued a command to delete a (ucp) with * number (plynum) * + search for its entry in list of (ucp) * + find how many line it have * + access (pwb) to set their deletion flags * back to ones to enable user to erase them * if he/she chooses to. ***************************************************************************** subroutine dfplyln(plynum) integer plynum common/table/tblitms(20,10),icolor(20),items(20) common/llist/lnlist(5,2),lncontr character*1 items integer index,ibegin,iend,nolines c call srchlst(plynum,index) c if(index.ne.0)then nolines=lnlist(index,2) ibegin=plynum-nolines iend=plynum-1 do 27 i=ibegin,iend tblitms(i,10)=1.0 27 continue c endif return end **************************************************************************** * * subroutine delucp(number) does the following: * ( delete (ucp) ) * + This routine is called after user has issued * a deletion command for (ucp)s number (number) * + display guiding messages to user to help him/ * her erasing the polygon correctly (because * (ucp) are special cases) * + erase (ucp) * * restructure and display image properly * (draw segment according to priorities) * + update segment table * + update (df) * + update polygons common block * + set its lines deletion flag back to ones **************************************************************************** subroutine delucp(number) integer number,entry common lstovlp(380),jo c write(0,10) 10 format(5x,'The way to erase a user constructed polygon',/, * 5x,'is to follow the construction procedure in reverse',/, * 5x,'like this') write(0,20) 20 format(5x,'The program will fill interior with background', * /,5x,'color,then you need to erase the lines one by one') call eraucp(number) call issovlp(number) call search(number,entry) call dlentry(entry) jo=jo-1 call sendsgs call updf(number) call upentry(number) call uppoly(number) call dfplyln(number) return end ************************************************************************** * * subroutine eraucp(numucp) does the following: * (erase (ucp) ) * + erase (ucp)s number (numucp) * + search for background color * + rebuild segment code with background color * + display erased (ucp) on (AED) screen ************************************************************************* subroutine eraucp(numucp) integer numucp common/table/tblitms(20,10),icolor(20),items(20) character*1 items integer ibclr,itclr c itclr=icolor(numucp) call srchtbl(ibclr) icolor(numucp)=ibclr call buldcod(numucp) call sendcod(numucp) icolor(numucp)=itclr return end ***************************************************************************** * * subroutine dlbkgd(ibgnum) does the following: * (delete back ground segment) * + segment number (ibgnum) * + search if there is any outlined items * in image * - yes--> * * error--cannot change color hollow polygons * exist in image * - no--> * * erasing color is black * * rebuild segment with new color * * show black background on screen * * update segment * * update (df) * * update segment table * * update (ucp)s numbers ****************************************************************************** subroutine dlbkgd(ibgnum) integer ibgnum common/table/tblitms(20,10),icolor(20),items(20) common/at/asegtbl(2,10),isgclr(2),seg(2) common/info/color,len,width,x1,y1,x2,y2,item common/num/numitms common/contr/icnt character*1 items,item,seg integer color,ipbeg,ipend real x1,y1,x2,y2,len,width c call tempinf(ibgnum) color=0 icnt=tblitms(ibgnum,8) call showbg tblitms(ibgnum,9)=icnt-1 call sendcod(ibgnum) call updf(ibgnum) call upentry(ibgnum) call cpnums(ibgnum) c c draw page boundary. c ipbeg=asegtbl(1,8) ipend=asegtbl(1,9) call intrprt(ipbeg,ipend) c c redraw image by sending one segment at a time. c do 20 i=1,numitms call tempinf(i) call sndscd(i) 20 continue return end ******************************************************************************* * * subroutine buldcod(elmnum) does the following: * ( build segment code ) * + This routine handles special case segments * segment background and segment (ucp) only. * + segment number (elmnum) * + build segment code in (df) * + save its (df) begin and end position in (pwb) ******************************************************************************* subroutine buldcod(elmnum) integer elmnum common/table/tblitms(20,10),icolor(20),items(20) common/contr/icnt real x,y integer elmclr character*1 items c elmclr=icolor(elmnum) icnt=tblitms(elmnum,8) x=tblitms(elmnum,2) y=tblitms(elmnum,3) call clr call sec(elmclr) call move(x,y) call ifl tblitms(elmnum,9)=icnt-1 return end ***************************************************************************** * * subroutine sendcod(tbentry) does the following: * ( send code ) * + segment number (tbentry) * + special case: * - segment page (boundary) * * find its starting and endig position * in (df) by accessing auxiliary table * + general case: * - any segment * * find its starting and ending position * in (df) by accessing segment table * + interpret code on (AED) screen ***************************************************************************** subroutine sendcod(tbentry) integer tbentry common/table/tblitms(20,10),icolor(20),items(20) common/at/asegtbl(2,10),isgclr(2),seg(2) character*1 items,seg integer begpnt,endpnt c if(tbentry.eq.21)then begpnt=asegtbl(1,8) endpnt=asegtbl(1,9) else begpnt=tblitms(tbentry,8) endpnt=tblitms(tbentry,9) endif call intrprt(begpnt,endpnt) return end ****************************************************************************** * * subroutine sendsgs does the following: * (send segments) * + send all segments in the sorted list of * overlapping segments (lstovlp) * (segment will be displayed according * to their priorities because list is * sorted in ascending manner) ****************************************************************************** subroutine sendsgs common lstovlp(380),jo c do 24 j=1,jo if(lstovlp(j).eq.21)then call sendcod(21) else call tempinf(lstovlp(j)) call sndscd(lstovlp(j)) endif 24 continue return end ****************************************************************************** * * subroutine sndscd(oneseg) does the following: * (send segment code) * + segment number (oneseg) * + erase segment (for better image) * + spacial case: * - (ucp) * * build (ucp) * + general case: * - any segment * * build segment code * + display segment on (AED) screen ****************************************************************************** subroutine sndscd(oneseg) integer oneseg common/table/tblitms(20,10),icolor(20),items(20) common/contr/icnt character*1 items c if(items(oneseg).eq.'b')then continue elseif(items(oneseg).eq.'u')then call eraucp(oneseg) call buldcod(oneseg) call sendcod(oneseg) else call eraitm(oneseg) icnt=tblitms(oneseg,8) call showitm tblitms(oneseg,9)=icnt-1 call sendcod(oneseg) endif return end ****************************************************************************** * * subroutine sctable does the following: * (set color table) * + create 12 extra colors on top * of the default (AED) color table * + colors are: * - grey * - orange * - light brown * - brown * - dark blue * - violet * - turqoise * - dark green * - (additional colors for demonstration purposes) * (light green, sky blue, dirty blue, light orange, * dark yellow, burgandy). ****************************************************************************** subroutine sctable c c call sct(8,1,150,150,150) call sct(9,1,250,100,0) call sct(10,1,250,150,0) call sct(11,1,200,100,0) call sct(12,1,0,100,150) call sct(13,1,180,0,250) call sct(14,1,0,250,200) call sct(15,1,90,150,0) call sct(16,1,0,250,150) call sct(17,1,0,200,250) call sct(18,1,0,100,100) call sct(19,1,250,150,0) call sct(20,1,250,200,0) call sct(21,1,200,50,200) return end ***************************************************************************** * * subroutine sct(iaddr,n,ir,ig,ib) does the following: * (set up color look up table) * + addr-is first location * + n-is number of consecutive location to set up * + ir-red color value * + ig-green color value * + ib-blue color value ***************************************************************************** subroutine sct(iaddr,n,ir,ig,ib) integer iaddr,n,ir,ig,ib,isctt character*1 sctt c isctt=75 sctt=char(isctt) call store(sctt) call zaed(iaddr) call zaed(n) call zaed(ir) call zaed(ig) call zaed(ib) return end ****************************************************************************** * * subroutine rstplst does the following: * (reset polygons list) * + (re) initialize (ucp) common block ****************************************************************************** subroutine rstplst common/poly/iflag,numpoly,ifivply(5) common/llist/lnlist(5,2),lncontr c do 65 i=1,5 do 55 j=1,2 lnlist(i,j)=0 55 continue ifivply(i)=0 65 continue iflag=0 numpoly=0 lncontr=0 return end