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.39 by greg, Wed Jan 6 20:34:10 2021 UTC vs.
Revision 3.44 by greg, Wed Feb 24 03:48:52 2021 UTC

# Line 67 | Line 67 | double gamval
67                  tmnew->mongam = gamval;
68                                                  /* set color divisors */
69          for (i = 0; i < 3; i++)
70 <                tmnew->cdiv[i] = 256.*pow(tmnew->clf[i], 1./tmnew->mongam);
70 >                tmnew->cdiv[i] = TM_BRES*pow(tmnew->clf[i], 1./tmnew->mongam);
71  
72                                                  /* set input transform */
73          tmnew->inppri = tmnew->monpri;
# Line 143 | Line 143 | MEM_PTR        dat
143                          tms->cmat[i][j] *= tms->inpsf;
144                                                  /* set color divisors */
145          for (i = 0; i < 3; i++)
146 <                tms->cdiv[i] = 256.*pow(tms->clf[i] < .001 ? .001 :
146 >                tms->cdiv[i] = TM_BRES*pow(tms->clf[i] < .001 ? .001 :
147                                                  tms->clf[i], 1./tms->mongam);
148                                                  /* notify packages */
149          for (i = tmNumPkgs; i--; )
# Line 436 | Line 436 | double gamval
436                  gamval = tms->mongam;
437          d = log(expmult/tms->inpsf);
438          for (i = tms->mbrmax-tms->mbrmin+1; i--; ) {
439 <                double  val = 256. * exp(
439 >                double  val = TM_BRES * exp(
440                          ( d + (tms->mbrmin+i)*(1./TM_BRTSCALE) )
441                          / gamval);
442 <                tms->lumap[i] = val >= (double)0xffff ? 0xffff : (int)val;
442 >                tms->lumap[i] = val;
443 >                if (sizeof(TMAP_TYP) == 2 && val >= 0xffff)
444 >                        tms->lumap[i] = 0xffff;
445          }
446          returnOK;
447   }
# Line 458 | Line 460 | double Ldmax
460          float   *cumf;
461          int     brt0, histlen;
462          HIST_TYP        threshold, ceiling, trimmings, histot;
463 <        double  logLddyn, Ldmin, Ldavg, Lwavg, Tr, Lw, Ld;
463 >        double  logLddyn, Ldmin, Lwavg, Tr, Lw, Ld;
464          double  sum;
465          double  d;
466          int     i, j;
# Line 472 | Line 474 | double Ldmax
474                                          /* compute handy values */
475          Ldmin = Ldmax/Lddyn;
476          logLddyn = log(Lddyn);
475        Ldavg = sqrt(Ldmax*Ldmin);
477          i = HISTI(tms->hbrmin);
478          brt0 = HISTV(i);
479          histlen = HISTI(tms->hbrmax) + 1 - i;
# Line 497 | Line 498 | double Ldmax
498          if ((histo == NULL) | (cumf == NULL))
499                  returnErr(TM_E_NOMEM);
500          cumf[histlen+1] = 1.;           /* guard for assignment code */
501 <        for (i = histlen; i--; )        /* make malleable copy */
502 <                histo[i] = tms->histo[i];
501 >                                        /* make malleable copy */
502 >        memcpy((MEM_PTR)histo, (MEM_PTR)tms->histo, histlen*sizeof(HIST_TYP));
503          do {                            /* iterate to solution */
504                  sum = 0;                /* cumulative probability */
505                  for (i = 0; i < histlen; i++) {
# Line 539 | Line 540 | double Ldmax
540                  d -= (double)j;
541                  Ld = Ldmin*exp(logLddyn*((1.-d)*cumf[j]+d*cumf[j+1]));
542                  d = (Ld - Ldmin)/(Ldmax - Ldmin);
543 <                tms->lumap[i] = 256.*pow(d, 1./gamval);
543 >                tms->lumap[i] = TM_BRES*pow(d, 1./gamval);
544          }
545          free((MEM_PTR)histo);           /* clean up and return */
546          free((MEM_PTR)cumf);
547          returnOK;
548   linearmap:                              /* linear tone-mapping */
549          if (tms->flags & TM_F_HCONTR)
550 <                d = htcontrs(Ldavg) / htcontrs(Lwavg);
550 >                d = htcontrs(sqrt(Ldmax*Ldmin)) / htcontrs(Lwavg);
551          else
552 <                d = Ldavg / Lwavg;
552 >                d = Ldmax / tmLuminance(tms->hbrmax);
553          return(tmFixedMapping(tms, tms->inpsf*d/Ldmax, gamval));
554   }
555  
# Line 563 | Line 564 | int    len
564   )
565   {
566          static const char funcName[] = "tmMapPixels";
567 <        int32   li, pv;
567 >        TMbright        lv;
568 >        TMAP_TYP        li;
569 >        int             pv;
570  
571          if (tms == NULL || tms->lumap == NULL)
572                  returnErr(TM_E_TMINVAL);
573          if ((ps == NULL) | (ls == NULL) | (len < 0))
574                  returnErr(TM_E_ILLEGAL);
575          while (len--) {
576 <                if ((li = *ls++) < tms->mbrmin) {
576 >                if ((lv = *ls++) < tms->mbrmin) {
577                          li = 0;
578                  } else {
579 <                        if (li > tms->mbrmax)
580 <                                li = tms->mbrmax;
581 <                        li = tms->lumap[li - tms->mbrmin];
579 >                        if (lv > tms->mbrmax)
580 >                                lv = tms->mbrmax;
581 >                        li = tms->lumap[lv - tms->mbrmin];
582                  }
583 <                if (cs == TM_NOCHROM)
584 <                        *ps++ = li>255 ? 255 : li;
585 <                else {
583 >                if (cs == TM_NOCHROM) {
584 > #if !(TM_BRES & 0xff)
585 >                        *ps++ = li>=TM_BRES ? 255 : li/(TM_BRES>>8);
586 > #else
587 >                        *ps++ = li>=TM_BRES ? 255 : (li<<8)/TM_BRES;
588 > #endif
589 >                } else {
590                          pv = *cs++ * li / tms->cdiv[RED];
591                          *ps++ = pv>255 ? 255 : pv;
592                          pv = *cs++ * li / tms->cdiv[GRN];
# Line 593 | Line 600 | int    len
600  
601  
602   TMstruct *
603 < tmDup(                          /* duplicate top tone mapping */
603 > tmDup(                          /* duplicate tone mapping */
604   TMstruct        *tms
605   )
606   {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines