mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-25 12:05:53 +00:00
115 lines
2.2 KiB
C
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
|