Index: trunk/psModules/src/imcombine/pmSubtraction.c
===================================================================
--- trunk/psModules/src/imcombine/pmSubtraction.c	(revision 14304)
+++ trunk/psModules/src/imcombine/pmSubtraction.c	(revision 14305)
@@ -4,6 +4,6 @@
  *  @author GLG, MHPCC
  *
- *  @version $Revision: 1.23 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2007-07-19 01:10:57 $
+ *  @version $Revision: 1.24 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2007-07-19 01:39:28 $
  *
  *  Copyright 2004-2007 Institute for Astronomy, University of Hawaii
@@ -25,5 +25,5 @@
 #include "pmSubtraction.h"
 
-//#define USE_FUNCTIONS_INSTEAD_OF_MACROS          // Can I pass the address of a static inline function?
+#define USE_FUNCTIONS_INSTEAD_OF_MACROS          // Can I pass the address of a static inline function?
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -209,4 +209,25 @@
               break;
           }
+          case PM_SUBTRACTION_KERNEL_GUNK: {
+              if (i < kernels->inner) {
+                  // Using pre-calculated function
+                  psKernel *preCalc = kernels->preCalc->data[i]; // Precalculated values
+                  for (int v = -size; v <= size; v++) {
+                      for (int u = -size; u <= size; u++) {
+                          kernel->kernel[v][u] += value * weightFunc(preCalc->kernel[v][u]);
+                      }
+                  }
+              } else {
+                  // Using delta function
+                  int u = kernels->u->data.S32[i]; // Offset in x
+                  int v = kernels->v->data.S32[i]; // Offset in y
+                  kernel->kernel[v][u] += value;
+              }
+              // The (0,0) kernel is subtracted from other kernels to preserve photometric scaling
+              if (kernels->spatialOrder > 0 && i != kernels->subIndex) {
+                  kernel->kernel[0][0] += subValue;
+              }
+              break;
+          }
           case PM_SUBTRACTION_KERNEL_ISIS: {
               psKernel *preCalc = kernels->preCalc->data[i];// Precalculated values
@@ -355,4 +376,30 @@
           return sum;
       }
+      case PM_SUBTRACTION_KERNEL_GUNK: {
+          double value;                 // The value to return
+          if (index < kernels->inner) {
+              // Using pre-calculated function
+              psKernel *kernel = kernels->preCalc->data[index]; // The convolution kernel
+              int size = kernels->size;     // Kernel half-size
+              double sum = 0.0;             // Accumulated sum from convolution
+              double sub = 0.0;             // Accumulated sum to subtract
+              for (int v = -size; v <= size; v++) {
+                  for (int u = -size; u <= size; u++) {
+                      sum += weightFunc(kernel->kernel[v][u]) * image->data.F32[y + v][x + u];
+                  }
+              }
+              value = weightFunc(polyValue) * sum + weightFunc(-1.0) * sub;
+          } else {
+              // Using delta function
+              int u = kernels->u->data.S32[index]; // Offset in x
+              int v = kernels->v->data.S32[index]; // Offset in y
+              value = weightFunc(polyValue) * image->data.F32[y + v][x + u]; // Value of convolution
+          }
+          /* The (0,0) delta function is subtracted from most kernels to preserve photometric scaling */
+          if (kernels->spatialOrder > 0 && index != kernels->subIndex) {
+              value += weightFunc(-1.0) * image->data.F32[y][x];
+          }
+          return value;
+      }
       case PM_SUBTRACTION_KERNEL_ISIS: {
           psKernel *kernel = kernels->preCalc->data[index]; // The convolution kernel
