home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 1 / 1173 < prev    next >
Internet Message Format  |  1990-12-28  |  31KB

  1. From: jcs@crash.cts.com (John Schultz)
  2. Newsgroups: alt.sources
  3. Subject: FC Clipper
  4. Message-ID: <2199@crash.cts.com>
  5. Date: 13 Apr 90 04:48:43 GMT
  6.  
  7.  
  8.  
  9.  
  10.                  
  11.  
  12.  
  13.                     SOURCE CODE FOR THE FC CLIPPER
  14.                                4/10/90
  15.  
  16.  
  17.   The Fast Clipper (FC) 2D line clipper algorithm uses line encoding
  18. as opposed to end point encoding as with the Cohen-Sutherland (CS)
  19. method, or parametric methods of Liang-Barsky and Cyrus-Beck.  The
  20. Sobkow-Pospisil-Yang paper shows benchmarks where the FC clipper
  21. is over twice as fast as the CS algorithm. The parametric methods are
  22. much slower.  The paper has a source code listing in C, which has a few
  23. errors.  These errors were in the #define statements for clipping to
  24. screen edges.  A divide and a subtract were left out:
  25.  
  26.   as published:
  27.     #define ClipPTop (*Px) = (*Px) + ((*Qx) - (*Px)) * (YTop - (*Py))
  28.  
  29.   should read:
  30.     #define ClipPTop (*Px) = (*Px) + ((*Qx) - (*Px)) * (YTop - (*Py)) /
  31.                                      ((*Qy) - (*Py))
  32.  
  33.   Once these errors were corrected, the algorithm worked properly.
  34. At the time I was experimenting with clipping, I was using a Modula-2
  35. compiler, so my HLL source is in modula-2.  The latest version is in
  36. 68000 assembly, linked to C test code.  
  37.  
  38.   The original paper on the FC algorithm was published in
  39. Computers & Graphics Vol. 11, No. 4, pp. 459-467, 1987
  40. Printed in Great Britain.  The publisher was Pergamon Journals Ltd.
  41.  
  42. Authors of the paper (Creators of the FC algorithm):
  43.  
  44.   Mark S. Sobkow, Paul Pospisil, and Yee-Hong Yang (to whom
  45. correspondence should be addressed), 
  46. Department of Computational Science, University of Saskatchewan, Saskatoon,
  47. Saskatchewan, Canada S7N 0W0.
  48.  
  49.  
  50.   I never tested my code against any other algorithms, so I'm curious to
  51. see if it is twice as fast as SC. Please let me know of any further
  52. optimizations.
  53.  
  54.  
  55.   Also, quite a few requests were for the C source, so someone might
  56. want to convert the Modula-2 source to C and re-post.
  57.  
  58.  
  59.  
  60.   John
  61.  
  62.  
  63. Here is the source code. Each file is separated by a 2 rows of 
  64. asteriks.
  65.  
  66. ***********************************************************************
  67. FILE: Clip.a
  68. ***********************************************************************
  69.  
  70. ; Clip.a,  Fast Clipper (FC).
  71.  
  72. ; A modified implementation of the Sobkow-Pospisil-Yang clipping algorithm.
  73. ; References: Computers & Graphics, Vol. 11. No. 4, pp. 459-467, 1987.
  74.  
  75. ; This algorithm uses line encoding as opposed to end point encoding.
  76.  
  77. ; Created 19-Nov-89
  78. ; by John C. Schultz
  79.  
  80.  
  81. ; Successfully assembled with Lattice 5.04 asm, CAPE 2.5, and Devpac 2.14.
  82.  
  83.  
  84.     section Clip,CODE
  85.  
  86.     xdef    _minX
  87.     xdef    _maxX
  88.     xdef    _minY
  89.     xdef    _maxY
  90.     xdef    _clipline
  91.  
  92. ; User definable clipping window.
  93.  
  94. _minX    dc.w    0        ; Popular defaults
  95. _maxX    dc.w    319
  96. _minY    dc.w    0
  97. _maxY    dc.w    199
  98.  
  99. ; code size can be reduced (with a loss of speed) by using
  100. ; bra's and bsr's instead of complete inline expanded macros.
  101.  
  102. ; ClipEdge: \2 = result, d0,d1 are scratched
  103. CLIPEDGE    MACRO        ; comments as per clip minX edge:
  104.     move.w    \1,d0        ;   copy p.y
  105.     sub.w    \2,d0        ;   d0 = p.y - s.y
  106.     move.w    \3,d1        ;   copy _minX(pc)
  107.     sub.w    \4,d1        ;   d1 = _minX(pc) - s.x
  108.     muls    d0,d1        ;   d1 = (p.y - s.y)*(_minX(pc) - s.x)
  109.     move.w    \5,d0        ;   copy p.x
  110.     sub.w    \4,d0        ;   d0 = p.x - s.x
  111.     divs    d0,d1        ;   d1 = deltay
  112.     add.w    d1,\2        ;   \2 = deltay + s.y
  113.         ENDM
  114.  
  115. clippmaxY    macro
  116.     CLIPEDGE d4,d2,_maxY(pc),d3,d5
  117.     move.w    _maxY(pc),d3
  118.         endm
  119.  
  120. clippminY    macro
  121.     CLIPEDGE d4,d2,_minY(pc),d3,d5
  122.     move.w    _minY(pc),d3
  123.         endm
  124.  
  125. clippmaxX    macro
  126.     CLIPEDGE d5,d3,_maxX(pc),d2,d4
  127.     move.w    _maxX(pc),d2
  128.         endm
  129.  
  130. clippminX    macro
  131.     CLIPEDGE d5,d3,_minX(pc),d2,d4
  132.     move.w    _minX(pc),d2
  133.         endm
  134.  
  135. clipqmaxY    macro
  136.     CLIPEDGE d2,d4,_maxY(pc),d5,d3
  137.     move.w    _maxY(pc),d5
  138.         endm
  139.  
  140. clipqminY    macro
  141.     CLIPEDGE d2,d4,_minY(pc),d5,d3
  142.     move.w    _minY(pc),d5
  143.         endm
  144.  
  145. clipqmaxX    macro
  146.     CLIPEDGE d3,d5,_maxX(pc),d4,d2
  147.     move.w    _maxX(pc),d4
  148.         endm
  149.  
  150. clipqminX    macro
  151.     CLIPEDGE d3,d5,_minX(pc),d4,d2
  152.     move.w    _minX(pc),d4
  153.         endm
  154.  
  155. accept    macro
  156.     movem.w    d2/d3/d4/d5,(a0)
  157.     moveq.l    #1,d0
  158.     movem.l    (sp)+,d2-d5
  159.     rts
  160.     endm
  161.  
  162. reject    macro
  163.     moveq.l    #0,d0
  164.     movem.l    (sp)+,d2-d5
  165.     rts
  166.     endm
  167.  
  168.  
  169. ; Fast Clipper (FC) line clipping algorithm.
  170. ; a0 = line pointer, format: px,py,qx,qy.
  171. ; d0 = return value, 1 = visible, 0 = invisible
  172. _clipline
  173.     movem.l    d2-d5,-(sp)
  174.  
  175.     movem.w    (a0),d2/d3/d4/d5 ; px,py,qx,qy
  176.  
  177. ; px = d2
  178. ; py = d3
  179. ; qx = d4
  180. ; qy = d5
  181.  
  182.     moveq.l    #0,d1        ; clear line code
  183.  
  184. ; There might be a way to do the following using ROXL, with no
  185. ; branches (10 cycles a pop)...
  186.  
  187. ; check qx,qy.
  188.  
  189. checkqmaxY
  190.     cmp.w    _maxY(pc),d5    ; y maxY ok?
  191.     ble.b    checkqminY    ; yes.
  192.     addq.w    #8,d1        ; else set code bit
  193.     bra.b    checkqmaxX
  194. checkqminY
  195.     cmp.w    _minY(pc),d5    ; y minY ok?
  196.     bge.b    checkqmaxX    ; yes.
  197.     addq.w    #4,d1        ; else set code bit
  198. checkqmaxX
  199.     cmp.w    _maxX(pc),d4    ; x maxX ok?
  200.     ble.b    checkqminX    ; yes
  201.     addq.w    #2,d1        ; else set code bit
  202. checkqminX
  203.     cmp.w    _minX(pc),d4    ; x minX ok?
  204.     bge.b    checkpmaxY    ; yes
  205.     addq.w    #1,d1        ; else set code bit
  206.  
  207. ; check px,py.
  208.  
  209. checkpmaxY
  210.     cmp.w    _maxY(pc),d3    ; y maxY ok?
  211.     ble.b    checkpminY    ; yes.
  212.     add.w    #128,d1        ; else set code bit
  213.     bra.b    checkpmaxX
  214. checkpminY
  215.     cmp.w    _minY(pc),d3    ; y minY ok?
  216.     bge.b    checkpmaxX    ; yes.
  217.     add.w    #64,d1        ; else set code bit
  218. checkpmaxX
  219.     cmp.w    _maxX(pc),d2    ; x maxX ok?
  220.     ble.b    checkpminX    ; yes
  221.     add.w    #32,d1        ; else set code bit
  222. checkpminX
  223.     cmp.w    _minX(pc),d2    ; x minX ok?
  224.     bge.b    checkcode    ; yes
  225.     add.w    #16,d1        ; else set code bit
  226.  
  227. checkcode
  228.     add.w    d1,d1        ; entries are 4 bytes
  229.     add.w    d1,d1
  230.     lea    casetable(pc),a1
  231.     movea.l    0(a1,d1.w),a1
  232.     jmp    (a1)        ; perform specific clipping action.
  233.  
  234. ; Specific line case functions.
  235.  
  236. ; From the Center
  237.  
  238. case00    accept
  239. case01    clipqminX
  240.     accept
  241. case02    clipqmaxX
  242.     accept
  243. case04    clipqminY
  244.     accept
  245. case05    clipqminX
  246.     cmp.w    _minY(pc),d5    ; qy < minY?
  247.     bge.b    1$
  248.     clipqminY
  249. 1$    accept
  250. case06    clipqmaxX
  251.     cmp.w    _minY(pc),d5    ; qy < minY?
  252.     bge.b    1$
  253.     clipqminY
  254. 1$    accept
  255. case08    clipqmaxY
  256.     accept
  257. case09    clipqminX
  258.     cmp.w    _maxY(pc),d5    ; qy > maxY?
  259.     ble.b    1$
  260.     clipqmaxY
  261. 1$    accept
  262. case0A    clipqmaxX
  263.     cmp.w    _maxY(pc),d5    ; qy > maxY?
  264.     ble.b    1$
  265.     clipqmaxY
  266. 1$    accept
  267.  
  268. ; From the minX
  269.  
  270. case10    clippminX
  271.     accept
  272. case11    reject
  273. case12    clippminX
  274.     clipqmaxX
  275.     accept
  276. case14    clippminX
  277.     cmp.w    _minY(pc),d3    ; py < minY?
  278.     bge.b    1$
  279.     reject
  280. 1$    clipqminY
  281.     accept
  282. case15    reject
  283. case16    clippminX
  284.     cmp.w    _minY(pc),d3    ; py < minY?
  285.     bge.b    1$
  286.     reject
  287. 1$    clipqminY
  288.     cmp.w    _maxX(pc),d4    ; qx > maxX?
  289.     ble.b    2$
  290.     clipqmaxX
  291. 2$    accept
  292. case18    clippminX
  293.     cmp.w    _maxY(pc),d3    ; py > maxY?
  294.     ble.b    1$
  295.     reject
  296. 1$    clipqmaxY
  297.     accept
  298. case19    reject
  299. case1A    clippminX
  300.     cmp.w    _maxY(pc),d3    ; py > maxY?
  301.     ble.b    1$
  302.     reject
  303. 1$    clipqmaxY
  304.     cmp.w    _maxX(pc),d4    ; qx > maxX?
  305.     ble.b    2$
  306.     clipqmaxX
  307. 2$    accept
  308.  
  309. ; From maxX
  310.  
  311. case20    clippmaxX
  312.     accept
  313. case21    clippmaxX
  314.     clipqminX
  315.     accept
  316. case22    reject
  317. case24    clippmaxX
  318.     cmp.w    _minY(pc),d3    ; py < minY?
  319.     bge.b    1$
  320.     reject
  321. 1$    clipqminY
  322.     accept
  323. case25    clippmaxX
  324.     cmp.w    _minY(pc),d3    ; py < minY?
  325.     bge.b    1$
  326.     reject
  327. 1$    clipqminY
  328.     cmp.w    _minX(pc),d4    ; qx < minX?
  329.     bge.b    2$
  330.     clipqminX
  331. 2$    accept
  332. case26    reject
  333. case28    clippmaxX
  334.     cmp.w    _maxY(pc),d3    ; py > maxY?
  335.     ble.b    1$
  336.     reject
  337. 1$    clipqmaxY
  338.     accept
  339. case29    clippmaxX
  340.     cmp.w    _maxY(pc),d3    ; py > maxY?
  341.     ble.b    1$
  342.     reject
  343. 1$    clipqmaxY
  344.     cmp.w    _minX(pc),d4    ; qx < minX?
  345.     bge.b    2$
  346.     clipqminX
  347. 2$    accept
  348. case2A    reject
  349.  
  350. ; From minY
  351.  
  352. case40    clippminY
  353.     accept
  354. case41    clippminY
  355.     cmp.w    _minX(pc),d2    ; px < minX?
  356.     bge.b    1$
  357.     reject
  358. 1$    clipqminX
  359.     cmp.w    _minY(pc),d5    ; qy < minY?
  360.     bge.b    2$
  361.     clipqminY
  362. 2$    accept
  363. case42    clippminY
  364.     cmp.w    _maxX(pc),d2    ; px > maxX?
  365.     ble.b    1$
  366.     reject
  367. 1$    clipqmaxX
  368.     accept
  369. case44    ; reject
  370. case45    ; reject
  371. case46    reject
  372. case48    clippminY
  373.     clipqmaxY
  374.     accept
  375. case49    clippminY
  376.     cmp.w    _minX(pc),d2    ; px < minX?
  377.     bge.b    1$
  378.     reject
  379. 1$    clipqminX
  380.     cmp.w    _maxY(pc),d5    ; qy > maxY?
  381.     ble.b    2$
  382.     clipqmaxY
  383. 2$    accept
  384. case4A    clippminY
  385.     cmp.w    _maxX(pc),d2    ; px > maxX?
  386.     ble.b    1$
  387.     reject
  388. 1$    clipqmaxX
  389.     cmp.w    _maxY(pc),d5    ; qy > maxY?
  390.     ble.b    2$
  391.     clipqmaxY
  392. 2$    accept
  393.  
  394. ; From Lower minX
  395.  
  396. case50    clippminX
  397.     cmp.w    _minY(pc),d3    ; py < minY?
  398.     bge.b    1$
  399.     clippminY
  400. 1$    accept
  401. case51    reject
  402. case52    clipqmaxX
  403.     cmp.w    _minY(pc),d5    ; qy < minY?
  404.     bge.b    1$
  405.     reject
  406. 1$    clippminY
  407.     cmp.w    _minX(pc),d2    ; px < minX?
  408.     bge.b    2$
  409.     clippminX
  410. 2$    accept
  411. case54  ; reject
  412. case55    ; reject
  413. case56    reject
  414. case58    clipqmaxY
  415.     cmp.w    _minX(pc),d4    ; qx < minX?
  416.     bge.b    1$
  417.     reject
  418. 1$    clippminY
  419.     cmp.w    _minX(pc),d2    ; px < minX?
  420.     bge.b    2$
  421.     clippminX
  422. 2$    accept
  423. case59    reject
  424. case5A    clippminX
  425.     cmp.w    _maxY(pc),d3    ; py > maxY?
  426.     ble.b    1$
  427.     reject
  428. 1$    clipqmaxX
  429.     cmp.w    _minY(pc),d5    ; qy < minY?
  430.     bge.b    2$
  431.     reject
  432. 2$    cmp.w    _minY(pc),d3    ; py < minY?
  433.     bge.b    3$
  434.     clippminY
  435. 3$    cmp.w    _maxY(pc),d5    ; qy > maxY?
  436.     ble.b    4$
  437.     clipqmaxY
  438. 4$    accept
  439.  
  440. ; From Lower maxX
  441.  
  442. case60    clippmaxX
  443.     cmp.w    _minY(pc),d3    ; py < minY?
  444.     bge.b    1$
  445.     clippminY
  446. 1$    accept
  447. case61    clipqminX
  448.     cmp.w    _minY(pc),d5    ; qy < minY?
  449.     bge.b    1$
  450.     reject
  451. 1$    clippminY
  452.     cmp.w    _maxX(pc),d2    ; px > maxX?
  453.     ble.b    2$
  454.     clippmaxX
  455. 2$    accept
  456. case62    ; reject
  457. case64    ; reject
  458. case65    ; reject
  459. case66    reject
  460. case68    clipqmaxY
  461.     cmp.w    _maxX(pc),d4    ; qx > maxX?
  462.     ble.b    1$
  463.     reject
  464. 1$    clippmaxX
  465.     cmp.w    _minY(pc),d3    ; py < minY?
  466.     bge.b    2$
  467.     clippminY
  468. 2$    accept
  469. case69    clipqminX
  470.     cmp.w    _minY(pc),d5    ; qy < minY?
  471.     bge.b    1$
  472.     reject
  473. 1$    clippmaxX
  474.     cmp.w    _maxY(pc),d3    ; py > maxY?
  475.     ble.b    2$
  476.     reject
  477. 2$    cmp.w    _maxY(pc),d5    ; qy > maxY?
  478.     ble.b    3$
  479.     clipqmaxY
  480. 3$    cmp.w    _minY(pc),d3    ; py < minY?
  481.     bge.b    4$
  482.     clippminY
  483. 4$    accept
  484. case6A    reject
  485.  
  486. ; From maxY
  487.  
  488. case80    clippmaxY
  489.     accept
  490. case81    clippmaxY
  491.     cmp.w    _minX(pc),d2    ; px < minX?
  492.     bge.b    1$
  493.     reject
  494. 1$    clipqminX
  495.     accept
  496. case82    clippmaxY
  497.     cmp.w    _maxX(pc),d2    ; px > maxX?
  498.     ble.b    1$
  499.     reject
  500. 1$    clipqmaxX
  501.     accept
  502. case84    clippmaxY
  503.     clipqminY
  504.     accept
  505. case85    clippmaxY
  506.     cmp.w    _minX(pc),d2    ; px < minX?
  507.     bge.b    1$
  508.     reject
  509. 1$    clipqminX
  510.     cmp.w    _minY(pc),d5    ; qy < minY?
  511.     bge.b    2$
  512.     clipqminY
  513. 2$    accept
  514. case86    clippmaxY
  515.     cmp.w    _maxX(pc),d2    ; px > maxX?
  516.     ble.b    1$
  517.     reject
  518. 1$    clipqmaxX
  519.     cmp.w    _minY(pc),d5    ; qy < minY?
  520.     bge.b    2$
  521.     clipqminY
  522. 2$    accept
  523. case88    ; reject
  524. case89    ; reject
  525. case8A    reject
  526.  
  527. ; From Upper minX
  528.  
  529. case90    clippminX
  530.     cmp.w    _maxY(pc),d3    ; py > maxY?
  531.     ble.b    1$
  532.     clippmaxY
  533. 1$    accept
  534. case91    reject
  535. case92    clipqmaxX
  536.     cmp.w    _maxY(pc),d5    ; qy > maxY?
  537.     ble.b    1$
  538.     reject
  539. 1$    clippmaxY
  540.     cmp.w    _minX(pc),d2    ; px < minX?
  541.     bge.b    2$
  542.     clippminX
  543. 2$    accept
  544. case94    clipqminY
  545.     cmp.w    _minX(pc),d4    ; qx < minX?
  546.     bge.b    1$
  547.     reject
  548. 1$    clippminX
  549.     cmp.w     _maxY(pc),d3    ; py > maxY?
  550.     ble.b    2$
  551.     clippmaxY
  552. 2$    accept
  553. case95    reject
  554. case96    clippminX
  555.     cmp.w    _minY(pc),d3    ; py < minY?
  556.     bge.b    1$
  557.     reject
  558. 1$    clipqmaxX
  559.     cmp.w    _maxY(pc),d5    ; qy > maxY?
  560.     ble.b    2$
  561.     reject
  562. 2$    cmp.w    _maxY(pc),d3    ; py > maxY?
  563.     ble.b    3$
  564.     clippmaxY
  565. 3$    cmp.w    _minY(pc),d5    ; qy < minY
  566.     bge.b    4$
  567.     clipqminY
  568. 4$    accept
  569. case98    ; reject
  570. case99    ; reject
  571. case9A    reject
  572.  
  573. ; From Upper maxX
  574.  
  575. caseA0    clippmaxX
  576.     cmp.w    _maxY(pc),d3    ; py > maxY?
  577.     ble.b    1$
  578.     clippmaxY
  579. 1$    accept
  580. caseA1    clipqminX
  581.     cmp.w    _maxY(pc),d5    ; qy > maxY?
  582.     ble.b    1$
  583.     reject
  584. 1$    clippmaxY
  585.     cmp.w    _maxX(pc),d2    ; px > maxX?
  586.     ble.b    2$
  587.     clippmaxX
  588. 2$    accept
  589. caseA2    reject
  590. caseA4    clipqminY
  591.     cmp.w    _maxX(pc),d4    ; qx > maxX?
  592.     ble.b    1$
  593.     reject
  594. 1$    clippmaxX
  595.     cmp.w    _maxY(pc),d3    ; py > maxY?
  596.     ble.b    2$
  597.     clippmaxY
  598. 2$    accept
  599. caseA5    clipqminX
  600.     cmp.w    _maxY(pc),d5    ; qy > maxY?
  601.     ble.b    1$
  602.     reject
  603. 1$    clippmaxX
  604.     cmp.w    _minY(pc),d3    ; py < minY?
  605.     bge.b    2$
  606.     reject
  607. 2$    cmp.w    _minY(pc),d5    ; qy < minY?
  608.     bge.b    3$
  609.     clipqminY
  610. 3$    cmp.w    _maxY(pc),d3    ; py > maxY?
  611.     ble.b    4$
  612.     clippmaxY
  613. 4$    accept
  614. caseA6    ; reject
  615. caseA8    ; reject
  616. caseA9    ; reject
  617. caseAA    reject
  618.  
  619. dummycase reject
  620.     
  621. casetable
  622.     dc.l    case00
  623.     dc.l    case01
  624.     dc.l    case02
  625.  
  626.     dc.l    dummycase ; 03
  627.  
  628.     dc.l    case04
  629.     dc.l    case05
  630.     dc.l    case06
  631.  
  632.     dc.l    dummycase ; 07
  633.  
  634.     dc.l    case08
  635.     dc.l    case09
  636.     dc.l    case0A
  637.  
  638.     dc.l    dummycase ; 0B 
  639.     dc.l    dummycase ; 0C
  640.     dc.l    dummycase ; 0D
  641.     dc.l    dummycase ; 0E 
  642.     dc.l    dummycase ; 0F
  643.  
  644.     dc.l    case10
  645.     dc.l    case11
  646.     dc.l    case12
  647.  
  648.     dc.l    dummycase ; 13
  649.  
  650.     dc.l    case14
  651.     dc.l    case15
  652.     dc.l    case16
  653.  
  654.     dc.l    dummycase ; 17
  655.  
  656.     dc.l    case18
  657.     dc.l    case19
  658.     dc.l    case1A
  659.  
  660.     dc.l    dummycase ; 1B 
  661.     dc.l    dummycase ; 1C
  662.     dc.l    dummycase ; 1D
  663.     dc.l    dummycase ; 1E 
  664.     dc.l    dummycase ; 1F
  665.  
  666.     dc.l    case20
  667.     dc.l    case21
  668.     dc.l    case22
  669.  
  670.     dc.l    dummycase ; 23
  671.  
  672.     dc.l    case24
  673.     dc.l    case25
  674.     dc.l    case26
  675.  
  676.     dc.l    dummycase ; 27
  677.  
  678.     dc.l    case28
  679.     dc.l    case29
  680.     dc.l    case2A
  681.  
  682.     dc.l    dummycase ; 2B 
  683.     dc.l    dummycase ; 2C
  684.     dc.l    dummycase ; 2D
  685.     dc.l    dummycase ; 2E 
  686.     dc.l    dummycase ; 2F
  687.     dc.l    dummycase ; 30 
  688.     dc.l    dummycase ; 31
  689.     dc.l    dummycase ; 32
  690.     dc.l    dummycase ; 33 
  691.     dc.l    dummycase ; 34
  692.     dc.l    dummycase ; 35 
  693.     dc.l    dummycase ; 36
  694.     dc.l    dummycase ; 37
  695.     dc.l    dummycase ; 38 
  696.     dc.l    dummycase ; 39
  697.     dc.l    dummycase ; 3A
  698.     dc.l    dummycase ; 3B 
  699.     dc.l    dummycase ; 3C
  700.     dc.l    dummycase ; 3D
  701.     dc.l    dummycase ; 3E 
  702.     dc.l    dummycase ; 3F
  703.  
  704.     dc.l    case40
  705.     dc.l    case41
  706.     dc.l    case42
  707.  
  708.     dc.l    dummycase ; 43
  709.  
  710.     dc.l    case44
  711.     dc.l    case45
  712.     dc.l    case46
  713.  
  714.     dc.l    dummycase ; 47
  715.  
  716.     dc.l    case48
  717.     dc.l    case49
  718.     dc.l    case4A
  719.  
  720.     dc.l    dummycase ; 4B 
  721.     dc.l    dummycase ; 4C
  722.     dc.l    dummycase ; 4D
  723.     dc.l    dummycase ; 4E 
  724.     dc.l    dummycase ; 4F
  725.  
  726.     dc.l    case50
  727.     dc.l    case51
  728.     dc.l    case52
  729.  
  730.     dc.l    dummycase ; 53
  731.  
  732.     dc.l    case54
  733.     dc.l    case55
  734.     dc.l    case56
  735.  
  736.     dc.l    dummycase ; 57
  737.  
  738.     dc.l    case58
  739.     dc.l    case59
  740.     dc.l    case5A
  741.  
  742.     dc.l    dummycase ; 5B 
  743.     dc.l    dummycase ; 5C
  744.     dc.l    dummycase ; 5D
  745.     dc.l    dummycase ; 5E 
  746.     dc.l    dummycase ; 5F
  747.  
  748.     dc.l    case60
  749.     dc.l    case61
  750.     dc.l    case62
  751.  
  752.     dc.l    dummycase ; 63
  753.  
  754.     dc.l    case64
  755.     dc.l    case65
  756.     dc.l    case66
  757.  
  758.     dc.l    dummycase ; 67
  759.  
  760.     dc.l    case68
  761.     dc.l    case69
  762.     dc.l    case6A
  763.  
  764.     dc.l    dummycase ; 6B 
  765.     dc.l    dummycase ; 6C
  766.     dc.l    dummycase ; 6D
  767.     dc.l    dummycase ; 6E 
  768.     dc.l    dummycase ; 6F
  769.  
  770.     dc.l    dummycase ; 70 
  771.     dc.l    dummycase ; 71
  772.     dc.l    dummycase ; 72
  773.     dc.l    dummycase ; 73 
  774.     dc.l    dummycase ; 74
  775.     dc.l    dummycase ; 75 
  776.     dc.l    dummycase ; 76
  777.     dc.l    dummycase ; 77
  778.     dc.l    dummycase ; 78 
  779.     dc.l    dummycase ; 79
  780.     dc.l    dummycase ; 7A
  781.     dc.l    dummycase ; 7B 
  782.     dc.l    dummycase ; 7C
  783.     dc.l    dummycase ; 7D
  784.     dc.l    dummycase ; 7E 
  785.     dc.l    dummycase ; 7F
  786.  
  787.     dc.l    case80
  788.     dc.l    case81
  789.     dc.l    case82
  790.  
  791.     dc.l    dummycase ; 83
  792.  
  793.     dc.l    case84
  794.     dc.l    case85
  795.     dc.l    case86
  796.  
  797.     dc.l    dummycase ; 87
  798.  
  799.     dc.l    case88
  800.     dc.l    case89
  801.     dc.l    case8A
  802.  
  803.     dc.l    dummycase ; 8B 
  804.     dc.l    dummycase ; 8C
  805.     dc.l    dummycase ; 8D
  806.     dc.l    dummycase ; 8E 
  807.     dc.l    dummycase ; 8F
  808.  
  809.     dc.l    case90
  810.     dc.l    case91
  811.     dc.l    case92
  812.  
  813.     dc.l    dummycase ; 93
  814.  
  815.     dc.l    case94
  816.     dc.l    case95
  817.     dc.l    case96
  818.  
  819.     dc.l    dummycase ; 97
  820.  
  821.     dc.l    case98
  822.     dc.l    case99
  823.     dc.l    case9A
  824.  
  825.     dc.l    dummycase ; 9B 
  826.     dc.l    dummycase ; 9C
  827.     dc.l    dummycase ; 9D
  828.     dc.l    dummycase ; 9E 
  829.     dc.l    dummycase ; 9F
  830.  
  831.     dc.l    caseA0
  832.     dc.l    caseA1
  833.     dc.l    caseA2
  834.  
  835.     dc.l    dummycase ; A3
  836.  
  837.     dc.l    caseA4
  838.     dc.l    caseA5
  839.     dc.l    caseA6
  840.  
  841.     dc.l    dummycase ; A7
  842.  
  843.     dc.l    caseA8
  844.     dc.l    caseA9
  845.     dc.l    caseAA
  846.     
  847.     END
  848.  
  849. ***********************************************************************
  850. FILE: Cliptest.c
  851. ***********************************************************************
  852.  
  853. /* Cliptest.c, by John Schultz, a modification of: */
  854.  
  855. /* This is a line drawing demo for the Commodore/Amiga  */
  856. /* Written by    John Riley, Lattice, Inc.        */
  857. /*                             */
  858.  
  859. #include <exec/types.h>
  860. #include <exec/nodes.h>
  861. #include <exec/lists.h>
  862. #include <intuition/intuition.h>
  863. #include <graphics/text.h>
  864. #include <proto/exec.h>
  865. #include <proto/graphics.h>
  866. #include <proto/intuition.h>
  867. #include <hardware/custom.h>
  868.  
  869. /***************** This is all you need for the FC clipper **************/
  870.  
  871. typedef struct {short px,py,qx,qy;} line;
  872.  
  873. extern short __asm clipline(register __a0 line * l);
  874.  
  875. extern unsigned short far minX,far minY,far maxX,far maxY;
  876.  
  877. /************************************************************************/
  878.  
  879. line l;
  880.  
  881. extern struct Custom far custom;
  882.                                             
  883. USHORT wakeup;    /* Wake me up for event */
  884. USHORT class;    /* Intu event class */
  885. USHORT code;    /* Intu event code */
  886.  
  887. struct Window *w;
  888. struct RastPort *rp,*cdrp;
  889. struct ViewPort *vp;
  890. struct IntuiMessage *message;
  891. int event(void);
  892. long rand(void);
  893. void srand(int);
  894.  
  895. /************************ Window Defines ********************************/
  896.  
  897. struct NewWindow nw = {
  898.         0,0,            /* Starting corner */
  899.         80,40,            /* Width, height */
  900.         2,1,            /* detail, block pens */
  901.     CLOSEWINDOW | NEWSIZE,        /* IDCMP flags */
  902.     WINDOWDEPTH | WINDOWDRAG | WINDOWCLOSE | GIMMEZEROZERO | WINDOWSIZING,
  903.                     /* Window flags */
  904.         NULL,            /* Pointer to first gadget */
  905.         NULL,            /* Pointer to checkmark */
  906.         "FC Clipper Test",    /* title */
  907.         NULL,            /* screen pointer */
  908.         NULL,            /* bitmap pointer */
  909.         0,0,640,400,        /* window not sized */
  910.         WBENCHSCREEN        /* type of screen */
  911.         };
  912.  
  913. int co,xlim,ylim;
  914.  
  915. short centerx,centery;
  916.  
  917. main(int argc,char * argv[])
  918. {
  919.   unsigned short linesize,halflinesize;
  920.  
  921.   if (argc > 1) {
  922.     linesize = atoi(argv[1]);
  923.     if (linesize > 32767) {
  924.       printf("Maximum line size exceeded, using 32767 (max).\n");
  925.       linesize = 32767;
  926.     }
  927.   } else {
  928.     printf("USAGE: cliptest <linesize>\n");
  929.     printf("  using default linesize of 500.\n");
  930.     linesize = 500;
  931.   } 
  932.   halflinesize = linesize >> 1;
  933.  
  934.  
  935. /************************ Set-Up routines **********************************/
  936.     GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0);
  937.     if(GfxBase == NULL) return;
  938.     IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0);
  939.     if(IntuitionBase == NULL) 
  940.         {
  941.         CloseLibrary((struct Library *)GfxBase);
  942.         return;
  943.         }
  944.     w = OpenWindow(&nw);
  945.     rp = w->RPort;            /* Get the raster port pointer */
  946.     vp = &w->WScreen->ViewPort;    /* Get the view port pointer */
  947.     SetAPen(rp,3);            /* Set foreground pen to white */
  948.     SetDrMd(rp,JAM1);        /* Draw with foreground pen */
  949.  
  950.     minX = 0;
  951.     minY = 0;
  952.     maxX = w->Width-1;
  953.     maxY = w->Height-1;
  954.  
  955.     centerx = w->Width >> 1;
  956.     centery = w->Height >> 1;
  957.  
  958.     co = 1;
  959.     do {
  960.  
  961.  /**************************  FC clipper test code *************************/
  962.  
  963.                 srand(custom.vhposr); /* video beam position */
  964.         SetAPen(rp,co);
  965.                 co = (co+1) & 3;
  966.  
  967.                 l.px = (rand() & linesize) - halflinesize + centerx;
  968.                 l.py = (rand() & linesize) - halflinesize + centery;
  969.                 l.qx = (rand() & linesize) - halflinesize + centerx;
  970.                 l.qy = (rand() & linesize) - halflinesize + centery;
  971.  
  972.                 if (clipline(&l)) {
  973.                   if ((l.px < minX) || (l.px > maxX)
  974.                    || (l.py < minY) || (l.py > maxY)  
  975.                    || (l.qx < minX) || (l.qx > maxX)
  976.                    || (l.qy < minY) || (l.qy > maxY)) {
  977.                     printf("FC Clip Error.\n");
  978.                   } else {  
  979.                     Move(rp,l.px,l.py);
  980.             Draw(rp,l.qx,l.qy);
  981.                   }
  982.                 }
  983.  
  984.  /************************** End FC clipper test code ***********************/
  985.  
  986.         if(w->UserPort->mp_SigBit)
  987.         {
  988.             message = (struct IntuiMessage *)GetMsg(w->UserPort);
  989.             if(message != NULL)
  990.             {
  991.                 class = message->Class;
  992.                 code = message->Code;
  993.                 ReplyMsg((struct Message *)message);
  994.             }
  995.         }
  996.     } while(event());
  997.     CloseWindow(w);
  998.     CloseLibrary((struct Library *)GfxBase);
  999.     CloseLibrary((struct Library *)IntuitionBase);
  1000. }
  1001.  
  1002. int event()
  1003. {
  1004.     switch(class)
  1005.     {
  1006.         case CLOSEWINDOW:
  1007.             return(0);
  1008.         case NEWSIZE:
  1009.                 maxX = w->Width-1;
  1010.             maxY = w->Height-1;
  1011.              centerx = w->Width >> 1;
  1012.             centery = w->Height >> 1;
  1013.             return(1);
  1014.  
  1015.     }
  1016.     return(1);
  1017. }
  1018.  
  1019. ***********************************************************************
  1020. FILE: Makefile
  1021. ***********************************************************************
  1022.  
  1023. cliptest: cliptest.o clip.o
  1024.   blink from lib:c.o cliptest.o clip.o to cliptest lib lib:lc.lib \
  1025.              lib:amiga.lib sd sc
  1026.  
  1027. cliptest.o: cliptest.c
  1028.   lc -O cliptest.c
  1029.  
  1030. clip.o:    clip.a
  1031.   comp:cape/cape -a clip.a -oclip.o
  1032.  
  1033. ***********************************************************************
  1034. FILE: Clip2d.def
  1035. ***********************************************************************
  1036.  
  1037. DEFINITION MODULE clip2d;
  1038.  
  1039. VAR
  1040.   XLeft,XRight,YTop,YBottom : INTEGER;
  1041.  
  1042. PROCEDURE clip2d(VAR px,py,qx,qy : INTEGER): BOOLEAN;
  1043.  
  1044. END clip2d.
  1045.  
  1046. ***********************************************************************
  1047. FILE: Clip2d.mod
  1048. ***********************************************************************
  1049.  
  1050. IMPLEMENTATION MODULE clip2d;
  1051.  
  1052. VAR
  1053.   code : CARDINAL;
  1054.  
  1055. PROCEDURE clip2d(VAR px,py,qx,qy : INTEGER): BOOLEAN;
  1056.  
  1057. (* These can be done in C with inline macros instead of functions *)
  1058.  
  1059. PROCEDURE ClipPBottom;
  1060. BEGIN
  1061.   px := (qx - px)*(YBottom - py) DIV (qy - py) + px;
  1062.   py := YBottom;
  1063. END ClipPBottom;
  1064.  
  1065. PROCEDURE ClipPTop;
  1066. BEGIN
  1067.   px := (qx - px)*(YTop - py) DIV (qy - py) + px;
  1068.   py := YTop;
  1069. END ClipPTop;
  1070.  
  1071. PROCEDURE ClipPRight;
  1072. BEGIN
  1073.   py := (qy - py)*(XRight - px) DIV (qx - px) + py;
  1074.   px := XRight;
  1075. END ClipPRight;
  1076.  
  1077. PROCEDURE ClipPLeft;
  1078. BEGIN
  1079.   py := (qy - py)*(XLeft - px) DIV (qx - px) + py;
  1080.   px := XLeft;
  1081. END ClipPLeft;
  1082.  
  1083. PROCEDURE ClipQBottom;
  1084. BEGIN
  1085.   qx := (px - qx)*(YBottom - qy) DIV (py - qy) + qx;
  1086.   qy := YBottom;
  1087. END ClipQBottom;
  1088.  
  1089. PROCEDURE ClipQTop;
  1090. BEGIN
  1091.   qx := (px - qx)*(YTop - qy) DIV (py - qy) + qx;
  1092.   qy := YTop;
  1093. END ClipQTop;
  1094.  
  1095. PROCEDURE ClipQRight;
  1096. BEGIN
  1097.   qy := (py - qy)*(XRight - qx) DIV (px - qx) + qy;
  1098.   qx := XRight;
  1099. END ClipQRight;
  1100.  
  1101. PROCEDURE ClipQLeft;
  1102. BEGIN
  1103.   qy := (py - qy)*(XLeft - qx) DIV (px - qx) + qy;
  1104.   qx := XLeft;
  1105. END ClipQLeft;
  1106.  
  1107. BEGIN
  1108.   code := 0;
  1109.   
  1110.   IF qy > YBottom THEN
  1111.     INC(code,8);
  1112.   ELSIF qy < YTop THEN
  1113.     INC(code,4);
  1114.   END;
  1115.  
  1116.   IF qx > XRight THEN
  1117.     INC(code,2);
  1118.   ELSIF qx < XLeft THEN
  1119.     INC(code,1);
  1120.   END;
  1121.  
  1122.   IF py > YBottom THEN
  1123.     INC(code,128);
  1124.   ELSIF py < YTop THEN
  1125.     INC(code,64);
  1126.   END;
  1127.  
  1128.   IF px > XRight THEN
  1129.     INC(code,32);
  1130.   ELSIF px < XLeft THEN
  1131.     INC(code,16);
  1132.   END;
  1133.   
  1134.   CASE code OF
  1135.  
  1136.    (**************  From Center ***************)
  1137.  
  1138.     00H : RETURN TRUE;
  1139.   | 01H : ClipQLeft; 
  1140.           RETURN TRUE;
  1141.   | 02H : ClipQRight; 
  1142.           RETURN TRUE;
  1143.   | 04H : ClipQTop;
  1144.           RETURN TRUE;
  1145.   | 05H : ClipQLeft;
  1146.           IF qy < YTop THEN
  1147.             ClipQTop;
  1148.           END;
  1149.           RETURN TRUE;
  1150.   | 06H : ClipQRight;
  1151.           IF qy < YTop THEN
  1152.             ClipQTop;
  1153.           END;
  1154.           RETURN TRUE;
  1155.   | 08H : ClipQBottom;
  1156.           RETURN TRUE;
  1157.   | 09H : ClipQLeft;
  1158.           IF qy > YBottom THEN
  1159.             ClipQBottom;
  1160.           END;
  1161.           RETURN TRUE;
  1162.   | 0AH : ClipQRight;
  1163.           IF qy > YBottom THEN
  1164.             ClipQBottom;
  1165.           END;
  1166.           RETURN TRUE;
  1167.  
  1168.   (**************  From Left ***************)
  1169.  
  1170.   | 10H : ClipPLeft;
  1171.           RETURN TRUE;
  1172.   | 11H : RETURN FALSE;
  1173.   | 12H : ClipPLeft;
  1174.           ClipQRight;
  1175.           RETURN TRUE;
  1176.   | 14H : ClipPLeft;
  1177.           IF py < YTop THEN
  1178.             RETURN FALSE;
  1179.           ELSE
  1180.             ClipQTop;
  1181.             RETURN TRUE;
  1182.           END;
  1183.   | 15H : RETURN FALSE;
  1184.   | 16H : ClipPLeft;
  1185.           IF py < YTop THEN
  1186.             RETURN FALSE;
  1187.           ELSE
  1188.             ClipQTop;
  1189.             IF qx > XRight THEN
  1190.               ClipQRight;
  1191.             END;
  1192.             RETURN TRUE;
  1193.           END;
  1194.   | 18H : ClipPLeft;
  1195.           IF py > YBottom THEN
  1196.             RETURN FALSE;
  1197.           ELSE
  1198.             ClipQBottom;
  1199.             RETURN TRUE;
  1200.           END;
  1201.   | 19H : RETURN FALSE;
  1202.   | 1AH : ClipPLeft;
  1203.           IF py > YBottom THEN
  1204.             RETURN FALSE;
  1205.           ELSE
  1206.             ClipQBottom;
  1207.             IF qx > XRight THEN
  1208.               ClipQRight;
  1209.             END;
  1210.             RETURN TRUE;
  1211.           END;
  1212.  
  1213.   (**************  From Right ***************)
  1214.  
  1215.   | 20H : ClipPRight;
  1216.           RETURN TRUE;
  1217.   | 21H : ClipPRight;
  1218.           ClipQLeft;
  1219.           RETURN TRUE;
  1220.   | 22H : RETURN FALSE;
  1221.   | 24H : ClipPRight;
  1222.           IF py < YTop THEN
  1223.             RETURN FALSE;
  1224.           ELSE
  1225.             ClipQTop;
  1226.             RETURN TRUE;
  1227.           END;
  1228.   | 25H : ClipPRight;
  1229.           IF py < YTop THEN
  1230.             RETURN FALSE;
  1231.           ELSE
  1232.             ClipQTop;
  1233.             IF qx < XLeft THEN
  1234.               ClipQLeft;
  1235.             END;
  1236.             RETURN TRUE;
  1237.           END;
  1238.   | 26H : RETURN FALSE;
  1239.   | 28H : ClipPRight;
  1240.           IF py > YBottom THEN
  1241.             RETURN FALSE;
  1242.           ELSE
  1243.             ClipQBottom;
  1244.             RETURN TRUE;
  1245.           END;
  1246.   | 29H : ClipPRight;
  1247.           IF py > YBottom THEN
  1248.             RETURN FALSE;
  1249.           ELSE
  1250.             ClipQBottom;
  1251.             IF qx < XLeft THEN
  1252.               ClipQLeft;
  1253.             END;
  1254.             RETURN TRUE;
  1255.           END;
  1256.   | 2AH : RETURN FALSE;
  1257.    
  1258.   (**************  From Top ***************)
  1259.  
  1260.   | 40H : ClipPTop;
  1261.           RETURN TRUE;
  1262.   | 41H : ClipPTop;
  1263.           IF px < XLeft THEN
  1264.             RETURN FALSE;
  1265.           ELSE
  1266.             ClipQLeft;
  1267.             IF qy < YTop THEN
  1268.               ClipQTop;
  1269.             END;
  1270.             RETURN TRUE;
  1271.           END;
  1272.   | 42H : ClipPTop;
  1273.           IF px > XRight THEN
  1274.             RETURN FALSE;
  1275.           ELSE
  1276.             ClipQRight;
  1277.             RETURN TRUE;
  1278.           END;
  1279.   | 44H : RETURN FALSE;
  1280.   | 45H : RETURN FALSE;
  1281.   | 46H : RETURN FALSE;
  1282.   | 48H : ClipPTop;
  1283.           ClipQBottom;
  1284.           RETURN TRUE;
  1285.   | 49H : ClipPTop;
  1286.           IF px < XLeft THEN
  1287.             RETURN FALSE;
  1288.           ELSE
  1289.             ClipQLeft;
  1290.             IF qy > YBottom THEN
  1291.               ClipQBottom;
  1292.             END;
  1293.             RETURN TRUE;
  1294.           END;
  1295.   | 4AH : ClipPTop;
  1296.           IF px > XRight THEN
  1297.             RETURN FALSE;
  1298.           ELSE
  1299.             ClipQRight;
  1300.             IF qy > YBottom THEN
  1301.               ClipQBottom;
  1302.             END;
  1303.             RETURN TRUE;
  1304.           END;
  1305.  
  1306.   (**************  From Bottom ***************)
  1307.  
  1308.   | 50H : ClipPLeft;
  1309.           IF py < YTop THEN
  1310.             ClipPTop;
  1311.           END;
  1312.           RETURN TRUE;
  1313.   | 51H : RETURN FALSE;
  1314.   | 52H : ClipQRight;
  1315.           IF qy < YTop THEN
  1316.             RETURN FALSE;
  1317.           ELSE
  1318.             ClipPTop;
  1319.             IF px < XLeft THEN
  1320.               ClipPLeft;
  1321.             END;
  1322.             RETURN TRUE;
  1323.           END;
  1324.   | 54H : RETURN FALSE;
  1325.   | 55H : RETURN FALSE;
  1326.   | 56H : RETURN FALSE;
  1327.   | 58H : ClipQBottom;
  1328.           IF qx < XLeft THEN
  1329.             RETURN FALSE;
  1330.           ELSE
  1331.             ClipPTop;
  1332.             IF px < XLeft THEN
  1333.               ClipPLeft;
  1334.             END;
  1335.             RETURN TRUE;
  1336.           END;
  1337.   | 59H : RETURN FALSE;
  1338.   | 5AH : ClipPLeft;
  1339.           IF py > YBottom THEN
  1340.             RETURN FALSE;
  1341.           ELSE
  1342.             ClipQRight;
  1343.             IF qy < YTop THEN
  1344.               RETURN FALSE;
  1345.             ELSE
  1346.               IF py < YTop THEN
  1347.                 ClipPTop;
  1348.               END;
  1349.               IF qy > YBottom THEN
  1350.                 ClipQBottom;
  1351.               END;
  1352.               RETURN TRUE;
  1353.             END;
  1354.           END;
  1355.  
  1356.   (**************  From Lower Right ***************)
  1357.  
  1358.   | 60H : ClipPRight;
  1359.           IF py < YTop THEN
  1360.             ClipPTop;
  1361.           END;
  1362.           RETURN TRUE;
  1363.   | 61H : ClipQLeft;
  1364.           IF qy < YTop THEN
  1365.             RETURN FALSE;
  1366.           ELSE
  1367.             ClipPTop;
  1368.             IF px > XRight THEN
  1369.               ClipPRight;
  1370.             END;
  1371.             RETURN TRUE;
  1372.           END;
  1373.   | 62H : RETURN FALSE;
  1374.   | 64H : RETURN FALSE;
  1375.   | 65H : RETURN FALSE;
  1376.   | 66H : RETURN FALSE;
  1377.   | 68H : ClipQBottom;
  1378.           IF qx > XRight THEN
  1379.             RETURN FALSE;
  1380.           ELSE
  1381.             ClipPRight;
  1382.             IF py < YTop THEN
  1383.               ClipPTop;
  1384.             END;
  1385.             RETURN TRUE;
  1386.           END;
  1387.   | 69H : ClipQLeft;
  1388.           IF qy < YTop THEN
  1389.             RETURN FALSE;
  1390.           ELSE
  1391.             ClipPRight;
  1392.             IF py > YBottom THEN
  1393.               RETURN FALSE;
  1394.             ELSE
  1395.               IF qy > YBottom THEN
  1396.                 ClipQBottom;
  1397.               END;
  1398.               IF py < YTop THEN
  1399.                 ClipPTop;
  1400.               END;
  1401.               RETURN TRUE;
  1402.             END;
  1403.           END;
  1404.   | 6AH : RETURN FALSE;
  1405.  
  1406.   (**************  From Bottom ***************)
  1407.    
  1408.   | 80H : ClipPBottom;
  1409.           RETURN TRUE;
  1410.   | 81H : ClipPBottom;
  1411.           IF px < XLeft THEN
  1412.             RETURN FALSE;
  1413.           ELSE
  1414.             ClipQLeft;
  1415.             RETURN TRUE;
  1416.           END;
  1417.   | 82H : ClipPBottom;
  1418.           IF px > XRight THEN
  1419.             RETURN FALSE;
  1420.           ELSE
  1421.             ClipQRight;
  1422.             RETURN TRUE;
  1423.           END;
  1424.   | 84H : ClipPBottom;
  1425.           ClipQTop;
  1426.           RETURN TRUE;
  1427.   | 85H : ClipPBottom;
  1428.           IF px < XLeft THEN
  1429.             RETURN FALSE;
  1430.           ELSE
  1431.             ClipQLeft;
  1432.             IF qy < YTop THEN
  1433.               ClipQTop;
  1434.             END;
  1435.             RETURN TRUE;
  1436.           END;
  1437.   | 86H : ClipPBottom;
  1438.           IF px > XRight THEN
  1439.             RETURN FALSE;
  1440.           ELSE
  1441.             ClipQRight;
  1442.             IF qy < YTop THEN
  1443.               ClipQTop;
  1444.             END;
  1445.             RETURN TRUE;
  1446.           END;
  1447.   | 88H : RETURN FALSE;
  1448.   | 89H : RETURN FALSE;
  1449.   | 8AH : RETURN FALSE;
  1450.  
  1451.   (**************  From Bottom ***************)
  1452.  
  1453.   | 90H : ClipPLeft;
  1454.           IF py > YBottom THEN
  1455.             ClipPBottom;
  1456.           END;
  1457.           RETURN TRUE;
  1458.   | 91H : RETURN FALSE;
  1459.   | 92H : ClipQRight;
  1460.           IF qy > YBottom THEN
  1461.             RETURN FALSE;
  1462.           ELSE
  1463.             ClipPBottom;
  1464.             IF px < XLeft THEN
  1465.               ClipPLeft;
  1466.             END;
  1467.             RETURN TRUE;
  1468.           END;
  1469.   | 94H : ClipQTop;
  1470.           IF qx < XLeft THEN
  1471.             RETURN FALSE;
  1472.           ELSE
  1473.             ClipPLeft;
  1474.             IF py > YBottom THEN
  1475.               ClipPBottom;
  1476.             END;
  1477.             RETURN TRUE;
  1478.           END;
  1479.   | 95H : RETURN FALSE;
  1480.   | 96H : ClipPLeft;
  1481.           IF py < YTop THEN
  1482.             RETURN FALSE;
  1483.           ELSE
  1484.             ClipQRight;
  1485.             IF qy > YBottom THEN
  1486.               RETURN FALSE;
  1487.             ELSE
  1488.               IF py > YBottom THEN
  1489.                 ClipPBottom;
  1490.               END;
  1491.               IF qy < YTop THEN
  1492.                 ClipQTop;
  1493.               END;
  1494.               RETURN TRUE;
  1495.             END;
  1496.           END;
  1497.   | 98H : RETURN FALSE;
  1498.   | 99H : RETURN FALSE;
  1499.   | 9AH : RETURN FALSE;
  1500.  
  1501.   (**************  From Bottom ***************)
  1502.  
  1503.   | 0A0H : ClipPRight;
  1504.            IF py > YBottom THEN
  1505.              ClipPBottom;
  1506.            END;
  1507.            RETURN TRUE;
  1508.   | 0A1H : ClipQLeft;
  1509.            IF qy > YBottom THEN
  1510.              RETURN FALSE;
  1511.            ELSE
  1512.              ClipPBottom;
  1513.              IF px > XRight THEN 
  1514.                ClipPRight;
  1515.              END;
  1516.              RETURN TRUE;
  1517.            END;
  1518.   | 0A2H : RETURN FALSE;
  1519.   | 0A4H : ClipQTop;
  1520.            IF qx > XRight THEN
  1521.              RETURN FALSE;
  1522.            ELSE
  1523.              ClipPRight;
  1524.              IF py > YBottom THEN
  1525.                ClipPBottom;
  1526.              END;
  1527.              RETURN TRUE;
  1528.            END;
  1529.   | 0A5H : ClipQLeft;
  1530.            IF qy > YBottom THEN
  1531.              RETURN FALSE;
  1532.            ELSE
  1533.              ClipPRight;
  1534.              IF py < YTop THEN
  1535.                RETURN FALSE;
  1536.              ELSE
  1537.                IF qy < YTop THEN
  1538.                  ClipQTop;
  1539.                END;
  1540.                IF py > YBottom THEN
  1541.                  ClipPBottom;
  1542.                END;
  1543.                RETURN TRUE;
  1544.              END;
  1545.            END;
  1546.   | 0A6H : RETURN FALSE;
  1547.   | 0A8H : RETURN FALSE;
  1548.   | 0A9H : RETURN FALSE;
  1549.   | 0AAH : RETURN FALSE;
  1550.  
  1551.   (************** Error Trap ***************)
  1552.  
  1553.   ELSE  (* Undefined Code *)
  1554.  
  1555.     RETURN FALSE;
  1556.  
  1557.   END; (* CASE code *)
  1558.  
  1559. END clip2d;
  1560.  
  1561. BEGIN
  1562.   XLeft   := 0;
  1563.   XRight  := 319;
  1564.   YTop    := 0;
  1565.   YBottom := 199;
  1566. END clip2d.
  1567.  
  1568. ***********************************************************************
  1569. No more files.
  1570. ***********************************************************************
  1571.