{ int n, dx, dy, sx, pp_inc_1, pp_inc_2; register int a; register PIXEL *pp; #if defined(INTERP_RGB) || TGL_FEATURE_RENDER_BITS == 24 register unsigned int r, g, b; #endif #ifdef INTERP_RGB register unsigned int rinc, ginc, binc; #endif #ifdef INTERP_Z register unsigned short *pz; int zinc; register int z, zz; #endif if (p1->y > p2->y || (p1->y == p2->y && p1->x > p2->x)) { ZBufferPoint *tmp; tmp = p1; p1 = p2; p2 = tmp; } sx = zb->xsize; pp = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p1->y + p1->x * PSZB); #ifdef INTERP_Z pz = zb->zbuf + (p1->y * sx + p1->x); z = p1->z; #endif dx = p2->x - p1->x; dy = p2->y - p1->y; #ifdef INTERP_RGB r = p2->r << 8; g = p2->g << 8; b = p2->b << 8; #elif TGL_FEATURE_RENDER_BITS == 24 /* for 24 bits, we store the colors in different variables */ r = p2->r >> 8; g = p2->g >> 8; b = p2->b >> 8; #endif #ifdef INTERP_RGB #define RGB(x) x #if TGL_FEATURE_RENDER_BITS == 24 #define RGBPIXEL pp[0] = r >> 16, pp[1] = g >> 16, pp[2] = b >> 16 #else #define RGBPIXEL *pp = RGB_TO_PIXEL(r >> 8,g >> 8,b >> 8) #endif #else /* INTERP_RGB */ #define RGB(x) #if TGL_FEATURE_RENDER_BITS == 24 #define RGBPIXEL pp[0] = r, pp[1] = g, pp[2] = b #else #define RGBPIXEL *pp = color #endif #endif /* INTERP_RGB */ #ifdef INTERP_Z #define ZZ(x) x #define PUTPIXEL() \ { \ zz=z >> ZB_POINT_Z_FRAC_BITS; \ if (ZCMP(zz,*pz)) { \ RGBPIXEL; \ *pz=zz; \ } \ } #else /* INTERP_Z */ #define ZZ(x) #define PUTPIXEL() RGBPIXEL #endif /* INTERP_Z */ #define DRAWLINE(dx,dy,inc_1,inc_2) \ n=dx;\ ZZ(zinc=(p2->z-p1->z)/n);\ RGB(rinc=((p2->r-p1->r) << 8)/n;\ ginc=((p2->g-p1->g) << 8)/n;\ binc=((p2->b-p1->b) << 8)/n);\ a=2*dy-dx;\ dy=2*dy;\ dx=2*dx-dy;\ pp_inc_1 = (inc_1) * PSZB;\ pp_inc_2 = (inc_2) * PSZB;\ do {\ PUTPIXEL();\ ZZ(z+=zinc);\ RGB(r+=rinc;g+=ginc;b+=binc);\ if (a>0) { pp=(PIXEL *)((char *)pp + pp_inc_1); ZZ(pz+=(inc_1)); a-=dx; }\ else { pp=(PIXEL *)((char *)pp + pp_inc_2); ZZ(pz+=(inc_2)); a+=dy; }\ } while (--n >= 0); /* fin macro */ if (dx == 0 && dy == 0) { PUTPIXEL(); } else if (dx > 0) { if (dx >= dy) { DRAWLINE(dx, dy, sx + 1, 1); } else { DRAWLINE(dy, dx, sx + 1, sx); } } else { dx = -dx; if (dx >= dy) { DRAWLINE(dx, dy, sx - 1, -1); } else { DRAWLINE(dy, dx, sx - 1, sx); } } } #undef INTERP_Z #undef INTERP_RGB /* internal defines */ #undef DRAWLINE #undef PUTPIXEL #undef ZZ #undef RGB #undef RGBPIXEL