Index: /branches/eam_branch_20080804/psModules/src/detrend/pmBias.c
===================================================================
--- /branches/eam_branch_20080804/psModules/src/detrend/pmBias.c	(revision 18878)
+++ /branches/eam_branch_20080804/psModules/src/detrend/pmBias.c	(revision 18879)
@@ -17,4 +17,72 @@
 #include "pmOverscan.h"
 #include "pmBias.h"
+
+typedef struct {
+  pmReadout *in;
+  pmReadout *sub;
+  float scan;
+  int xOffset, yOffset;
+  int rowStart, rowStop;
+} pmBiasSubtractScanArgs;
+
+void pmBiasSubtractScanArgsFree (pmBiasSubtractScanArgs *args) {
+  return;
+}
+
+pmBiasSubtractScanArgs *pmBiasSubtractScanArgsAlloc () {
+
+}
+
+pmBiasSubtractScan_Threaded (psThreadJob *job) {
+
+      args->in = in;
+      args->sub = sub;
+      args->scan = scan;
+      args->xOffset = xOffset;
+      args->yOffset = yOffset;
+      args->rowStart = rowStart;
+      args->rowStop = rowStop;
+      bool status = pmBiasSubtractScan (args->in, args->sub, args->scan, args->xOffset, args->yOffset, args->rowStart, args->rowStop);
+      return status;
+}
+
+bool pmModulesDetrendSetThreads () {
+
+    psThreadTask *task = NULL;
+
+    task = psThreadTaskAlloc ("PSMODULES_DETREND_BIAS", 1);
+    task->function = &pmBiasSubtractScan_Threaded;
+    psThreadTaskAdd (task);
+
+    return true;
+}
+bool pmBiasSubtractScan (pmReadout *in, pmReadout *sub, float scan, int xOffset, int yOffset, int rowStart, int rowStop) {
+
+    psImage *inImage  = in->image;      // The input image
+    psImage *inMask   = in->mask;       // The input mask
+    psImage *subImage = sub->image;     // The image to be subtracted
+    psImage *subMask  = sub->mask;      // The mask for the subtraction image
+
+    if (scale == 1.0) {
+        for (int i = rowStart; i < rowStop; i++) {
+            for (int j = 0; j < inImage->numCols; j++) {
+                inImage->data.F32[i][j] -= subImage->data.F32[i+yOffset][j+xOffset];
+                if (inMask && subMask) {
+                    inMask->data.U8[i][j] |= subMask->data.U8[i+yOffset][j+xOffset];
+                }
+            }
+        }
+    } else {
+        for (int i = rowStart; i < rowStop; i++) {
+            for (int j = 0; j < inImage->numCols; j++) {
+                inImage->data.F32[i][j] -= subImage->data.F32[i+yOffset][j+xOffset] * scale;
+                if (inMask && subMask) {
+                    inMask->data.U8[i][j] |= subMask->data.U8[i+yOffset][j+xOffset];
+                }
+            }
+        }
+    }
+    return true;
+}
 
 // pmBiasSubtractFrame(): this routine will take as input a readout for the input image and a readout for the bias
@@ -76,22 +144,31 @@
     }
 
-    if (scale == 1.0) {
-        for (int i = 0; i < inImage->numRows; i++) {
-            for (int j = 0; j < inImage->numCols; j++) {
-                inImage->data.F32[i][j] -= subImage->data.F32[i+y0in-y0sub][j+x0in-x0sub];
-                if (inMask && subMask) {
-                    inMask->data.U8[i][j] |= subMask->data.U8[i+y0in-y0sub][j+x0in-x0sub];
-                }
-            }
-        }
-    } else {
-        for (int i = 0; i < inImage->numRows; i++) {
-            for (int j = 0; j < inImage->numCols; j++) {
-                inImage->data.F32[i][j] -= subImage->data.F32[i+y0in-y0sub][j+x0in-x0sub] * scale;
-                if (inMask && subMask) {
-                    inMask->data.U8[i][j] |= subMask->data.U8[i+y0in-y0sub][j+x0in-x0sub];
-                }
-            }
-        }
+    int xOffset = x0in - x0sub;
+    int yOffset = y0in - y0sub;
+    for (int rowStart = 0; rowStart < inImage->numRows; rowStart += scanRows) {
+      int rowStop = PS_MIN (rowStart + scanRows, inImage->numRows);
+
+      // allocate a job
+      psThreadJob *job = psThreadJobAlloc ("PSMODULES_DETREND_BIAS");
+
+      pmBiasSubtractScanArgs *args = pmBiasSubtractScanArgsAlloc ();
+      args->in = in;
+      args->sub = sub;
+      args->scan = scan;
+      args->xOffset = xOffset;
+      args->yOffset = yOffset;
+      args->rowStart = rowStart;
+      args->rowStop = rowStop;
+
+      // construct the arguments for this job
+      psArrayAdd (job->args, 1, args);
+      psFree (args);
+
+      // ppImageDetrendReadout(config, options, view)
+      if (!psThreadJobAddPending (job)) {
+	return false;
+      }
+
+      pmBiasSubtractScan (in, sub, scan, xOffset, yOffset, rowStart, rowStop);
     }
 
