r328: *** empty log message ***
[ctsim.git] / include / imagefile.h
index 4660a92139c91c0fdb9995ee3ff193d685fb7d88..3587f1cde01e5cc90b905ea5bafd9874200ca4d5 100644 (file)
-#ifndef IDF_H
-#define IDF_H
-
+/*****************************************************************************
+** FILE IDENTIFICATION
+**
+**     Name:         imagefile.h
+**      Purpose:      imagefile class header
+**     Programmer:   Kevin Rosenberg
+**     Date Started: June 2000
+**
+**  This is part of the CTSim program
+**  Copyright (C) 1983-2000 Kevin Rosenberg
+**
+**  $Id: imagefile.h,v 1.27 2001/01/02 05:34:57 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
+**  published by the Free Software Foundation.
+**
+**  This program is distributed in the hope that it will be useful,
+**  but WITHOUT ANY WARRANTY; without even the implied warranty of
+**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+**  GNU General Public License for more details.
+**
+**  You should have received a copy of the GNU General Public License
+**  along with this program; if not, write to the Free Software
+**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+******************************************************************************/
+
+#ifndef IMAGEFILE_H
+#define IMAGEFILE_H
+
+#ifndef MSVC\r
+#include <unistd.h>\r
+#endif\r
 #include <string>
 #include <string>
-#include "kstddef.h"
-#include <array2d.h>
-
-using namespace std;
-
-class Array2dFileLabel
-{
-private:
-    void init (void);
-
-public:
-    kfloat64 calc_time;
-    kuint16 label_type;
-    kuint16 year;
-    kuint16 month;
-    kuint16 day;
-    kuint16 hour;
-    kuint16 minute;
-    kuint16 second;
-    string label_str;
-
-    static const int L_EMPTY = 0;
-    static const int L_HISTORY = 1;
-    static const int L_USER = 2;
-
-    Array2dFileLabel(); 
-
-    Array2dFileLabel(const char* const str, double ctime = 0.);
-
-    Array2dFileLabel(const int type, const char* const str, double ctime = 0.);
-
-    ~Array2dFileLabel();
-
-    string getLabelString (void) const
-       { return label_str; }
-
-    kfloat64 getCalcTime (void) const
-       { return calc_time; }
-
-    kfloat64 getLabelType (void) const
-       { return label_type; }
-
-    string& setLabelString (const char* const str)
-       { label_str = str; return (label_str); }
-
-    string& setLabelString (const string& str)
-       { label_str = str; return (label_str); }
-
-    void getDateString (string& str) const;
-};
-
-
-template<class T>
-class Array2dFile 
-{
-private:
-  void init (void);
-  kuint16 signature;
-  kuint16 num_labels;
-  kuint16 headersize;
-  string  filename;
-  int file_id;
-  iostream *io;
-  bool bHeaderWritten;
-  bool bDataWritten;
-
-  bool headerWrite (void);
-
-  bool headerRead (void);
-
-  bool arrayDataRead (void);
-
-  bool labelSeek (unsigned int label_num);
-
-  kuint16 mPixelSize;
-  kuint16 axis_increment_known;
-  kfloat64 mIncX, mIncY;
-  kuint16 axis_extent_known;
-  kfloat64 mMinX, mMaxX, mMinY, mMaxY;
-  kfloat64 mOffsetPV, mScalePV;
-  kuint16 mPixelType;
-  kuint32 mNX;
-  kuint32 mNY;
-
-public:
-
-  Array2d<T> *array;
-
-  static const int INT8 = 1;
-  static const int UINT8 = 2;
-  static const int INT16 = 3;
-  static const int UINT16 = 4;
-  static const int INT32 = 5;
-  static const int UINT32 = 6;
-  static const int FLOAT32 = 7;
-  static const int FLOAT64 = 8;
-
-  Array2dFile (unsigned int nx, unsigned int ny);
-  Array2dFile (const char* const filename);
-  Array2dFile (const char* const filename, unsigned int nx, unsigned int ny);
-  ~Array2dFile ();
-
-  unsigned int getNumLabels (void) const
-      { return num_labels; }
-
-  bool labelRead (Array2dFileLabel& label, unsigned int label_num);
-
-  void labelAdd (const Array2dFileLabel& label);
-
-  void labelAdd (const char* const label_str, double calc_time=0.);
-
-  void labelAdd (int type, const char* const label_str, double calc_time=0.);
-
-  void labelsCopy (Array2dFile& file, const char* const idStr = NULL);
-
-  void fileClose (void);
-
-  void setPixelType (int type)
-      { mPixelType = type; }
-
-  kuint32 nx (void) const
-      { return mNX; }
-
-  kuint32 ny (void) const
-      { return mNY; }
-
-  void setAxisIncrement (double mIncX, double mIncY);
-
-  void setAxisExtent (double mMinX, double mMaxX, double mMinY, double mMaxY);
-
-  void getPixelValueRange (T& pvmin, T& pvmax) const;
-      
-  void doPixelOffsetScale (double offset, double scale);
-
-  T** getArray (void) const
-      { return (array == NULL ? NULL : array->getArray()); }
-
-  bool arrayDataWrite (void);
-
-  void arrayDataClear (void);
-
-  bool fileRead (void);
-
-  bool fileCreate (void);
-
-  const string& GetFilename (void) const 
-      {  return filename; }
-};
-
-
-template<class T>
-Array2dFile<T>::Array2dFile (unsigned int x, unsigned int y)
-{
-    init();
-    mNX = x;
-    mNY = y;
-    array = new Array2d<T> (mNX, mNY);
-}
-
-template<class T>
-Array2dFile<T>::Array2dFile (const char * const str, unsigned int x, unsigned int y)
-  : filename(str)
-{
-    init();
-    mNX = x;
-    mNY = y;
-    array = new Array2d<T> (mNX, mNY);
-}
-
-template<class T>
-Array2dFile<T>::Array2dFile (const char * const str)
-  : filename(str)
-{
-    init();
-}
-
-template<class T>
-void
-Array2dFile<T>::init (void)
-{
-  mPixelSize = sizeof(T);
-  signature = ('I' * 256 + 'F');
-  file_id = -1;
-  mNX = 0;
-  mNY = 0;
-  headersize = 0;
-  num_labels = 0;
-  axis_increment_known = false;
-  axis_extent_known = false;
-  mIncX = mMinY = 0;
-  mMinX = mMaxX = mMinY = mMaxY = 0;
-  mOffsetPV = 0;
-  mScalePV = 1;
-  array = NULL;
-  io = NULL;
-
-#if 0
-  const type_info& t_id = typeid(T);
-  cout << t_id.name() << endl;
-  const type_info& comp_id = typeid(T);
-
-  if (t_id == comp_id)
-      mPixelType = FLOAT64;
-  else if (t_id == typeid(kfloat32))
-    mPixelType = FLOAT32;
-  else if (t_id == typeid(kint32))
-    mPixelType = INT32;
-  else if (t_id == typeid(kuint32))
-    mPixelType = UINT32;
-  else if (t_id == typeid(kint16))
-    mPixelType = INT16;
-  else if (t_id == typeid(kuint16))
-    mPixelType = UINT16;
-  else if (t_id == typeid(kint8))
-    mPixelType = INT8;
-  else if (t_id == typeid(kuint8))
-    mPixelType = UINT8;
-  else
-#endif
-      mPixelType = 0;
-
-  bHeaderWritten = false;
-  bDataWritten = false;
-}
-
-template<class T>
-Array2dFile<T>::~Array2dFile (void)
-{
-    fileClose ();
-}
-
-
-template<class T>
-void
-Array2dFile<T>::fileClose (void)
-{
-  headerWrite ();
-  if (file_id >= 0 && array != NULL) {
-    arrayDataWrite ();
-    close (file_id);
-    file_id = -1;
-  }
-}
-
-template<class T>
-bool
-Array2dFile<T>::fileCreate (void)
-{
-  //  io = new iostream(filename, ios::out | ios::in | ios::trunc | io::binary);
-    if ((file_id = open (filename.c_str(), O_RDWR | O_CREAT | O_TRUNC | O_BINARY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) < 0) {
-       sys_error (ERR_WARNING, "Error opening file %s for writing [fileCreate]", filename.c_str());
-       return (false);
-    }
-  headerWrite();
-  return (true);
-}
-
-template<class T>
-bool
-Array2dFile<T>::fileRead (void)
-{
-  // io = new iostream(filename, ios::out | ios::in | io::binary);
-  if ((file_id = open (filename.c_str(), O_RDONLY | O_BINARY)) < 0) {
-    sys_error (ERR_WARNING, "Unable to open file %s [fileRead]", filename.c_str());
-    return (false);
-  }
-
-  headerRead();
-  if (array != NULL)
-    delete array;
-
-  array = new Array2d<T> (mNX, mNY);
-
-  arrayDataRead();
-
-  return (true);
-}
-
-template<class T>
-void
-Array2dFile<T>::setAxisIncrement (double incX, double incY)
-{
-    axis_increment_known = true;
-    mIncX = incX;
-    mIncY = incY;
-}
-
-template<class T>
-void 
-Array2dFile<T>::setAxisExtent (double minX, double maxX, double minY, double maxY)
-{
-    axis_extent_known = true;
-    mMinX = minX;
-    mMaxY = maxX;
-    mMinX = minX;
-    mMaxY = maxY;
-}
-
-template<class T>
-void 
-Array2dFile<T>::getPixelValueRange (T& pvmin, T& pvmax) const
-{
-    if (array != NULL) {
-       T** da = array->getArray();
-       pvmax = pvmin = da[0][0];
-       for (int ix = 0; ix < mNX; ix++)
-           for (int iy = 0; iy < mNY; iy++)
-               if (pvmax < da[ix][iy])
-                   pvmax = da[ix][iy];
-               else if (pvmin > da[ix][iy])
-                   pvmin = da[ix][iy];
-    }
-}
-
-template<class T>
-void
-Array2dFile<T>::doPixelOffsetScale (double offset, double scale)
-{
-    if (adf != NULL) {
-      mOffsetPV = offset;
-      mScalePV = scale;
-
-      T** ad = adf->getArray();
-      for (unsigned int ix = 0; ix < mNX; ix++) 
-         for (unsigned int iy = 0; iy < mNY; iy++)
-             ad[ix][iy] = (ad[ix][iy] - offset) * scale;
-    }
-}
-
-template<class T>
-bool
-Array2dFile<T>::headerRead (void)
-{
-  if (file_id < 0) {
-    sys_error (ERR_WARNING, "Tried to read header with file closed [headerRead]");
-    return (false);
-  }
-
-  lseek (file_id, 0, SEEK_SET);
-  kuint16 file_signature;
-  kuint16 file_mPixelSize;
-  kuint16 file_mPixelType;
-
-  read_nint16 (&headersize, file_id);
-  read_nint16 (&file_signature, file_id);
-  read_nint16 (&num_labels, file_id);
-  read_nint16 (&file_mPixelType, file_id);
-  read_nint16 (&file_mPixelSize, file_id);
-  read_nint32 (&mNX, file_id);
-  read_nint32 (&mNY, file_id);
-  read_nint16 (&axis_increment_known, file_id);
-  read_nfloat64 (&mIncX, file_id);
-  read_nfloat64 (&mIncY, file_id);
-  read_nint16 (&axis_extent_known, file_id);
-  read_nfloat64 (&mMinX, file_id);
-  read_nfloat64 (&mMaxX, file_id);
-  read_nfloat64 (&mMinY, file_id);
-  read_nfloat64 (&mMaxY, file_id);
-  read_nfloat64 (&mOffsetPV, file_id);
-  read_nfloat64 (&mScalePV, file_id);
-
-  int read_headersize = lseek (file_id, 0, SEEK_CUR);
-  if (read_headersize != headersize) {
-    sys_error (ERR_WARNING, "Read headersize %d != file headersize %d", read_headersize, headersize);
-    return (false);
-  }
-  if (file_signature != signature) {
-    sys_error (ERR_WARNING, "File signature %d != true signature %d", file_signature, signature);
-    return (false);
-  }
-  if (file_mPixelType != mPixelType) {
-    sys_error (ERR_WARNING, "File pixel type %d != class pixel type %d", file_mPixelType, mPixelType);
-    return (false);
-  }
-  if (file_mPixelSize != mPixelSize) {
-    sys_error (ERR_WARNING, "File pixel size %d != class pixel size %d", file_mPixelSize, mPixelSize);
-    return (false);
-  }
-
-  return (true);
-}
-
-template<class T>
-bool
-Array2dFile<T>::headerWrite (void)
-{
-  if (file_id < 0) {
-    sys_error (ERR_WARNING, "Tried to write header with file closed");
-    return (false);
-  }
-
-  lseek (file_id, 0, SEEK_SET);
-  write_nint16 (&headersize, file_id);
-  write_nint16 (&signature, file_id);
-  write_nint16 (&num_labels, file_id);
-  write_nint16 (&mPixelType, file_id);
-  write_nint16 (&mPixelSize, file_id);
-  write_nint32 (&mNX, file_id);
-  write_nint32 (&mNY, file_id);
-  write_nint16 (&axis_increment_known, file_id);
-  write_nfloat64 (&mIncX, file_id);
-  write_nfloat64 (&mIncY, file_id);
-  write_nint16 (&axis_extent_known, file_id);
-  write_nfloat64 (&mMinX, file_id);
-  write_nfloat64 (&mMaxX, file_id);
-  write_nfloat64 (&mMinY, file_id);
-  write_nfloat64 (&mMaxY, file_id);
-  write_nfloat64 (&mOffsetPV, file_id);
-  write_nfloat64 (&mScalePV, file_id);
-
-  headersize = lseek (file_id, 0, SEEK_CUR);
-  lseek (file_id, 0, SEEK_SET);
-  write_nint16 (&headersize, file_id);
-  
-  return (true);
-}
-
-template<class T>
-bool
-Array2dFile<T>::arrayDataWrite (void)
-{
-  if (file_id < 0) {
-    sys_error (ERR_WARNING, "Tried to arrayDataWrite with file_id < 0");
-    return (false);
-  }
-
-  lseek (file_id, headersize, SEEK_SET);
-  for (unsigned int ix = 0; ix < mNX; ix++)
-      for (unsigned int iy = 0; iy < mNY; iy++) {
-         T value = array->array_data[ix][iy];
-         ConvertNetworkOrder (&value, sizeof(T));
-         write (file_id, &value, mPixelSize);
-      }
-
-  return (true);
-}
-
-template<class T>
-bool
-Array2dFile<T>::arrayDataRead (void)
-{
-  if (file_id < 0) {
-    sys_error (ERR_WARNING, "Tried to arrayDataRead with file_id < 0");
-    return (false);
-  }
-
-  lseek (file_id, headersize, SEEK_SET);
-  T pixelBuffer;
-  for (int ix = 0; ix < mNX; ix++) 
-      for (unsigned int iy = 0; iy < mNY; iy++) {
-         read (file_id, &pixelBuffer, mPixelSize);
-         ConvertNetworkOrder (&pixelBuffer, sizeof(T));
-         array->array_data[ix][iy] = pixelBuffer;
-      }
-
-  return (true);
-}
-
-template<class T>
-bool
-Array2dFile<T>::labelSeek (unsigned int label_num)
-{
-  if (label_num > num_labels) {
-    sys_error (ERR_WARNING, "label_num %d > num_labels %d [labelSeek]");
-    return (false);
-  }
-
-  if (array == NULL) {    // Could not have written data if array not allocated
-    sys_error (ERR_WARNING, "array == NULL [labelSeek]");
-    return (false);
-  }
-
-  off_t pos = headersize + array->sizeofArray();
-  if (lseek (file_id, pos, SEEK_SET) != pos) {
-    sys_error (ERR_WARNING, "Can't seek to end of data array");
-    return (false);
-  }
-
-  for (int i = 0; i < label_num; i++)
-      {
-         pos += 22;  // Skip to string length
-         if (lseek (file_id, pos, SEEK_SET) != pos) {
-           sys_error (ERR_WARNING, "Can't seek to string length");
-           return (false);
-         }
-         kuint16 strlength;
-         read_nint16 (&strlength, file_id);
-         pos += 2 + strlength;  // Skip label string length + data
-         if (lseek (file_id, pos, SEEK_SET) != pos) {
-           sys_error (ERR_WARNING, "Can't seek past label string");
-           return (false);
-         }
-      }
-
-  return (true);
-}
-
-template<class T>
-bool
-Array2dFile<T>::labelRead (Array2dFileLabel& label, unsigned int label_num)
-{
-  if (label_num >= num_labels) {
-    sys_error (ERR_WARNING, "Trying to read past number of labels [labelRead]");
-    return (false);
-  }
-
-  if (! labelSeek (label_num)) {
-    sys_error (ERR_WARNING, "Error calling labelSeek");
-    return (false);
-  }
-
-  read_nint16 (&label.label_type, file_id);
-  read_nint16 (&label.year, file_id);
-  read_nint16 (&label.month, file_id);
-  read_nint16 (&label.day, file_id);
-  read_nint16 (&label.hour, file_id);
-  read_nint16 (&label.minute, file_id);
-  read_nint16 (&label.second, file_id);
-  read_nfloat64 (&label.calc_time, file_id);
-
-  kuint16 strlength;
-  read_nint16 (&strlength, file_id);
-  char *str = new char [strlength+1];
-  read (file_id, str, strlength);
-  label.label_str = str;
-
-  return (true);
-}
-
-
-template<class T>
-void
-Array2dFile<T>::labelAdd (const char* const lstr, double calc_time=0.)
-{
-  labelAdd (Array2dFileLabel::L_HISTORY, lstr, calc_time);
-}
-
-template<class T>
-void
-Array2dFile<T>::labelAdd (int type, const char* const lstr, double calc_time=0.)
-{
-  Array2dFileLabel label (type, lstr, calc_time);
-
-  labelAdd (label);
-}
-
-template<class T>
-void
-Array2dFile<T>::labelAdd (const Array2dFileLabel& label)
-{
-  labelSeek (num_labels);
-  
-  write_nint16 (&label.label_type, file_id);
-  write_nint16 (&label.year, file_id);
-  write_nint16 (&label.month, file_id);
-  write_nint16 (&label.day, file_id);
-  write_nint16 (&label.hour, file_id);
-  write_nint16 (&label.minute, file_id);
-  write_nint16 (&label.second, file_id);
-  write_nfloat64 (&label.calc_time, file_id);
-  kuint16 strlength = label.label_str.length();
-  write_nint16 (&strlength, file_id);
-  write (file_id, static_cast<const void*>(label.label_str.c_str()), strlength);
-
-  num_labels++;
-
-  headerWrite();
-  fsync(file_id);
-}
-
-template<class T>
-void
-Array2dFile<T>::labelsCopy (Array2dFile& copyFile, const char* const idStr)
-{
-    string id = idStr;
-    for (int i = 0; i < copyFile.getNumLabels(); i++) {
-      Array2dFileLabel l;
-      copyFile.labelRead (l, i);
-      string lstr = l.getLabelString();
-      lstr = idStr + lstr;
-      l.setLabelString (lstr);
-      labelAdd (l);
-    }
-}
-
-template<class T>
-void 
-Array2dFile<T>::arrayDataClear (void)
-{
-    if (array != NULL) {
-       T** v = array->getArray();
-       for (unsigned int ix = 0; ix < mNX; ix++)
-           for (unsigned int iy = 0; iy < mNY; iy++)
-               v[ix][iy] = 0;
-    }
-}
-
-
-#ifdef MPI_CT
-#include <mpi.h>
+#include <sys/types.h>
+#include <fstream>
+#include <iostream>
+#include "ctsupport.h"
+#include "fnetorderstream.h"
+#include "array2dfile.h"
+
+#ifdef HAVE_MPI
+#include <mpi++.h>
 #endif
 
 #endif
 
-class F32Image
+class F32Image : public Array2dFile
 {
 public:
 {
 public:
-  Array2dFile<kfloat32> adf;
-
-  F32Image (const char* const fname, unsigned int nx, unsigned int ny) : adf (fname, nx, ny)
-  {
-      adf.setPixelType (Array2dFile<kfloat64>::FLOAT32);
-  }
-
-  F32Image (unsigned int nx, unsigned int ny) : adf (nx, ny)
-  {
-      adf.setPixelType (Array2dFile<kfloat64>::FLOAT32);
-  }
-
-  F32Image (const char* const fname) : adf (fname)
-  {
-      adf.setPixelType (Array2dFile<kfloat64>::FLOAT32);
-  }
-
-  kfloat32** getArray(void) const
-      { return adf.getArray(); }
-
-  kuint32 nx(void) const
-      { return adf.nx(); }
-
-  kuint32 ny(void) const
-      { return adf.ny(); }
-
-#ifdef MPI_CT
-  MPI_Datatype getMPIDataType (void) const
-      { return MPI_FLOAT; }
+  F32Image (int nx, int ny, int dataType = Array2dFile::DATA_TYPE_REAL);     
+  F32Image (void);\r
+
+  kfloat32** getArray (void)\r
+      { return (kfloat32**) (m_arrayData); }\r
+\r
+  kfloat32** const getArray (void) const\r
+       { return (kfloat32** const) (m_arrayData); }\r
+\r
+  kfloat32** getImaginaryArray (void)\r
+      { return (kfloat32**) (m_imaginaryArrayData); }\r
+\r
+  kfloat32** const getImaginaryArray (void) const\r
+       { return (kfloat32** const) (m_imaginaryArrayData); }\r
+\r
+#ifdef HAVE_MPI
+  MPI::Datatype getMPIDataType (void) const
+      { return MPI::FLOAT; }
 #endif
 #endif
+
+ private:
+  F32Image (const F32Image& rhs);             //copy constructor
+  F32Image& operator= (const F32Image& rhs);  // assignment operator
 };
 
 };
 
-class F64Image 
-{
-public:
-  Array2dFile<kfloat64> adf;
 
 
-#ifdef MPI_CT
-  MPI_Datatype getMPIDataType (void) const
-      { return MPI_DOUBLE; }
+class F64Image : public Array2dFile
+{
+ public:
+
+   F64Image (int nx, int ny, int dataType = Array2dFile::DATA_TYPE_REAL);
+  F64Image (void);
+
+  kfloat64** getArray (void)\r
+      { return (kfloat64**) (m_arrayData); }\r
+\r
+  kfloat64** const getArray (void) const\r
+      { return (kfloat64** const) (m_arrayData); }\r
+\r
+  kfloat64** getImaginaryArray (void)\r
+      { return (kfloat64**) (m_imaginaryArrayData); }\r
+\r
+  kfloat64** const getImaginaryArray (void) const\r
+      { return (kfloat64** const) (m_imaginaryArrayData); }\r
+\r
+#ifdef HAVE_MPI
+  MPI::Datatype getMPIDataType (void) const
+      { return MPI::DOUBLE; }
 #endif
 #endif
-
-  F64Image (const char* const fname, unsigned int nx, unsigned int ny) : adf (fname, nx, ny)
-  {
-      adf.setPixelType (Array2dFile<kfloat64>::FLOAT64);
-  }
-
-  F64Image (unsigned int nx, unsigned int ny) : adf (nx, ny)
-  {
-      adf.setPixelType (Array2dFile<kfloat64>::FLOAT64);
-  }
-
-  F64Image (const char* const fname) : adf (fname)
-  {
-      adf.setPixelType (Array2dFile<kfloat64>::FLOAT64);
-  }
-
-  kfloat64** getArray(void) const
-      { return adf.getArray(); }
-
-  kuint32 nx(void) const
-      { return adf.nx(); }
-
-  kuint32 ny(void) const
-      { return adf.ny(); }
+ private:
+  F64Image (const F64Image& rhs);             //copy constructor
+  F64Image& operator= (const F64Image& rhs);  // assignment operator
 };
 
 };
 
-typedef F64Image   ImageFile;
+#undef IMAGEFILE_64_BITS
+#ifdef IMAGEFILE_64_BITS
+typedef F64Image   ImageFileBase;
 typedef kfloat64   ImageFileValue;
 typedef kfloat64*  ImageFileColumn;
 typedef kfloat64** ImageFileArray;
 typedef kfloat64   ImageFileValue;
 typedef kfloat64*  ImageFileColumn;
 typedef kfloat64** ImageFileArray;
-
+typedef kfloat64** const ImageFileArrayConst;\r
+typedef const kfloat64* ImageFileColumnConst;
+#else
+typedef F32Image   ImageFileBase;
+typedef kfloat32   ImageFileValue;
+typedef kfloat32*  ImageFileColumn;
+typedef kfloat32** ImageFileArray;
+typedef kfloat32** const ImageFileArrayConst;
+typedef const kfloat32* ImageFileColumnConst;\r
 #endif
 
 
 #endif
 
 
+class ImageFile : public ImageFileBase
+{\r
+private:\r
+\r
+  static const char* s_aszFormatName[];\r
+  static const char* s_aszFormatTitle[];\r
+  static const int s_iFormatCount;\r
+
+public:\r
+\r
+  static const int FORMAT_INVALID;\r
+  static const int FORMAT_PGM;\r
+  static const int FORMAT_PGMASCII;\r
+#if HAVE_PNG\r
+  static const int FORMAT_PNG;\r
+  static const int FORMAT_PNG16;\r
+#endif\r
+\r
+  static const int getFormatCount() {return s_iFormatCount;}\r
+  static const char** getFormatNameArray() {return s_aszFormatName;}\r
+  static const char** getFormatTitleArray() {return s_aszFormatTitle;}\r
+  static int convertFormatNameToID (const char* const formatName);\r
+  static const char* convertFormatIDToName (const int formatID);\r
+  static const char* convertFormatIDToTitle (const int formatID);\r
+
+  ImageFile (int nx, int ny)
+      : ImageFileBase (nx, ny)
+  {}
+
+  ImageFile (void)
+      : ImageFileBase ()
+  {}
+\r
+  bool convertRealToComplex ();\r
+  bool convertComplexToReal ();\r
+
+  void filterResponse (const char* const domainName, double bw, const char* const filterName, double filt_param, double dInputScale = 1., double dOutputScale = 1.);
+
+  void statistics (double& min, double& max, double& mean, double& mode, double& median, double& stddev) const;\r
+  void statistics (ImageFileArrayConst v, double& min, double& max, double& mean, double& mode, double& median, double& stddev) const;\r
+  void getMinMax (double& min, double& max) const;
+  void printStatistics (std::ostream& os) const;
+  bool comparativeStatistics (const ImageFile& imComp, double& d, double& r, double& e) const;
+  bool printComparativeStatistics (const ImageFile& imComp, std::ostream& os) const;
+\r
+  bool subtractImages (const ImageFile& rRHS, ImageFile& result) const;
+  bool addImages (const ImageFile& rRHS, ImageFile& result) const;\r
+  bool multiplyImages (const ImageFile& rRHS, ImageFile& result) const;\r
+  bool divideImages (const ImageFile& rRHS, ImageFile& result) const;\r
+\r
+  bool scaleImage (ImageFile& result) const;\r
+\r
+  bool invertPixelValues (ImageFile& result) const;\r
+  bool sqrt (ImageFile& result) const;\r
+  bool square (ImageFile& result) const;\r
+  bool log (ImageFile& result) const;\r
+  bool exp (ImageFile& result) const;\r
+  bool fourier (ImageFile& result) const;\r
+  bool inverseFourier (ImageFile& result) const;\r
+#ifdef HAVE_FFTW\r
+  bool fft (ImageFile& result) const;\r
+  bool ifft (ImageFile& result) const;\r
+#endif\r
+  bool magnitude (ImageFile& result) const;\r
+  bool phase (ImageFile& result) const;\r
+\r
+  int display (void) const;
+  int displayScaling (const int scaleFactor, ImageFileValue pmin, ImageFileValue pmax) const;
+\r
+  bool exportImage (const char* const pszFormat, const char* const pszFilename, int nxcell, int nycell, double densmin, double densmax);\r
+
+#if HAVE_PNG
+  bool writeImagePNG (const char* const outfile, int bitdepth, int nxcell, int nycell, double densmin, double densmax);
+#endif
+#if HAVE_GD
+  bool writeImageGIF (const char* const outfile, int nxcell, int nycell, double densmin, double densmax);
+#endif
+  bool writeImagePGM (const char* const outfile, int nxcell, int nycell, double densmin, double densmax);
+  bool writeImagePGMASCII (const char* const outfile, int nxcell, int nycell, double densmin, double densmax);
+};
 
 
+
+#endif