--- ray/src/common/colrops.c 1991/11/12 16:55:43 2.1 +++ 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,21 +217,33 @@ 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; register int adjust; { + int minexp; + + if (adjust == 0) + return; + minexp = adjust < 0 ? -adjust : 0; while (len-- > 0) { - scan[0][EXP] += adjust; + if (scan[0][EXP] <= minexp) + scan[0][RED] = scan[0][GRN] = scan[0][BLU] = + scan[0][EXP] = 0; + else + scan[0][EXP] += adjust; scan++; } } +void normcolrs(scan, len, adjust) /* normalize a scanline of colrs */ register COLR *scan; int len;