diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2015-04-30 16:52:18 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2015-04-30 16:52:18 +0000 |
commit | 504e7b6291cd5e68f5286dd06cdaab0fe1d185c6 (patch) | |
tree | 10eab9edeaa443e1108d97fa72b9658652d4f181 | |
parent | 8bf6efa667b7414fddadc3a61c5de8a4802da648 (diff) | |
download | netpbm-mirror-504e7b6291cd5e68f5286dd06cdaab0fe1d185c6.tar.gz netpbm-mirror-504e7b6291cd5e68f5286dd06cdaab0fe1d185c6.tar.xz netpbm-mirror-504e7b6291cd5e68f5286dd06cdaab0fe1d185c6.zip |
Fix bug: incorrect handling of negative sample values
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@2472 9d0c8265-081b-0410-96cb-a4ca84ce46f8
-rw-r--r-- | doc/HISTORY | 4 | ||||
-rw-r--r-- | editor/pnmconvol.c | 30 |
2 files changed, 24 insertions, 10 deletions
diff --git a/doc/HISTORY b/doc/HISTORY index 22df4eb5..fcacf727 100644 --- a/doc/HISTORY +++ b/doc/HISTORY @@ -6,6 +6,10 @@ CHANGE HISTORY not yet BJH Release 10.71.00 + pnmconvol: Fix bug: wrong output for pixels that convolve to + negative values (should be clipped to zero). Introduced in + Netpbm 10.68 (September 2014). + st4topgm: Fix bug: with no argument, uses file named "'" instead of Standard Input. Always present (st45topgm was new in Netpbm 10.70 (March 2015). diff --git a/editor/pnmconvol.c b/editor/pnmconvol.c index 485fa0b8..8d9bb83a 100644 --- a/editor/pnmconvol.c +++ b/editor/pnmconvol.c @@ -32,7 +32,19 @@ static sample const clipSample(sample const unclipped, sample const maxval) { - return MIN(maxval, MAX(0, unclipped)); + return MIN(maxval, unclipped); +} + + + +static sample const +makeSample(float const arg, + sample const maxval) { +/*---------------------------------------------------------------------------- + From a tentative sample value that could be fractional or negative, + produce an actual sample value by rounding and clipping. +-----------------------------------------------------------------------------*/ + return MIN(maxval, ROUNDU(MAX(0.0, arg))); } @@ -1193,7 +1205,7 @@ convolveGeneralRowPlane(struct pam * const pamP, convKernelP->weight[plane][crow][ccol]; } outputrow[col][plane] = - clipSample(convKernelP->bias + sum + 0.5, pamP->maxval); + makeSample(convKernelP->bias + sum, pamP->maxval); } } } @@ -1391,7 +1403,7 @@ convolveRowWithColumnSumsMean(const struct ConvKernel * const convKernelP, gisum += convColumnSum[plane][addcol]; } outputrow[col][plane] = - clipSample(convKernelP->bias + gisum * weight + 0.5, + makeSample(convKernelP->bias + gisum * weight, pamP->maxval); } } @@ -1449,7 +1461,7 @@ convolveRowWithColumnSumsVertical( convKernelP->weight[plane][0][ccol]; outputrow[col][plane] = - clipSample(convKernelP->bias + sum + 0.5, pamP->maxval); + makeSample(convKernelP->bias + sum, pamP->maxval); } } } @@ -1522,8 +1534,7 @@ convolveMeanRowPlane(struct pam * const pamP, gisum = gisum - convColumnSum[subcol] + convColumnSum[addcol]; } outputrow[col][plane] = - clipSample(convKernelP->bias + gisum * weight + 0.5, - pamP->maxval); + makeSample(convKernelP->bias + gisum * weight, pamP->maxval); } } } @@ -1783,8 +1794,7 @@ convolveHorizontalRowPlane0(struct pam * const outpamP, } } outputrow[col][plane] = - clipSample(convKernelP->bias + matrixSum + 0.5, - outpamP->maxval); + makeSample(convKernelP->bias + matrixSum, outpamP->maxval); } } } @@ -1891,7 +1901,7 @@ convolveHorizontalRowPlane(struct pam * const pamP, } } outputrow[col][plane] = - clipSample(convKernelP->bias + matrixSum + 0.5, pamP->maxval); + makeSample(convKernelP->bias + matrixSum, pamP->maxval); } } @@ -2058,7 +2068,7 @@ convolveVerticalRowPlane(struct pam * const pamP, } } outputrow[col][plane] = - clipSample(convKernelP->bias + matrixSum + 0.5, pamP->maxval); + makeSample(convKernelP->bias + matrixSum, pamP->maxval); } } } |