--- ray/src/rt/colortab.c 1990/02/09 09:14:52 1.12 +++ ray/src/rt/colortab.c 2003/02/25 02:47:22 2.6 @@ -1,9 +1,6 @@ -/* Copyright (c) 1989 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: colortab.c,v 2.6 2003/02/25 02:47:22 greg Exp $"; #endif - /* * colortab.c - allocate and control dynamic color table. * @@ -14,11 +11,15 @@ static char SCCSid[] = "$SunId$ LBL"; * histogram is cleared. This algorithm * performs only as well as the next drawing's color * distribution is correlated to the last. + * + * External symbols declared in drvier.h */ -#include "color.h" +#include "copyright.h" -#define NULL 0 +#include "standard.h" + +#include "color.h" /* histogram resolution */ #define NRED 24 #define NGRN 32 @@ -33,7 +34,7 @@ static char SCCSid[] = "$SunId$ LBL"; (int)(colval(c,p)*256.) : 255 ] /* color partition tree */ #define CNODE short -#define set_branch(p,c) ((c)<<2|(p)) +#define set_branch(p,c) ((c)<<2|(p)) #define set_pval(pv) ((pv)<<2|3) #define is_branch(cn) (((cn)&3)!=3) #define is_pval(cn) (((cn)&3)==3) @@ -43,8 +44,8 @@ static char SCCSid[] = "$SunId$ LBL"; /* our color table */ static struct tabent { long sum[3]; /* sum of colors using this entry */ - long n; /* number of colors */ - short ent[3]; /* current table value */ + int n; /* number of colors */ + BYTE ent[3]; /* current table value */ } *clrtab = NULL; /* color cube partition */ static CNODE *ctree = NULL; @@ -53,9 +54,12 @@ static BYTE clrmap[3][256]; /* histogram of colors used */ static unsigned short histo[NRED][NGRN][NBLU]; /* initial color cube boundary */ -static int CLRCUBE[3][2] = {0,NRED,0,NGRN,0,NBLU}; +static int CLRCUBE[3][2] = {{0,NRED},{0,NGRN},{0,NBLU}}; +static int split(); +static void cut(); + int new_ctab(ncolors) /* start new color table with max ncolors */ int ncolors; @@ -66,9 +70,9 @@ int ncolors; return(0); /* free old tables */ if (clrtab != NULL) - free((char *)clrtab); + free((void *)clrtab); if (ctree != NULL) - free((char *)ctree); + free((void *)ctree); /* get new tables */ for (treesize = 1; treesize < ncolors; treesize <<= 1) ; @@ -89,7 +93,7 @@ int ncolors; int get_pixel(col, set_pixel) /* get pixel for color */ COLOR col; -int (*set_pixel)(); +void (*set_pixel)(); { int r, g, b; int cv[3]; @@ -110,7 +114,7 @@ int (*set_pixel)(); if (cv[prim(*tp)] < part(*tp)) tp += 1< MAXDST2) { clrtab[h].ent[RED] = r; - clrtab[h].ent[GRN] = g; /* reassign pixel */ + clrtab[h].ent[GRN] = g; /* reassign pixel */ clrtab[h].ent[BLU] = b; #ifdef DEBUG sprintf(errmsg, "pixel %d = (%d,%d,%d) (%d refs)\n", @@ -140,19 +144,20 @@ int (*set_pixel)(); } +void make_gmap(gam) /* make gamma correction map */ -double gam; +double gam; { - extern double pow(); register int i; for (i = 0; i < 256; i++) clrmap[RED][i] = clrmap[GRN][i] = - clrmap[BLU][i] = 256.0 * pow(i/256.0, 1.0/gam); + clrmap[BLU][i] = 256.0 * pow((i+0.5)/256.0, 1.0/gam); } +void set_cmap(rmap, gmap, bmap) /* set custom color correction map */ BYTE *rmap, *gmap, *bmap; { @@ -162,7 +167,18 @@ BYTE *rmap, *gmap, *bmap; } -static +void +map_color(rgb, col) /* map a color to a byte triplet */ +BYTE rgb[3]; +COLOR col; +{ + rgb[RED] = map_col(col,RED); + rgb[GRN] = map_col(col,GRN); + rgb[BLU] = map_col(col,BLU); +} + + +static void cut(tree, level, box, c0, c1) /* partition color space */ register CNODE *tree; int level; @@ -195,7 +211,7 @@ register int box[3][2]; #define c0 r register int r, g, b; int pri; - int t[HMAX], med; + long t[HMAX], med; /* find dominant axis */ pri = RED; if (box[GRN][1]-box[GRN][0] > box[pri][1]-box[pri][0])