{
    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 ZPOINT *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;
#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()              \
  {                     \
    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 
