forked from KolibriOS/kolibrios
cd74d1af33
git-svn-id: svn://kolibrios.org@5098 a494cfbc-eb01-0410-851d-a64ba20cac60
122 lines
2.6 KiB
C
122 lines
2.6 KiB
C
{
|
|
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
|