439 |
|
for (i = tms->mbrmax-tms->mbrmin+1; i--; ) { |
440 |
|
double d; |
441 |
|
d = expmult/tms->inpsf * tmLuminance(tms->mbrmin + i); |
442 |
< |
if (d <= minD) |
443 |
< |
break; /* map initialized to zeroes */ |
444 |
< |
d = (d - minD)/(1. - minD); |
442 |
> |
if (d >= 2.*minD) |
443 |
> |
d -= minD; |
444 |
> |
else /* soft black crushing */ |
445 |
> |
d *= d/(4.*minD); |
446 |
> |
d /= 1. - minD; |
447 |
|
d = TM_BRES*pow(d, 1./gamval); |
448 |
|
tms->lumap[i] = (d > maxV) ? maxV : (int)d; |
449 |
|
} |
488 |
|
histot += tms->histo[i]; |
489 |
|
sum += (double)(j -= HISTEP) * tms->histo[i]; |
490 |
|
} |
489 |
– |
threshold = histot*0.002 + .5; |
491 |
|
if (!histot) |
492 |
|
returnErr(TM_E_TMFAIL); |
493 |
+ |
threshold = histot*0.025 + 1.; |
494 |
|
Lwavg = tmLuminance( (double)sum / histot ); |
495 |
|
/* use linear tone mapping? */ |
496 |
|
if (tms->flags & TM_F_LINEAR || threshold < 4 || |
534 |
|
free(cumf); |
535 |
|
goto linearmap; |
536 |
|
} |
537 |
< |
} while (trimmings > threshold); |
537 |
> |
threshold = 0.025*histot + 1.; |
538 |
> |
|
539 |
> |
} while ((threshold > 4) & (trimmings > threshold)); |
540 |
|
/* allocate space for mapping */ |
541 |
|
if (!tmNewMap(tms)) |
542 |
|
returnErr(TM_E_NOMEM); |