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.6 by gregl, Mon Nov 17 14:02:12 1997 UTC

# 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 266 | Line 267 | int    wt;
267                          ;
268                  if (i < 0)
269                          returnOK;
270 <                tmTop->brmin = tmTop->brmax = ls[i];
270 >                tmTop->hbrmin = tmTop->hbrmax = ls[i];
271                  oldlen = 0;
272          } else {
273 <                oldorig = (tmTop->brmin-MINBRT)/HISTEP;
274 <                oldlen = (tmTop->brmax-MINBRT)/HISTEP + 1 - oldorig;
273 >                oldorig = (tmTop->hbrmin-MINBRT)/HISTEP;
274 >                oldlen = (tmTop->hbrmax-MINBRT)/HISTEP + 1 - oldorig;
275          }
276          for (i = len; i--; ) {
277                  if ((j = ls[i]) < MINBRT)
278                          continue;
279 <                if (j < tmTop->brmin)
280 <                        tmTop->brmin = j;
281 <                else if (j > tmTop->brmax)
282 <                        tmTop->brmax = j;
279 >                if (j < tmTop->hbrmin)
280 >                        tmTop->hbrmin = j;
281 >                else if (j > tmTop->hbrmax)
282 >                        tmTop->hbrmax = j;
283          }
284 <        horig = (tmTop->brmin-MINBRT)/HISTEP;
285 <        hlen = (tmTop->brmax-MINBRT)/HISTEP + 1 - horig;
284 >        horig = (tmTop->hbrmin-MINBRT)/HISTEP;
285 >        hlen = (tmTop->hbrmax-MINBRT)/HISTEP + 1 - horig;
286          if (hlen > oldlen) {                    /* (re)allocate histogram */
287                  register int    *newhist = (int *)calloc(hlen, sizeof(int));
288                  if (newhist == NULL)
# Line 292 | Line 293 | int    wt;
293                          free((MEM_PTR)tmTop->histo);
294                  }
295                  tmTop->histo = newhist;
295                if (tmTop->lumap != NULL) {     /* invalid tone map */
296                        free((MEM_PTR)tmTop->lumap);
297                        tmTop->lumap = NULL;
298                }
296          }
297          if (wt == 0)
298                  returnOK;
# Line 353 | Line 350 | double Ldmax;
350          Ldmin = Ldmax/Lddyn;
351          logLddyn = log(Lddyn);
352          Ldavg = sqrt(Ldmax*Ldmin);
353 <        i = (tmTop->brmin-MINBRT)/HISTEP;
353 >        i = (tmTop->hbrmin-MINBRT)/HISTEP;
354          brt0 = MINBRT + HISTEP/2 + i*HISTEP;
355 <        histlen = (tmTop->brmax-MINBRT)/HISTEP + 1 - i;
355 >        histlen = (tmTop->hbrmax-MINBRT)/HISTEP + 1 - i;
356                                          /* histogram total and mean */
357          histot = 0; sum = 0;
358          j = brt0 + histlen*HISTEP;
# Line 381 | Line 378 | double Ldmax;
378                                  sum += histo[i];
379                          }
380                          cumf[i] = 1.;
381 <                        Tr = histot * (double)(tmTop->brmax - tmTop->brmin) /
381 >                        Tr = histot * (double)(tmTop->hbrmax - tmTop->hbrmin) /
382                                  ((double)histlen*TM_BRTSCALE) / logLddyn;
383                          ceiling = Tr + 1.;
384                          trimmings = 0;                  /* clip to envelope */
# Line 402 | Line 399 | double Ldmax;
399                                                  trimmings > threshold);
400          }
401                                                  /* allocate luminance map */
402 <        if (tmTop->lumap == NULL) {
403 <                tmTop->lumap = (unsigned short *)malloc(
404 <                        (tmTop->brmax-tmTop->brmin+1)*sizeof(unsigned short) );
405 <                if (tmTop->lumap == NULL)
406 <                        returnErr(TM_E_NOMEM);
407 <        }
402 >        if (tmTop->lumap != NULL)
403 >                free((MEM_PTR)tmTop->lumap);
404 >        tmTop->mbrmin = tmTop->hbrmin;
405 >        tmTop->mbrmax = tmTop->hbrmax;
406 >        tmTop->lumap = (unsigned short *)malloc(
407 >                (tmTop->mbrmax-tmTop->mbrmin+1)*sizeof(unsigned short) );
408 >        if (tmTop->lumap == NULL)
409 >                returnErr(TM_E_NOMEM);
410          if (tmTop->flags & TM_F_LINEAR || histot <= threshold) {
411                                                  /* linear tone mapping */
412                  if (tmTop->flags & TM_F_HCONTR)
# Line 415 | Line 414 | double Ldmax;
414                  else
415                          d = Ldavg / Lwavg;
416                  d = log(d/Ldmax);
417 <                for (i = tmTop->brmax-tmTop->brmin+1; i--; )
417 >                for (i = tmTop->mbrmax-tmTop->mbrmin+1; i--; )
418                          tmTop->lumap[i] = 256. * exp(
419 <                                ( d + (tmTop->brmin+i)/(double)TM_BRTSCALE )
419 >                                ( d + (tmTop->mbrmin+i)/(double)TM_BRTSCALE )
420                                  / gamval );
421          } else {
422                                                  /* histogram adjustment */
423 <                for (i = tmTop->brmax-tmTop->brmin+1; i--; ) {
424 <                        j = d = (double)i/(tmTop->brmax-tmTop->brmin)*histlen;
423 >                for (i = tmTop->mbrmax-tmTop->mbrmin+1; i--; ) {
424 >                        j = d = (double)i/(tmTop->mbrmax-tmTop->mbrmin)*histlen;
425                          d -= (double)j;
426                          Ld = Ldmin*exp(logLddyn*((1.-d)*cumf[j]+d*cumf[j+1]));
427                          d = (Ld - Ldmin)/(Ldmax - Ldmin);
# Line 452 | Line 451 | int    len;
451          if (ps == NULL | ls == NULL | len <= 0)
452                  returnErr(TM_E_ILLEGAL);
453          while (len--) {
454 <                if ((li = *ls++) < tmTop->brmin)
455 <                        li = tmTop->brmin;
456 <                else if (li > tmTop->brmax)
457 <                        li = tmTop->brmax;
458 <                li = tmTop->lumap[li - tmTop->brmin];
454 >                if ((li = *ls++) < tmTop->mbrmin)
455 >                        li = tmTop->mbrmin;
456 >                else if (li > tmTop->mbrmax)
457 >                        li = tmTop->mbrmax;
458 >                li = tmTop->lumap[li - tmTop->mbrmin];
459                  if (cs == TM_NOCHROM)
460                          *ps++ = li>255 ? 255 : li;
461                  else {
# Line 520 | Line 519 | tmDup()                                /* duplicate top tone mapping */
519                  return(NULL);
520          *tmnew = *tmTop;                /* copy everything */
521          if (tmnew->histo != NULL) {     /* duplicate histogram */
522 <                len = (tmnew->brmax-MINBRT)/HISTEP + 1 -
523 <                                (tmnew->brmin-MINBRT)/HISTEP;
522 >                len = (tmnew->hbrmax-MINBRT)/HISTEP + 1 -
523 >                                (tmnew->hbrmin-MINBRT)/HISTEP;
524                  tmnew->histo = (int *)malloc(len*sizeof(int));
525                  if (tmnew->histo != NULL)
526                          for (i = len; i--; )
527                                  tmnew->histo[i] = tmTop->histo[i];
528          }
529          if (tmnew->lumap != NULL) {     /* duplicate luminance mapping */
530 <                len = tmnew->brmax-tmnew->brmin+1;
530 >                len = tmnew->mbrmax-tmnew->mbrmin+1;
531                  tmnew->lumap = (unsigned short *)malloc(
532                                                  len*sizeof(unsigned short) );
533                  if (tmnew->lumap != NULL)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines