Index: trunk/psModules/src/camera/pmFPA_JPEG.c
===================================================================
--- trunk/psModules/src/camera/pmFPA_JPEG.c	(revision 8848)
+++ trunk/psModules/src/camera/pmFPA_JPEG.c	(revision 8935)
@@ -5,6 +5,6 @@
  *  @author EAM, IfA
  *
- *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-09-20 02:36:36 $
+ *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-09-25 20:23:10 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -124,54 +124,61 @@
     PS_ASSERT_PTR_NON_NULL(file, false);
 
-    char *name, *mode, *word, *mapname;
-    psArray *range;
-    psImageJpegColormap *map;
+    switch (file->type) {
+    case PM_FPA_FILE_JPEG: {
+            // XXX we need to decide where the scale will come from in the long term
+            psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
+            psStats *stats = psImageBackground(readout->image, NULL, 0, 0.25, 0.75, 10000, rng);
+            psFree(rng);
 
-    switch (file->type) {
-    case PM_FPA_FILE_JPEG:
+            if (!isfinite(stats->robustMedian) || !isfinite(stats->robustUQ) || !isfinite(stats->robustLQ)) {
+                psError(PS_ERR_UNKNOWN, false, "Unable to measure statistics for image.\n");
+                psFree(stats);
+                return false;
+            }
+            float delta = stats->robustUQ - stats->robustLQ; // Inter-quartile range
+            float min, max;                 // Minimum and maximum for stretch
 
-        name = pmFPAfileNameFromRule (file->filerule, file, view);
+            psString mode = pmFPAfileNameFromRule (file->extrule, file, view);
+            psString word = pmFPAfileNameFromRule (file->extxtra, file, view);
+            psArray *range = psStringSplitArray (word, ":", false);
 
-        mapname = pmFPAfileNameFromRule (file->filextra, file, view);
-        map = psImageJpegColormapSet (NULL, mapname);
-        if (!map) {
-            map = psImageJpegColormapSet (NULL, "-greyscale");
+            if (!strcasecmp (mode, "RANGE") && range) {
+                float fmin = atof(range->data[0]);
+                float fmax = atof(range->data[1]);
+                min = stats->robustMedian + fmin*delta;
+                max = stats->robustMedian + fmax*delta;
+            } else if (!strcasecmp (mode, "FRACTION")) {
+                float fmin = atof(range->data[0]);
+                float fmax = atof(range->data[1]);
+                min = fmin*stats->robustMedian;
+                max = fmax*stats->robustMedian;
+            } else {
+                min = stats->robustMedian - 3*delta;
+                max = stats->robustMedian + 6*delta;
+            }
+            psFree(mode);
+            psFree(word);
+            psFree(range);
+            psFree(stats);
+
+            if (!isfinite(min) || !isfinite(max)) {
+                psError(PS_ERR_UNKNOWN, true, "The stretch parameters are not both finite.\n");
+                return false;
+            }
+
+            psString name = pmFPAfileNameFromRule (file->filerule, file, view);
+            psString mapname = pmFPAfileNameFromRule (file->filextra, file, view);
+            psImageJpegColormap *map = psImageJpegColormapSet (NULL, mapname);
+            psFree(mapname);
+            if (!map) {
+                map = psImageJpegColormapSet (NULL, "-greyscale");
+            }
+
+            psImageJpeg (map, readout->image, name, min, max);
+            psFree(name);
+            psFree(map);
+
+            return true;
         }
-
-        mode = pmFPAfileNameFromRule (file->extrule, file, view);
-        word = pmFPAfileNameFromRule (file->extxtra, file, view);
-        range = psStringSplitArray (word, ":", false);
-
-        // XXX we need to decide where the scale will come from in the long term
-        psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
-        psStats *stats = psImageBackground(readout->image, NULL, 0, 0.25, 0.75, 10000, rng);
-        float delta = stats->robustUQ - stats->robustLQ;
-        float min = stats->robustMedian - 3*delta;
-        float max = stats->robustMedian + 6*delta;
-        if (!strcasecmp (mode, "RANGE") && range) {
-            float fmin = atof(range->data[0]);
-            float fmax = atof(range->data[1]);
-            min = stats->robustMedian + fmin*delta;
-            max = stats->robustMedian + fmax*delta;
-        }
-        if (!strcasecmp (mode, "FRACTION")) {
-            float fmin = atof(range->data[0]);
-            float fmax = atof(range->data[1]);
-            min = fmin*stats->robustMedian;
-            max = fmax*stats->robustMedian;
-        }
-        psImageJpeg (map, readout->image, name, min, max);
-
-        psFree(name);
-        psFree(mapname);
-        psFree(map);
-        psFree(mode);
-        psFree(word);
-        psFree(range);
-        psFree(rng);
-        psFree(stats);
-
-        return true;
-
     default:
         fprintf (stderr, "warning: type mismatch\n");
