| [3ae31e9] | 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 | }
|
|---|