home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d2xx
/
d267
/
diglib.lha
/
Diglib
/
diglib.zoo
/
diglib
/
GSDRW2.FOR
< prev
next >
Wrap
Text File
|
1989-06-20
|
3KB
|
101 lines
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