Back to index

radiance  4R0+20100331
Defines | Functions | Variables
colrops.c File Reference
#include "copyright.h"
#include <stdio.h>
#include <math.h>
#include "rtmisc.h"
#include "color.h"

Go to the source code of this file.

Defines

#define MAXGSHIFT   31 /* maximum shift for gamma table */

Functions

int setcolrcor (double *f, double a2)
int setcolrinv (double *f, double a2)
int setcolrgam (double g)
int colrs_gambs (COLR *scan, int len)
int gambs_colrs (COLR *scan, int len)
void shiftcolrs (COLR *scan, int len, int adjust)
void normcolrs (COLR *scan, int len, int adjust)

Variables

static const char RCSid [] = "$Id: colrops.c,v 2.11 2003/07/30 10:11:06 schorsch Exp $"
static BYTEg_mant = NULL
static BYTEg_nexp = NULL
static BYTE(* g_bval )[256] = NULL

Define Documentation

#define MAXGSHIFT   31 /* maximum shift for gamma table */

Definition at line 17 of file colrops.c.


Function Documentation

int colrs_gambs ( COLR scan,
int  len 
)

Definition at line 83 of file colrops.c.

{
       register int  i, expo;

       if (g_bval == NULL)
              return(-1);
       while (len-- > 0) {
              expo = scan[0][EXP] - COLXS;
              if (expo < -MAXGSHIFT) {
                     if (expo < -MAXGSHIFT-8) {
                            scan[0][RED] =
                            scan[0][GRN] =
                            scan[0][BLU] = 0;
                     } else {
                            i = (-MAXGSHIFT-1) - expo;
                            scan[0][RED] = 
                            g_bval[MAXGSHIFT][((scan[0][RED]>>i)+1)>>1];
                            scan[0][GRN] =
                            g_bval[MAXGSHIFT][((scan[0][GRN]>>i)+1)>>1];
                            scan[0][BLU] =
                            g_bval[MAXGSHIFT][((scan[0][BLU]>>i)+1)>>1];
                     }
              } else if (expo > 0) {
                     if (expo > 8) {
                            scan[0][RED] =
                            scan[0][GRN] =
                            scan[0][BLU] = 255;
                     } else {
                            i = (scan[0][RED]<<1 | 1) << (expo-1);
                            scan[0][RED] = i > 255 ? 255 : g_bval[0][i];
                            i = (scan[0][GRN]<<1 | 1) << (expo-1);
                            scan[0][GRN] = i > 255 ? 255 : g_bval[0][i];
                            i = (scan[0][BLU]<<1 | 1) << (expo-1);
                            scan[0][BLU] = i > 255 ? 255 : g_bval[0][i];
                     }
              } else {
                     scan[0][RED] = g_bval[-expo][scan[0][RED]];
                     scan[0][GRN] = g_bval[-expo][scan[0][GRN]];
                     scan[0][BLU] = g_bval[-expo][scan[0][BLU]];
              }
              scan[0][EXP] = COLXS;
              scan++;
       }
       return(0);
}

Here is the caller graph for this function:

int gambs_colrs ( COLR scan,
int  len 
)

Definition at line 133 of file colrops.c.

{
       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)
                     nexpo = g_nexp[scan[0][GRN]];
              if (g_nexp[scan[0][BLU]] < nexpo)
                     nexpo = g_nexp[scan[0][BLU]];
              if (nexpo < g_nexp[scan[0][RED]])
                     scan[0][RED] = g_mant[scan[0][RED]]
                                   >> (g_nexp[scan[0][RED]]-nexpo);
              else
                     scan[0][RED] = g_mant[scan[0][RED]];
              if (nexpo < g_nexp[scan[0][GRN]])
                     scan[0][GRN] = g_mant[scan[0][GRN]]
                                   >> (g_nexp[scan[0][GRN]]-nexpo);
              else
                     scan[0][GRN] = g_mant[scan[0][GRN]];
              if (nexpo < g_nexp[scan[0][BLU]])
                     scan[0][BLU] = g_mant[scan[0][BLU]]
                                   >> (g_nexp[scan[0][BLU]]-nexpo);
              else
                     scan[0][BLU] = g_mant[scan[0][BLU]];
              scan[0][EXP] = COLXS - nexpo;
              scan++;
       }
       return(0);
}

Here is the caller graph for this function:

void normcolrs ( COLR scan,
int  len,
int  adjust 
)

Definition at line 192 of file colrops.c.

{
       register int  c;
       register int  shift;

       while (len-- > 0) {
              shift = scan[0][EXP] + adjust - COLXS;
              if (shift > 0) {
                     if (shift > 8) {
                            scan[0][RED] =
                            scan[0][GRN] =
                            scan[0][BLU] = 255;
                     } else {
                            shift--;
                            c = (scan[0][RED]<<1 | 1) << shift;
                            scan[0][RED] = c > 255 ? 255 : c;
                            c = (scan[0][GRN]<<1 | 1) << shift;
                            scan[0][GRN] = c > 255 ? 255 : c;
                            c = (scan[0][BLU]<<1 | 1) << shift;
                            scan[0][BLU] = c > 255 ? 255 : c;
                     }
              } else if (shift < 0) {
                     if (shift < -8) {
                            scan[0][RED] =
                            scan[0][GRN] =
                            scan[0][BLU] = 0;
                     } else {
                            shift = -1-shift;
                            scan[0][RED] = ((scan[0][RED]>>shift)+1)>>1;
                            scan[0][GRN] = ((scan[0][GRN]>>shift)+1)>>1;
                            scan[0][BLU] = ((scan[0][BLU]>>shift)+1)>>1;
                     }
              }
              scan[0][EXP] = COLXS - adjust;
              scan++;
       }
}

Here is the caller graph for this function:

int setcolrcor ( double *  f,
double  a2 
)

Definition at line 25 of file colrops.c.

{
       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++) {
              for (j = 0; j < 256; j++)
                     g_bval[i][j] = 256.0 * (*f)((j+.5)*mult, a2);
              mult *= 0.5;
       }
       return(0);
}

Here is the call graph for this function:

int setcolrgam ( double  g)

Definition at line 73 of file colrops.c.

{
       if (setcolrcor(pow, 1.0/g) < 0)
              return(-1);
       return(setcolrinv(pow, g));
}

Here is the call graph for this function:

Here is the caller graph for this function:

int setcolrinv ( double *  f,
double  a2 
)

Definition at line 47 of file colrops.c.

{
       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 = 256; j--; ) {
              while ((g_mant[j] = mult * (*f)((j+.5)/256.0, a2)) < 128) {
                     i++;
                     mult *= 2.0;
              }
              g_nexp[j] = i;
       }
       return(0);
}

Here is the call graph for this function:

void shiftcolrs ( COLR scan,
int  len,
int  adjust 
)

Definition at line 170 of file colrops.c.

{
       int    minexp;

       if (adjust == 0)
              return;
       minexp = adjust < 0 ? -adjust : 0;
       while (len-- > 0) {
              if (scan[0][EXP] <= minexp)
                     scan[0][RED] = scan[0][GRN] = scan[0][BLU] =
                     scan[0][EXP] = 0;
              else
                     scan[0][EXP] += adjust;
              scan++;
       }
}

Here is the caller graph for this function:


Variable Documentation

BYTE(* g_bval)[256] = NULL [static]

Definition at line 21 of file colrops.c.

BYTE* g_mant = NULL [static]

Definition at line 19 of file colrops.c.

BYTE * g_nexp = NULL [static]

Definition at line 19 of file colrops.c.

const char RCSid[] = "$Id: colrops.c,v 2.11 2003/07/30 10:11:06 schorsch Exp $" [static]

Definition at line 2 of file colrops.c.