115 lines
2.2 KiB
C

{
int n, dx, dy, sx, pp_inc_1, pp_inc_2;
register int a;
register PIXEL *pp;
#if defined(INTERP_RGB)
register unsigned int r, g, b;
#endif
#ifdef INTERP_RGB
register unsigned int rinc, ginc, binc;
#endif
#ifdef INTERP_Z
register unsigned int *pz;
int zinc;
register unsigned int z;
#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.getRawBuffer() + 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;
#endif
#ifdef INTERP_RGB
#define RGB(x) x
#define RGBPIXEL *pp = RGB_TO_PIXEL(r >> 8,g >> 8,b >> 8)
#else // INTERP_RGB
#define RGB(x)
#define RGBPIXEL *pp = color
#endif // INTERP_RGB
#ifdef INTERP_Z
#define ZZ(x) x
#define PUTPIXEL() \
{ \
if (ZCMP(z, *pz)) { \
RGBPIXEL; \
*pz = z; \
} \
}
#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