11 #if defined(TGL_FEATURE_8_BITS)
19 #define _MIX(r,g,b) ( ((g)<<6) | ((b)<<3) | (r) )
21 #define DITHER_TABLE_SIZE (1 << 15)
23 #define DITHER_INDEX(r,g,b) ((b) + (g) * _B + (r) * (_B * _G))
26 static int kernel8[_DY*_DX] = {
27 0 * MAXC, 8 * MAXC, 2 * MAXC, 10 * MAXC,
28 12 * MAXC, 4 * MAXC, 14 * MAXC, 6 * MAXC,
29 3 * MAXC, 11 * MAXC, 1 * MAXC, 9 * MAXC,
30 15 * MAXC, 7 * MAXC, 13 * MAXC, 5 * MAXC,
35 void ZB_initDither(
ZBuffer *zb,
int nb_colors,
36 unsigned char *color_indexes,
int *color_table)
38 int c,r,g,b,i,index,r1,g1,b1;
40 if (nb_colors < (_R * _G * _B)) {
41 fprintf(stderr,
"zdither: not enough colors\n");
45 for(i=0;i<nb_colors;i++) color_table[i]=0;
47 zb->nb_colors=nb_colors;
48 zb->ctable=gl_malloc(nb_colors *
sizeof(
int));
50 for (r = 0; r < _R; r++) {
51 for (g = 0; g < _G; g++) {
52 for (b = 0; b < _B; b++) {
53 r1=(r*255) / (_R - 1);
54 g1=(g*255) / (_G - 1);
55 b1=(b*255) / (_B - 1);
56 index=DITHER_INDEX(r,g,b);
57 c=(r1 << 16) | (g1 << 8) | b1;
64 zb->dctable=gl_malloc( DITHER_TABLE_SIZE );
66 for(i=0;i<DITHER_TABLE_SIZE;i++) {
70 index=DITHER_INDEX(r,g,b);
71 zb->dctable[i]=color_indexes[index];
83 ZDither_lookupColor(
int r,
int g,
int b) {
84 unsigned char *ctable=zdither_color_table;
85 return ctable[_MIX(_DITH0(_R, r), _DITH0(_G, g),_DITH0(_B, b))];
90 #define DITHER_PIXEL2(a) \
93 v=*(unsigned int *)(pp+(a)); \
94 g=(v & 0x07DF07DF) + g_d; \
95 r=(((v & 0xF800F800) >> 2) + r_d) & 0x70007000; \
97 c=ctable[t & 0xFFFF] | (ctable[t >> 16] << 8); \
98 *(unsigned short *)(dest+(a))=c; \
106 ZB_ditherFrameBuffer(
ZBuffer *zb,
unsigned char *buf,
109 unsigned char *dest1;
112 unsigned char *ctable=zb->dctable;
116 assert( ((
long)buf & 1) == 0 && (linesize & 1) == 0);
118 for(yk=0;yk<4;yk++) {
119 for(xk=0;xk<4;xk+=2) {
120 #if BYTE_ORDER == BIG_ENDIAN
121 c1=kernel8[yk*4+xk+1];
125 c2=kernel8[yk*4+xk+1];
127 r_d=((c1 << 2) & 0xF800) >> 2;
128 g_d=(c1 >> 4) & 0x07C0;
129 b_d=(c1 >> 9) & 0x001F;
131 r_d|=(((c2 << 2) & 0xF800) >> 2) << 16;
132 g_d|=((c2 >> 4) & 0x07C0) << 16;
133 b_d|=((c2 >> 9) & 0x001F) << 16;
136 dest1=buf + (yk * linesize) + xk;
137 pp1=zb->pbuf + (yk * zb->xsize) + xk;
139 for(y=yk;y<zb->ysize;y+=4) {
142 for(x=xk;x<zb->xsize;x+=16) {