Index: trunk/psModules/src/objects/pmFootprint.c
===================================================================
--- trunk/psModules/src/objects/pmFootprint.c	(revision 23187)
+++ trunk/psModules/src/objects/pmFootprint.c	(revision 27672)
@@ -53,4 +53,5 @@
     assert(nspan >= 0);
     footprint->npix = 0;
+    footprint->nspans = 0; // we may allocate more spans than we set -- this is the number of active spans
     footprint->spans = psArrayAllocEmpty(nspan);
     footprint->peaks = psArrayAlloc(0);
@@ -73,4 +74,23 @@
 }
 
+bool pmFootprintAllocEmptySpans (pmFootprint *footprint, int nSpans) {
+
+    psArrayRealloc (footprint->spans, nSpans);
+    for (int i = 0; i < nSpans; i++) {
+	footprint->spans->data[i] = pmSpanAlloc(-1, -1, -1);
+    }
+    footprint->spans->n = nSpans;
+    return true;
+}
+
+// reset the footprint containers
+bool pmFootprintInit(pmFootprint *footprint) {
+
+    footprint->bbox.x0 = footprint->bbox.y0 = 0;
+    footprint->bbox.x1 = footprint->bbox.y1 = -1;
+    footprint->nspans = 0;
+    return true;
+}
+
 bool pmFootprintTest(const psPtr ptr) {
     return (psMemGetDeallocator(ptr) == (psFreeFunc)footprintFree);
@@ -103,8 +123,10 @@
     psArrayAdd(fp->spans, 1, sp);
     psFree(sp);
-    
+
+    fp->nspans ++;
+
     fp->npix += x1 - x0 + 1;
 
-    if (fp->spans->n == 1) {
+    if (fp->nspans == 1) {
 	fp->bbox.x0 = x0;
 	fp->bbox.x1 = x1;
@@ -121,7 +143,55 @@
 }
 
+
+// Set the next available elements of the nSpan entry in footprint->spans
+pmSpan *pmFootprintSetSpan(pmFootprint *fp,	// the footprint to add to
+			   const int y,		// row to add
+			   int x0,		// range of
+			   int x1) {		// columns
+
+    if (x1 < x0) {
+	int tmp = x0;
+	x0 = x1;
+	x1 = tmp;
+    }
+
+    int N = fp->nspans;
+    if (N == fp->spans->n) {
+	// if we need more space, extend fp->spans as needed
+	int Nalloc = fp->spans->n + 100;
+	psArrayRealloc(fp->spans, Nalloc);
+	fp->spans->n = Nalloc;
+	for (int i = N; i < fp->spans->n; i++) {
+	    fp->spans->data[i] = pmSpanAlloc(-1, -1, -1);
+	}
+    }
+
+    pmSpan *span = fp->spans->data[N];
+    span->y = y;
+    span->x0 = x0;
+    span->x1 = x1;
+
+    fp->nspans ++;
+
+    fp->npix += x1 - x0 + 1;
+
+    if (fp->nspans == 1) {
+	fp->bbox.x0 = x0;
+	fp->bbox.x1 = x1;
+	fp->bbox.y0 = y;
+	fp->bbox.y1 = y;
+    } else {
+	if (x0 < fp->bbox.x0) fp->bbox.x0 = x0;
+	if (x1 > fp->bbox.x1) fp->bbox.x1 = x1;
+	if (y < fp->bbox.y0) fp->bbox.y0 = y;
+	if (y > fp->bbox.y1) fp->bbox.y1 = y;
+    }
+
+    return span;
+}
+
 void pmFootprintSetBBox(pmFootprint *fp) {
     assert (fp != NULL);
-    if (fp->spans->n == 0) {
+    if (fp->nspans == 0) {
 	return;
     }
@@ -132,5 +202,5 @@
     int y1 = sp->y;
 
-    for (int i = 1; i < fp->spans->n; i++) {
+    for (int i = 1; i < fp->nspans; i++) {
 	sp = fp->spans->data[i];
 	
@@ -150,5 +220,5 @@
    assert (fp != NULL);
    int npix = 0;
-   for (int i = 0; i < fp->spans->n; i++) {
+   for (int i = 0; i < fp->nspans; i++) {
        pmSpan *span = fp->spans->data[i];
        npix += span->x1 - span->x0 + 1;
