11#if defined(TGL_FEATURE_8_BITS)
13#if TGL_FEATURE_RENDER_BITS != 16
14#error TGL_FEATURE_8_BITS is not supported for this value of TGL_FEATURE_RENDER_BITS
23#define _MIX(r,g,b) ( ((g)<<6) | ((b)<<3) | (r) )
25#define DITHER_TABLE_SIZE (1 << 15)
27#define DITHER_INDEX(r,g,b) ((b) + (g) * _B + (r) * (_B * _G))
30static int kernel8[
_DY*
_DX] = {
40 unsigned char *color_indexes,
int *color_table)
42 int c,r,g,b,i,index,r1,g1,b1;
44 if (nb_colors < (
_R *
_G *
_B)) {
45 fprintf(stderr,
"zdither: not enough colors\n");
49 for(i=0;i<nb_colors;i++) color_table[i]=0;
54 for (r = 0; r <
_R; r++) {
55 for (g = 0; g <
_G; g++) {
56 for (b = 0; b <
_B; b++) {
57 r1=(r*255) / (
_R - 1);
58 g1=(g*255) / (
_G - 1);
59 b1=(b*255) / (
_B - 1);
61 c=(r1 << 16) | (g1 << 8) | b1;
75 zb->
dctable[i]=color_indexes[index];
86int ZDither_lookupColor(
int r,
int g,
int b)
88 unsigned char *ctable=zdither_color_table;
89 return ctable[
_MIX(_DITH0(
_R, r), _DITH0(
_G, g),_DITH0(
_B, b))];
94#define DITHER_PIXEL2(a) \
96 register int v,t,r,g,c; \
97 v=*(unsigned int *)(pp+(a)); \
98 g=(v & 0x07DF07DF) + g_d; \
99 r=(((v & 0xF800F800) >> 2) + r_d) & 0x70007000; \
101 c=ctable[t & 0xFFFF] | (ctable[t >> 16] << 8); \
102 *(unsigned short *)(dest+(a))=c; \
113 unsigned char *dest1;
116 unsigned char *ctable=zb->
dctable;
117 register unsigned char *dest;
118 register unsigned short *
pp;
120 assert( ((
long)buf & 1) == 0 && (linesize & 1) == 0);
122 for(yk=0;yk<4;yk++) {
123 for(xk=0;xk<4;xk+=2) {
124#if BYTE_ORDER == BIG_ENDIAN
125 c1=kernel8[yk*4+xk+1];
129 c2=kernel8[yk*4+xk+1];
131 r_d=((c1 << 2) & 0xF800) >> 2;
132 g_d=(c1 >> 4) & 0x07C0;
133 b_d=(c1 >> 9) & 0x001F;
135 r_d|=(((c2 << 2) & 0xF800) >> 2) << 16;
136 g_d|=((c2 >> 4) & 0x07C0) << 16;
137 b_d|=((c2 >> 9) & 0x001F) << 16;
140 dest1=buf + (yk * linesize) + xk;
143 for(y=yk;y<zb->
ysize;y+=4) {
146 for(x=xk;x<zb->
xsize;x+=16) {
void * gl_malloc(int size)
#define DITHER_INDEX(r, g, b)
void ZB_initDither(ZBuffer *zb, int nb_colors, unsigned char *color_indexes, int *color_table)
void ZB_ditherFrameBuffer(ZBuffer *zb, unsigned char *buf, int linesize)
#define DITHER_TABLE_SIZE
void ZB_closeDither(ZBuffer *zb)