0,0 → 1,121 |
{ |
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 = p1->r << 8; |
g = p1->g << 8; |
b = p1->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 |