From 504e7b6291cd5e68f5286dd06cdaab0fe1d185c6 Mon Sep 17 00:00:00 2001 From: giraffedata Date: Thu, 30 Apr 2015 16:52:18 +0000 Subject: 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 --- doc/HISTORY | 4 ++++ 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); } } } -- cgit 1.4.1