Index: trunk/psModules/test/tst_pmImageSubtract.c
===================================================================
--- trunk/psModules/test/tst_pmImageSubtract.c	(revision 4224)
+++ trunk/psModules/test/tst_pmImageSubtract.c	(revision 4322)
@@ -10,6 +10,6 @@
  *  data.  More work need to be done to verify the results.
  *
- *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2005-06-13 20:12:18 $
+ *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-06-20 23:21:05 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -33,4 +33,5 @@
 int main(int argc, char* argv[])
 {
+    psLogSetFormat("HLNM");
     return !runTestSuite(stderr, "Test Point Driver", tests, argc, argv);
 }
@@ -495,11 +496,76 @@
 }
 
-#define TST03_THRESHOLD 3.0
-#define TST03_MASK_VAL 1
+
+#define TST03_THRESHOLD  3.0
+#define TST03_MASK_VAL  1
 #define TST03_KERNEL_SIZE 2
 #define TST03_SPATIAL_ORDER 3
 #define TST03_ORDER_LENGTH 2
 #define TST03_SIGMA_LENGTH 3
-#define TST03_FOOTPRINT 5
+#define TST03_PSF_MAX  10.0
+#define TST03_IMAGE_SIZE 40
+#define TST03_NUM_COLS  TST03_IMAGE_SIZE
+#define TST03_NUM_ROWS  TST03_IMAGE_SIZE
+#define TST03_NUM_STAMPS 2
+#define TST03_NUM_STAMPS_COLS TST03_NUM_STAMPS
+#define TST03_NUM_STAMPS_ROWS TST03_NUM_STAMPS
+#define TST03_BORDER  TST03_KERNEL_SIZE
+//#define TST03_FOOTPRINT (((TST03_IMAGE_SIZE - (2 * TST03_BORDER)) / TST03_NUM_STAMPS) - TST03_KERNEL_SIZE)
+#define TST03_FOOTPRINT  4
+#define TST03_PSF_WIDTH  (TST03_FOOTPRINT/2 - 1)
+
+psBool genObject(psImage *tstImg,
+                 psImage *refImg,
+                 psS32 xMin,
+                 psS32 xMax,
+                 psS32 yMin,
+                 psS32 yMax)
+{
+    if (0) {
+        for (psS32 y = yMin ; y <= yMax ; y++) {
+            for (psS32 x = xMin ; x <= xMax ; x++) {
+                refImg->data.F32[(yMax+yMin)/2][(xMax+xMin)/2] = TST03_THRESHOLD + (psF32) (y/10 + x/10);
+                tstImg->data.F32[(yMax+yMin)/2][(xMax+xMin)/2] = TST03_THRESHOLD + (psF32) (y/10 + x/10);
+                refImg->data.F32[(yMax+yMin)/2][(xMax+xMin)/2] = 100.0;
+                tstImg->data.F32[(yMax+yMin)/2][(xMax+xMin)/2] = 100.0;
+
+                // Add some noise for the test image.
+                tstImg->data.F32[(yMax+yMin)/2][(xMax+xMin)/2]+= genRanFloat(0.0, 1.0);
+
+            }
+        }
+
+    } else {
+        if (((1 + 2 * TST03_PSF_WIDTH) > (xMax - xMin)) ||
+                ((1 + 2 * TST03_PSF_WIDTH) > (yMax - yMin))) {
+            printf("INCORRECT TEST CONFIGURATION: TST03_PSF_WIDTH is too big.\n");
+            printf("TST03_PSF_WIDTH is %d: (xMin - xMax) is %d\n", TST03_PSF_WIDTH, (xMax - xMin));
+            return(FALSE);
+        }
+        //
+        // HEY
+        // This code basically creates a peak at the center of the stamp with
+        // a height of TST03_PSF_MAX
+        //
+        psS32 xCenter = (xMax + xMin) / 2;
+        psS32 yCenter = (yMax + yMin) / 2;
+        psF32 subImageWidth = 1.0 + sqrtf(PS_SQR(((psF32) ((yMax-yMin)/2))) + PS_SQR(((psF32) ((xMax-xMin)/2))));
+        for (psS32 y = yMin ; y <= yMax ; y++) {
+            for (psS32 x = xMin ; x <= xMax ; x++) {
+                psF32 dist = sqrtf(PS_SQR((psF32) (y - yCenter)) + PS_SQR((psF32) (x - xCenter)));
+                psF32 pixel = TST03_PSF_MAX * PS_SQR(((psF32) (subImageWidth - dist)) / ((psF32) subImageWidth));
+                if (pixel < 0.0) {
+                    pixel = 0.0;
+                }
+                refImg->data.F32[y][x] = pixel;
+                tstImg->data.F32[y][x] = pixel;
+                // Add some noise for the test image.
+                tstImg->data.F32[y][x]+= genRanFloat(0.0, 1.0);
+            }
+        }
+    }
+    return(TRUE);
+}
+
 /*******************************************************************************
 NOTE: This function returns FALSE if there were no errors.
@@ -548,12 +614,16 @@
             psS32 xMax = PS_MIN(numCols-1, (border + (i + 1) * (numCols - 2.0 * border) / xNum) - 1);
 
-            // Set the center pixel in the stamp.
-            refImg->data.F32[(yMax+yMin)/2][(xMax+xMin)/2] = TST03_THRESHOLD + (psF32) (i + j);
-            tstImg->data.F32[(yMax+yMin)/2][(xMax+xMin)/2] = TST03_THRESHOLD + (psF32) (i + j);
-            refImg->data.F32[(yMax+yMin)/2][(xMax+xMin)/2] = 100.0;
-            tstImg->data.F32[(yMax+yMin)/2][(xMax+xMin)/2] = 100.0;
-
-            // Add some noise for the test image.
-            tstImg->data.F32[(yMax+yMin)/2][(xMax+xMin)/2]+= genRanFloat(0.0, 1.0);
+            if (0) {
+                // Set the center pixel in the stamp.
+                refImg->data.F32[(yMax+yMin)/2][(xMax+xMin)/2] = TST03_THRESHOLD + (psF32) (i + j);
+                tstImg->data.F32[(yMax+yMin)/2][(xMax+xMin)/2] = TST03_THRESHOLD + (psF32) (i + j);
+                refImg->data.F32[(yMax+yMin)/2][(xMax+xMin)/2] = 100.0;
+                tstImg->data.F32[(yMax+yMin)/2][(xMax+xMin)/2] = 100.0;
+
+                // Add some noise for the test image.
+                tstImg->data.F32[(yMax+yMin)/2][(xMax+xMin)/2]+= genRanFloat(0.0, 1.0);
+            } else {
+                genObject(tstImg, refImg, xMin, xMax, yMin, yMax);
+            }
         }
     }
@@ -593,5 +663,5 @@
         //-------------------------------------------------------------------------
         printf("Calling with a NULL psArray stamps.  Should generate error, return FALSE.\n");
-        psBool rc = pmSubtractionCalculateEquation(NULL, refImg, tstImg, myKernels, TST03_KERNEL_SIZE);
+        psBool rc = pmSubtractionCalculateEquation(NULL, refImg, tstImg, myKernels, TST03_FOOTPRINT);
         if (rc == TRUE) {
             printf("TEST ERROR: pmSubtractionCalculateEquation() returned TRUE.\n");
@@ -601,5 +671,5 @@
         //-------------------------------------------------------------------------
         printf("Calling with a NULL reference images.  Should generate error, return FALSE.\n");
-        rc = pmSubtractionCalculateEquation(stamps, NULL, tstImg, myKernels, TST03_KERNEL_SIZE);
+        rc = pmSubtractionCalculateEquation(stamps, NULL, tstImg, myKernels, TST03_FOOTPRINT);
         if (rc == TRUE) {
             printf("TEST ERROR: pmSubtractionCalculateEquation() returned TRUE.\n");
@@ -609,5 +679,5 @@
         //-------------------------------------------------------------------------
         printf("Calling with a NULL input images.  Should generate error, return FALSE.\n");
-        rc = pmSubtractionCalculateEquation(stamps, refImg, NULL, myKernels, TST03_KERNEL_SIZE);
+        rc = pmSubtractionCalculateEquation(stamps, refImg, NULL, myKernels, TST03_FOOTPRINT);
         if (rc == TRUE) {
             printf("TEST ERROR: pmSubtractionCalculateEquation() returned TRUE.\n");
@@ -617,5 +687,5 @@
         //-------------------------------------------------------------------------
         printf("Calling with a NULL kernel basis functions.  Should generate error, return FALSE.\n");
-        rc = pmSubtractionCalculateEquation(stamps, refImg, tstImg, NULL, TST03_KERNEL_SIZE);
+        rc = pmSubtractionCalculateEquation(stamps, refImg, tstImg, NULL, TST03_FOOTPRINT);
         if (rc == TRUE) {
             printf("TEST ERROR: pmSubtractionCalculateEquation() returned TRUE.\n");
@@ -626,5 +696,5 @@
         printf("Calling with acceptable input parameters.  Should return TRUE.\n");
 
-        rc = pmSubtractionCalculateEquation(stamps, refImg, tstImg, myKernels, TST03_KERNEL_SIZE);
+        rc = pmSubtractionCalculateEquation(stamps, refImg, tstImg, myKernels, TST03_FOOTPRINT);
         if (rc != TRUE) {
             printf("TEST ERROR: pmSubtractionCalculateEquation() returned FALSE.\n");
@@ -641,83 +711,98 @@
 
             //-------------------------------------------------------------------------
-            printf("Calling with pmSubtractionSolveEquation() acceptable input parameters.  Should return non-NULL.\n");
+            printf("Calling pmSubtractionSolveEquation() with acceptable input parameters.  Should return non-NULL.\n");
             solution = pmSubtractionSolveEquation(NULL, stamps);
             if (solution == NULL) {
                 printf("TEST ERROR: pmSubtractionSolveEquation() returned NULL.\n");
                 testStatus = true;
+            } else {
+
+                //-------------------------------------------------------------------------
+                printf("Calling pmSubtractionRejectStamps() with acceptable input parameters.  Should return TRUE.\n");
+                rc = pmSubtractionRejectStamps(stamps, maskImg, 0xff, TST03_FOOTPRINT, 1.0, refImg,
+                                               tstImg, solution, myKernels);
+                if (rc != TRUE) {
+                    printf("TEST ERROR: pmSubtractionRejectStamps() returned FALSE.\n");
+                    testStatus = true;
+                } else {
+                    printf("The solution vector is:\n");
+                    for (psS32 i = 0 ; i < solution->n ; i++) {
+                        printf("(%.2f) ", solution->data.F32[i]);
+                    }
+                    printf("\n");
+                }
+
+                //-------------------------------------------------------------------------
+                printf("Calling pmSubtractionKernelImage() with NULL solution.  Should generate error, return NULL.\n");
+                psImage *kernelImg = pmSubtractionKernelImage(NULL, NULL, myKernels, 0.0, 0.0);
+                if (kernelImg != NULL) {
+                    printf("TEST ERROR: pmSubtractionKernelImage() returned non-NULL.\n");
+                    testStatus = true;
+                }
+                free(kernelImg);
+
+                //-------------------------------------------------------------------------
+                printf("Calling pmSubtractionKernelImage() with NULL kernels.  Should generate error, return NULL.\n");
+                kernelImg = pmSubtractionKernelImage(NULL, solution, NULL, 0.0, 0.0);
+                if (kernelImg != NULL) {
+                    printf("TEST ERROR: pmSubtractionKernelImage() returned non-NULL.\n");
+                    testStatus = true;
+                }
+                free(kernelImg);
+
+                //-------------------------------------------------------------------------
+                printf("Calling pmSubtractionKernelImage() unallowable x value.  Should generate error, return NULL.\n");
+                kernelImg = pmSubtractionKernelImage(NULL, solution, myKernels, -2.0, 0.0);
+                if (kernelImg != NULL) {
+                    printf("TEST ERROR: pmSubtractionKernelImage() returned non-NULL.\n");
+                    testStatus = true;
+                }
+                free(kernelImg);
+
+                //-------------------------------------------------------------------------
+                printf("Calling pmSubtractionKernelImage() unallowable x value.  Should generate error, return NULL.\n");
+                kernelImg = pmSubtractionKernelImage(NULL, solution, myKernels, 2.0, 0.0);
+                if (kernelImg != NULL) {
+                    printf("TEST ERROR: pmSubtractionKernelImage() returned non-NULL.\n");
+                    testStatus = true;
+                }
+                free(kernelImg);
+
+                //-------------------------------------------------------------------------
+                printf("Calling pmSubtractionKernelImage() unallowable y value.  Should generate error, return NULL.\n");
+                kernelImg = pmSubtractionKernelImage(NULL, solution, myKernels, 0.0, -2.0);
+                if (kernelImg != NULL) {
+                    printf("TEST ERROR: pmSubtractionKernelImage() returned non-NULL.\n");
+                    testStatus = true;
+                }
+                free(kernelImg);
+
+                //-------------------------------------------------------------------------
+                printf("Calling pmSubtractionKernelImage() unallowable y value.  Should generate error, return NULL.\n");
+                kernelImg = pmSubtractionKernelImage(NULL, solution, myKernels, 0.0, 2.0);
+                if (kernelImg != NULL) {
+                    printf("TEST ERROR: pmSubtractionKernelImage() returned non-NULL.\n");
+                    testStatus = true;
+                }
+                free(kernelImg);
+
+                //-------------------------------------------------------------------------
+                printf("Calling pmSubtractionKernelImage() with acceptable input parameters.  Should return a psImage.\n");
+                kernelImg = pmSubtractionKernelImage(NULL, solution, myKernels, 0.5, 0.5);
+                if (kernelImg == NULL) {
+                    printf("TEST ERROR: pmSubtractionKernelImage() returned NULL.\n");
+                    testStatus = true;
+                } else {
+                    for (psS32 row = 0 ; row < kernelImg->numRows; row++) {
+                        for (psS32 col = 0 ; col < kernelImg->numCols; col++) {
+                            printf("%f ", kernelImg->data.F32[row][col]);
+                        }
+                        printf("\n");
+                    }
+                }
+                free(kernelImg);
+
+                psFree(solution);
             }
-
-            //-------------------------------------------------------------------------
-            printf("Calling with pmSubtractionRejectStamps() acceptable input parameters.  Should return TRUE.\n");
-            rc = pmSubtractionRejectStamps(stamps, maskImg, 0xff, TST03_FOOTPRINT, 1.0, refImg, tstImg, solution, myKernels);
-            if (rc != TRUE) {
-                printf("TEST ERROR: pmSubtractionRejectStamps() returned FALSE.\n");
-                testStatus = true;
-            }
-
-            //-------------------------------------------------------------------------
-            printf("Calling pmSubtractionKernelImage() with NULL solution.  Should generate error, return NULL.\n");
-            psImage *kernelImg = pmSubtractionKernelImage(NULL, NULL, myKernels, 0.0, 0.0);
-            if (kernelImg != NULL) {
-                printf("TEST ERROR: pmSubtractionKernelImage() returned non-NULL.\n");
-                testStatus = true;
-            }
-            free(kernelImg);
-
-            //-------------------------------------------------------------------------
-            printf("Calling pmSubtractionKernelImage() with NULL kernels.  Should generate error, return NULL.\n");
-            kernelImg = pmSubtractionKernelImage(NULL, solution, NULL, 0.0, 0.0);
-            if (kernelImg != NULL) {
-                printf("TEST ERROR: pmSubtractionKernelImage() returned non-NULL.\n");
-                testStatus = true;
-            }
-            free(kernelImg);
-
-            //-------------------------------------------------------------------------
-            printf("Calling pmSubtractionKernelImage() unallowable x value.  Should generate error, return NULL.\n");
-            kernelImg = pmSubtractionKernelImage(NULL, solution, myKernels, -2.0, 0.0);
-            if (kernelImg != NULL) {
-                printf("TEST ERROR: pmSubtractionKernelImage() returned non-NULL.\n");
-                testStatus = true;
-            }
-            free(kernelImg);
-
-            //-------------------------------------------------------------------------
-            printf("Calling pmSubtractionKernelImage() unallowable x value.  Should generate error, return NULL.\n");
-            kernelImg = pmSubtractionKernelImage(NULL, solution, myKernels, 2.0, 0.0);
-            if (kernelImg != NULL) {
-                printf("TEST ERROR: pmSubtractionKernelImage() returned non-NULL.\n");
-                testStatus = true;
-            }
-            free(kernelImg);
-
-            //-------------------------------------------------------------------------
-            printf("Calling pmSubtractionKernelImage() unallowable y value.  Should generate error, return NULL.\n");
-            kernelImg = pmSubtractionKernelImage(NULL, solution, myKernels, 0.0, -2.0);
-            if (kernelImg != NULL) {
-                printf("TEST ERROR: pmSubtractionKernelImage() returned non-NULL.\n");
-                testStatus = true;
-            }
-            free(kernelImg);
-
-            //-------------------------------------------------------------------------
-            printf("Calling pmSubtractionKernelImage() unallowable y value.  Should generate error, return NULL.\n");
-            kernelImg = pmSubtractionKernelImage(NULL, solution, myKernels, 0.0, 2.0);
-            if (kernelImg != NULL) {
-                printf("TEST ERROR: pmSubtractionKernelImage() returned non-NULL.\n");
-                testStatus = true;
-            }
-            free(kernelImg);
-
-            //-------------------------------------------------------------------------
-            printf("Calling with pmSubtractionKernelImage() acceptable input parameters.  Should return a psImage.\n");
-            kernelImg = pmSubtractionKernelImage(NULL, solution, myKernels, 0.0, 0.0);
-            if (kernelImg == NULL) {
-                printf("TEST ERROR: pmSubtractionKernelImage() returned NULL.\n");
-                testStatus = true;
-            }
-            free(kernelImg);
-
-            psFree(solution);
         }
     }
@@ -739,8 +824,20 @@
     bool testStatus = false;
 
-    testStatus|= testSubCalcEqu(100, 100, 2, 2, 3, PM_SUBTRACTION_KERNEL_POIS);
-    testStatus|= testSubCalcEqu(100, 100, 2, 2, 3, PM_SUBTRACTION_KERNEL_ISIS);
+    testStatus|= testSubCalcEqu(TST03_NUM_COLS,
+                                TST03_NUM_ROWS,
+                                TST03_NUM_STAMPS_COLS,
+                                TST03_NUM_STAMPS_ROWS,
+                                TST03_BORDER,
+                                PM_SUBTRACTION_KERNEL_POIS);
+
+    testStatus|= testSubCalcEqu(TST03_NUM_COLS,
+                                TST03_NUM_ROWS,
+                                TST03_NUM_STAMPS_COLS,
+                                TST03_NUM_STAMPS_ROWS,
+                                TST03_BORDER,
+                                PM_SUBTRACTION_KERNEL_ISIS);
 
     return(!testStatus);
 }
 
+//This code will
