about summary refs log tree commit diff
diff options
context:
space:
mode:
authorgiraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8>2015-04-30 16:52:18 +0000
committergiraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8>2015-04-30 16:52:18 +0000
commit504e7b6291cd5e68f5286dd06cdaab0fe1d185c6 (patch)
tree10eab9edeaa443e1108d97fa72b9658652d4f181
parent8bf6efa667b7414fddadc3a61c5de8a4802da648 (diff)
downloadnetpbm-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/HISTORY4
-rw-r--r--editor/pnmconvol.c30
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);
         }
     }
 }