Isis 3.0 Developer's Reference (API) |
Home |
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