diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2019-01-20 19:23:11 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2019-01-20 19:23:11 +0000 |
commit | 4b8daa32342e426270aca945853934e8e25f0af1 (patch) | |
tree | 5a9f25739cc003e45a7a5ef8dfbd47c7f8c63c92 /lib/libpamn.c | |
parent | 6d06b8e0c26536edaedf04ae56849667b85c1325 (diff) | |
download | netpbm-mirror-4b8daa32342e426270aca945853934e8e25f0af1.tar.gz netpbm-mirror-4b8daa32342e426270aca945853934e8e25f0af1.tar.xz netpbm-mirror-4b8daa32342e426270aca945853934e8e25f0af1.zip |
Fix handling of floating point imprecision in unnormalizing samples
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@3514 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'lib/libpamn.c')
-rw-r--r-- | lib/libpamn.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/libpamn.c b/lib/libpamn.c index 8ae57037..ae28283a 100644 --- a/lib/libpamn.c +++ b/lib/libpamn.c @@ -414,6 +414,19 @@ pnm_writepamn(struct pam * const pamP, +samplen +pnm_normalized_sample(struct pam * const pamP, + sample const sample) { + return (samplen)sample/pamP->maxval; +} + +sample +pnm_unnormalized_sample(struct pam * const pamP, + samplen const sampleVal) { + double const epsilon = 1e-6; + return (sample)((sampleVal + epsilon) * pamP->maxval + 0.5); +} + void pnm_normalizetuple(struct pam * const pamP, tuple const tuple, @@ -422,7 +435,7 @@ pnm_normalizetuple(struct pam * const pamP, unsigned int plane; for (plane = 0; plane < pamP->depth; ++plane) - tuplen[plane] = (samplen)tuple[plane] / pamP->maxval; + tuplen[plane] = pnm_normalized_sample(pamP, tuple[plane]); } @@ -435,7 +448,7 @@ pnm_unnormalizetuple(struct pam * const pamP, unsigned int plane; for (plane = 0; plane < pamP->depth; ++plane) - tuple[plane] = tuplen[plane] * pamP->maxval + 0.5; + tuple[plane] = pnm_unnormalized_sample(pamP, tuplen[plane]); } |