source: trunk/sys/TinyGL/src/zline.h @ 280

Last change on this file since 280 was 1, checked in by alain, 8 years ago

First import

File size: 2.6 KB
RevLine 
[1]1{
2    int n, dx, dy, sx, pp_inc_1, pp_inc_2;
3    register int a;
4    register PIXEL *pp;
5#if defined(INTERP_RGB) || TGL_FEATURE_RENDER_BITS == 24
6    register unsigned int r, g, b;
7#endif
8#ifdef INTERP_RGB
9    register unsigned int rinc, ginc, binc;
10#endif
11#ifdef INTERP_Z
12    register unsigned short *pz;
13    int zinc;
14    register int z, zz;
15#endif
16
17    if (p1->y > p2->y || (p1->y == p2->y && p1->x > p2->x)) {
18        ZBufferPoint *tmp;
19        tmp = p1;
20        p1 = p2;
21        p2 = tmp;
22    }
23    sx = zb->xsize;
24    pp = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p1->y + p1->x * PSZB);
25#ifdef INTERP_Z
26    pz = zb->zbuf + (p1->y * sx + p1->x);
27    z = p1->z;
28#endif
29
30    dx = p2->x - p1->x;
31    dy = p2->y - p1->y;
32#ifdef INTERP_RGB
33    r = p2->r << 8;
34    g = p2->g << 8;
35    b = p2->b << 8;
36#elif TGL_FEATURE_RENDER_BITS == 24
37    /* for 24 bits, we store the colors in different variables */
38    r = p2->r >> 8;
39    g = p2->g >> 8;
40    b = p2->b >> 8;
41#endif
42
43#ifdef INTERP_RGB
44#define RGB(x) x
45#if TGL_FEATURE_RENDER_BITS == 24
46#define RGBPIXEL pp[0] = r >> 16, pp[1] = g >> 16, pp[2] = b >> 16
47#else
48#define RGBPIXEL *pp = RGB_TO_PIXEL(r >> 8,g >> 8,b >> 8)
49#endif
50#else /* INTERP_RGB */
51#define RGB(x)
52#if TGL_FEATURE_RENDER_BITS == 24
53#define RGBPIXEL pp[0] = r, pp[1] = g, pp[2] = b
54#else
55#define RGBPIXEL *pp = color
56#endif
57#endif /* INTERP_RGB */
58
59#ifdef INTERP_Z
60#define ZZ(x) x
61#define PUTPIXEL()                              \
62  {                                             \
63    zz=z >> ZB_POINT_Z_FRAC_BITS;               \
64    if (ZCMP(zz,*pz))  {                        \
65      RGBPIXEL; \
66      *pz=zz;                                   \
67    }                                           \
68  }
69#else /* INTERP_Z */
70#define ZZ(x)
71#define PUTPIXEL() RGBPIXEL
72#endif /* INTERP_Z */
73
74#define DRAWLINE(dx,dy,inc_1,inc_2) \
75    n=dx;\
76    ZZ(zinc=(p2->z-p1->z)/n);\
77    RGB(rinc=((p2->r-p1->r) << 8)/n;\
78        ginc=((p2->g-p1->g) << 8)/n;\
79        binc=((p2->b-p1->b) << 8)/n);\
80    a=2*dy-dx;\
81    dy=2*dy;\
82    dx=2*dx-dy;\
83    pp_inc_1 = (inc_1) * PSZB;\
84    pp_inc_2 = (inc_2) * PSZB;\
85    do {\
86        PUTPIXEL();\
87        ZZ(z+=zinc);\
88        RGB(r+=rinc;g+=ginc;b+=binc);\
89        if (a>0) { pp=(PIXEL *)((char *)pp + pp_inc_1); ZZ(pz+=(inc_1));  a-=dx; }\
90        else { pp=(PIXEL *)((char *)pp + pp_inc_2); ZZ(pz+=(inc_2)); a+=dy; }\
91    } while (--n >= 0);
92
93/* fin macro */
94
95    if (dx == 0 && dy == 0) {
96        PUTPIXEL();
97    } else if (dx > 0) {
98        if (dx >= dy) {
99            DRAWLINE(dx, dy, sx + 1, 1);
100        } else {
101            DRAWLINE(dy, dx, sx + 1, sx);
102        }
103    } else {
104        dx = -dx;
105        if (dx >= dy) {
106            DRAWLINE(dx, dy, sx - 1, -1);
107        } else {
108            DRAWLINE(dy, dx, sx - 1, sx);
109        }
110    }
111}
112
113#undef INTERP_Z
114#undef INTERP_RGB
115
116/* internal defines */
117#undef DRAWLINE
118#undef PUTPIXEL
119#undef ZZ
120#undef RGB
121#undef RGBPIXEL
Note: See TracBrowser for help on using the repository browser.