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

Comparing ray/src/common/tonemap.c (file contents):
Revision 3.5 by gregl, Wed Nov 12 13:25:48 1997 UTC vs.
Revision 3.8 by gwlarson, Mon Aug 17 17:58:47 1998 UTC

# Line 1 | Line 1
1 < /* Copyright (c) 1997 Regents of the University of California */
1 > /* Copyright (c) 1998 Silicon Graphics, Inc. */
2  
3   #ifndef lint
4 < static char SCCSid[] = "$SunId$ LBL";
4 > static char SCCSid[] = "$SunId$ SGI";
5   #endif
6  
7   /*
# Line 86 | Line 86 | double gamval;
86                          tmnew->inpsf = WHTEFFICACY;
87          tmnew->cmat[0][1] = tmnew->cmat[0][2] = tmnew->cmat[1][0] =
88          tmnew->cmat[1][2] = tmnew->cmat[2][0] = tmnew->cmat[2][1] = 0.;
89 <        tmnew->brmin = tmnew->brmax = 0;
89 >        tmnew->hbrmin = tmnew->hbrmax = 0;
90          tmnew->histo = NULL;
91 +        tmnew->mbrmin = tmnew->mbrmax = 0;
92          tmnew->lumap = NULL;
93                                                  /* zero private data */
94          for (i = TM_MAXPKG; i--; )
# Line 185 | Line 186 | int    len;
186  
187          if (tmTop == NULL)
188                  returnErr(TM_E_TMINVAL);
189 <        if (ls == NULL | scan == NULL | len <= 0)
189 >        if (ls == NULL | scan == NULL | len < 0)
190                  returnErr(TM_E_ILLEGAL);
191          for (i = len; i--; ) {
192                  if (tmNeedMatrix(tmTop))                /* get monitor RGB */
# Line 253 | Line 254 | int    len;
254   int     wt;
255   {
256          static char     funcName[] = "tmAddHisto";
257 <        int     sum, oldorig, oldlen, horig, hlen;
257 >        int     oldorig, oldlen, horig, hlen;
258          register int    i, j;
259  
259        if (len <= 0)
260                returnErr(TM_E_ILLEGAL);
260          if (tmTop == NULL)
261                  returnErr(TM_E_TMINVAL);
262 +        if (len < 0)
263 +                returnErr(TM_E_ILLEGAL);
264 +        if (len == 0)
265 +                returnOK;
266                                                  /* first, grow limits */
267          if (tmTop->histo == NULL) {
268                  for (i = len; i-- && ls[i] < MINBRT; )
269                          ;
270                  if (i < 0)
271                          returnOK;
272 <                tmTop->brmin = tmTop->brmax = ls[i];
272 >                tmTop->hbrmin = tmTop->hbrmax = ls[i];
273                  oldlen = 0;
274          } else {
275 <                oldorig = (tmTop->brmin-MINBRT)/HISTEP;
276 <                oldlen = (tmTop->brmax-MINBRT)/HISTEP + 1 - oldorig;
275 >                oldorig = (tmTop->hbrmin-MINBRT)/HISTEP;
276 >                oldlen = (tmTop->hbrmax-MINBRT)/HISTEP + 1 - oldorig;
277          }
278          for (i = len; i--; ) {
279                  if ((j = ls[i]) < MINBRT)
280                          continue;
281 <                if (j < tmTop->brmin)
282 <                        tmTop->brmin = j;
283 <                else if (j > tmTop->brmax)
284 <                        tmTop->brmax = j;
281 >                if (j < tmTop->hbrmin)
282 >                        tmTop->hbrmin = j;
283 >                else if (j > tmTop->hbrmax)
284 >                        tmTop->hbrmax = j;
285          }
286 <        horig = (tmTop->brmin-MINBRT)/HISTEP;
287 <        hlen = (tmTop->brmax-MINBRT)/HISTEP + 1 - horig;
286 >        horig = (tmTop->hbrmin-MINBRT)/HISTEP;
287 >        hlen = (tmTop->hbrmax-MINBRT)/HISTEP + 1 - horig;
288          if (hlen > oldlen) {                    /* (re)allocate histogram */
289                  register int    *newhist = (int *)calloc(hlen, sizeof(int));
290                  if (newhist == NULL)
# Line 292 | Line 295 | int    wt;
295                          free((MEM_PTR)tmTop->histo);
296                  }
297                  tmTop->histo = newhist;
295                if (tmTop->lumap != NULL) {     /* invalid tone map */
296                        free((MEM_PTR)tmTop->lumap);
297                        tmTop->lumap = NULL;
298                }
298          }
299          if (wt == 0)
300                  returnOK;
# Line 353 | Line 352 | double Ldmax;
352          Ldmin = Ldmax/Lddyn;
353          logLddyn = log(Lddyn);
354          Ldavg = sqrt(Ldmax*Ldmin);
355 <        i = (tmTop->brmin-MINBRT)/HISTEP;
355 >        i = (tmTop->hbrmin-MINBRT)/HISTEP;
356          brt0 = MINBRT + HISTEP/2 + i*HISTEP;
357 <        histlen = (tmTop->brmax-MINBRT)/HISTEP + 1 - i;
357 >        histlen = (tmTop->hbrmax-MINBRT)/HISTEP + 1 - i;
358                                          /* histogram total and mean */
359          histot = 0; sum = 0;
360          j = brt0 + histlen*HISTEP;
# Line 381 | Line 380 | double Ldmax;
380                                  sum += histo[i];
381                          }
382                          cumf[i] = 1.;
383 <                        Tr = histot * (double)(tmTop->brmax - tmTop->brmin) /
383 >                        Tr = histot * (double)(tmTop->hbrmax - tmTop->hbrmin) /
384                                  ((double)histlen*TM_BRTSCALE) / logLddyn;
385                          ceiling = Tr + 1.;
386                          trimmings = 0;                  /* clip to envelope */
# Line 402 | Line 401 | double Ldmax;
401                                                  trimmings > threshold);
402          }
403                                                  /* allocate luminance map */
404 <        if (tmTop->lumap == NULL) {
405 <                tmTop->lumap = (unsigned short *)malloc(
406 <                        (tmTop->brmax-tmTop->brmin+1)*sizeof(unsigned short) );
407 <                if (tmTop->lumap == NULL)
408 <                        returnErr(TM_E_NOMEM);
409 <        }
404 >        if (tmTop->lumap != NULL)
405 >                free((MEM_PTR)tmTop->lumap);
406 >        tmTop->mbrmin = tmTop->hbrmin;
407 >        tmTop->mbrmax = tmTop->hbrmax;
408 >        tmTop->lumap = (unsigned short *)malloc(
409 >                (tmTop->mbrmax-tmTop->mbrmin+1)*sizeof(unsigned short) );
410 >        if (tmTop->lumap == NULL)
411 >                returnErr(TM_E_NOMEM);
412          if (tmTop->flags & TM_F_LINEAR || histot <= threshold) {
413                                                  /* linear tone mapping */
414                  if (tmTop->flags & TM_F_HCONTR)
# Line 415 | Line 416 | double Ldmax;
416                  else
417                          d = Ldavg / Lwavg;
418                  d = log(d/Ldmax);
419 <                for (i = tmTop->brmax-tmTop->brmin+1; i--; )
419 >                for (i = tmTop->mbrmax-tmTop->mbrmin+1; i--; )
420                          tmTop->lumap[i] = 256. * exp(
421 <                                ( d + (tmTop->brmin+i)/(double)TM_BRTSCALE )
421 >                                ( d + (tmTop->mbrmin+i)/(double)TM_BRTSCALE )
422                                  / gamval );
423          } else {
424                                                  /* histogram adjustment */
425 <                for (i = tmTop->brmax-tmTop->brmin+1; i--; ) {
426 <                        j = d = (double)i/(tmTop->brmax-tmTop->brmin)*histlen;
425 >                for (i = tmTop->mbrmax-tmTop->mbrmin+1; i--; ) {
426 >                        j = d = (double)i/(tmTop->mbrmax-tmTop->mbrmin)*histlen;
427                          d -= (double)j;
428                          Ld = Ldmin*exp(logLddyn*((1.-d)*cumf[j]+d*cumf[j+1]));
429                          d = (Ld - Ldmin)/(Ldmax - Ldmin);
# Line 449 | Line 450 | int    len;
450  
451          if (tmTop == NULL || tmTop->lumap == NULL)
452                  returnErr(TM_E_TMINVAL);
453 <        if (ps == NULL | ls == NULL | len <= 0)
453 >        if (ps == NULL | ls == NULL | len < 0)
454                  returnErr(TM_E_ILLEGAL);
455          while (len--) {
456 <                if ((li = *ls++) < tmTop->brmin)
457 <                        li = tmTop->brmin;
458 <                else if (li > tmTop->brmax)
459 <                        li = tmTop->brmax;
460 <                li = tmTop->lumap[li - tmTop->brmin];
456 >                if ((li = *ls++) < tmTop->mbrmin)
457 >                        li = tmTop->mbrmin;
458 >                else if (li > tmTop->mbrmax)
459 >                        li = tmTop->mbrmax;
460 >                li = tmTop->lumap[li - tmTop->mbrmin];
461                  if (cs == TM_NOCHROM)
462                          *ps++ = li>255 ? 255 : li;
463                  else {
# Line 520 | Line 521 | tmDup()                                /* duplicate top tone mapping */
521                  return(NULL);
522          *tmnew = *tmTop;                /* copy everything */
523          if (tmnew->histo != NULL) {     /* duplicate histogram */
524 <                len = (tmnew->brmax-MINBRT)/HISTEP + 1 -
525 <                                (tmnew->brmin-MINBRT)/HISTEP;
524 >                len = (tmnew->hbrmax-MINBRT)/HISTEP + 1 -
525 >                                (tmnew->hbrmin-MINBRT)/HISTEP;
526                  tmnew->histo = (int *)malloc(len*sizeof(int));
527                  if (tmnew->histo != NULL)
528                          for (i = len; i--; )
529                                  tmnew->histo[i] = tmTop->histo[i];
530          }
531          if (tmnew->lumap != NULL) {     /* duplicate luminance mapping */
532 <                len = tmnew->brmax-tmnew->brmin+1;
532 >                len = tmnew->mbrmax-tmnew->mbrmin+1;
533                  tmnew->lumap = (unsigned short *)malloc(
534                                                  len*sizeof(unsigned short) );
535                  if (tmnew->lumap != NULL)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines