Merge branch 'master' of ssh://repo.or.cz/srv/git/tgl
[tgl.git] / src / zline.h
blob081b551c20c6027e74b0a1e516f3a692ec8f7675
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
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;
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
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
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 */
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 } \
69 #else /* INTERP_Z */
70 #define ZZ(x)
71 #define PUTPIXEL() RGBPIXEL
72 #endif /* INTERP_Z */
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);
93 /* fin macro */
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);
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);
113 #undef INTERP_Z
114 #undef INTERP_RGB
116 /* internal defines */
117 #undef DRAWLINE
118 #undef PUTPIXEL
119 #undef ZZ
120 #undef RGB
121 #undef RGBPIXEL