Index: trunk/psModules/src/imcombine/pmReadoutCombine.c
===================================================================
--- trunk/psModules/src/imcombine/pmReadoutCombine.c	(revision 7059)
+++ trunk/psModules/src/imcombine/pmReadoutCombine.c	(revision 7194)
@@ -5,6 +5,6 @@
  *  @author GLG, MHPCC
  *
- *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-05-04 02:38:20 $
+ *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-05-24 05:08:52 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -144,5 +144,10 @@
     psVector *colLower = psVectorAlloc(inputs->n, PS_TYPE_U32); // The lower x bound for each image
     psVector *colUpper = psVectorAlloc(inputs->n, PS_TYPE_U32); // The upper x bound for each image
+    rowLower->n = inputs->n;
+    rowUpper->n = inputs->n;
+    colLower->n = inputs->n;
+    colUpper->n = inputs->n;
     psVector *mask   = psVectorAlloc(inputs->n, PS_TYPE_U8); // Mask for stack
+    mask->n = inputs->n;
     psVectorInit(mask, 0);
     bool haveWeights = false;           // Do we have weight images?
@@ -180,17 +185,48 @@
         colUpper->data.U32[i] = readout->col0 + readout->image->numCols;
     }
-
-    // Reset output readout components
-    *(psS32 *) &(output->col0) = minInputCols;
-    *(psS32 *) &(output->row0) = minInputRows;
-    output->image = psImageRecycle(output->image, maxInputCols - minInputCols, maxInputRows - minInputRows,
-                                   PS_TYPE_F32);
-    output->mask = psImageRecycle(output->mask, maxInputCols - minInputCols, maxInputRows - minInputRows,
-                                  PS_TYPE_U8);
-    psImageInit(output->mask, 0);
-    psStatsOptions combineStdev = 0;    // Statistics option for weights
+    if (!valid) {
+        psError(PS_ERR_IO, true, "No valid inputs.\n");
+        return NULL;
+    }
+
+    // If there's existing images, we need to extend them
+    long minOutputRows = (output->image || output->mask || output->weight) ?
+                         PS_MIN(minInputRows, output->row0) : minInputRows; // Smallest row value, considering the output
+    long minOutputCols = (output->image || output->mask || output->weight) ?
+                         PS_MIN(minInputCols, output->col0) : minInputCols; // Smallest column value, considering the output
+
+    // Update the origin
+    *(psS32 *) &(output->col0) = minOutputCols;
+    *(psS32 *) &(output->row0) = minOutputRows;
+
+    // Generate the new output image by extending the current one, or making a whole new one
+    psImage *newImage = psImageAlloc(maxInputCols - minOutputCols, maxInputRows - minOutputRows, PS_TYPE_F32);
+    psImageInit(newImage, 0.0);
+    if (output->image) {
+        psImageOverlaySection(newImage, output->image, output->col0, output->row0, "=");
+        psFree(output->image);
+    }
+    output->image = newImage;
+
+    psImage *newMask = psImageAlloc(maxInputCols - minOutputCols, maxInputRows - minOutputRows, PS_TYPE_U8);
+    psImageInit(newMask, 0);
+    if (output->mask) {
+        psImageOverlaySection(newMask, output->mask, output->col0, output->row0, "=");
+        psFree(output->mask);
+    }
+    output->mask = newMask;
+
+    psStatsOptions combineStdev = 0; // Statistics option for weights
     if (haveWeights) {
-        output->weight = psImageRecycle(output->weight, maxInputCols - minInputCols,
-                                        maxInputRows - minInputRows, PS_TYPE_F32);
+        psImage *newWeight = psImageAlloc(maxInputCols - minOutputCols, maxInputRows - minOutputRows,
+                                          PS_TYPE_F32);
+        psImageInit(newWeight, 0.0);
+        if (output->weight) {
+            psImageOverlaySection(newWeight, output->weight, output->col0, output->row0, "=");
+            psFree(output->weight);
+        }
+        output->weight = newWeight;
+
+        // Get the correct statistics option for weights
         switch (params->combine) {
         case PS_STAT_SAMPLE_MEAN:
@@ -231,6 +267,6 @@
     psMaskType maskVal = params->maskVal; // The mask value
 
-    for (int i = output->row0; i < output->row0 + output->image->numRows; i++) {
-        for (int j = output->col0; j < output->col0 + output->image->numCols; j++) {
+    for (int i = minInputRows; i < maxInputRows; i++) {
+        for (int j = minInputCols; j < maxInputCols; j++) {
 
             int numValid = 0;           // Number of valid pixels in the stack
@@ -246,12 +282,12 @@
 
                 pmReadout *readout = inputs->data[r]; // Input readout
-                int y = i - readout->row0; // y position on input readout
-                int x = j - readout->col0; // x position on input readout
-                if (readout->mask && readout->mask->data.U8[y][x] & maskVal) {
+                int yIn = i - readout->row0; // y position on input readout
+                int xIn = j - readout->col0; // x position on input readout
+                if (readout->mask && readout->mask->data.U8[yIn][xIn] & maskVal) {
                     mask->data.U8[r] &= PM_READOUT_COMBINE_MASKED;
                     continue;
                 }
 
-                pixels->data.F32[r] = readout->image->data.F32[y][x];
+                pixels->data.F32[r] = readout->image->data.F32[yIn][xIn];
 
                 // Apply zero and scale
@@ -264,5 +300,5 @@
 
                 if (haveWeights) {
-                    weights->data.F32[r] = readout->weight->data.F32[y][x];
+                    weights->data.F32[r] = readout->weight->data.F32[yIn][xIn];
                     if (scale) {
                         weights->data.F32[r] /= scale->data.F32[r] * scale->data.F32[r];
@@ -272,6 +308,10 @@
             }
 
+            int yOut = i - output->row0; // y position on output readout
+            int xOut = j - output->col0; // x position on output readout
+            psTrace(__func__, 10, "Output pixel: %d %d\n", xOut, yOut);
+
             if (numValid == 0) {
-                output->mask->data.U8[i][j] = PM_MASK_FLAT;
+                output->mask->data.U8[yOut][xOut] = PM_MASK_FLAT;
                 continue;
             }
@@ -298,13 +338,11 @@
                     }
                 }
-                psFree(index);
             }
 
             // Combination
             psVectorStats(stats, pixels, weights, mask, PM_READOUT_COMBINE_BAD | PM_READOUT_COMBINE_CLIPPED);
-            output->image->data.F32[i][j] = getStat(stats, params->combine);
+            output->image->data.F32[yOut][xOut] = getStat(stats, params->combine);
             if (haveWeights) {
-                output->weight->data.F32[i][j] = getStat(stats, combineStdev);
-                output->weight->data.F32[i][j] *= output->weight->data.F32[i][j]; // Squared for variance
+                output->weight->data.F32[yOut][xOut] = PS_SQR(getStat(stats, combineStdev)); // Variance
             }
 
@@ -315,4 +353,5 @@
     }
 
+    psFree(index);
     psFree(rowLower);
     psFree(rowUpper);
