ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/tmapcolrs.c
(Generate patch)

Comparing ray/src/common/tmapcolrs.c (file contents):
Revision 3.6 by gwlarson, Thu Oct 22 13:53:19 1998 UTC vs.
Revision 3.14 by schorsch, Sun Jul 27 22:12:01 2003 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1998 Silicon Graphics, Inc. */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ SGI";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   * Routines for tone mapping on Radiance RGBE and XYZE pictures.
6 < * See tonemap.h for detailed function descriptions.
6 > *
7 > * Externals declared in tonemap.h
8   */
9  
10 + #include "copyright.h"
11 +
12   #include        <stdio.h>
13 + #include        <string.h>
14   #include        <math.h>
15 + #include        <time.h>
16   #include        "tmprivat.h"
17   #include        "resolu.h"
18  
19 + #ifndef TM_PIC_CTRANS
20 + #define TM_PIC_CTRANS   1               /* transform colors? (expensive) */
21 + #endif
22  
18 extern char     *tempbuffer();
19
23   #define GAMTSZ  1024
24  
25   typedef struct {
# Line 25 | Line 28 | typedef struct {
28          TMbright        inpsfb;         /* encoded tm->inpsf */
29   } COLRDATA;
30  
31 + #ifdef NOPROTO
32   static MEM_PTR  colrInit();
33   static void     colrNewSpace();
34 < extern void     free();
34 > #else
35 > static MEM_PTR  colrInit(struct tmStruct *);
36 > static void     colrNewSpace(struct tmStruct *);
37 > #endif
38   static struct tmPackage colrPkg = {     /* our package functions */
39          colrInit, colrNewSpace, free
40   };
# Line 35 | Line 42 | static int     colrReg = -1;           /* our package registration
42  
43   #define LOGISZ  260
44   static TMbright logi[LOGISZ];
38 static BYTE     photofact[BMESUPPER-BMESLOWER];
45  
46  
47   int
# Line 52 | Line 58 | int    len;
58  
59          if (tmTop == NULL)
60                  returnErr(TM_E_TMINVAL);
61 <        if (ls == NULL | scan == NULL | len < 0)
61 >        if ((ls == NULL) | (scan == NULL) | (len < 0))
62                  returnErr(TM_E_ILLEGAL);
63 + #if TM_PIC_CTRANS
64          if (tmNeedMatrix(tmTop)) {              /* need floating point */
65 + #else
66 +        if (tmTop->inppri == TM_XYZPRIM) {      /* no way around this */
67 + #endif
68                  register COLOR  *newscan;
69                  newscan = (COLOR *)tempbuffer(len*sizeof(COLOR));
70                  if (newscan == NULL)
# Line 70 | Line 80 | int    len;
80                  for (i = 256; i--; )
81                          logi[i] = TM_BRTSCALE*log((i+.5)/256.) - .5;
82                  for (i = 256; i < LOGISZ; i++)
83 <                        logi[i] = logi[255];
84 <                for (i = BMESLOWER; i < BMESUPPER; i++)
75 <                        photofact[i-BMESLOWER] = 256. *
76 <                                        (tmLuminance(i) - LMESLOWER) /
77 <                                        (LMESUPPER - LMESLOWER);
83 >                        logi[i] = 0;
84 >                tmMkMesofact();
85          }
86          if ((cd = (COLRDATA *)tmPkgData(tmTop,colrReg)) == NULL)
87                  returnErr(TM_E_NOMEM);
# Line 84 | Line 91 | int    len;
91                  li =  ( cd->clfb[RED]*cmon[RED] +
92                          cd->clfb[GRN]*cmon[GRN] +
93                          cd->clfb[BLU]*cmon[BLU] ) >> 8;
94 <                bi = BRT2SCALE*(cmon[EXP]-COLXS) +
94 >                bi = BRT2SCALE(cmon[EXP]-COLXS) +
95                                  logi[li] + cd->inpsfb;
96 <                if (bi < MINBRT) {
97 <                        bi = MINBRT-1;                  /* bogus value */
98 <                        li++;                           /* avoid li==0 */
96 >                if (li <= 0) {
97 >                        bi = TM_NOBRT;                  /* bogus value */
98 >                        li = 1;                         /* avoid li==0 */
99                  }
100                  ls[i] = bi;
101                  if (cs == TM_NOCHROM)                   /* no color? */
102                          continue;
96                if (tmTop->flags & TM_F_BW)
97                        cmon[RED] = cmon[GRN] = cmon[BLU] = li;
103                                                          /* mesopic adj. */
104                  if (tmTop->flags & TM_F_MESOPIC && bi < BMESUPPER) {
105                          register int    pf, sli = normscot(cmon);
106                          if (bi < BMESLOWER)
107                                  cmon[RED] = cmon[GRN] = cmon[BLU] = sli;
108                          else {
109 <                                pf = photofact[bi-BMESLOWER];
109 >                                if (tmTop->flags & TM_F_BW)
110 >                                        cmon[RED] = cmon[GRN] = cmon[BLU] = li;
111 >                                pf = tmMesofact[bi-BMESLOWER];
112                                  sli *= 256 - pf;
113                                  cmon[RED] = ( sli + pf*cmon[RED] ) >> 8;
114                                  cmon[GRN] = ( sli + pf*cmon[GRN] ) >> 8;
115                                  cmon[BLU] = ( sli + pf*cmon[BLU] ) >> 8;
116                          }
117 +                } else if (tmTop->flags & TM_F_BW) {
118 +                        cmon[RED] = cmon[GRN] = cmon[BLU] = li;
119                  }
120 <                bi = ( (int4)GAMTSZ*cd->clfb[RED]*cmon[RED]/li ) >> 8;
120 >                bi = ( (int32)GAMTSZ*cd->clfb[RED]*cmon[RED]/li ) >> 8;
121                  cs[3*i  ] = bi>=GAMTSZ ? 255 : cd->gamb[bi];
122 <                bi = ( (int4)GAMTSZ*cd->clfb[GRN]*cmon[GRN]/li ) >> 8;
122 >                bi = ( (int32)GAMTSZ*cd->clfb[GRN]*cmon[GRN]/li ) >> 8;
123                  cs[3*i+1] = bi>=GAMTSZ ? 255 : cd->gamb[bi];
124 <                bi = ( (int4)GAMTSZ*cd->clfb[BLU]*cmon[BLU]/li ) >> 8;
124 >                bi = ( (int32)GAMTSZ*cd->clfb[BLU]*cmon[BLU]/li ) >> 8;
125                  cs[3*i+2] = bi>=GAMTSZ ? 255 : cd->gamb[bi];
126          }
127          returnOK;
# Line 146 | Line 155 | register struct radhead        *rh;
155                          rh->format = FMTCIE;
156                  else
157                          rh->format = FMTBAD;
158 <                return;
158 >                return(0);
159          }
160          if (isexpos(s)) {
161                  rh->expos *= exposval(s);
162 <                return;
162 >                return(0);
163          }
164          if (isprims(s)) {
165                  primsval(rh->mypri, s);
166                  rh->primp = rh->mypri;
167 <                return;
167 >                return(0);
168          }
169 +        return(0);
170   }
171  
172  
# Line 177 | Line 187 | FILE   *fp;
187                                                  /* check arguments */
188          if (tmTop == NULL)
189                  returnErr(TM_E_TMINVAL);
190 <        if (lpp == NULL | xp == NULL | yp == NULL |
191 <                        (fname == NULL & fp == TM_GETFILE))
190 >        if ((lpp == NULL) | (xp == NULL) | (yp == NULL) |
191 >                        ((fname == NULL) & (fp == TM_GETFILE)))
192                  returnErr(TM_E_ILLEGAL);
193          *xp = *yp = 0;                          /* error precaution */
194          if ((inpf = fp) == TM_GETFILE && (inpf = fopen(fname, "r")) == NULL)
# Line 186 | Line 196 | FILE   *fp;
196          *lpp = NULL;
197          if (cpp != TM_NOCHROMP) *cpp = NULL;
198          info = rhdefault;                       /* get our header */
199 <        getheader(inpf, headline, (MEM_PTR)&info);
200 <        if (info.format == FMTBAD | info.expos <= 0. ||
199 >        getheader(inpf, headline, (char *)&info);
200 >        if ((info.format == FMTBAD) | (info.expos <= 0.) ||
201                          fgetresolu(xp, yp, inpf) < 0) {
202                  err = TM_E_BADFILE; goto done;
203          }
# Line 239 | Line 249 | done:                                          /* clean up */
249   }
250  
251  
252 < int                                     /* run pcond to map picture */
252 > #ifdef PCOND
253 > static int                                      /* run pcond to map picture */
254   dopcond(psp, xp, yp, flags, monpri, gamval, Lddyn, Ldmax, fname)
255   BYTE    **psp;
256   int     *xp, *yp;
# Line 249 | Line 260 | double gamval, Lddyn, Ldmax;
260   char    *fname;
261   {
262          char    *funcName = fname;
263 <        char    cmdbuf[512];
263 >        char    cmdbuf[1024];
264          FILE    *infp;
265          register COLR   *scan;
266          register BYTE   *rp;
# Line 259 | Line 270 | char   *fname;
270          if (setcolrcor(pow, 1./gamval) < 0)
271                  returnErr(TM_E_NOMEM);
272                                          /* create command */
273 <        strcpy(cmdbuf, "pcond ");
273 >        strcpy(cmdbuf, PCOND);
274          if (flags & TM_F_HCONTR)
275 <                strcat(cmdbuf, "-s ");
275 >                strcat(cmdbuf, " -s");
276          if (flags & TM_F_MESOPIC)
277 <                strcat(cmdbuf, "-c ");
277 >                strcat(cmdbuf, " -c");
278          if (flags & TM_F_LINEAR)
279 <                strcat(cmdbuf, "-l ");
279 >                strcat(cmdbuf, " -l");
280          if (flags & TM_F_ACUITY)
281 <                strcat(cmdbuf, "-a ");
281 >                strcat(cmdbuf, " -a");
282          if (flags & TM_F_VEIL)
283 <                strcat(cmdbuf, "-v ");
283 >                strcat(cmdbuf, " -v");
284          if (flags & TM_F_CWEIGHT)
285 <                strcat(cmdbuf, "-w ");
286 <        sprintf(cmdbuf+strlen(cmdbuf),
287 <                        "-p %f %f %f %f %f %f %f %f -d %f -u %f %s",
288 <                        monpri[RED][CIEX], monpri[RED][CIEY],
289 <                        monpri[GRN][CIEX], monpri[GRN][CIEY],
290 <                        monpri[BLU][CIEX], monpri[BLU][CIEY],
291 <                        monpri[WHT][CIEX], monpri[WHT][CIEY],
292 <                        Lddyn, Ldmax, fname);
285 >                strcat(cmdbuf, " -w");
286 >        if (monpri != stdprims)
287 >                sprintf(cmdbuf+strlen(cmdbuf), " -p %f %f %f %f %f %f %f %f",
288 >                                monpri[RED][CIEX], monpri[RED][CIEY],
289 >                                monpri[GRN][CIEX], monpri[GRN][CIEY],
290 >                                monpri[BLU][CIEX], monpri[BLU][CIEY],
291 >                                monpri[WHT][CIEX], monpri[WHT][CIEY]);
292 >        sprintf(cmdbuf+strlen(cmdbuf), " -d %f -u %f %s", Lddyn, Ldmax, fname);
293                                          /* start pcond */
294          if ((infp = popen(cmdbuf, "r")) == NULL)
295                  returnErr(TM_E_BADFILE);
# Line 294 | Line 305 | char   *fname;
305                  rp = (BYTE *)malloc(sizeof(BYTE) * *xp * *yp);
306          else
307                  rp = (BYTE *)malloc(3*sizeof(BYTE) * *xp * *yp);
308 <        if ((*psp = rp) == NULL | scan == NULL) {
308 >        if (((*psp = rp) == NULL) | (scan == NULL)) {
309                  pclose(infp);
310                  returnErr(TM_E_NOMEM);
311          }
# Line 322 | Line 333 | char   *fname;
333          pclose(infp);
334          returnOK;
335   }
336 + #endif
337  
338  
339   int                                     /* map a Radiance picture */
# Line 339 | Line 351 | FILE   *fp;
351          TMbright        *lp;
352          int     err;
353                                                  /* check arguments */
354 <        if (psp == NULL | xp == NULL | yp == NULL | monpri == NULL |
355 <                        (fname == NULL & fp == TM_GETFILE))
354 >        if ((psp == NULL) | (xp == NULL) | (yp == NULL) | (monpri == NULL) |
355 >                        ((fname == NULL) & (fp == TM_GETFILE)))
356                  returnErr(TM_E_ILLEGAL);
357                                                  /* set defaults */
358          if (gamval < MINGAM) gamval = DEFGAM;
359          if (Lddyn < MINLDDYN) Lddyn = DEFLDDYN;
360          if (Ldmax < MINLDMAX) Ldmax = DEFLDMAX;
361          if (flags & TM_F_BW) monpri = stdprims;
362 + #ifdef PCOND
363                                                  /* check for pcond run */
364          if (fp == TM_GETFILE && flags & TM_F_UNIMPL)
365                  return( dopcond(psp, xp, yp, flags,
366                                  monpri, gamval, Lddyn, Ldmax, fname) );
367 + #endif
368                                                  /* initialize tone mapping */
369          if (tmInit(flags, monpri, gamval) == NULL)
370                  returnErr(TM_E_NOMEM);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines