1 | /*
|
---|
2 | ===========================================================================
|
---|
3 | LSEG.C -- Generalized line drawing function (Integer DDA algorithm)
|
---|
4 | Version 6 -- 1987-08-04 -- D.N. Lynx Crowe
|
---|
5 | Copyright 1985, 1986, 1987 -- D.N. Lynx Crowe
|
---|
6 | ===========================================================================
|
---|
7 | */
|
---|
8 |
|
---|
9 | short (*point)();
|
---|
10 |
|
---|
11 | #define ABS(x) ((x) < 0 ? (-(x)) : (x))
|
---|
12 | #define SIGN(x) ((x) < 0 ? (-1) : ((x) ? 1 : 0))
|
---|
13 |
|
---|
14 | #define LE <=
|
---|
15 |
|
---|
16 | /*
|
---|
17 | =============================================================================
|
---|
18 | lseg(x1, y1, x2, y2, t) -- draw a line from ('x1', 'y1') to ('x2', 'y2')
|
---|
19 | in drawing mode 't'.
|
---|
20 |
|
---|
21 | All coordinates are short integers in whatever plotting units the
|
---|
22 | 'point' function expects. No clipping or scaling is done, as this is
|
---|
23 | the lowest level 'line' primitive in the drawing code, and coordinates
|
---|
24 | are expected to have already been checked and found to be on screen.
|
---|
25 |
|
---|
26 | The 'point' variable must be initialized to point at the
|
---|
27 | pixel plotting function before this function is called. The pixel
|
---|
28 | plotting function is passed 3 arguments: the x coordinate, the y
|
---|
29 | coordinate, and the plotting mode. It is declared here as type 'short',
|
---|
30 | but any value it returns will be ignored.
|
---|
31 |
|
---|
32 | The register variable assignments were chosen based on the Alcyon C
|
---|
33 | compiler for the Atari 1040ST and reflect the capabilities of that
|
---|
34 | compiler. Other compilers may require different optimizations based
|
---|
35 | on their use of register variables.
|
---|
36 | =============================================================================
|
---|
37 | */
|
---|
38 |
|
---|
39 | /* |
---|
40 |
|
---|
41 | */
|
---|
42 |
|
---|
43 | lseg(x1, y1, x2, y2, t)
|
---|
44 | short x1, y1, x2, y2, t;
|
---|
45 | {
|
---|
46 | register short dx, dy, ptx, pty, p;
|
---|
47 | short i, px, py;
|
---|
48 |
|
---|
49 | p = x2 - (ptx = x1);
|
---|
50 | dx = SIGN(p);
|
---|
51 | py = ABS(p);
|
---|
52 |
|
---|
53 | p = y2 - (pty = y1);
|
---|
54 | dy = SIGN(p);
|
---|
55 | px = ABS(p);
|
---|
56 |
|
---|
57 | (*point)(ptx, pty, t);
|
---|
58 |
|
---|
59 | if (py > px) {
|
---|
60 |
|
---|
61 | p = py >> 1;
|
---|
62 |
|
---|
63 | for (i = 1; i < py; i++) {
|
---|
64 |
|
---|
65 | ptx += dx;
|
---|
66 |
|
---|
67 | if ( (p -= px) < 0) {
|
---|
68 |
|
---|
69 | pty += dy;
|
---|
70 | p += py;
|
---|
71 | }
|
---|
72 |
|
---|
73 | (*point)(ptx, pty, t);
|
---|
74 | }
|
---|
75 |
|
---|
76 | } else {
|
---|
77 |
|
---|
78 | p = px >> 1;
|
---|
79 |
|
---|
80 | for (i = 1; i LE px; i++) {
|
---|
81 |
|
---|
82 | pty += dy;
|
---|
83 |
|
---|
84 | if ( (p -= py) < 0) {
|
---|
85 |
|
---|
86 | ptx += dx;
|
---|
87 | p += px;
|
---|
88 | }
|
---|
89 |
|
---|
90 | (*point)(ptx, pty, t);
|
---|
91 | }
|
---|
92 | }
|
---|
93 | }
|
---|