Index: trunk/psModules/src/objects/pmFootprintFind.c
===================================================================
--- trunk/psModules/src/objects/pmFootprintFind.c	(revision 18844)
+++ trunk/psModules/src/objects/pmFootprintFind.c	(revision 18901)
@@ -4,6 +4,6 @@
  * @author RHL, Princeton & IfA; EAM, IfA
  *
- * @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
- * @date $Date: 2008-08-01 18:32:27 $
+ * @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
+ * @date $Date: 2008-08-05 02:08:44 $
  * Copyright 2006 Institute for Astronomy, University of Hawaii
  */
@@ -82,15 +82,6 @@
    assert(img != NULL);
 
-   bool F32 = false;                    // is this an F32 image?
-   if (img->type.type == PS_TYPE_F32) {
-       F32 = true;
-   } else if (img->type.type == PS_TYPE_S32) {
-       F32 = false;
-   } else {                             // N.b. You can't trivially add more cases here; F32 is just a bool
-       psError(PS_ERR_UNKNOWN, true, "Unsupported psImage type: %d", img->type.type);
-       return NULL;
-   }
-   psF32 *imgRowF32 = NULL;             // row pointer if F32
-   psS32 *imgRowS32 = NULL;             //  "   "   "  "  !F32
+   psImage *floatImg = img->type.type == PS_TYPE_F32 ? psMemIncrRefCounter(img) :
+       psImageCopy(NULL, img, PS_TYPE_F32); // Floating-point version of image
 
    const int row0 = img->row0;
@@ -116,129 +107,126 @@
  */
    for (int i = 0; i < numRows; i++) {
-      int j;
-      tmp = idc; idc = idp; idp = tmp;  /* swap ID pointers */
-      memset(idc, '\0', numCols*sizeof(int));
-
-      imgRowF32 = img->data.F32[i];     // only one of
-      imgRowS32 = img->data.S32[i];     //      these is valid!
-
-      in_span = 0;                      /* not in a span */
-      for (j = 0; j < numCols; j++) {
-         double pixVal = F32 ? imgRowF32[j] : imgRowS32[j];
-         if (pixVal < threshold) {
-            if (in_span) {
-               if(nspan >= size_spans) {
-                  size_spans *= 2;
-                  spans = psRealloc(spans, size_spans*sizeof(WSPAN));
-               }
-               spans[nspan].id = in_span;
-               spans[nspan].y = i;
-               spans[nspan].x0 = x0;
-               spans[nspan].x1 = j - 1;
-
-               nspan++;
-
-               in_span = 0;
-            }
-         } else {                       /* a pixel to fix */
-            if(idc[j - 1] != 0) {
-               id = idc[j - 1];
-            } else if(idp[j - 1] != 0) {
-               id = idp[j - 1];
-            } else if(idp[j] != 0) {
-               id = idp[j];
-            } else if(idp[j + 1] != 0) {
-               id = idp[j + 1];
-            } else {
-               id = ++nobj;
-
-               if(id >= size_aliases) {
-                  size_aliases *= 2;
-                  aliases = psRealloc(aliases, size_aliases*sizeof(int));
-               }
-               aliases[id] = id;
-            }
-
-            idc[j] = id;
-            if(!in_span) {
-               x0 = j; in_span = id;
-            }
-/*
- * Do we need to merge ID numbers? If so, make suitable entries in aliases[]
- */
-            if(idp[j + 1] != 0 && idp[j + 1] != id) {
-               aliases[resolve_alias(aliases, idp[j + 1])] =
-                                                    resolve_alias(aliases, id);
-
-               idc[j] = id = idp[j + 1];
-            }
-         }
-      }
-
-      if(in_span) {
-         if(nspan >= size_spans) {
-            size_spans *= 2;
-            spans = psRealloc(spans, size_spans*sizeof(WSPAN));
-         }
-
-         assert(nspan < size_spans);    /* we checked for space above */
-         spans[nspan].id = in_span;
-         spans[nspan].y = i;
-         spans[nspan].x0 = x0;
-         spans[nspan].x1 = j - 1;
-
-         nspan++;
-      }
-   }
+       tmp = idc; idc = idp; idp = tmp;  /* swap ID pointers */
+       memset(idc, '\0', numCols*sizeof(int));
+
+       in_span = 0;                      /* not in a span */
+       for (int j = 0; j < numCols; j++) {
+           double pixVal = floatImg->data.F32[i][j]; // Value of pixel
+           if (pixVal < threshold) {
+               if (in_span) {
+                   if(nspan >= size_spans) {
+                       size_spans *= 2;
+                       spans = psRealloc(spans, size_spans*sizeof(WSPAN));
+                   }
+                   spans[nspan].id = in_span;
+                   spans[nspan].y = i;
+                   spans[nspan].x0 = x0;
+                   spans[nspan].x1 = j - 1;
+
+                   nspan++;
+
+                   in_span = 0;
+               }
+           } else {                       /* a pixel to fix */
+               if(idc[j - 1] != 0) {
+                   id = idc[j - 1];
+               } else if(idp[j - 1] != 0) {
+                   id = idp[j - 1];
+               } else if(idp[j] != 0) {
+                   id = idp[j];
+               } else if(idp[j + 1] != 0) {
+                   id = idp[j + 1];
+               } else {
+                   id = ++nobj;
+
+                   if(id >= size_aliases) {
+                       size_aliases *= 2;
+                       aliases = psRealloc(aliases, size_aliases*sizeof(int));
+                   }
+                   aliases[id] = id;
+               }
+
+               idc[j] = id;
+               if(!in_span) {
+                   x0 = j; in_span = id;
+               }
+               /*
+                * Do we need to merge ID numbers? If so, make suitable entries in aliases[]
+                */
+               if(idp[j + 1] != 0 && idp[j + 1] != id) {
+                   aliases[resolve_alias(aliases, idp[j + 1])] =
+                       resolve_alias(aliases, id);
+
+                   idc[j] = id = idp[j + 1];
+               }
+           }
+       }
+
+       if(in_span) {
+           if(nspan >= size_spans) {
+               size_spans *= 2;
+               spans = psRealloc(spans, size_spans*sizeof(WSPAN));
+           }
+
+           assert(nspan < size_spans);    /* we checked for space above */
+           spans[nspan].id = in_span;
+           spans[nspan].y = i;
+           spans[nspan].x0 = x0;
+           spans[nspan].x1 = j - 1;
+
+           nspan++;
+       }
+   }
+   psFree(floatImg);
 
    psFree(id_s);
-/*
- * Resolve aliases; first alias chains, then the IDs in the spans
- */
+   /*
+    * Resolve aliases; first alias chains, then the IDs in the spans
+    */
    for (int i = 0; i < nspan; i++) {
-      spans[i].id = resolve_alias(aliases, spans[i].id);
+       spans[i].id = resolve_alias(aliases, spans[i].id);
    }
 
    psFree(aliases);
-/*
- * Sort spans by ID, so we can sweep through them once
- * XXX replace with a psLib sort call
- */
+   /*
+    * Sort spans by ID, so we can sweep through them once
+    * XXX replace with a psLib sort call
+    */
    if(nspan > 0) {
-      qsort(spans, nspan, sizeof(WSPAN), compar);
-   }
-/*
- * Build pmFootprints from the spans
- */
+       qsort(spans, nspan, sizeof(WSPAN), compar);
+   }
+   /*
+    * Build pmFootprints from the spans
+    */
    psArray *footprints = psArrayAlloc(nobj);
    int n = 0;                   // number of pmFootprints
 
    if(nspan > 0) {
-      id = spans[0].id;
-      i0 = 0;
-      for (int i = 0; i <= nspan; i++) {        /* nspan + 1 to catch last object */
-         if(i == nspan || spans[i].id != id) {
-            pmFootprint *fp = pmFootprintAlloc(i - i0, img);
-
-            for(; i0 < i; i0++) {
-                pmFootprintAddSpan(fp, spans[i0].y + row0,
-                                   spans[i0].x0 + col0, spans[i0].x1 + col0);
-            }
-
-            if (fp->npix < npixMin) {
-               psFree(fp);
-            } else {
-               footprints->data[n++] = fp;
-            }
-         }
-
-         id = spans[i].id;
-      }
+       id = spans[0].id;
+       i0 = 0;
+       for (int i = 0; i <= nspan; i++) {        /* nspan + 1 to catch last object */
+           if(i == nspan || spans[i].id != id) {
+               pmFootprint *fp = pmFootprintAlloc(i - i0, img);
+
+               for(; i0 < i; i0++) {
+                   pmFootprintAddSpan(fp, spans[i0].y + row0,
+                                      spans[i0].x0 + col0, spans[i0].x1 + col0);
+               }
+
+               if (fp->npix < npixMin) {
+                   psFree(fp);
+               } else {
+                   footprints->data[n++] = fp;
+               }
+           }
+
+           id = spans[i].id;
+       }
    }
 
    footprints = psArrayRealloc(footprints, n);
-/*
- * clean up
- */
+   /*
+    * clean up
+    */
    psFree(spans);
 
