USGS

Isis 3.0 Object Programmers' Reference

Home

SpecialPixel.h
Go to the documentation of this file.
1 #ifndef SpecialPixel_h
2 #define SpecialPixel_h
3 
24 #include <vector>
25 #include <cmath>
26 #include <cfloat>
27 #include <QString>
28 #include <QStringList>
29 
30 #include "IException.h"
31 #include "IString.h"
32 
33 namespace Isis {
34 
82 
83  // Set up special kludge for double precision initialization
84  typedef union {
85  unsigned int i[2];
86  double d;
87  } DBL_UNION;
88 
89 #if ISIS_LITTLE_ENDIAN
90 # define DBL_INIT(a,b) {(b), (a)}
91 #else
92 # define DBL_INIT(a,b) {(a), (b)}
93 #endif
94 
95 
96  // Define 8-byte special pixel values for IEEE floating point
97  const DBL_UNION IVALID_MIN8 = { DBL_INIT(0xFFEFFFFF, 0xFFFFFFFA) };
98  const double VALID_MIN8 = IVALID_MIN8.d;
99  const double ValidMinimum = IVALID_MIN8.d;
105  const DBL_UNION INULL8 = { DBL_INIT(0xFFEFFFFF, 0xFFFFFFFB) };
106  const double NULL8 = INULL8.d;
107  const double Null = INULL8.d;
108 
109  const DBL_UNION ILOW_REPR_SAT8 = { DBL_INIT(0xFFEFFFFF, 0xFFFFFFFC) };
110  const double LOW_REPR_SAT8 = ILOW_REPR_SAT8.d;
111  const double Lrs = ILOW_REPR_SAT8.d;
115  const DBL_UNION ILOW_INSTR_SAT8 = { DBL_INIT(0xFFEFFFFF, 0xFFFFFFFD) };
116  const double LOW_INSTR_SAT8 = ILOW_INSTR_SAT8.d;
117  const double Lis = ILOW_INSTR_SAT8.d;
121  const DBL_UNION IHIGH_INSTR_SAT8 = { DBL_INIT(0xFFEFFFFF, 0xFFFFFFFE) };
122  const double HIGH_INSTR_SAT8 = IHIGH_INSTR_SAT8.d;
123  const double His = IHIGH_INSTR_SAT8.d;
127  const DBL_UNION IHIGH_REPR_SAT8 = { DBL_INIT(0xFFEFFFFF, 0xFFFFFFFF) };
128  const double HIGH_REPR_SAT8 = IHIGH_REPR_SAT8.d;
129  const double Hrs = IHIGH_REPR_SAT8.d;
133  const double VALID_MAX8 = DBL_MAX;
134  const double ValidMaximum = DBL_MAX;
138 #undef DBL_INIT
139 
140  // Define 4-byte special pixel values for IEEE floating point
141  const int IVALID_MIN4 = 0xFF7FFFFA;
142  const float VALID_MIN4 = (*((const float *) &IVALID_MIN4));
143 
144  const int INULL4 = 0xFF7FFFFB;
145  const float NULL4 = (*((const float *) &INULL4));
146 
147  const int ILOW_REPR_SAT4 = 0xFF7FFFFC;
148  const float LOW_REPR_SAT4 = (*((const float *) &ILOW_REPR_SAT4));
149 
150  const int ILOW_INSTR_SAT4 = 0xFF7FFFFD;
151  const float LOW_INSTR_SAT4 = (*((const float *) &ILOW_INSTR_SAT4));
152 
153  const int IHIGH_INSTR_SAT4 = 0xFF7FFFFE;
154  const float HIGH_INSTR_SAT4 = (*((const float *) &IHIGH_INSTR_SAT4));
155 
156  const int IHIGH_REPR_SAT4 = 0xFF7FFFFF;
157  const float HIGH_REPR_SAT4 = (*((const float *) &IHIGH_REPR_SAT4));
158 
159  const float VALID_MAX4 = FLT_MAX;
160 
161  // 2-byte signed special pixel values
162  const short VALID_MIN2 = ((short)(-32752));
163  const short NULL2 = ((short)(-32768));
164  const short LOW_REPR_SAT2 = ((short)(-32767));
165  const short LOW_INSTR_SAT2 = ((short)(-32766));
166  const short HIGH_INSTR_SAT2 = ((short)(-32765));
167  const short HIGH_REPR_SAT2 = ((short)(-32764));
168  const short VALID_MAX2 = ((short) 32767);
169 
170  // 2-byte unsigned special pixel values
171  const unsigned short VALID_MINU2 = ((unsigned short) 3);
172  const unsigned short NULLU2 = ((unsigned short) 0);
173  const unsigned short LOW_REPR_SATU2 = ((unsigned short) 1);
174  const unsigned short LOW_INSTR_SATU2 = ((unsigned short) 2);
175  const unsigned short HIGH_INSTR_SATU2 = ((unsigned short) 65534);
176  const unsigned short HIGH_REPR_SATU2 = ((unsigned short) 65535);
177  const unsigned short VALID_MAXU2 = ((unsigned short) 65522);
178 
179  // 1-byte special pixel values
180  const unsigned char VALID_MIN1 = ((unsigned char) 1);
181  const unsigned char NULL1 = ((unsigned char) 0);
182  const unsigned char LOW_REPR_SAT1 = ((unsigned char) 0);
183  const unsigned char LOW_INSTR_SAT1 = ((unsigned char) 0);
184  const unsigned char HIGH_INSTR_SAT1 = ((unsigned char) 255);
185  const unsigned char HIGH_REPR_SAT1 = ((unsigned char) 255);
186  const unsigned char VALID_MAX1 = ((unsigned char) 254);
187 
196  inline bool IsSpecial(const double d) {
197  return (d < VALID_MIN8);
198  }
199 
209  inline bool IsSpecial(const float f) {
210  return (f < VALID_MIN4);
211  }
212 
220  inline bool IsValidPixel(const double d) {
221  return (d >= VALID_MIN8);
222  }
223 
231  inline bool IsNullPixel(const double d) {
232  return (d == NULL8);
233  }
234 
242  inline bool IsHighPixel(const double d) {
243  return (d == HIGH_REPR_SAT8) || (d == HIGH_INSTR_SAT8);
244  }
245 
253  inline bool IsLowPixel(const double d) {
254  return (d == LOW_REPR_SAT8) || (d == LOW_INSTR_SAT8);
255  }
256 
264  inline bool IsHrsPixel(const double d) {
265  return (d == HIGH_REPR_SAT8);
266  }
267 
275  inline bool IsHisPixel(const double d) {
276  return (d == HIGH_INSTR_SAT8);
277  }
278 
286  inline bool IsLisPixel(const double d) {
287  return (d == LOW_INSTR_SAT8);
288  }
289 
297  inline bool IsLrsPixel(const double d) {
298  return (d == LOW_REPR_SAT8);
299  }
300 
308  inline double TestPixel(const float t) {
309  if(t < VALID_MIN4) {
310  if(t == NULL4) return (NULL8);
311  if(t == LOW_REPR_SAT4) return (LOW_REPR_SAT8);
312  if(t == LOW_INSTR_SAT4) return (LOW_INSTR_SAT8);
313  if(t == HIGH_REPR_SAT4) return (HIGH_REPR_SAT8);
314  if(t == HIGH_INSTR_SAT4) return (HIGH_INSTR_SAT8);
315  return (LOW_REPR_SAT8);
316  }
317  else if(t > VALID_MAX4) {
318  return (HIGH_REPR_SAT8);
319  }
320  else {
321  return ((double) t);
322  }
323  }
324 
333  inline float TestPixel(const double t) {
334  if(t < (double) VALID_MIN4) {
335  if(t == NULL8) return (NULL4);
336  if(t == LOW_REPR_SAT8) return (LOW_REPR_SAT4);
337  if(t == LOW_INSTR_SAT8) return (LOW_INSTR_SAT4);
338  if(t == HIGH_INSTR_SAT8) return (HIGH_INSTR_SAT4);
339  if(t == HIGH_REPR_SAT8) return (HIGH_REPR_SAT4);
340  return (LOW_REPR_SAT4);
341  }
342  else if(t > (double) VALID_MAX4) {
343  return (HIGH_REPR_SAT8);
344  }
345  else {
346  return ((float) t);
347  }
348  }
349 
358  inline QString PixelToString(double d) {
359  if(Isis::IsSpecial(d)) {
360  if(Isis::IsNullPixel(d)) return "Null";
361  if(Isis::IsLrsPixel(d)) return "Lrs";
362  if(Isis::IsHrsPixel(d)) return "Hrs";
363  if(Isis::IsHisPixel(d)) return "His";
364  if(Isis::IsLisPixel(d)) return "Lis";
365  return "Invalid";
366  }
367 
368  QString result;
369  return result.setNum(d, 'g', 8);
370  }
379  inline double StringToPixel(const QString &str) {
380 
381  QString s = str.toUpper();
382 
383  QStringList legal;
384  legal.push_back("NULL");
385  legal.push_back("HRS");
386  legal.push_back("LRS");
387  legal.push_back("HIS");
388  legal.push_back("LIS");
389  int matches = 0;
390  for(int i = 0; i < (int) legal.size(); i++) {
391  if(legal[i].mid(0, s.size()) == s) {
392  matches++;
393  }
394  }
395  if(matches > 1) {
396  QString msg = "Input [" + str + "] is not a unique abbreviation. Use " + s + "I or " + s + "R.";
398  }
399  if(matches == 0) {
400  try {
401  return toDouble(s);
402  }
403  catch(IException &e) {
404  QString msg = "Input [" + str + "] does not appear to be a legal special pixel abbreviation or double value.";
405  throw IException(e, IException::User, msg, _FILEINFO_);
406  }
407  }
408  if(s[0] == 'N') return Null;
409  if(s.mid(0, 2) == "HR") return Hrs;
410  if(s.mid(0, 2) == "LR") return Lrs;
411  if(s.mid(0, 2) == "HI") return His;
412  else return Lis;//(s.substr(0,2) == "LI")
413 
414  }
415 }
416 
417 #endif
418