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; |
474 |
|
/* compute handy values */ |
475 |
|
Ldmin = Ldmax/Lddyn; |
476 |
|
logLddyn = log(Lddyn); |
477 |
– |
Ldavg = sqrt(Ldmax*Ldmin); |
477 |
|
i = HISTI(tms->hbrmin); |
478 |
|
brt0 = HISTV(i); |
479 |
|
histlen = HISTI(tms->hbrmax) + 1 - i; |
484 |
|
histot += tms->histo[i]; |
485 |
|
sum += (double)(j -= HISTEP) * tms->histo[i]; |
486 |
|
} |
487 |
< |
threshold = histot*0.005 + .5; |
487 |
> |
threshold = histot*0.002 + .5; |
488 |
|
if (!histot) |
489 |
|
returnErr(TM_E_TMFAIL); |
490 |
|
Lwavg = tmLuminance( (double)sum / histot ); |
503 |
|
do { /* iterate to solution */ |
504 |
|
sum = 0; /* cumulative probability */ |
505 |
|
for (i = 0; i < histlen; i++) { |
506 |
< |
cumf[i] = (double)sum/histot; |
507 |
< |
sum += histo[i]; |
506 |
> |
cumf[i] = sum/histot; |
507 |
> |
sum += (double)histo[i]; |
508 |
|
} |
509 |
|
cumf[histlen] = 1.; |
510 |
|
Tr = histot * (double)(tms->hbrmax - tms->hbrmin) / |
511 |
< |
((double)histlen*TM_BRTSCALE) / logLddyn; |
511 |
> |
((double)TM_BRTSCALE*histlen*logLddyn); |
512 |
|
ceiling = Tr + 1.; |
513 |
|
trimmings = 0; /* clip to envelope */ |
514 |
|
for (i = histlen; i--; ) { |
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 |
|
|
580 |
|
lv = tms->mbrmax; |
581 |
|
li = tms->lumap[lv - tms->mbrmin]; |
582 |
|
} |
583 |
< |
if (cs == TM_NOCHROM) |
584 |
< |
*ps++ = li>=TM_BRES ? 255 : (int)(256*li/TM_BRES); |
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]; |