Index: trunk/psLib/src/dataIO/psFits.c
===================================================================
--- trunk/psLib/src/dataIO/psFits.c	(revision 2375)
+++ trunk/psLib/src/dataIO/psFits.c	(revision 2681)
@@ -7,6 +7,6 @@
  *  @author Robert DeSonia, MHPCC
  *
- *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-11-16 20:00:21 $
+ *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-12-10 02:50:15 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -200,13 +200,13 @@
 }
 
-psFitsType psFitsMoveExtName(psFits* fits,
-                             const char* extname)
-{
-    int status = 0;
-
-    if (fits == NULL) {
-        psError(PS_ERR_BAD_PARAMETER_NULL, true,
-                PS_ERRORTEXT_psFits_NULL);
-        return PS_FITS_TYPE_NONE;
+bool psFitsMoveExtName(psFits* fits,
+                       const char* extname)
+{
+    int status = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
     }
 
@@ -218,18 +218,18 @@
                 PS_ERRORTEXT_psFits_EXTNAME_INVALID,
                 extname, fits->filename, fitsErr);
-        return PS_FITS_TYPE_NONE;
-    }
-
-    return psFitsGetExtType(fits);
-}
-
-psFitsType psFitsMoveExtNum(psFits* fits,
-                            int extnum,
-                            bool relative)
-{
-    if (fits == NULL) {
-        psError(PS_ERR_BAD_PARAMETER_NULL, true,
-                PS_ERRORTEXT_psFits_NULL);
-        return PS_FITS_TYPE_NONE;
+        return false;
+    }
+
+    return true;
+}
+
+bool psFitsMoveExtNum(psFits* fits,
+                      int extnum,
+                      bool relative)
+{
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
     }
 
@@ -249,8 +249,8 @@
                 PS_ERRORTEXT_psFits_EXTNUM_INVALID,
                 extnum, fits->filename, fitsErr);
-        return PS_FITS_TYPE_NONE;
-    }
-
-    return hdutype;
+        return false;
+    }
+
+    return true;
 }
 
@@ -304,5 +304,5 @@
         psError(PS_ERR_BAD_PARAMETER_NULL, true,
                 PS_ERRORTEXT_psFits_NULL);
-        return PS_FITS_TYPE_NONE;
+        return 0;
     }
 
@@ -316,32 +316,8 @@
                 PS_ERRORTEXT_psFits_GETNUMHDUS_FAILED,
                 fits->filename, fitsErr);
-        return -1;
+        return 0;
     }
 
     return num;
-}
-
-bool psFitsCreateExt(psFits* fits)
-{
-    if (fits == NULL) {
-        psError(PS_ERR_BAD_PARAMETER_NULL, true,
-                PS_ERRORTEXT_psFits_NULL);
-        return false;
-    }
-
-    int status = 0;
-
-    fits_create_hdu(fits->p_fd,&status);
-
-    if ( status != 0) {
-        char fitsErr[MAX_STRING_LENGTH];
-        (void)fits_get_errstatus(status, fitsErr);
-        psError(PS_ERR_IO, true,
-                PS_ERRORTEXT_psFits_CREATE_HDU_FAILED,
-                fits->filename, fitsErr);
-        return false;
-    }
-
-    return true;
 }
 
@@ -481,8 +457,5 @@
     }
 
-    int status = 0;
-
     int size = psFitsGetSize(fits);
-    int position = psFitsGetExtNum(fits);
 
     for (int lcv=0; lcv < size; lcv++) {
@@ -502,11 +475,12 @@
         }
     }
+
+    return out;
 }
 
 bool psFitsWriteImage(psFits* fits,
+                      const psMetadata* header,
                       const psImage* input,
-                      int x,
-                      int y,
-                      int z)
+                      int numZPlanes)
 {
 
@@ -526,12 +500,4 @@
 
     int status = 0;
-
-    psFitsType fitsType = psFitsGetExtType(fits);
-
-    if (fitsType != PS_FITS_TYPE_IMAGE && fitsType != PS_FITS_TYPE_ANY) {
-        psError(PS_ERR_IO, true,
-                PS_ERRORTEXT_psFits_NOT_IMAGE_TYPE);
-        return false;
-    }
 
     // determine the FITS-equivalent parameters
@@ -543,36 +509,48 @@
     }
 
-    if (fitsType == PS_FITS_TYPE_ANY) {
-        int naxis = 3;
-        long naxes[3];
-
-        naxes[0] = numCols;
-        naxes[1] = numRows;
-        naxes[2] = z;
-
-        if (z < 2) {
-            naxis = 2;
-        }
-
-        /* write the required keys to make an empty HDU be an IMAGE HDU */
-        fits_write_imghdr(fits->p_fd, bitPix, naxis, naxes, &status);
-        if (bZero != 0) {        // set the bscale/bzero
-            fits_write_key_dbl(fits->p_fd, "BZERO", bZero, 12, "Pixel Value Offset", &status);
-            fits_write_key_dbl(fits->p_fd, "BSCALE", 1.0, 12, "Pixel Value Scale", &status);
-            // don't think this is needed: fits_set_bscale(fits->p_fd, bScale, bZero, &status);
-        }
-    }
-
-    long firstPixel[3];         /* First Pixel to read */
-    long lastPixel[3];          /* Last Pixel to read */
-    firstPixel[0] = x + 1;
-    firstPixel[1] = y + 1;
-    firstPixel[2] = z + 1;
-
-    lastPixel[0] = firstPixel[0] + numCols - 1;
-    lastPixel[1] = firstPixel[1] + numRows - 1;
-    lastPixel[2] = z + 1;
-
-    fits_write_subset(fits->p_fd, dataType, firstPixel, lastPixel, input->data.V[0], &status);
+    int naxis = 3;
+    long naxes[3];
+
+    naxes[0] = numCols;
+    naxes[1] = numRows;
+    naxes[2] = numZPlanes;
+
+    if (numZPlanes < 2) {
+        naxis = 2;
+    }
+
+    fits_create_img(fits->p_fd, bitPix, naxis, naxes, &status);
+
+    if (bZero != 0) {        // set the bscale/bzero
+        fits_write_key_dbl(fits->p_fd, "BZERO", bZero, 12, "Pixel Value Offset", &status);
+        fits_write_key_dbl(fits->p_fd, "BSCALE", 1.0, 12, "Pixel Value Scale", &status);
+        fits_set_bscale(fits->p_fd, 1.0, bZero, &status);
+    }
+
+    // write the header, if any.
+    if (header != NULL) {
+        psFitsWriteHeader(fits, header);
+    }
+
+    long firstPixel = (numZPlanes-1)*numRows*numCols; // start write in last z-plane
+
+    if (input->parent == NULL) { // if no parent, assume that the image data is contiguous
+        fits_write_img(fits->p_fd,
+                       dataType,              // datatype
+                       firstPixel,                     // writing to the first z-plane
+                       numCols*numRows,       // number of elements to write, i.e., the whole image
+                       input->data.V[0],      // the data
+                       &status);
+    } else { // image data may not be contiguous; write one row at a time
+        for (int row = 0; row < numRows; row++) {
+            fits_write_img(fits->p_fd,
+                           dataType,          // datatype
+                           firstPixel,
+                           numCols,           // number of elements to write, i.e., one row's worth
+                           input->data.V[row],// the raw row data
+                           &status);
+            firstPixel += numCols;  // move to next row
+        }
+    }
 
     if ( status != 0) {
@@ -589,26 +567,41 @@
 }
 
+bool psFitsWriteHeader(psMetadata* header,
+                       psFits* fits)
+{
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    if (header == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_METADATA_NULL);
+        return false;
+    }
+
+
+    return true;
+}
+
 psMetadata* psFitsReadTableRow(psFits* fits,
                                int row)
-{
-}
+{}
 
 psArray* psFitsReadTableColumn(psFits* fits,
                                const char* colname)
-{
-}
+{}
 
 psVector* psFitsReadTableColumnNum(psFits* fits,
                                    const char* colname)
-{
-}
+{}
 
 
 psArray* psFitsReadTable(psFits* fits)
-{
-}
+{}
 
 bool psFitsWriteTable(psFits* fits,
                       psArray* table)
-{
-}
+{}
