--- ray/src/common/colrops.c 1992/02/18 15:25:55 2.2
+++ ray/src/common/colrops.c 2003/02/22 02:07:22 2.6
@@ -1,55 +1,148 @@
-/* Copyright (c) 1990 Regents of the University of California */
-
#ifndef lint
-static char SCCSid[] = "$SunId$ LBL";
+static const char RCSid[] = "$Id: colrops.c,v 2.6 2003/02/22 02:07:22 greg Exp $";
#endif
-
/*
* Integer operations on COLR scanlines
*/
+/* ====================================================================
+ * 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
+ * .
+ */
+
+#include
#include "color.h"
-#define MAXGSHIFT 15 /* maximum shift for gamma table */
+#define NULL 0
-static BYTE g_mant[256], g_nexp[256];
+extern char *bmalloc();
-static BYTE g_bval[MAXGSHIFT+1][256];
+#define MAXGSHIFT 31 /* maximum shift for gamma table */
+static BYTE *g_mant = NULL, *g_nexp = NULL;
-setcolrgam(g) /* set gamma conversion */
-double g;
+static BYTE (*g_bval)[256] = NULL;
+
+
+int
+setcolrcor(f, a2) /* set brightness correction */
+double (*f)();
+double a2;
{
- extern double pow();
double mult;
register int i, j;
+ /* allocate tables */
+ if (g_bval == NULL && (g_bval =
+ (BYTE (*)[256])bmalloc((MAXGSHIFT+1)*256)) == NULL)
+ return(-1);
/* compute colr -> gamb mapping */
+ mult = 1.0/256.0;
for (i = 0; i <= MAXGSHIFT; i++) {
- mult = pow(0.5, (double)(i+8));
for (j = 0; j < 256; j++)
- g_bval[i][j] = 256.0 * pow((j+.5)*mult, 1.0/g);
+ g_bval[i][j] = 256.0 * (*f)((j+.5)*mult, a2);
+ mult *= 0.5;
}
+ return(0);
+}
+
+
+int
+setcolrinv(f, a2) /* set inverse brightness correction */
+double (*f)();
+double a2;
+{
+ double mult;
+ register int i, j;
+ /* allocate tables */
+ if (g_mant == NULL && (g_mant = (BYTE *)bmalloc(256)) == NULL)
+ return(-1);
+ if (g_nexp == NULL && (g_nexp = (BYTE *)bmalloc(256)) == NULL)
+ return(-1);
/* compute gamb -> colr mapping */
i = 0;
mult = 256.0;
- for (j = 255; j > 0; j--) {
- while ((g_mant[j] = mult * pow(j/256.0, g)) < 128) {
+ for (j = 256; j--; ) {
+ while ((g_mant[j] = mult * (*f)((j+.5)/256.0, a2)) < 128) {
i++;
mult *= 2.0;
}
g_nexp[j] = i;
}
- g_mant[0] = 0;
- g_nexp[0] = COLXS;
+ return(0);
}
+int
+setcolrgam(g) /* set gamma conversion */
+double g;
+{
+ if (setcolrcor(pow, 1.0/g) < 0)
+ return(-1);
+ return(setcolrinv(pow, g));
+}
+
+
+int
colrs_gambs(scan, len) /* convert scanline of colrs to gamma bytes */
register COLR *scan;
int len;
{
register int i, expo;
+ if (g_bval == NULL)
+ return(-1);
while (len-- > 0) {
expo = scan[0][EXP] - COLXS;
if (expo < -MAXGSHIFT) {
@@ -87,15 +180,19 @@ int len;
scan[0][EXP] = COLXS;
scan++;
}
+ return(0);
}
+int
gambs_colrs(scan, len) /* convert gamma bytes to colr scanline */
register COLR *scan;
int len;
{
register int nexpo;
+ if (g_mant == NULL | g_nexp == NULL)
+ return(-1);
while (len-- > 0) {
nexpo = g_nexp[scan[0][RED]];
if (g_nexp[scan[0][GRN]] < nexpo)
@@ -120,9 +217,11 @@ int len;
scan[0][EXP] = COLXS - nexpo;
scan++;
}
+ return(0);
}
+void
shiftcolrs(scan, len, adjust) /* shift a scanline of colors by 2^adjust */
register COLR *scan;
register int len;
@@ -144,6 +243,7 @@ register int adjust;
}
+void
normcolrs(scan, len, adjust) /* normalize a scanline of colrs */
register COLR *scan;
int len;