IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Sep 25, 2006, 10:23:10 AM (20 years ago)
Author:
Paul Price
Message:

Adding error checks; rearranging code to make it easier to return earlier.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/camera/pmFPA_JPEG.c

    r8848 r8935  
    55 *  @author EAM, IfA
    66 *
    7  *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
    8  *  @date $Date: 2006-09-20 02:36:36 $
     7 *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
     8 *  @date $Date: 2006-09-25 20:23:10 $
    99 *
    1010 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    124124    PS_ASSERT_PTR_NON_NULL(file, false);
    125125
    126     char *name, *mode, *word, *mapname;
    127     psArray *range;
    128     psImageJpegColormap *map;
     126    switch (file->type) {
     127    case PM_FPA_FILE_JPEG: {
     128            // XXX we need to decide where the scale will come from in the long term
     129            psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
     130            psStats *stats = psImageBackground(readout->image, NULL, 0, 0.25, 0.75, 10000, rng);
     131            psFree(rng);
    129132
    130     switch (file->type) {
    131     case PM_FPA_FILE_JPEG:
     133            if (!isfinite(stats->robustMedian) || !isfinite(stats->robustUQ) || !isfinite(stats->robustLQ)) {
     134                psError(PS_ERR_UNKNOWN, false, "Unable to measure statistics for image.\n");
     135                psFree(stats);
     136                return false;
     137            }
     138            float delta = stats->robustUQ - stats->robustLQ; // Inter-quartile range
     139            float min, max;                 // Minimum and maximum for stretch
    132140
    133         name = pmFPAfileNameFromRule (file->filerule, file, view);
     141            psString mode = pmFPAfileNameFromRule (file->extrule, file, view);
     142            psString word = pmFPAfileNameFromRule (file->extxtra, file, view);
     143            psArray *range = psStringSplitArray (word, ":", false);
    134144
    135         mapname = pmFPAfileNameFromRule (file->filextra, file, view);
    136         map = psImageJpegColormapSet (NULL, mapname);
    137         if (!map) {
    138             map = psImageJpegColormapSet (NULL, "-greyscale");
     145            if (!strcasecmp (mode, "RANGE") && range) {
     146                float fmin = atof(range->data[0]);
     147                float fmax = atof(range->data[1]);
     148                min = stats->robustMedian + fmin*delta;
     149                max = stats->robustMedian + fmax*delta;
     150            } else if (!strcasecmp (mode, "FRACTION")) {
     151                float fmin = atof(range->data[0]);
     152                float fmax = atof(range->data[1]);
     153                min = fmin*stats->robustMedian;
     154                max = fmax*stats->robustMedian;
     155            } else {
     156                min = stats->robustMedian - 3*delta;
     157                max = stats->robustMedian + 6*delta;
     158            }
     159            psFree(mode);
     160            psFree(word);
     161            psFree(range);
     162            psFree(stats);
     163
     164            if (!isfinite(min) || !isfinite(max)) {
     165                psError(PS_ERR_UNKNOWN, true, "The stretch parameters are not both finite.\n");
     166                return false;
     167            }
     168
     169            psString name = pmFPAfileNameFromRule (file->filerule, file, view);
     170            psString mapname = pmFPAfileNameFromRule (file->filextra, file, view);
     171            psImageJpegColormap *map = psImageJpegColormapSet (NULL, mapname);
     172            psFree(mapname);
     173            if (!map) {
     174                map = psImageJpegColormapSet (NULL, "-greyscale");
     175            }
     176
     177            psImageJpeg (map, readout->image, name, min, max);
     178            psFree(name);
     179            psFree(map);
     180
     181            return true;
    139182        }
    140 
    141         mode = pmFPAfileNameFromRule (file->extrule, file, view);
    142         word = pmFPAfileNameFromRule (file->extxtra, file, view);
    143         range = psStringSplitArray (word, ":", false);
    144 
    145         // XXX we need to decide where the scale will come from in the long term
    146         psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
    147         psStats *stats = psImageBackground(readout->image, NULL, 0, 0.25, 0.75, 10000, rng);
    148         float delta = stats->robustUQ - stats->robustLQ;
    149         float min = stats->robustMedian - 3*delta;
    150         float max = stats->robustMedian + 6*delta;
    151         if (!strcasecmp (mode, "RANGE") && range) {
    152             float fmin = atof(range->data[0]);
    153             float fmax = atof(range->data[1]);
    154             min = stats->robustMedian + fmin*delta;
    155             max = stats->robustMedian + fmax*delta;
    156         }
    157         if (!strcasecmp (mode, "FRACTION")) {
    158             float fmin = atof(range->data[0]);
    159             float fmax = atof(range->data[1]);
    160             min = fmin*stats->robustMedian;
    161             max = fmax*stats->robustMedian;
    162         }
    163         psImageJpeg (map, readout->image, name, min, max);
    164 
    165         psFree(name);
    166         psFree(mapname);
    167         psFree(map);
    168         psFree(mode);
    169         psFree(word);
    170         psFree(range);
    171         psFree(rng);
    172         psFree(stats);
    173 
    174         return true;
    175 
    176183    default:
    177184        fprintf (stderr, "warning: type mismatch\n");
Note: See TracChangeset for help on using the changeset viewer.