r319: add complex-valued imagefile support
[ctsim.git] / libctsim / array2dfile.cpp
index 6c400ad77f35ebae4c1a5ab5f1dddc368433c743..ca45d8b820eaea485272a6e6f824243c01ac0b89 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: array2dfile.cpp,v 1.21 2000/12/16 06:12:47 kevin Exp $
+**  $Id: array2dfile.cpp,v 1.22 2000/12/29 19:30:08 kevin Exp $
 **
 **  This program is free software; you can redistribute it and/or modify
 **  it under the terms of the GNU General Public License (version 2) as
@@ -44,39 +44,39 @@ const kuint16 Array2dFile::m_signature = ('I'*256+'F');
 void
 Array2dFileLabel::init (void)
 {
-    m_calcTime = 0;
-    m_labelType = L_EMPTY;
-    time_t t = time(0);
-    tm* lt = localtime(&t);
-    m_year = lt->tm_year;
-    m_month = lt->tm_mon;
-    m_day = lt->tm_mday;
-    m_hour = lt->tm_hour;
-    m_minute = lt->tm_min;
-    m_second = lt->tm_sec;
+  m_calcTime = 0;
+  m_labelType = L_EMPTY;
+  time_t t = time(0);
+  tm* lt = localtime(&t);
+  m_year = lt->tm_year;
+  m_month = lt->tm_mon;
+  m_day = lt->tm_mday;
+  m_hour = lt->tm_hour;
+  m_minute = lt->tm_min;
+  m_second = lt->tm_sec;
 }
 
 Array2dFileLabel::Array2dFileLabel() 
 {
-    init();
+  init();
 }
 
 Array2dFileLabel::Array2dFileLabel(const char* const str, double ctime)
-    : m_strLabel (str)
+: m_strLabel (str)
 {
-    init();
-
-    m_labelType = L_USER;
-    m_calcTime = ctime;
+  init();
+  
+  m_labelType = L_USER;
+  m_calcTime = ctime;
 }
 
 Array2dFileLabel::Array2dFileLabel(const int type, const char* const str, double ctime)
-  :  m_strLabel (str)
+:  m_strLabel (str)
 {
-    init();
-
-    m_labelType = type;
-    m_calcTime = ctime;
+  init();
+  
+  m_labelType = type;
+  m_calcTime = ctime;
 }
 
 Array2dFileLabel::~Array2dFileLabel()
@@ -110,7 +110,7 @@ Array2dFileLabel::getDateString (void) const
 {
   char szDate [128];\r
   snprintf (szDate, sizeof(szDate), "%2d/%02d/%4d %02d:%02d:%02d",\r
-         m_month + 1, m_day, m_year + 1900, m_hour, m_minute, m_second);
+    m_month + 1, m_day, m_year + 1900, m_hour, m_minute, m_second);
   m_strDate = szDate;
   return m_strDate;
 }
@@ -118,30 +118,30 @@ Array2dFileLabel::getDateString (void) const
 
 Array2dFileLabel::Array2dFileLabel (const Array2dFileLabel& rhs)
 {
-    m_calcTime = rhs.m_calcTime;
-    m_labelType = rhs.m_labelType;
-    m_strLabel = rhs.m_strLabel;
-    m_year = rhs.m_year; m_month = rhs.m_month; m_day = rhs.m_day;
-    m_hour = rhs.m_hour; m_minute = rhs.m_minute; m_second = rhs.m_second;
+  m_calcTime = rhs.m_calcTime;
+  m_labelType = rhs.m_labelType;
+  m_strLabel = rhs.m_strLabel;
+  m_year = rhs.m_year; m_month = rhs.m_month; m_day = rhs.m_day;
+  m_hour = rhs.m_hour; m_minute = rhs.m_minute; m_second = rhs.m_second;
 }
 
 Array2dFileLabel&
 Array2dFileLabel::operator= (const Array2dFileLabel& rhs)
 {
-    m_calcTime = rhs.m_calcTime;
-    m_labelType = rhs.m_labelType;
-    m_strLabel = rhs.m_strLabel;
-    m_year = rhs.m_year; m_month = rhs.m_month; m_day = rhs.m_day;
-    m_hour = rhs.m_hour; m_minute = rhs.m_minute; m_second = rhs.m_second;
-
-    return (*this);
+  m_calcTime = rhs.m_calcTime;
+  m_labelType = rhs.m_labelType;
+  m_strLabel = rhs.m_strLabel;
+  m_year = rhs.m_year; m_month = rhs.m_month; m_day = rhs.m_day;
+  m_hour = rhs.m_hour; m_minute = rhs.m_minute; m_second = rhs.m_second;
+  
+  return (*this);
 }
 
 void
 Array2dFileLabel::print (std::ostream& os) const
 {
   if (m_labelType == L_HISTORY) {
-         os << "History: " << std::endl;
+    os << "History: " << std::endl;
     os << "  " << m_strLabel << std::endl;
     os << "  calc time = " << m_calcTime << " secs" << std::endl;
     os << "  Timestamp = " << getDateString() << std::endl;
@@ -163,22 +163,22 @@ Array2dFileLabel::print (std::ostream& os) const
 ///////////////////////////////////////////////////////////////////////////
 
 
-Array2dFile::Array2dFile (int x, int y, int pixelSize, int pixelFormat)
+Array2dFile::Array2dFile (int x, int y, int pixelSize, int pixelFormat, int dataType)
 {
-    init();
-    setArraySize (x, y, pixelSize, pixelFormat);
+  init();
+  setArraySize (x, y, pixelSize, pixelFormat, dataType);
 }
 
 Array2dFile::~Array2dFile (void)
 {
-    freeArray ();
-    for (labelIterator l = m_labels.begin(); l != m_labels.end(); l++)
-      delete *l;
+  freeArrays ();
+  for (labelIterator l = m_labels.begin(); l != m_labels.end(); l++)
+    delete *l;
 }
 
 Array2dFile::Array2dFile (void)
 {
-    init();
+  init();
 }
 
 void
@@ -186,7 +186,9 @@ Array2dFile::init (void)
 {
   m_pixelSize = 0;
   m_pixelFormat = PIXEL_INVALID;
-  m_arrayData = NULL;
+  m_arrayData = NULL;\r
+  m_imaginaryArrayData = NULL;\r
+  m_dataType = DATA_TYPE_INVALID;
   m_nx = 0;
   m_ny = 0;
   m_headersize = 0;
@@ -200,45 +202,92 @@ Array2dFile::init (void)
 
 
 void
-Array2dFile::setArraySize (int x, int y, int pixelSize, int pixelFormat)
+Array2dFile::setArraySize (int x, int y, int pixelSize, int pixelFormat, int dataType)
 {
-    m_pixelSize = pixelSize;
-    m_pixelFormat = pixelFormat;
-    setArraySize (x, y);
+  m_pixelSize = pixelSize;
+  m_pixelFormat = pixelFormat;\r
+  m_dataType = dataType;
+  setArraySize (x, y);
 }
 
 void
 Array2dFile::setArraySize (int x, int y)
 {
-    m_nx = x;
-    m_ny = y;
-    allocArray ();
-}
+  m_nx = x;
+  m_ny = y;
+  allocArrays ();
+}\r
+\r
+bool\r
+Array2dFile::reallocComplexToReal ()\r
+{\r
+  if (m_dataType != DATA_TYPE_COMPLEX)\r
+    return false;\r
+\r
+  freeArray (m_imaginaryArrayData);\r
+  m_dataType = DATA_TYPE_REAL;\r
+\r
+  return true;\r
+}\r
+\r
+\r
+bool\r
+Array2dFile::reallocRealToComplex ()\r
+{\r
+  if (m_dataType != DATA_TYPE_REAL)\r
+    return false;\r
+\r
+  allocArray (m_imaginaryArrayData);\r
+  m_dataType = DATA_TYPE_COMPLEX;\r
+\r
+  return true;\r
+}\r
+\r
+
 
 void 
-Array2dFile::allocArray (void)
+Array2dFile::allocArrays ()
 {
-    if (m_arrayData)
-       freeArray();
-
-    m_arraySize = m_nx * m_ny * m_pixelSize;
-    m_arrayData = new unsigned char* [m_nx];
-    
-    int columnBytes = m_ny * m_pixelSize;
-    for (unsigned int i = 0; i < m_nx; i++)
-       m_arrayData[i] = new unsigned char [columnBytes];
+  if (m_arrayData) \r
+    freeArray (m_arrayData);\r
+  if (m_imaginaryArrayData)\r
+    freeArray (m_imaginaryArrayData);\r
+\r
+  allocArray (m_arrayData);\r
+  if (m_dataType == DATA_TYPE_COMPLEX)\r
+    allocArray (m_imaginaryArrayData);\r
+}\r
+\r
+void\r
+Array2dFile::allocArray (unsigned char**& rppData)\r
+{\r
+  m_arraySize = m_nx * m_ny * m_pixelSize;
+  rppData = new unsigned char* [m_nx];\r
+  int columnBytes = m_ny * m_pixelSize;
+  for (unsigned int i = 0; i < m_nx; i++)
+    rppData[i] = new unsigned char [columnBytes];\r
 }
 
 void 
-Array2dFile::freeArray (void)
-{
-    if (m_arrayData) {
-       for (unsigned int i = 0; i < m_nx; i++)
-           delete m_arrayData[i];
-       delete m_arrayData;
-       m_arrayData = NULL;
-    }
-}
+Array2dFile::freeArrays ()
+{
+  if (m_arrayData) \r
+    freeArray (m_arrayData);\r
+  \r
+  if (m_imaginaryArrayData) \r
+    freeArray (m_imaginaryArrayData);\r
+  \r
+}\r
+\r
+void\r
+Array2dFile::freeArray (unsigned char**& rppData)\r
+{\r
+   for (unsigned int i = 0; i < m_nx; i++)\r
+      delete rppData[i];\r
+    delete rppData;\r
+    rppData = NULL;\r
+}\r
+\r
 
 bool
 Array2dFile::fileWrite (const std::string& filename)
@@ -249,23 +298,23 @@ Array2dFile::fileWrite (const std::string& filename)
 bool
 Array2dFile::fileWrite (const char* const filename)
 {
-    m_filename = filename;
-
-    frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::trunc | std::ios::binary);
-    if (fs.fail()) {
-       sys_error (ERR_WARNING, "Error opening file %s for writing [fileCreate]", m_filename.c_str());
-      return false;
-    }
-    if (! headerWrite(fs))
-       return false;
-    
-    if (! arrayDataWrite (fs))
-       return false;
-    
-    if (! labelsWrite (fs))
-       return false;
-
-    return true;
+  m_filename = filename;
+  
+  frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::trunc | std::ios::binary);
+  if (fs.fail()) {
+    sys_error (ERR_WARNING, "Error opening file %s for writing [fileCreate]", m_filename.c_str());
+    return false;
+  }
+  if (! headerWrite(fs))
+    return false;
+  
+  if (! arrayDataWrite (fs))
+    return false;
+  
+  if (! labelsWrite (fs))
+    return false;
+  
+  return true;
 }
 
 bool
@@ -277,30 +326,30 @@ Array2dFile::fileRead (const std::string& filename)
 bool
 Array2dFile::fileRead (const char* const filename)
 {
-    m_filename = filename;
-
+  m_filename = filename;
+  
 #ifdef MSVC\r
-    frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::binary);\r
+  frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::binary);\r
 #else\r
-    frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::binary | std::ios::nocreate);\r
+  frnetorderstream fs (m_filename.c_str(), std::ios::out | std::ios::in | std::ios::binary | std::ios::nocreate);\r
 #endif\r
-    if (fs.fail()) {
-      sys_error (ERR_WARNING, "Unable to open file %s [fileRead]", m_filename.c_str());
-      return false;
-    }
-
-    if (! headerRead(fs))
-      return false;
-    
-    allocArray ();
-    
-    if (! arrayDataRead(fs))
-      return false;;
-
-    if (! labelsRead (fs))
-      return false;
-    
-    return true;
+  if (fs.fail()) {
+    sys_error (ERR_WARNING, "Unable to open file %s [fileRead]", m_filename.c_str());
+    return false;
+  }
+  
+  if (! headerRead(fs))
+    return false;
+  
+  allocArrays ();
+  
+  if (! arrayDataRead(fs))
+    return false;;
+  
+  if (! labelsRead (fs))
+    return false;
+  
+  return true;
 }
 
 void
@@ -314,11 +363,11 @@ Array2dFile::setAxisIncrement (double incX, double incY)
 void 
 Array2dFile::setAxisExtent (double minX, double maxX, double minY, double maxY)
 {
-    m_axisExtentKnown = true;
-    m_minX = minX;
-    m_maxY = maxX;
-    m_minX = minX;
-    m_maxY = maxY;
+  m_axisExtentKnown = true;
+  m_minX = minX;
+  m_maxY = maxX;
+  m_minX = minX;
+  m_maxY = maxY;
 }
 
 bool
@@ -328,17 +377,18 @@ Array2dFile::headerRead (frnetorderstream& fs)
     sys_error (ERR_WARNING, "Tried to read header with file closed [headerRead]");
     return false;
   }
-
+  
   fs.seekg (0);
   kuint16 file_signature;
-
+  
   fs.readInt16 (m_headersize);
   fs.readInt16 (file_signature);
   fs.readInt16 (m_pixelFormat);
   fs.readInt16 (m_pixelSize);
   fs.readInt16 (m_numFileLabels);
   fs.readInt32 (m_nx);
-  fs.readInt32 (m_ny);
+  fs.readInt32 (m_ny);\r
+  fs.readInt16 (m_dataType);
   fs.readInt16 (m_axisIncrementKnown);
   fs.readFloat64 (m_axisIncrementX);
   fs.readFloat64 (m_axisIncrementY);
@@ -349,7 +399,7 @@ Array2dFile::headerRead (frnetorderstream& fs)
   fs.readFloat64 (m_maxY);
   fs.readFloat64 (m_offsetPV);
   fs.readFloat64 (m_scalePV);
-
+  
   int read_m_headersize = fs.tellg();
   if (read_m_headersize != m_headersize) {
     sys_error (ERR_WARNING, "Read m_headersize %d != file m_headersize %d", read_m_headersize, m_headersize);
@@ -359,7 +409,7 @@ Array2dFile::headerRead (frnetorderstream& fs)
     sys_error (ERR_WARNING, "File signature %d != true signature %d", file_signature, m_signature);
     return false;
   }
-
+  
   return true;
 }
 
@@ -371,9 +421,9 @@ Array2dFile::headerWrite (frnetorderstream& fs)
     sys_error (ERR_WARNING, "Tried to write header with ! fs");
     return false;
   }
-
+  
   m_numFileLabels = m_labels.size();
-
+  
   fs.seekp (0);
   fs.writeInt16 (m_headersize);
   fs.writeInt16 (m_signature);
@@ -381,7 +431,8 @@ Array2dFile::headerWrite (frnetorderstream& fs)
   fs.writeInt16 (m_pixelSize);
   fs.writeInt16 (m_numFileLabels);
   fs.writeInt32 (m_nx);
-  fs.writeInt32 (m_ny);
+  fs.writeInt32 (m_ny);\r
+  fs.writeInt16 (m_dataType);
   fs.writeInt16 (m_axisIncrementKnown);
   fs.writeFloat64 (m_axisIncrementX);
   fs.writeFloat64 (m_axisIncrementY);
@@ -392,7 +443,7 @@ Array2dFile::headerWrite (frnetorderstream& fs)
   fs.writeFloat64 (m_maxY);
   fs.writeFloat64 (m_offsetPV);
   fs.writeFloat64 (m_scalePV);
-
+  
   m_headersize = static_cast<kuint16>(fs.tellp());
   fs.seekp (0);
   fs.writeInt16 (m_headersize);
@@ -408,24 +459,37 @@ Array2dFile::arrayDataWrite (frnetorderstream& fs)
     sys_error (ERR_WARNING, "Tried to arrayDataWrite with !fs");
     return false;
   }
-
+  
   if (! m_arrayData) 
-      return false;
-
+    return false;
+  
   fs.seekp (m_headersize);
   int columnSize = m_ny * m_pixelSize;
-  for (unsigned int ix = 0; ix < m_nx; ix++) {
-      unsigned char* ptrColumn = m_arrayData[ix];
-      if (NativeBigEndian()) {
-         for (unsigned int iy = 0; iy < m_ny; iy++) {
-             ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);
-             fs.write (reinterpret_cast<const char*>(ptrColumn), m_pixelSize);
-             ptrColumn += m_pixelSize;
-         }
-      } else 
-         fs.write (reinterpret_cast<const char*>(ptrColumn), columnSize);
-  }
-
+  for (unsigned int ix = 0; ix < m_nx; ix++) {\r
+    unsigned char* ptrColumn = m_arrayData[ix];\r
+    if (NativeBigEndian()) {\r
+      for (unsigned int iy = 0; iy < m_ny; iy++) {\r
+        ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);\r
+        fs.write (reinterpret_cast<const char*>(ptrColumn), m_pixelSize);\r
+        ptrColumn += m_pixelSize;\r
+      }\r
+    } else \r
+      fs.write (reinterpret_cast<const char*>(ptrColumn), columnSize);\r
+  }\r
+  if (m_dataType == DATA_TYPE_COMPLEX) {\r
+    for (unsigned int ix = 0; ix < m_nx; ix++) {\r
+      unsigned char* ptrColumn = m_imaginaryArrayData[ix];\r
+      if (NativeBigEndian()) {\r
+        for (unsigned int iy = 0; iy < m_ny; iy++) {\r
+          ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);\r
+          fs.write (reinterpret_cast<const char*>(ptrColumn), m_pixelSize);\r
+          ptrColumn += m_pixelSize;\r
+        }\r
+      } else \r
+        fs.write (reinterpret_cast<const char*>(ptrColumn), columnSize);\r
+    }\r
+  }\r
+  
   return true;
 }
 
@@ -437,96 +501,109 @@ Array2dFile::arrayDataRead (frnetorderstream& fs)
     sys_error (ERR_WARNING, "Tried to arrayDataRead with ! fs");
     return false;
   }
-
+  
   if (! m_arrayData)
-      return false;
-
+    return false;
+  
   fs.seekg (m_headersize);
   int columnSize = m_ny * m_pixelSize;
-  for (unsigned int ix = 0; ix < m_nx; ix++) {
-      unsigned char* ptrColumn = m_arrayData[ix];
-      if (NativeBigEndian()) {
-         for (unsigned int iy = 0; iy < m_ny; iy++) {
-             fs.read (reinterpret_cast<char*>(ptrColumn), m_pixelSize);
-             ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);
-             ptrColumn += m_pixelSize;
-         } 
-      } else
-         fs.read (reinterpret_cast<char*>(ptrColumn), columnSize);
-  }
-
+  for (unsigned int ix = 0; ix < m_nx; ix++) {\r
+    unsigned char* ptrColumn = m_arrayData[ix];\r
+    if (NativeBigEndian()) {\r
+      for (unsigned int iy = 0; iy < m_ny; iy++) {\r
+        fs.read (reinterpret_cast<char*>(ptrColumn), m_pixelSize);\r
+        ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);\r
+        ptrColumn += m_pixelSize;\r
+      } \r
+    } else\r
+      fs.read (reinterpret_cast<char*>(ptrColumn), columnSize);\r
+  }\r
+  if (m_dataType == DATA_TYPE_COMPLEX) {\r
+    for (unsigned int ix = 0; ix < m_nx; ix++) {\r
+      unsigned char* ptrColumn = m_imaginaryArrayData[ix];\r
+      if (NativeBigEndian()) {\r
+        for (unsigned int iy = 0; iy < m_ny; iy++) {\r
+          fs.read (reinterpret_cast<char*>(ptrColumn), m_pixelSize);\r
+          ConvertReverseNetworkOrder (ptrColumn, m_pixelSize);\r
+          ptrColumn += m_pixelSize;\r
+        } \r
+      } else\r
+        fs.read (reinterpret_cast<char*>(ptrColumn), columnSize);\r
+    }\r
+  }\r
+  
   return true;
 }
 
 bool
 Array2dFile::labelsRead (frnetorderstream& fs)
 {
-    off_t pos = m_headersize + m_arraySize;
-    fs.seekg (pos);
-    if (fs.fail())
-       return false;
-
-    for (int i = 0; i < m_numFileLabels; i++) {
-       kuint16 labelType, year, month, day, hour, minute, second;
-       kfloat64 calcTime;
-
-       fs.readInt16 (labelType);
-       fs.readInt16 (year);
-       fs.readInt16 (month);
-       fs.readInt16 (day);
-       fs.readInt16 (hour);
-       fs.readInt16 (minute);
-       fs.readInt16 (second);
-       fs.readFloat64 (calcTime);
-       
-       kuint16 strLength;
-       fs.readInt16 (strLength);
-       char* pszLabelStr = new char [strLength+1];
-       fs.read (pszLabelStr, strLength);
-       pszLabelStr[strLength] = 0;
-
-       Array2dFileLabel* pLabel = new Array2dFileLabel (labelType, pszLabelStr, calcTime);
-       delete pszLabelStr;\r
-\r
-       pLabel->setDateTime (year, month, day, hour, minute, second);
-       m_labels.push_back (pLabel);\r
-    }
-
-    return true;
+  off_t pos = m_headersize + m_arraySize;
+  fs.seekg (pos);
+  if (fs.fail())
+    return false;
+  
+  for (int i = 0; i < m_numFileLabels; i++) {
+    kuint16 labelType, year, month, day, hour, minute, second;
+    kfloat64 calcTime;
+    
+    fs.readInt16 (labelType);
+    fs.readInt16 (year);
+    fs.readInt16 (month);
+    fs.readInt16 (day);
+    fs.readInt16 (hour);
+    fs.readInt16 (minute);
+    fs.readInt16 (second);
+    fs.readFloat64 (calcTime);
+    
+    kuint16 strLength;
+    fs.readInt16 (strLength);
+    char* pszLabelStr = new char [strLength+1];
+    fs.read (pszLabelStr, strLength);
+    pszLabelStr[strLength] = 0;
+    
+    Array2dFileLabel* pLabel = new Array2dFileLabel (labelType, pszLabelStr, calcTime);
+    delete pszLabelStr;\r
+    \r
+    pLabel->setDateTime (year, month, day, hour, minute, second);
+    m_labels.push_back (pLabel);\r
+  }
+  
+  return true;
 }
 
 bool
 Array2dFile::labelsWrite (frnetorderstream& fs)
 {
-    off_t pos = m_headersize + m_arraySize;
-    fs.seekp (pos);
-
-    for (constLabelIterator l = m_labels.begin(); l != m_labels.end(); l++) {
-       const Array2dFileLabel& label = **l;
-       kuint16 labelType = label.getLabelType();
-       kfloat64 calcTime = label.getCalcTime();
-       const char* const labelString = label.getLabelString().c_str();
-       int year, month, day, hour, minute, second;
-       kuint16 yearBuf, monthBuf, dayBuf, hourBuf, minuteBuf, secondBuf;
-
-       label.getDateTime (year, month, day, hour, minute, second);
-       yearBuf = year; monthBuf = month; dayBuf = day;
-       hourBuf = hour; minuteBuf = minute; secondBuf = second;
-
-       fs.writeInt16 (labelType);
-       fs.writeInt16 (yearBuf);
-       fs.writeInt16 (monthBuf);
-       fs.writeInt16 (dayBuf);
-       fs.writeInt16 (hourBuf);
-       fs.writeInt16 (minuteBuf);
-       fs.writeInt16 (secondBuf);
-       fs.writeFloat64 (calcTime);
-       kuint16 strlength = strlen (labelString);
-       fs.writeInt16 (strlength);
-       fs.write (labelString, strlength);
-    }
-
-    return true;
+  off_t pos = m_headersize + m_arraySize;
+  fs.seekp (pos);
+  
+  for (constLabelIterator l = m_labels.begin(); l != m_labels.end(); l++) {
+    const Array2dFileLabel& label = **l;
+    kuint16 labelType = label.getLabelType();
+    kfloat64 calcTime = label.getCalcTime();
+    const char* const labelString = label.getLabelString().c_str();
+    int year, month, day, hour, minute, second;
+    kuint16 yearBuf, monthBuf, dayBuf, hourBuf, minuteBuf, secondBuf;
+    
+    label.getDateTime (year, month, day, hour, minute, second);
+    yearBuf = year; monthBuf = month; dayBuf = day;
+    hourBuf = hour; minuteBuf = minute; secondBuf = second;
+    
+    fs.writeInt16 (labelType);
+    fs.writeInt16 (yearBuf);
+    fs.writeInt16 (monthBuf);
+    fs.writeInt16 (dayBuf);
+    fs.writeInt16 (hourBuf);
+    fs.writeInt16 (minuteBuf);
+    fs.writeInt16 (secondBuf);
+    fs.writeFloat64 (calcTime);
+    kuint16 strlength = strlen (labelString);
+    fs.writeInt16 (strlength);
+    fs.write (labelString, strlength);
+  }
+  
+  return true;
 }
 
 void
@@ -540,7 +617,7 @@ void
 Array2dFile::labelAdd (int type, const char* const lstr, double calc_time)
 {
   Array2dFileLabel label (type, lstr, calc_time);
-
+  
   labelAdd (label);
 }
 
@@ -548,45 +625,50 @@ Array2dFile::labelAdd (int type, const char* const lstr, double calc_time)
 void
 Array2dFile::labelAdd (const Array2dFileLabel& label)
 {
-    Array2dFileLabel* pLabel = new Array2dFileLabel(label);
-
-    m_labels.push_back (pLabel);
+  Array2dFileLabel* pLabel = new Array2dFileLabel(label);
+  
+  m_labels.push_back (pLabel);
 }
 
 void
 Array2dFile::labelsCopy (Array2dFile& copyFile, const char* const pszId)
 {
-       std::string id;
-    if (pszId)
-      id = pszId;
-    for (unsigned int i = 0; i < copyFile.getNumLabels(); i++) {
-      Array2dFileLabel l (copyFile.labelGet (i));
-         std::string lstr = l.getLabelString();
-      lstr = id + lstr;
-      l.setLabelString (lstr);
-      labelAdd (l);
-    }
+  std::string id;
+  if (pszId)
+    id = pszId;
+  for (unsigned int i = 0; i < copyFile.getNumLabels(); i++) {
+    Array2dFileLabel l (copyFile.labelGet (i));
+    std::string lstr = l.getLabelString();
+    lstr = id + lstr;
+    l.setLabelString (lstr);
+    labelAdd (l);
+  }
 }
 
 void 
 Array2dFile::arrayDataClear (void)
 {
-    if (m_arrayData) {
-       int columnSize = m_ny * m_pixelSize;
-       for (unsigned int ix = 0; ix < m_nx; ix++)
-           memset (m_arrayData[ix], 0, columnSize);
-    }
+  if (m_arrayData) {\r
+    int columnSize = m_ny * m_pixelSize;\r
+    for (unsigned int ix = 0; ix < m_nx; ix++)\r
+      memset (m_arrayData[ix], 0, columnSize);\r
+  }\r
+  if (m_imaginaryArrayData) {\r
+    int columnSize = m_ny * m_pixelSize;\r
+    for (unsigned int ix = 0; ix < m_nx; ix++)\r
+      memset (m_arrayData[ix], 0, columnSize);\r
+  }\r
 }
 
 void
 Array2dFile::printLabels (std::ostream& os) const
 {
-    for (constLabelIterator l = m_labels.begin(); l != m_labels.end(); l++) {
-      const Array2dFileLabel& label = **l;
-
-      label.print (os);
-      os << std::endl;
-    }
+  for (constLabelIterator l = m_labels.begin(); l != m_labels.end(); l++) {
+    const Array2dFileLabel& label = **l;
+    
+    label.print (os);
+    os << std::endl;
+  }
 }