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 >
Text File  |  1989-06-20  |  3KB  |  101 lines

  1.         SUBROUTINE GSDRW2(X0,Y0,IVIS0,X1,Y1,IVIS1)
  2. C
  3. C        CLIP LINE TO CLIPPING BOX.   PASS ON ONLY VISIBLE LINE SEGMENTS TO
  4. C        GSDRW3 TO BE DRAWN IN THE CURRENT LINE TYPE.   THIS SUBROUTINE ALSO
  5. C        WORRIES ABOUT WHETHER THE GRAPHICS DEVICE WILL REQUIRE A "MOVE"
  6. C        BEFORE THE "DRAW" IS DONE.
  7. C
  8.         INCLUDE GCCLIP.PRM
  9.         INCLUDE GCLTYP.PRM
  10. C
  11.         LOGICAL*1 LDID1
  12. C
  13. D       WRITE(9,90)X0,Y0,IVIS0
  14. D90    FORMAT('CLIPPING (',F10.3,',',F10.3,')  IVIS=',I2)
  15. D       WRITE(9,91)X1,Y1,IVIS1
  16. D91    FORMAT(' TO (',F10.3,',',F10.3,')  IVIS=',I2)
  17.         IF (IAND(IVIS0,IVIS1) .NE. 0) RETURN
  18.         IF (IVIS0 .EQ. 0) GO TO 10
  19.                 LPOSND = .FALSE.
  20.                 LINILT = .TRUE.
  21. 10      CONTINUE
  22. C
  23. C       CALCULATE THE NUMBER OF CLIPS NECESSARY
  24. C
  25.         NCLIPS = 0
  26.         IF (IVIS0 .NE. 0) NCLIPS = 1
  27.         IF (IVIS1 .NE. 0) NCLIPS = NCLIPS + 1
  28.         IF (NCLIPS .NE. 0) GO TO 100
  29. C
  30. C       LINE TOTALLY VISIBLE, JUST DRAW IT
  31. C
  32.         CALL GSDRW3(X0,Y0,X1,Y1)
  33.         RETURN
  34. C
  35. C       FIND THE INTERSECTION(S) WITH THE CLIPPING BOX EDGES
  36. C
  37. 100     CONTINUE
  38. D       WRITE(9,92)NCLIPS
  39. D92    FORMAT('NCLIPS=',I4)
  40.         LDID1 = .FALSE.
  41.         IST = 1
  42.         DX = X1-X0
  43.         IF (DX .EQ. 0.0) IST = 3
  44.         IFN = 4
  45.         DY = Y1-Y0
  46.         IF (DY .EQ. 0.0) IFN = 2
  47.         IF (IST .GT. IFN) RETURN
  48.         IVISC = IOR(IVIS0,IVIS1)
  49.         IBIT = 2**(IST-1)
  50. D       WRITE(9,93)IST,IFN
  51. D93    FORMAT('IST=',I4,'   IFN=',I4)
  52.         DO 210 I = IST, IFN
  53.         IF (IAND(IVISC,IBIT) .EQ. 0) GO TO 200
  54.         IF (I .GT. 2) GO TO 110
  55.                 XI = XCM0
  56.                 IF (I .EQ. 2) XI = XCM1
  57.                 YI = Y0 + (XI-X0)*DY/DX
  58.                 IF (YI .LT. YCM0 .OR. YI .GT. YCM1) GO TO 200
  59.                 GO TO 120
  60. 110         CONTINUE
  61.                 YI = YCM0
  62.                 IF (I .EQ. 4) YI = YCM1
  63.                 XI = X0 + (YI-Y0)*DX/DY
  64. D               WRITE(9,94)XI,YI
  65. D94        FORMAT('Y INTERSECTION',2F10.3)
  66.                 IF (XI .LT. XCM0 .OR. XI .GT. XCM1) GO TO 200
  67. 120     CONTINUE
  68. C
  69. C       GOT AN INTERSECTION.   IF IT'S THE ONLY ONE, THE DRAW THE LINE.
  70. C
  71.         IF (NCLIPS .GT. 1) GO TO 140
  72.                 IF (IVIS0 .EQ. 0) GO TO 130
  73.                         CALL GSDRW3(XI,YI,X1,Y1)
  74.                         RETURN
  75. 130                CONTINUE
  76.                         CALL GSDRW3(X0,Y0,XI,YI)
  77.                         RETURN
  78. 140         CONTINUE
  79. C
  80. C        TWO CLIPS NECESSARY. IF WE ALREADY HAVE ONE, DRAW THE DOUBLE CLIPPED
  81. C        LINE, ELSE SAVE FIRST CLIP AND WAIT FOR LAST.
  82. C        NOTE, IF DOUBLE CLIPPED, IT DOESN'T MATTER IN WHICH DIRECTION IT
  83. C        IS DRAWN.
  84. C
  85.                 IF (.NOT. LDID1) GO TO 180
  86.                         CALL GSDRW3(X2,Y2,XI,YI)
  87.                         RETURN
  88. 180                 CONTINUE
  89.                         X2 = XI
  90.                         Y2 = YI
  91.                         LDID1 = .TRUE.
  92. 200             CONTINUE
  93.         IBIT = 2*IBIT
  94. 210     CONTINUE
  95. C
  96. C       SEGMENT IS NOT VISIBLE IF WE DROP THRU TO HERE
  97. C
  98.         RETURN
  99.         END
  100.  
  101.