Index: trunk/psLib/src/imageops/psImageConvolve.c
===================================================================
--- trunk/psLib/src/imageops/psImageConvolve.c	(revision 14464)
+++ trunk/psLib/src/imageops/psImageConvolve.c	(revision 14478)
@@ -7,6 +7,6 @@
 /// @author Eugene Magnier, IfA
 ///
-/// @version $Revision: 1.53 $ $Name: not supported by cvs2svn $
-/// @date $Date: 2007-07-20 20:12:31 $
+/// @version $Revision: 1.54 $ $Name: not supported by cvs2svn $
+/// @date $Date: 2007-08-14 02:06:32 $
 ///
 /// Copyright 2004-2007 Institute for Astronomy, University of Hawaii
@@ -42,4 +42,20 @@
 }
 
+// Set up indirections, so we can refer to kernel->kernel[-1][-3] for the (-1,-1) element, instead of
+// kernel->image[kernel->yMax - kernel->yMin + 1][kernel->yMax - kernel->yMin + 3] (yuk!).
+static void kernelRedirects(psKernel *kernel, // Kernel for which to set up the redirects
+                            int numRows // Number of rows
+    )
+{
+    int xMin = kernel->xMin, yMin = kernel->yMin; // Minimum values
+
+    kernel->p_kernelRows = psAlloc(sizeof(float*)*numRows);
+    for (int i = 0; i < numRows; i++) {
+        kernel->p_kernelRows[i] = kernel->image->data.PS_TYPE_KERNEL_DATA[i] - xMin;
+    }
+    kernel->kernel = kernel->p_kernelRows - yMin;
+    return;
+}
+
 psKernel *psKernelAlloc(int xMin, int xMax, int yMin, int yMax)
 {
@@ -79,16 +95,26 @@
     psImageInit(kernel->image, 0.0);
 
-    // Set up indirections, so we can refer to kernel->kernel[-1][-3] for the (-1,-1) element, instead of
-    // kernel->image[kernel->yMax - kernel->yMin + 1][kernel->yMax - kernel->yMin + 3] (yuk!).
-    kernel->p_kernelRows = psAlloc(sizeof(float*)*numRows);
-    for (int i = 0; i < numRows; i++) {
-        kernel->p_kernelRows[i] = kernel->image->data.PS_TYPE_KERNEL_DATA[i] - xMin;
-    }
-    kernel->kernel = kernel->p_kernelRows - yMin;
+    kernelRedirects(kernel, numRows);
 
     return kernel;
 }
 
-
+psKernel *psKernelAllocFromImage(psImage *image, int x0, int y0)
+{
+    psKernel *kernel = psAlloc(sizeof(psKernel)); // The kernel, to be returned
+    psMemSetDeallocator(kernel,(psFreeFunc)kernelFree);
+
+    int numCols = image->numCols, numRows = image->numRows; // Size of image
+
+    kernel->xMin = - x0;
+    kernel->xMax = numCols - x0;
+    kernel->yMin = - y0;
+    kernel->yMax = numRows - y0;
+    kernel->image = psMemIncrRefCounter(image);
+
+    kernelRedirects(kernel, numRows);
+
+    return kernel;
+}
 
 bool psMemCheckKernel(psPtr ptr)
@@ -200,13 +226,13 @@
 }
 
-psImage *psImageConvolveDirect(psImage *out, 
-			       const psImage *in,
+psImage *psImageConvolveDirect(psImage *out,
+                               const psImage *in,
                                const psKernel *kernel)
 {
     PS_ASSERT_IMAGE_NON_NULL(in, NULL);
     if (in->type.type != PS_TYPE_S32 && in->type.type != PS_TYPE_F32 && in->type.type != PS_TYPE_F64) {
-	psError(PS_ERR_BAD_PARAMETER_TYPE, true,
-		"Unallowable operation: psImage %s is not of type S32 or F{32,64}.", "in");
-	return(NULL);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                "Unallowable operation: psImage %s is not of type S32 or F{32,64}.", "in");
+        return(NULL);
     }
     PS_ASSERT_PTR_NON_NULL(kernel, NULL);
Index: trunk/psLib/src/imageops/psImageConvolve.h
===================================================================
--- trunk/psLib/src/imageops/psImageConvolve.h	(revision 14464)
+++ trunk/psLib/src/imageops/psImageConvolve.h	(revision 14478)
@@ -5,6 +5,6 @@
  * @author Robert DeSonia, MHPCC
  *
- * @version $Revision: 1.22 $ $Name: not supported by cvs2svn $
- * @date $Date: 2007-08-09 01:40:07 $
+ * @version $Revision: 1.23 $ $Name: not supported by cvs2svn $
+ * @date $Date: 2007-08-14 02:06:32 $
  * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
  */
@@ -69,4 +69,9 @@
     int yMax                           ///< Most positive y index
 ) PS_ATTR_MALLOC;
+
+/// Allocate a convolution kernel from a provided image
+psKernel *psKernelAllocFromImage(psImage *image, ///< Image from which to define kernel
+                                 int x0, int y0 ///< Coordinates of kernel centre
+    );
 
 /// Checks the type of a particular pointer.
