home *** CD-ROM | disk | FTP | other *** search
- SUBROUTINE GSDRW2(X0,Y0,IVIS0,X1,Y1,IVIS1)
- C
- C CLIP LINE TO CLIPPING BOX. PASS ON ONLY VISIBLE LINE SEGMENTS TO
- C GSDRW3 TO BE DRAWN IN THE CURRENT LINE TYPE. THIS SUBROUTINE ALSO
- C WORRIES ABOUT WHETHER THE GRAPHICS DEVICE WILL REQUIRE A "MOVE"
- C BEFORE THE "DRAW" IS DONE.
- C
- INCLUDE GCCLIP.PRM
- INCLUDE GCLTYP.PRM
- C
- LOGICAL*1 LDID1
- C
- D WRITE(9,90)X0,Y0,IVIS0
- D90 FORMAT('CLIPPING (',F10.3,',',F10.3,') IVIS=',I2)
- D WRITE(9,91)X1,Y1,IVIS1
- D91 FORMAT(' TO (',F10.3,',',F10.3,') IVIS=',I2)
- IF (IAND(IVIS0,IVIS1) .NE. 0) RETURN
- IF (IVIS0 .EQ. 0) GO TO 10
- LPOSND = .FALSE.
- LINILT = .TRUE.
- 10 CONTINUE
- C
- C CALCULATE THE NUMBER OF CLIPS NECESSARY
- C
- NCLIPS = 0
- IF (IVIS0 .NE. 0) NCLIPS = 1
- IF (IVIS1 .NE. 0) NCLIPS = NCLIPS + 1
- IF (NCLIPS .NE. 0) GO TO 100
- C
- C LINE TOTALLY VISIBLE, JUST DRAW IT
- C
- CALL GSDRW3(X0,Y0,X1,Y1)
- RETURN
- C
- C FIND THE INTERSECTION(S) WITH THE CLIPPING BOX EDGES
- C
- 100 CONTINUE
- D WRITE(9,92)NCLIPS
- D92 FORMAT('NCLIPS=',I4)
- LDID1 = .FALSE.
- IST = 1
- DX = X1-X0
- IF (DX .EQ. 0.0) IST = 3
- IFN = 4
- DY = Y1-Y0
- IF (DY .EQ. 0.0) IFN = 2
- IF (IST .GT. IFN) RETURN
- IVISC = IOR(IVIS0,IVIS1)
- IBIT = 2**(IST-1)
- D WRITE(9,93)IST,IFN
- D93 FORMAT('IST=',I4,' IFN=',I4)
- DO 210 I = IST, IFN
- IF (IAND(IVISC,IBIT) .EQ. 0) GO TO 200
- IF (I .GT. 2) GO TO 110
- XI = XCM0
- IF (I .EQ. 2) XI = XCM1
- YI = Y0 + (XI-X0)*DY/DX
- IF (YI .LT. YCM0 .OR. YI .GT. YCM1) GO TO 200
- GO TO 120
- 110 CONTINUE
- YI = YCM0
- IF (I .EQ. 4) YI = YCM1
- XI = X0 + (YI-Y0)*DX/DY
- D WRITE(9,94)XI,YI
- D94 FORMAT('Y INTERSECTION',2F10.3)
- IF (XI .LT. XCM0 .OR. XI .GT. XCM1) GO TO 200
- 120 CONTINUE
- C
- C GOT AN INTERSECTION. IF IT'S THE ONLY ONE, THE DRAW THE LINE.
- C
- IF (NCLIPS .GT. 1) GO TO 140
- IF (IVIS0 .EQ. 0) GO TO 130
- CALL GSDRW3(XI,YI,X1,Y1)
- RETURN
- 130 CONTINUE
- CALL GSDRW3(X0,Y0,XI,YI)
- RETURN
- 140 CONTINUE
- C
- C TWO CLIPS NECESSARY. IF WE ALREADY HAVE ONE, DRAW THE DOUBLE CLIPPED
- C LINE, ELSE SAVE FIRST CLIP AND WAIT FOR LAST.
- C NOTE, IF DOUBLE CLIPPED, IT DOESN'T MATTER IN WHICH DIRECTION IT
- C IS DRAWN.
- C
- IF (.NOT. LDID1) GO TO 180
- CALL GSDRW3(X2,Y2,XI,YI)
- RETURN
- 180 CONTINUE
- X2 = XI
- Y2 = YI
- LDID1 = .TRUE.
- 200 CONTINUE
- IBIT = 2*IBIT
- 210 CONTINUE
- C
- C SEGMENT IS NOT VISIBLE IF WE DROP THRU TO HERE
- C
- RETURN
- END
-
-