Index: trunk/Ohana/src/libfits/include/gfitsio.h
===================================================================
--- trunk/Ohana/src/libfits/include/gfitsio.h	(revision 19250)
+++ trunk/Ohana/src/libfits/include/gfitsio.h	(revision 20652)
@@ -138,5 +138,5 @@
 
 void   	gfits_add_matrix_value         PROTO((Matrix *matrix, int x, int y, double value)); 
-int    	gfits_convert_format           PROTO((Header *header, Matrix *matrix, int outBitpix, double outScale, double outZero, int outUnsign));
+int    	gfits_convert_format           PROTO((Header *header, Matrix *matrix, int outBitpix, double outScale, double outZero, int inBlank, int outUnsign));
 int     gfits_copy_matrix              PROTO((Matrix *in, Matrix *out)); 
 int     gfits_create_matrix            PROTO((Header *header, Matrix *matrix)); 
@@ -157,5 +157,5 @@
 int     gfits_uncompress_image 	       PROTO((Header *header, Matrix *matrix, FTable *ftable));
 int     gfits_uncompress_data  	       PROTO((char *zdata, int Nzdata, char *cmptype, char **optname, char **optvalue, int Nopt, char *outdata, int *Nout, int out_pixsize));
-int     gfits_distribute_data  	       PROTO((Matrix *matrix, int bitpix, char *data, int Ndata, int *otile, int *ztile, float zscale, float zzero));
+int     gfits_distribute_data  	       PROTO((Matrix *matrix, int bitpix, char *data, int Ndata, int *otile, int oblank, int *ztile, int zblank, float zscale, float zzero));
 int     gfits_byteswap_zdata   	       PROTO((char *zdata, int Nzdata, int bitpix));
 int     gfits_extension_is_compressed  PROTO((Header *header));
Index: trunk/Ohana/src/libfits/matrix/F_compress_M.c
===================================================================
--- trunk/Ohana/src/libfits/matrix/F_compress_M.c	(revision 19250)
+++ trunk/Ohana/src/libfits/matrix/F_compress_M.c	(revision 20652)
@@ -34,5 +34,5 @@
   char cmptype[80];
   char zaxis[10], naxis[10], key[10], word[81], exttype[81], checksum[81], datasum[81];
-  int Noptions, NOPTIONS;
+  int Noptions, NOPTIONS, zblank, oblank;
   VarLengthColumn zdef;
   float zscale, zzero;
@@ -177,4 +177,10 @@
   gfits_scan (header, "ZSCALE", "%lf", 1, &zscale);
 
+  zblank = 32767;
+  gfits_scan (header, "ZBLANK", "%d", 1, &zblank);
+
+  oblank = 32767;
+  gfits_scan (header, "BLANK", "%d", 1, &oblank);
+
   zzero = 0;
   gfits_scan (header, "ZZERO", "%lf", 1, &zzero);
@@ -248,5 +254,5 @@
 
     // copy the uncompressed pixels into their correct locations 	    
-    if (!gfits_distribute_data (matrix, odata_pixsize, out, Nout, otile, ztile, zscale, zzero)) return (FALSE);
+    if (!gfits_distribute_data (matrix, odata_pixsize, out, Nout, otile, oblank, ztile, zblank, zscale, zzero)) return (FALSE);
 
     // update the tile counters, carrying to the next dimension if needed
@@ -289,5 +295,5 @@
 
 // bitpix is the input data size/type
-int gfits_distribute_data (Matrix *matrix, int bitpix, char *data, int Ndata, int *otile, int *ztile, float zscale, float zzero) {
+int gfits_distribute_data (Matrix *matrix, int bitpix, char *data, int Ndata, int *otile, int oblank, int *ztile, int zblank, float zscale, float zzero) {
 
   int i, j, start, offset, coord, Nline;
@@ -331,6 +337,9 @@
     TYPE *Optr = (TYPE *) &matrix->buffer[SIZE*(offset + start)]; \
     for (j = 0; j < Ztile[0]; j++, Iptr++, Optr++) { \
-      *Optr = *Iptr * zscale + zzero; \
-    } }
+      if (*Iptr == zblank) { \
+	  *Optr = oblank;    \
+      } else { \
+	  *Optr = *Iptr * zscale + zzero;	\
+      } } }
 
   // this macro sets up the outer switch and calls above macro with all output bitpix options
Index: trunk/Ohana/src/libfits/matrix/F_convert_format.c
===================================================================
--- trunk/Ohana/src/libfits/matrix/F_convert_format.c	(revision 19250)
+++ trunk/Ohana/src/libfits/matrix/F_convert_format.c	(revision 20652)
@@ -2,32 +2,93 @@
 # include <gfitsio.h>
 
-# define CONVERTDOWN \
-  inMode  *in; \
-  outMode *out; \
-  out = (outMode *) matrix[0].buffer; \
-  in  = (inMode  *) matrix[0].buffer; \
-  for (i = 0; i < Npixels; i++, out++, in++) \
-    *out = *in*A + B; \
+# ifndef NAN
+# ifndef BYTE_SWAP
+#  define __nan_bytes           { 0x7f, 0xc0, 0, 0 }
+# else
+#  define __nan_bytes           { 0, 0, 0xc0, 0x7f }
+# endif
+static union { unsigned char __c[4]; float __d; } __nan_union
+__attribute_used__ = { __nan_bytes };
+# define NAN    (__nan_union.__d)
+# endif
+
+# define CONVERTDOWN(MY_NAN)				\
+  inMode  *in;						\
+  outMode *out;						\
+  out = (outMode *) matrix[0].buffer;			\
+  in  = (inMode  *) matrix[0].buffer;			\
+  for (i = 0; i < Npixels; i++, out++, in++)		\
+    if (*in == inBlank) {				\
+      *out = (MY_NAN);					\
+    } else {						\
+      *out = *in*A + B;					\
+    }							\
   REALLOCATE (matrix[0].buffer, char, matrix[0].size); 
 
-# define CONVERTSAME \
-  inMode  *in; \
-  outMode *out; \
-  out = (outMode *) matrix[0].buffer; \
-  in  = (inMode  *) matrix[0].buffer; \
-  for (i = 0; i < Npixels; i++, out++, in++) \
-    *out = *in*A + B; 
-
-# define CONVERTUP \
-  inMode  *in; \
-  outMode *out; \
-  REALLOCATE (matrix[0].buffer, char, matrix[0].size); \
-  out = (outMode *)matrix[0].buffer + Npixels - 1; \
-  in  = (inMode  *)matrix[0].buffer + Npixels - 1; \
-  for (i = 0; i < Npixels; i++, out--, in--) \
-    *out = *in*A + B;
+# define CONVERTSAME(MY_NAN)			\
+  inMode  *in;					\
+  outMode *out;					\
+  out = (outMode *) matrix[0].buffer;		\
+  in  = (inMode  *) matrix[0].buffer;		\
+  for (i = 0; i < Npixels; i++, out++, in++)	\
+    if (*in == inBlank) {			\
+      *out = (MY_NAN);				\
+    } else {					\
+      *out = *in*A + B;				\
+    }
+
+# define CONVERTUP(MY_NAN)				\
+  inMode  *in;						\
+  outMode *out;						\
+  REALLOCATE (matrix[0].buffer, char, matrix[0].size);	\
+  out = (outMode *)matrix[0].buffer + Npixels - 1;	\
+  in  = (inMode  *)matrix[0].buffer + Npixels - 1;	\
+  for (i = 0; i < Npixels; i++, out--, in--)		\
+    if (*in == inBlank) {				\
+      *out = (MY_NAN);					\
+    } else {						\
+      *out = *in*A + B;					\
+    }
+
+# define CONVERTDOWN_FF(MY_NAN)				\
+  inMode  *in;						\
+  outMode *out;						\
+  out = (outMode *) matrix[0].buffer;			\
+  in  = (inMode  *) matrix[0].buffer;			\
+  for (i = 0; i < Npixels; i++, out++, in++)		\
+    if (isnan(*in) || isinf(*in)) {			\
+      *out = (MY_NAN);					\
+    } else {						\
+      *out = *in*A + B;					\
+    }							\
+  REALLOCATE (matrix[0].buffer, char, matrix[0].size); 
+
+# define CONVERTSAME_FF(MY_NAN)			\
+  inMode  *in;					\
+  outMode *out;					\
+  out = (outMode *) matrix[0].buffer;		\
+  in  = (inMode  *) matrix[0].buffer;		\
+  for (i = 0; i < Npixels; i++, out++, in++)	\
+    if (isnan(*in) || isinf(*in)) {			\
+      *out = (MY_NAN);				\
+    } else {					\
+      *out = *in*A + B;				\
+    }
+
+# define CONVERTUP_FF(MY_NAN)				\
+  inMode  *in;						\
+  outMode *out;						\
+  REALLOCATE (matrix[0].buffer, char, matrix[0].size);	\
+  out = (outMode *)matrix[0].buffer + Npixels - 1;	\
+  in  = (inMode  *)matrix[0].buffer + Npixels - 1;	\
+  for (i = 0; i < Npixels; i++, out--, in--)		\
+    if (isnan(*in) || isinf(*in)) {			\
+      *out = (MY_NAN);					\
+    } else {						\
+      *out = *in*A + B;					\
+    }
 
 /*********************** fits convert format ***********************************/
-int gfits_convert_format (Header *header, Matrix *matrix, int outBitpix, double outScale, double outZero, int outUnsign) {
+int gfits_convert_format (Header *header, Matrix *matrix, int outBitpix, double outScale, double outZero, int inBlank, int outUnsign) {
 
   unsigned long i, nbytes, Npixels;
@@ -63,300 +124,300 @@
   if ((!outUnsign) && (!inUnsign)) {  /** BLOCK 1 **/
     switch (inBitpix) {
-    case 8: 
-      { typedef unsigned char inMode;
+      case 8: 
+	{ typedef unsigned char inMode;
 	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTSAME; break; }
-	case 16:  { typedef short          outMode; CONVERTUP;   break; }
-	case -16: { typedef unsigned short outMode; CONVERTUP;   break; }
-	case 32:  { typedef int            outMode; CONVERTUP;   break; }
-	case -32: { typedef float          outMode; CONVERTUP;   break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case 16: 
-      { typedef short inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTSAME; break; }
-	case -16: { typedef unsigned short outMode; CONVERTSAME; break; }
-	case 32:  { typedef int            outMode; CONVERTUP;   break; }
-	case -32: { typedef float          outMode; CONVERTUP;   break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case -16: 
-      { typedef unsigned short inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTSAME; break; }
-	case -16: { typedef unsigned short outMode; CONVERTSAME; break; }
-	case 32:  { typedef int            outMode; CONVERTUP;   break; }
-	case -32: { typedef float          outMode; CONVERTUP;   break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case 32: 
-      { typedef int inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short outMode; CONVERTDOWN; break; }
-	case 32:  { typedef int            outMode; CONVERTSAME; break; }
-	case -32: { typedef float          outMode; CONVERTSAME; break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;
-    case -32: 
-      { typedef float inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short outMode; CONVERTDOWN; break; }
-	case 32:  { typedef int            outMode; CONVERTSAME; break; }
-	case -32: { typedef float          outMode; CONVERTSAME; break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;
-    case -64: 
-      { typedef double inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short outMode; CONVERTDOWN; break; }
-	case 32:  { typedef int            outMode; CONVERTDOWN; break; }
-	case -32: { typedef float          outMode; CONVERTDOWN; break; }
-	case -64: { typedef double         outMode; CONVERTSAME; break; }
-	}
-      }
+	  case 8:   { typedef unsigned char  outMode; CONVERTSAME(0); break; }
+	  case 16:  { typedef short          outMode; CONVERTUP(0);   break; }
+	  case -16: { typedef unsigned short outMode; CONVERTUP(0);   break; }
+	  case 32:  { typedef int            outMode; CONVERTUP(0);   break; }
+	  case -32: { typedef float          outMode; CONVERTUP(NAN);   break; }
+	  case -64: { typedef double         outMode; CONVERTUP(NAN);   break; }
+	}
+	}
+	break;  
+      case 16: 
+	{ typedef short inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTSAME(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTSAME(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTUP(0);   break; }
+	    case -32: { typedef float          outMode; CONVERTUP(NAN);   break; }
+	    case -64: { typedef double         outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;  
+      case -16: 
+	{ typedef unsigned short inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTSAME(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTSAME(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTUP(0);   break; }
+	    case -32: { typedef float          outMode; CONVERTUP(NAN);   break; }
+	    case -64: { typedef double         outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;  
+      case 32: 
+	{ typedef int inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTDOWN(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTDOWN(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTSAME(0); break; }
+	    case -32: { typedef float          outMode; CONVERTSAME(NAN); break; }
+	    case -64: { typedef double         outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;
+      case -32: 
+	{ typedef float inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN_FF(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTDOWN_FF(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTDOWN_FF(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTSAME_FF(0); break; }
+	    case -32: { typedef float          outMode; CONVERTSAME_FF(NAN); break; }
+	    case -64: { typedef double         outMode; CONVERTUP_FF(NAN);   break; }
+	  }
+	}
+	break;
+      case -64: 
+	{ typedef double inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN_FF(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTDOWN_FF(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTDOWN_FF(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTDOWN_FF(0); break; }
+	    case -32: { typedef float          outMode; CONVERTDOWN_FF(NAN); break; }
+	    case -64: { typedef double         outMode; CONVERTSAME_FF(NAN); break; }
+	  }
+	}
     }
   }
   if ((outUnsign) && (!inUnsign)) {  /** BLOCK 3 **/
     switch (inBitpix) {
-    case 8: 
-      { typedef unsigned char inMode;
+      case 8: 
+	{ typedef unsigned char inMode;
 	switch (outBitpix) {
-	case 8:   { typedef          char   outMode; CONVERTSAME; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTUP;   break; }
-	case -16: { typedef unsigned short  outMode; CONVERTUP;   break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTUP;   break; }
-	case -32: { typedef          float  outMode; CONVERTUP;   break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case 16: 
-      { typedef short inMode;
-	switch (outBitpix) {
-	case 8:   { typedef          char   outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTSAME; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTSAME; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTUP;   break; }
-	case -32: { typedef          float  outMode; CONVERTUP;   break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case -16: 
-      { typedef unsigned short inMode;
-	switch (outBitpix) {
-	case 8:   { typedef          char   outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTSAME; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTSAME; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTUP;   break; }
-	case -32: { typedef          float  outMode; CONVERTUP;   break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case 32: 
-      { typedef int inMode;
-	switch (outBitpix) {
-	case 8:   { typedef          char   outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTSAME; break; }
-	case -32: { typedef          float  outMode; CONVERTSAME; break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}
-      }
-      break;
-    case -32: 
-      { typedef float inMode;
-	switch (outBitpix) {
-	case 8:   { typedef          char   outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTSAME; break; }
-	case -32: { typedef          float  outMode; CONVERTSAME; break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}
-      }
-      break;
-    case -64: 
-      { typedef double inMode;
-	switch (outBitpix) {
-	case 8:   { typedef          char   outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTDOWN; break; }
-	case -32: { typedef          float  outMode; CONVERTDOWN; break; }
-	case -64: { typedef          double outMode; CONVERTSAME; break; }
-	}
-      }
+	  case 8:   { typedef          char   outMode; CONVERTSAME(0); break; }
+	  case 16:  { typedef unsigned short  outMode; CONVERTUP(0);   break; }
+	  case -16: { typedef unsigned short  outMode; CONVERTUP(0);   break; }
+	  case 32:  { typedef unsigned int    outMode; CONVERTUP(0);   break; }
+	  case -32: { typedef          float  outMode; CONVERTUP(NAN);   break; }
+	  case -64: { typedef          double outMode; CONVERTUP(NAN);   break; }
+	}
+	}
+	break;  
+      case 16: 
+	{ typedef short inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef          char   outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTSAME(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTSAME(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTUP(0);   break; }
+	    case -32: { typedef          float  outMode; CONVERTUP(NAN);   break; }
+	    case -64: { typedef          double outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;  
+      case -16: 
+	{ typedef unsigned short inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef          char   outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTSAME(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTSAME(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTUP(0);   break; }
+	    case -32: { typedef          float  outMode; CONVERTUP(NAN);   break; }
+	    case -64: { typedef          double outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;  
+      case 32: 
+	{ typedef int inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef          char   outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTDOWN(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTDOWN(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTSAME(0); break; }
+	    case -32: { typedef          float  outMode; CONVERTSAME(NAN); break; }
+	    case -64: { typedef          double outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;
+      case -32: 
+	{ typedef float inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef          char   outMode; CONVERTDOWN_FF(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTDOWN_FF(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTDOWN_FF(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTSAME_FF(0); break; }
+	    case -32: { typedef          float  outMode; CONVERTSAME_FF(NAN); break; }
+	    case -64: { typedef          double outMode; CONVERTUP_FF(NAN);   break; }
+	  }
+	}
+	break;
+      case -64: 
+	{ typedef double inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef          char   outMode; CONVERTDOWN_FF(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTDOWN_FF(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTDOWN_FF(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTDOWN_FF(0); break; }
+	    case -32: { typedef          float  outMode; CONVERTDOWN_FF(NAN); break; }
+	    case -64: { typedef          double outMode; CONVERTSAME_FF(NAN); break; }
+	  }
+	}
     }
   }
   if ((!outUnsign) && (inUnsign)) {  /** BLOCK 2 **/
     switch (inBitpix) {
-    case 8: 
-      { typedef unsigned char inMode;
+      case 8: 
+	{ typedef unsigned char inMode;
 	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTSAME; break; }
-	case 16:  { typedef short          outMode; CONVERTUP;   break; }
-	case -16: { typedef unsigned short outMode; CONVERTUP;   break; }
-	case 32:  { typedef int            outMode; CONVERTUP;   break; }
-	case -32: { typedef float          outMode; CONVERTUP;   break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case 16: 
-      { typedef unsigned short inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTSAME; break; }
-	case -16: { typedef unsigned short outMode; CONVERTSAME; break; }
-	case 32:  { typedef int            outMode; CONVERTUP;   break; }
-	case -32: { typedef float          outMode; CONVERTUP;   break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case -16: 
-      { typedef unsigned short inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTSAME; break; }
-	case -16: { typedef unsigned short outMode; CONVERTSAME; break; }
-	case 32:  { typedef int            outMode; CONVERTUP;   break; }
-	case -32: { typedef float          outMode; CONVERTUP;   break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case 32: 
-      { typedef unsigned int inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short outMode; CONVERTDOWN; break; }
-	case 32:  { typedef int            outMode; CONVERTSAME; break; }
-	case -32: { typedef float          outMode; CONVERTSAME; break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;
-    case -32: 
-      { typedef float inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short outMode; CONVERTDOWN; break; }
-	case 32:  { typedef int            outMode; CONVERTSAME; break; }
-	case -32: { typedef float          outMode; CONVERTSAME; break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;
-    case -64: 
-      { typedef double inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short outMode; CONVERTDOWN; break; }
-	case 32:  { typedef int            outMode; CONVERTDOWN; break; }
-	case -32: { typedef float          outMode; CONVERTDOWN; break; }
-	case -64: { typedef double         outMode; CONVERTSAME; break; }
-	}
-      }
+	  case 8:   { typedef unsigned char  outMode; CONVERTSAME(0); break; }
+	  case 16:  { typedef short          outMode; CONVERTUP(0);   break; }
+	  case -16: { typedef unsigned short outMode; CONVERTUP(0);   break; }
+	  case 32:  { typedef int            outMode; CONVERTUP(0);   break; }
+	  case -32: { typedef float          outMode; CONVERTUP(NAN);   break; }
+	  case -64: { typedef double         outMode; CONVERTUP(NAN);   break; }
+	}
+	}
+	break;  
+      case 16: 
+	{ typedef unsigned short inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTSAME(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTSAME(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTUP(0);   break; }
+	    case -32: { typedef float          outMode; CONVERTUP(NAN);   break; }
+	    case -64: { typedef double         outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;  
+      case -16: 
+	{ typedef unsigned short inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTSAME(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTSAME(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTUP(0);   break; }
+	    case -32: { typedef float          outMode; CONVERTUP(NAN);   break; }
+	    case -64: { typedef double         outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;  
+      case 32: 
+	{ typedef unsigned int inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTDOWN(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTDOWN(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTSAME(0); break; }
+	    case -32: { typedef float          outMode; CONVERTSAME(NAN); break; }
+	    case -64: { typedef double         outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;
+      case -32: 
+	{ typedef float inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN_FF(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTDOWN_FF(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTDOWN_FF(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTSAME_FF(0); break; }
+	    case -32: { typedef float          outMode; CONVERTSAME_FF(NAN); break; }
+	    case -64: { typedef double         outMode; CONVERTUP_FF(NAN);   break; }
+	  }
+	}
+	break;
+      case -64: 
+	{ typedef double inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN_FF(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTDOWN_FF(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTDOWN_FF(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTDOWN_FF(0); break; }
+	    case -32: { typedef float          outMode; CONVERTDOWN_FF(NAN); break; }
+	    case -64: { typedef double         outMode; CONVERTSAME_FF(NAN); break; }
+	  }
+	}
     }
   }
   if ((outUnsign) && (inUnsign)) {
     switch (inBitpix) {
-    case 8: 
-      { typedef char inMode;
+      case 8: 
+	{ typedef char inMode;
 	switch (outBitpix) {
-	case 8:   { typedef char            outMode; CONVERTSAME; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTUP;   break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTUP;   break; }
-	case -32: { typedef          float  outMode; CONVERTUP;   break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case 16: 
-      { typedef unsigned short inMode;
-	switch (outBitpix) {
-	case 8:   { typedef char            outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTSAME; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTUP;   break; }
-	case -32: { typedef          float  outMode; CONVERTUP;   break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case -16: 
-      { typedef unsigned short inMode;
-	switch (outBitpix) {
-	case 8:   { typedef char            outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTSAME; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTUP;   break; }
-	case -32: { typedef          float  outMode; CONVERTUP;   break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case 32: 
-      { typedef unsigned int inMode;
-	switch (outBitpix) {
-	case 8:   { typedef char            outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTSAME; break; }
-	case -32: { typedef          float  outMode; CONVERTSAME; break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}				    
-      }					    
-      break;				    
-    case -32: 				    
-      { typedef float inMode;		    
-	switch (outBitpix) {		    
-	case 8:   { typedef char            outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTSAME; break; }
-	case -32: { typedef          float  outMode; CONVERTSAME; break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}				    
-      }					    
-      break;				    
-    case -64: 				    
-      { typedef double inMode;		    
-	switch (outBitpix) {		    
-	case 8:   { typedef char            outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTDOWN; break; }
-	case -32: { typedef          float  outMode; CONVERTDOWN; break; }
-	case -64: { typedef          double outMode; CONVERTSAME; break; }
-	}
-      }
+	  case 8:   { typedef char            outMode; CONVERTSAME(0); break; }
+	  case 16:  { typedef unsigned short  outMode; CONVERTUP(0);   break; }
+	  case -16: { typedef unsigned short  outMode; CONVERTDOWN(0); break; }
+	  case 32:  { typedef unsigned int    outMode; CONVERTUP(0);   break; }
+	  case -32: { typedef          float  outMode; CONVERTUP(NAN);   break; }
+	  case -64: { typedef          double outMode; CONVERTUP(NAN);   break; }
+	}
+	}
+	break;  
+      case 16: 
+	{ typedef unsigned short inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef char            outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTSAME(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTDOWN(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTUP(0);   break; }
+	    case -32: { typedef          float  outMode; CONVERTUP(NAN);   break; }
+	    case -64: { typedef          double outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;  
+      case -16: 
+	{ typedef unsigned short inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef char            outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTSAME(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTDOWN(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTUP(0);   break; }
+	    case -32: { typedef          float  outMode; CONVERTUP(NAN);   break; }
+	    case -64: { typedef          double outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;  
+      case 32: 
+	{ typedef unsigned int inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef char            outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTDOWN(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTDOWN(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTSAME(0); break; }
+	    case -32: { typedef          float  outMode; CONVERTSAME(NAN); break; }
+	    case -64: { typedef          double outMode; CONVERTUP(NAN);   break; }
+	  }				    
+	}					    
+	break;				    
+      case -32: 				    
+	{ typedef float inMode;		    
+	  switch (outBitpix) {		    
+	    case 8:   { typedef char            outMode; CONVERTDOWN_FF(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTDOWN_FF(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTDOWN_FF(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTSAME_FF(0); break; }
+	    case -32: { typedef          float  outMode; CONVERTSAME_FF(NAN); break; }
+	    case -64: { typedef          double outMode; CONVERTUP_FF(NAN);   break; }
+	  }				    
+	}					    
+	break;				    
+      case -64: 				    
+	{ typedef double inMode;		    
+	  switch (outBitpix) {		    
+	    case 8:   { typedef char            outMode; CONVERTDOWN_FF(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTDOWN_FF(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTDOWN_FF(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTDOWN_FF(0); break; }
+	    case -32: { typedef          float  outMode; CONVERTDOWN_FF(NAN); break; }
+	    case -64: { typedef          double outMode; CONVERTSAME_FF(NAN); break; }
+	  }
+	}
     }
   }
