Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5098 clevermous 1
{
2
    int n, dx, dy, sx, pp_inc_1, pp_inc_2;
3
    register int a;
4
    register PIXEL *pp;
5
#if defined(INTERP_RGB) || TGL_FEATURE_RENDER_BITS == 24
6
    register unsigned int r, g, b;
7
#endif
8
#ifdef INTERP_RGB
9
    register unsigned int rinc, ginc, binc;
10
#endif
11
#ifdef INTERP_Z
12
    register unsigned short *pz;
13
    int zinc;
14
    register int z, zz;
15
#endif
16
 
17
    if (p1->y > p2->y || (p1->y == p2->y && p1->x > p2->x)) {
18
	ZBufferPoint *tmp;
19
	tmp = p1;
20
	p1 = p2;
21
	p2 = tmp;
22
    }
23
    sx = zb->xsize;
24
    pp = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p1->y + p1->x * PSZB);
25
#ifdef INTERP_Z
26
    pz = zb->zbuf + (p1->y * sx + p1->x);
27
    z = p1->z;
28
#endif
29
 
30
    dx = p2->x - p1->x;
31
    dy = p2->y - p1->y;
32
#ifdef INTERP_RGB
33
    r = p1->r << 8;
34
    g = p1->g << 8;
35
    b = p1->b << 8;
36
#elif TGL_FEATURE_RENDER_BITS == 24
37
    /* for 24 bits, we store the colors in different variables */
38
    r = p2->r >> 8;
39
    g = p2->g >> 8;
40
    b = p2->b >> 8;
41
#endif
42
 
43
#ifdef INTERP_RGB
44
#define RGB(x) x
45
#if TGL_FEATURE_RENDER_BITS == 24
46
#define RGBPIXEL pp[0] = r >> 16, pp[1] = g >> 16, pp[2] = b >> 16
47
#else
48
#define RGBPIXEL *pp = RGB_TO_PIXEL(r >> 8,g >> 8,b >> 8)
49
#endif
50
#else /* INTERP_RGB */
51
#define RGB(x)
52
#if TGL_FEATURE_RENDER_BITS == 24
53
#define RGBPIXEL pp[0] = r, pp[1] = g, pp[2] = b
54
#else
55
#define RGBPIXEL *pp = color
56
#endif
57
#endif /* INTERP_RGB */
58
 
59
#ifdef INTERP_Z
60
#define ZZ(x) x
61
#define PUTPIXEL() 				\
62
  {						\
63
    zz=z >> ZB_POINT_Z_FRAC_BITS;		\
64
    if (ZCMP(zz,*pz))  { 			\
65
      RGBPIXEL;	\
66
      *pz=zz; 					\
67
    }						\
68
  }
69
#else /* INTERP_Z */
70
#define ZZ(x)
71
#define PUTPIXEL() RGBPIXEL
72
#endif /* INTERP_Z */
73
 
74
#define DRAWLINE(dx,dy,inc_1,inc_2) \
75
    n=dx;\
76
    ZZ(zinc=(p2->z-p1->z)/n);\
77
    RGB(rinc=((p2->r-p1->r) << 8)/n;\
78
        ginc=((p2->g-p1->g) << 8)/n;\
79
        binc=((p2->b-p1->b) << 8)/n);\
80
    a=2*dy-dx;\
81
    dy=2*dy;\
82
    dx=2*dx-dy;\
83
    pp_inc_1 = (inc_1) * PSZB;\
84
    pp_inc_2 = (inc_2) * PSZB;\
85
    do {\
86
        PUTPIXEL();\
87
        ZZ(z+=zinc);\
88
        RGB(r+=rinc;g+=ginc;b+=binc);\
89
        if (a>0) { pp=(PIXEL *)((char *)pp + pp_inc_1); ZZ(pz+=(inc_1));  a-=dx; }\
90
	else { pp=(PIXEL *)((char *)pp + pp_inc_2); ZZ(pz+=(inc_2)); a+=dy; }\
91
    } while (--n >= 0);
92
 
93
/* fin macro */
94
 
95
    if (dx == 0 && dy == 0) {
96
	PUTPIXEL();
97
    } else if (dx > 0) {
98
	if (dx >= dy) {
99
	    DRAWLINE(dx, dy, sx + 1, 1);
100
	} else {
101
	    DRAWLINE(dy, dx, sx + 1, sx);
102
	}
103
    } else {
104
	dx = -dx;
105
	if (dx >= dy) {
106
	    DRAWLINE(dx, dy, sx - 1, -1);
107
	} else {
108
	    DRAWLINE(dy, dx, sx - 1, sx);
109
	}
110
    }
111
}
112
 
113
#undef INTERP_Z
114
#undef INTERP_RGB
115
 
116
/* internal defines */
117
#undef DRAWLINE
118
#undef PUTPIXEL
119
#undef ZZ
120
#undef RGB
121
#undef RGBPIXEL