--- ray/src/rt/colortab.c 1990/02/23 10:08:33 1.13
+++ ray/src/rt/colortab.c 2003/02/22 02:07:28 2.5
@@ -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.5 2003/02/22 02:07:28 greg Exp $";
#endif
-
/*
* colortab.c - allocate and control dynamic color table.
*
@@ -14,11 +11,70 @@ 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"
+/* ====================================================================
+ * The Radiance Software License, Version 1.0
+ *
+ * Copyright (c) 1990 - 2002 The Regents of the University of California,
+ * through Lawrence Berkeley National Laboratory. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes Radiance software
+ * (http://radsite.lbl.gov/)
+ * developed by the Lawrence Berkeley National Laboratory
+ * (http://www.lbl.gov/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
+ * and "The Regents of the University of California" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact radiance@radsite.lbl.gov.
+ *
+ * 5. Products derived from this software may not be called "Radiance",
+ * nor may "Radiance" appear in their name, without prior written
+ * permission of Lawrence Berkeley National Laboratory.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of Lawrence Berkeley National Laboratory. For more
+ * information on Lawrence Berkeley National Laboratory, please see
+ * .
+ */
-#define NULL 0
+#include "standard.h"
+
+#include "color.h"
/* histogram resolution */
#define NRED 24
#define NGRN 32
@@ -33,7 +89,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 +99,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 +109,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 +125,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 +148,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 +169,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 +199,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,6 +222,7 @@ BYTE *rmap, *gmap, *bmap;
}
+void
map_color(rgb, col) /* map a color to a byte triplet */
BYTE rgb[3];
COLOR col;
@@ -172,7 +233,7 @@ COLOR col;
}
-static
+static void
cut(tree, level, box, c0, c1) /* partition color space */
register CNODE *tree;
int level;
@@ -205,7 +266,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])