Index: trunk/psLib/src/imageops/psImageConvolve.c
===================================================================
--- trunk/psLib/src/imageops/psImageConvolve.c	(revision 15958)
+++ trunk/psLib/src/imageops/psImageConvolve.c	(revision 17302)
@@ -7,6 +7,6 @@
 /// @author Eugene Magnier, IfA
 ///
-/// @version $Revision: 1.61 $ $Name: not supported by cvs2svn $
-/// @date $Date: 2007-12-31 03:02:08 $
+/// @version $Revision: 1.62 $ $Name: not supported by cvs2svn $
+/// @date $Date: 2008-04-03 03:00:25 $
 ///
 /// Copyright 2004-2007 Institute for Astronomy, University of Hawaii
@@ -420,4 +420,5 @@
     psImage *paddedImage = psImageAlloc(paddedCols,paddedRows,in->type.type); // Padded input image
     if (mask && maskVal) {
+        // Need to replace non-finite (assumed masked) pixels, since they propagate everywhere during FFT
         for (int y = 0; y < numRows; y++) {
             for (int x = 0; x < numCols; x++) {
@@ -454,22 +455,28 @@
     for (int y = PS_MIN(-1, yMin); y <= PS_MIN(-1, yMax); y++) {
         // y is negative
-        for (int x = PS_MIN(-1, xMin); x <= PS_MIN(-1, xMax); x++) {
+        if (xMin < 0) {
             // x is negative
-            paddedKernel->data.F32[paddedRows + y][paddedCols + x] = kernel->kernel[y][x];
-        }
-        for (int x = PS_MAX(0, xMin); x <= PS_MAX(0, xMax); x++) {
+            memcpy(&paddedKernel->data.F32[paddedRows + y][paddedCols + xMin], &kernel->kernel[y][xMin],
+                   (PS_MIN(0, xMax) - xMin) * PSELEMTYPE_SIZEOF(PS_TYPE_F32));
+        }
+        if (xMax >= 0) {
             // x is positive
-            paddedKernel->data.F32[paddedRows + y][x] = kernel->kernel[y][x];
+            int min = PS_MAX(0, xMin);  // Minimum value of x when positive
+            memcpy(&paddedKernel->data.F32[paddedRows + y][min], &kernel->kernel[y][min],
+                   (xMax - min + 1) * PSELEMTYPE_SIZEOF(PS_TYPE_F32));
         }
     }
     for (int y = PS_MAX(0, yMin); y <= PS_MAX(0, yMax); y++) {
         // y is positive
-        for (int x = PS_MIN(-1, xMin); x <= PS_MIN(-1, xMax); x++) {
+        if (xMin < 0) {
             // x is negative
-            paddedKernel->data.F32[y][paddedCols + x] = kernel->kernel[y][x];
-        }
-        for (int x = PS_MAX(0, xMin); x <= PS_MAX(0, xMax); x++) {
+            memcpy(&paddedKernel->data.F32[y][paddedCols + xMin], &kernel->kernel[y][xMin],
+                   (PS_MIN(0, xMax) - xMin) * PSELEMTYPE_SIZEOF(PS_TYPE_F32));
+        }
+        if (xMax >= 0) {
             // x is positive
-            paddedKernel->data.F32[y][x] = kernel->kernel[y][x];
+            int min = PS_MAX(0, xMin);  // Minimum value of x when positive
+            memcpy(&paddedKernel->data.F32[y][min], &kernel->kernel[y][min],
+                   (xMax - min + 1) * PSELEMTYPE_SIZEOF(PS_TYPE_F32));
         }
     }
@@ -834,6 +841,6 @@
     // XXX test
     if (0) {
-	psFree(gaussnorm);
-	return true;
+        psFree(gaussnorm);
+        return true;
     }
 
