USGS

Isis 3.0 Developer's Reference (API)

Home

SpecialPixel.h

Go to the documentation of this file.
00001 #ifndef SpecialPixel_h
00002 #define SpecialPixel_h
00003 
00024 #include <vector>
00025 #include <cmath>
00026 #include <cfloat>
00027 #include <QString>
00028 #include <QStringList>
00029 
00030 #include "IException.h"
00031 #include "IString.h"
00032 
00033 namespace Isis {
00034 
00082 
00083   //  Set up special kludge for double precision initialization
00084   typedef union {
00085     unsigned int i[2];
00086     double d;
00087   } DBL_UNION;
00088 
00089 #if ISIS_LITTLE_ENDIAN
00090 #  define DBL_INIT(a,b)  {(b), (a)}
00091 #else
00092 #  define DBL_INIT(a,b)  {(a), (b)}
00093 #endif
00095 
00096   // Define 8-byte special pixel values for IEEE floating point
00097   const DBL_UNION IVALID_MIN8 = { DBL_INIT(0xFFEFFFFF, 0xFFFFFFFA) };
00098   const double VALID_MIN8          = IVALID_MIN8.d;
00099   const double ValidMinimum        = IVALID_MIN8.d; 
00105   const DBL_UNION INULL8 = { DBL_INIT(0xFFEFFFFF, 0xFFFFFFFB) };
00106   const double NULL8               = INULL8.d;
00107   const double Null                = INULL8.d;  
00108 
00109   const DBL_UNION ILOW_REPR_SAT8 = { DBL_INIT(0xFFEFFFFF, 0xFFFFFFFC) };
00110   const double LOW_REPR_SAT8       = ILOW_REPR_SAT8.d;
00111   const double Lrs                 = ILOW_REPR_SAT8.d;  
00115   const DBL_UNION ILOW_INSTR_SAT8 = { DBL_INIT(0xFFEFFFFF, 0xFFFFFFFD) };
00116   const double LOW_INSTR_SAT8      = ILOW_INSTR_SAT8.d;
00117   const double Lis                 = ILOW_INSTR_SAT8.d;  
00121   const DBL_UNION IHIGH_INSTR_SAT8 = { DBL_INIT(0xFFEFFFFF, 0xFFFFFFFE) };
00122   const double HIGH_INSTR_SAT8     = IHIGH_INSTR_SAT8.d;
00123   const double His                 = IHIGH_INSTR_SAT8.d; 
00127   const DBL_UNION IHIGH_REPR_SAT8  = { DBL_INIT(0xFFEFFFFF, 0xFFFFFFFF) };
00128   const double HIGH_REPR_SAT8      = IHIGH_REPR_SAT8.d;
00129   const double Hrs                 = IHIGH_REPR_SAT8.d;  
00133   const double VALID_MAX8 = DBL_MAX;
00134   const double ValidMaximum = DBL_MAX;  
00138 #undef DBL_INIT
00139 
00140   // Define 4-byte special pixel values for IEEE floating point
00141   const int  IVALID_MIN4      = 0xFF7FFFFA;
00142   const float VALID_MIN4       = (*((const float *) &IVALID_MIN4));
00143 
00144   const int  INULL4           =         0xFF7FFFFB;
00145   const float NULL4            = (*((const float *) &INULL4));
00146 
00147   const int  ILOW_REPR_SAT4   =         0xFF7FFFFC;
00148   const float LOW_REPR_SAT4    = (*((const float *) &ILOW_REPR_SAT4));
00149 
00150   const int  ILOW_INSTR_SAT4  =         0xFF7FFFFD;
00151   const float LOW_INSTR_SAT4   = (*((const float *) &ILOW_INSTR_SAT4));
00152 
00153   const int  IHIGH_INSTR_SAT4 =         0xFF7FFFFE;
00154   const float HIGH_INSTR_SAT4  = (*((const float *) &IHIGH_INSTR_SAT4));
00155 
00156   const int  IHIGH_REPR_SAT4  =         0xFF7FFFFF;
00157   const float HIGH_REPR_SAT4   = (*((const float *) &IHIGH_REPR_SAT4));
00158 
00159   const float VALID_MAX4       = FLT_MAX;
00160 
00161   // 2-byte signed special pixel values
00162   const short VALID_MIN2     = ((short)(-32752));
00163   const short NULL2          = ((short)(-32768));
00164   const short LOW_REPR_SAT2  = ((short)(-32767));
00165   const short LOW_INSTR_SAT2 = ((short)(-32766));
00166   const short HIGH_INSTR_SAT2 = ((short)(-32765));
00167   const short HIGH_REPR_SAT2  = ((short)(-32764));
00168   const short VALID_MAX2      = ((short)   32767);
00169 
00170   // 2-byte unsigned special pixel values
00171   const unsigned short VALID_MINU2     = ((unsigned short)       3);
00172   const unsigned short NULLU2          = ((unsigned short)       0);
00173   const unsigned short LOW_REPR_SATU2  = ((unsigned short)       1);
00174   const unsigned short LOW_INSTR_SATU2 = ((unsigned short)       2);
00175   const unsigned short HIGH_INSTR_SATU2 = ((unsigned short)   65534);
00176   const unsigned short HIGH_REPR_SATU2  = ((unsigned short)   65535);
00177   const unsigned short VALID_MAXU2      = ((unsigned short)   65522);
00178 
00179   // 1-byte special pixel values
00180   const unsigned char VALID_MIN1  = ((unsigned char) 1);
00181   const unsigned char NULL1       = ((unsigned char) 0);
00182   const unsigned char LOW_REPR_SAT1 = ((unsigned char) 0);
00183   const unsigned char LOW_INSTR_SAT1 = ((unsigned char) 0);
00184   const unsigned char HIGH_INSTR_SAT1 = ((unsigned char) 255);
00185   const unsigned char HIGH_REPR_SAT1 = ((unsigned char) 255);
00186   const unsigned char VALID_MAX1    = ((unsigned char) 254);
00187 
00196   inline bool IsSpecial(const double d) {
00197     return (d < VALID_MIN8);
00198   }
00199 
00209   inline bool IsSpecial(const float f) {
00210     return (f < VALID_MIN4);
00211   }
00212 
00220   inline bool IsValidPixel(const double d) {
00221     return (d >= VALID_MIN8);
00222   }
00223 
00231   inline bool IsNullPixel(const double d) {
00232     return (d == NULL8);
00233   }
00234 
00242   inline bool IsHighPixel(const double d) {
00243     return (d == HIGH_REPR_SAT8) || (d == HIGH_INSTR_SAT8);
00244   }
00245 
00253   inline bool IsLowPixel(const double d) {
00254     return (d == LOW_REPR_SAT8) || (d == LOW_INSTR_SAT8);
00255   }
00256 
00264   inline bool IsHrsPixel(const double d) {
00265     return (d == HIGH_REPR_SAT8);
00266   }
00267 
00275   inline bool IsHisPixel(const double d) {
00276     return (d == HIGH_INSTR_SAT8);
00277   }
00278 
00286   inline bool IsLisPixel(const double d) {
00287     return (d == LOW_INSTR_SAT8);
00288   }
00289 
00297   inline bool IsLrsPixel(const double d) {
00298     return (d == LOW_REPR_SAT8);
00299   }
00300 
00308   inline double TestPixel(const float t) {
00309     if(t < VALID_MIN4) {
00310       if(t == NULL4) return (NULL8);
00311       if(t == LOW_REPR_SAT4) return (LOW_REPR_SAT8);
00312       if(t == LOW_INSTR_SAT4) return (LOW_INSTR_SAT8);
00313       if(t == HIGH_REPR_SAT4) return (HIGH_REPR_SAT8);
00314       if(t == HIGH_INSTR_SAT4) return (HIGH_INSTR_SAT8);
00315       return (LOW_REPR_SAT8);
00316     }
00317     else if(t > VALID_MAX4) {
00318       return (HIGH_REPR_SAT8);
00319     }
00320     else {
00321       return ((double) t);
00322     }
00323   }
00324 
00333   inline float TestPixel(const double t) {
00334     if(t < (double) VALID_MIN4) {
00335       if(t == NULL8) return (NULL4);
00336       if(t == LOW_REPR_SAT8) return (LOW_REPR_SAT4);
00337       if(t == LOW_INSTR_SAT8) return (LOW_INSTR_SAT4);
00338       if(t == HIGH_INSTR_SAT8) return (HIGH_INSTR_SAT4);
00339       if(t == HIGH_REPR_SAT8) return (HIGH_REPR_SAT4);
00340       return (LOW_REPR_SAT4);
00341     }
00342     else if(t > (double) VALID_MAX4) {
00343       return (HIGH_REPR_SAT8);
00344     }
00345     else {
00346       return ((float) t);
00347     }
00348   }
00349 
00358   inline QString PixelToString(double d) {
00359     if(Isis::IsSpecial(d)) {
00360       if(Isis::IsNullPixel(d)) return "Null";
00361       if(Isis::IsLrsPixel(d)) return "Lrs";
00362       if(Isis::IsHrsPixel(d)) return "Hrs";
00363       if(Isis::IsHisPixel(d)) return "His";
00364       if(Isis::IsLisPixel(d)) return "Lis";
00365       return "Invalid";
00366     }
00367 
00368     QString result;
00369     return result.setNum(d, 'g', 8);
00370   }
00379   inline double StringToPixel(const QString &str) {
00380 
00381     QString s = str.toUpper();
00382 
00383     QStringList legal;
00384     legal.push_back("NULL");
00385     legal.push_back("HRS");
00386     legal.push_back("LRS");
00387     legal.push_back("HIS");
00388     legal.push_back("LIS");
00389     int matches = 0;
00390     for(int i = 0; i < (int) legal.size(); i++) {
00391       if(legal[i].mid(0, s.size()) == s) {
00392         matches++;
00393       }
00394     }
00395     if(matches > 1) {
00396       QString msg = "Input [" + str + "] is not a unique abbreviation. Use " + s + "I or " + s + "R.";
00397       throw IException(IException::User, msg, _FILEINFO_);
00398     }
00399     if(matches == 0) {
00400       try {
00401         return toDouble(s);
00402       }
00403       catch(IException &e) {
00404         QString msg = "Input [" + str + "] does not appear to be a legal special pixel abbreviation or double value.";
00405         throw IException(e, IException::User, msg, _FILEINFO_);
00406       }
00407     }
00408     if(s[0] == 'N') return Null;
00409     if(s.mid(0, 2) == "HR") return Hrs;
00410     if(s.mid(0, 2) == "LR") return Lrs;
00411     if(s.mid(0, 2) == "HI") return His;
00412     else  return Lis;//(s.substr(0,2) == "LI")
00413 
00414   }
00415 }
00416 
00417 #endif
00418