--- ray/src/rt/colortab.c 1989/10/12 11:32:09 1.8 +++ ray/src/rt/colortab.c 1990/02/09 09:14:52 1.12 @@ -51,7 +51,7 @@ static CNODE *ctree = NULL; /* our color correction map */ static BYTE clrmap[3][256]; /* histogram of colors used */ -static unsigned histo[NRED][NGRN][NBLU]; +static unsigned short histo[NRED][NGRN][NBLU]; /* initial color cube boundary */ static int CLRCUBE[3][2] = {0,NRED,0,NGRN,0,NBLU}; @@ -80,7 +80,7 @@ int ncolors; /* partition color space */ cut(ctree, 0, CLRCUBE, 0, ncolors); /* clear histogram */ - bzero(histo, sizeof(histo)); + bzero((char *)histo, sizeof(histo)); /* return number of colors used */ return(ncolors); } @@ -93,7 +93,7 @@ int (*set_pixel)(); { int r, g, b; int cv[3]; - register union { CNODE *t; struct tabent *e; } p; + register CNODE *tp; register int h; /* map color */ r = map_col(col,RED); @@ -106,34 +106,33 @@ int (*set_pixel)(); /* add to histogram */ histo[cv[RED]][cv[GRN]][cv[BLU]]++; /* find pixel in tree */ - for (p.t = ctree, h = 0; is_branch(*p.t); h++) - if (cv[prim(*p.t)] < part(*p.t)) - p.t += 1<sum[RED] += r; - p.e->sum[GRN] += g; - p.e->sum[BLU] += b; - p.e->n++; + clrtab[h].sum[RED] += r; + clrtab[h].sum[GRN] += g; + clrtab[h].sum[BLU] += b; + clrtab[h].n++; /* recompute average */ - r = p.e->sum[RED] / p.e->n; - g = p.e->sum[GRN] / p.e->n; - b = p.e->sum[BLU] / p.e->n; + r = clrtab[h].sum[RED] / clrtab[h].n; + g = clrtab[h].sum[GRN] / clrtab[h].n; + b = clrtab[h].sum[BLU] / clrtab[h].n; /* check for movement */ - if (p.e->n == 1 || - (r-p.e->ent[RED])*(r-p.e->ent[RED]) + - (g-p.e->ent[GRN])*(g-p.e->ent[GRN]) + - (b-p.e->ent[BLU])*(b-p.e->ent[BLU]) > MAXDST2) { - p.e->ent[RED] = r; - p.e->ent[GRN] = g; /* reassign pixel */ - p.e->ent[BLU] = b; -#ifdef notdef - printf("pixel %d = (%d,%d,%d) (%d refs)\n", - h, r, g, b, p.e->n); + if (clrtab[h].n == 1 || + (r-clrtab[h].ent[RED])*(r-clrtab[h].ent[RED]) + + (g-clrtab[h].ent[GRN])*(g-clrtab[h].ent[GRN]) + + (b-clrtab[h].ent[BLU])*(b-clrtab[h].ent[BLU]) > MAXDST2) { + clrtab[h].ent[RED] = r; + clrtab[h].ent[GRN] = g; /* reassign pixel */ + clrtab[h].ent[BLU] = b; +#ifdef DEBUG + sprintf(errmsg, "pixel %d = (%d,%d,%d) (%d refs)\n", + h, r, g, b, clrtab[h].n); + eputs(errmsg); #endif (*set_pixel)(h, r, g, b); } @@ -157,9 +156,9 @@ double gam; set_cmap(rmap, gmap, bmap) /* set custom color correction map */ BYTE *rmap, *gmap, *bmap; { - bcopy(rmap, clrmap[RED], 256); - bcopy(gmap, clrmap[GRN], 256); - bcopy(bmap, clrmap[BLU], 256); + bcopy((char *)rmap, (char *)clrmap[RED], 256); + bcopy((char *)gmap, (char *)clrmap[GRN], 256); + bcopy((char *)bmap, (char *)clrmap[BLU], 256); } @@ -178,7 +177,7 @@ int c0, c1; } /* split box */ *tree = split(box); - bcopy(box, kb, sizeof(kb)); + bcopy((char *)box, (char *)kb, sizeof(kb)); /* do left (lesser) branch */ kb[prim(*tree)][1] = part(*tree); cut(tree+(1<>1);