r592: Added PPM & PNG File importing
authorKevin M. Rosenberg <kevin@rosenberg.net>
Thu, 1 Mar 2001 20:02:18 +0000 (20:02 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Thu, 1 Mar 2001 20:02:18 +0000 (20:02 +0000)
14 files changed:
ChangeLog
doc/ctsim.prj
include/imagefile.h
libctsim/ctndicom.cpp
libctsim/imagefile.cpp
msvc/ctsim.dsw
msvc/ctsim/ctsim.plg
msvc/libctsim/libctsim.dsp
src/ctsim-map.h
src/ctsim.cpp
src/ctsim.h
src/dialogs.cpp
src/dialogs.h
src/views.cpp

index 735b59b..c772eec 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -11,6 +11,8 @@
        background processing as well as taking advantage of multiple-CPU's 
        on SMP systems.
 
+       * ctsim: Added PPM/PGM and PNG file import to imagefile.
+       
        * ctsim: Added background and SMP processing for reconstructions. 
 
        * ctsim: Added background and SMP processing for scanning.
index de489c8..e2ee8a5 100644 (file)
@@ -6,18 +6,21 @@
 ctsim.tex
 21
 3
-0
+1
 
 
 ctsim-algorithms.tex
 TeX
-268439547 0 65 52 0 43 44 44 960 631
+4091 0 65 52 0 43 44 44 960 631
 ctsim-concepts.tex
 TeX
-12282 0 31 22 44 30 110 110 1187 697
+268447738 0 302 40 280 44 110 110 1187 697
 ctsim.tex
 TeX
 134230010 2 50 12 50 22 22 22 1099 609
+tex2rtf.ini
+DATA
+273777330 0 0 1 26 8 22 22 938 609
 ctsim-gui.tex
 TeX
 268447738 0 145 21 144 1 176 176 1253 763
@@ -42,9 +45,6 @@ DATA
 ctsim-web.tex
 TeX
 268447739 0 24 50 0 60 88 88 1165 675
-tex2rtf.ini
-DATA
-273777330 0 0 1 17 8 22 22 938 609
 C:\Program Files\SecureCRT 3.0\download\ct.tex
 TeX
 268439546 0 3 1 600 1 132 132 1048 719
index 1062828..63a02bc 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: imagefile.h,v 1.31 2001/01/28 19:10:18 kevin Exp $
+**  $Id: imagefile.h,v 1.32 2001/03/01 20:02:18 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
@@ -118,30 +118,54 @@ typedef const kfloat32* ImageFileColumnConst;
 #endif
 
 
+
 class ImageFile : public ImageFileBase
 {
 private:
 
-  static const char* s_aszFormatName[];
-  static const char* s_aszFormatTitle[];
-  static const int s_iFormatCount;
+  static const char* s_aszExportFormatName[];
+  static const char* s_aszExportFormatTitle[];
+  static const int s_iExportFormatCount;
+  static const char* s_aszImportFormatName[];
+  static const char* s_aszImportFormatTitle[];
+  static const int s_iImportFormatCount;
+
+  static void skipSpacePPM (FILE* fp); // skip space in a ppm file
 
 public:
 
-  static const int FORMAT_INVALID;
-  static const int FORMAT_PGM;
-  static const int FORMAT_PGMASCII;
+  static const int EXPORT_FORMAT_INVALID;
+  static const int IMPORT_FORMAT_INVALID;
+  static const int EXPORT_FORMAT_PGM;
+  static const int EXPORT_FORMAT_PGMASCII;
+  static const int IMPORT_FORMAT_PPM;
 #if HAVE_PNG
-  static const int FORMAT_PNG;
-  static const int FORMAT_PNG16;
+  static const int EXPORT_FORMAT_PNG;
+  static const int EXPORT_FORMAT_PNG16;
+  static const int IMPORT_FORMAT_PNG;
 #endif
+#if HAVE_CTN_DICOM
+  static const int EXPORT_FORMAT_DICOM;
+  static const int IMPORT_FORMAT_DICOM;
+#endif
+
+  static const int getExportFormatCount() {return s_iExportFormatCount;}
+  static const char** getExportFormatNameArray() {return s_aszExportFormatName;}
+  static const char** getExportFormatTitleArray() {return s_aszExportFormatTitle;}
+  static int convertExportFormatNameToID (const char* const ExportFormatName);
+  static const char* convertExportFormatIDToName (const int ExportFormatID);
+  static const char* convertExportFormatIDToTitle (const int ExportFormatID);
 
-  static const int getFormatCount() {return s_iFormatCount;}
-  static const char** getFormatNameArray() {return s_aszFormatName;}
-  static const char** getFormatTitleArray() {return s_aszFormatTitle;}
-  static int convertFormatNameToID (const char* const formatName);
-  static const char* convertFormatIDToName (const int formatID);
-  static const char* convertFormatIDToTitle (const int formatID);
+  static const int getImportFormatCount() {return s_iImportFormatCount;}
+  static const char** getImportFormatNameArray() {return s_aszImportFormatName;}
+  static const char** getImportFormatTitleArray() {return s_aszImportFormatTitle;}
+  static int convertImportFormatNameToID (const char* const ImportFormatName);
+  static const char* convertImportFormatIDToName (const int ImportFormatID);
+  static const char* convertImportFormatIDToTitle (const int ImportFormatID);
+
+  static const double s_dRedGrayscaleFactor;
+  static const double s_dGreenGrayscaleFactor;
+  static const double s_dBlueGrayscaleFactor;
 
   ImageFile (int nx, int ny)
       : ImageFileBase (nx, ny)
@@ -195,14 +219,27 @@ public:
 
   bool exportImage (const char* const pszFormat, const char* const pszFilename, int nxcell, int nycell, double densmin, double densmax);
 
+  bool importImage (const char* const pszFormat, const char* const pszFilename);
+
 #if HAVE_PNG
   bool writeImagePNG (const char* const outfile, int bitdepth, int nxcell, int nycell, double densmin, double densmax);
+  bool readImagePNG (const char* const pszFile);
 #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);
+  bool readImagePPM (const char* const pszFile);
+#if HAVE_CTN_DICOM
+  bool readImageDicom (const char* const pszFile);
+#endif
+
+  static double redGrayscaleFactor() {return s_dRedGrayscaleFactor;}
+  static double greenGrayscaleFactor() {return s_dGreenGrayscaleFactor;}
+  static double blueGrayscaleFactor() {return s_dBlueGrayscaleFactor;}
+  static double colorToGrayscale (double r, double g, double b) 
+  { return r * s_dRedGrayscaleFactor + g * s_dGreenGrayscaleFactor + b * s_dBlueGrayscaleFactor; }
 };
 
 
index a2a343b..85ec88c 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: ctndicom.cpp,v 1.1 2001/03/01 07:30:49 kevin Exp $
+**  $Id: ctndicom.cpp,v 1.2 2001/03/01 20:02:18 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
@@ -30,7 +30,7 @@
 #endif
 
 #ifdef HAVE_CTN_DICOM
-#include "ctndicomp.h"
+#include "ctndicom.h"
 
 #endif // HAVE_CTN_DICOM
 
index 3186cb5..134a0c5 100644 (file)
@@ -1,15 +1,15 @@
 /*****************************************************************************
 ** FILE IDENTIFICATION
 **
-**     Name:         imagefile.cpp
-**      Purpose:      Imagefile classes
+**     Name:           imagefile.cpp
+**  Purpose:      Imagefile classes
 **     Programmer:   Kevin Rosenberg
 **     Date Started: June 2000
 **
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: imagefile.cpp,v 1.37 2001/01/28 19:10:18 kevin Exp $
+**  $Id: imagefile.cpp,v 1.38 2001/03/01 20:02:18 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
 
 #include "ct.h"
 
-const int ImageFile::FORMAT_INVALID = -1;
-const int ImageFile::FORMAT_PGM = 0;
-const int ImageFile::FORMAT_PGMASCII = 1;
+const double ImageFile::s_dRedGrayscaleFactor = 0.299;
+const double ImageFile::s_dGreenGrayscaleFactor = 0.587;
+const double ImageFile::s_dBlueGrayscaleFactor = 0.114;
+
+
+const int ImageFile::EXPORT_FORMAT_INVALID = -1;
+const int ImageFile::EXPORT_FORMAT_PGM = 0;
+const int ImageFile::EXPORT_FORMAT_PGMASCII = 1;
 #ifdef HAVE_PNG
-const int ImageFile::FORMAT_PNG = 2;
-const int ImageFile::FORMAT_PNG16 = 3;
+const int ImageFile::EXPORT_FORMAT_PNG = 2;
+const int ImageFile::EXPORT_FORMAT_PNG16 = 3;
+#endif
+#ifdef HAVE_CTN_DICOM
+const int ImageFile::EXPORT_FORMAT_DICOM = 4;
 #endif
 
-const char* ImageFile::s_aszFormatName[] = 
+const char* ImageFile::s_aszExportFormatName[] = 
 {
   {"pgm"},
   {"pgmascii"},
@@ -43,17 +51,54 @@ const char* ImageFile::s_aszFormatName[] =
   {"png"},
   {"png16"},
 #endif
+#ifdef HAVE_CTN_DICOM
+  {"dicom"},
+#endif
 };
 
-const char* ImageFile::s_aszFormatTitle[] = 
+const char* ImageFile::s_aszExportFormatTitle[] = 
 {
   {"PGM"},
   {"PGM ASCII"},
   {"PNG"},
   {"PNG 16-bit"},
+#ifdef HAVE_CTN_DICOM
+  {"Dicom"},
+#endif
+};
+const int ImageFile::s_iExportFormatCount = sizeof(s_aszExportFormatName) / sizeof(const char*);
+
+
+const int ImageFile::IMPORT_FORMAT_INVALID = -1;
+const int ImageFile::IMPORT_FORMAT_PPM = 0;
+#ifdef HAVE_PNG
+const int ImageFile::IMPORT_FORMAT_PNG = 1;
+#endif
+#ifdef HAVE_CTN_DICOM
+const int ImageFile::IMPORT_FORMAT_DICOM = 2;
+#endif
+
+
+const char* ImageFile::s_aszImportFormatName[] = 
+{
+  {"ppm"},
+#ifdef HAVE_PNG
+  {"png"},
+#endif
+#ifdef HAVE_CTN_DICOM
+  {"dicom"},
+#endif
 };
 
-const int ImageFile::s_iFormatCount = sizeof(s_aszFormatName) / sizeof(const char*);
+const char* ImageFile::s_aszImportFormatTitle[] = 
+{
+  {"PPM"},
+  {"PNG"},
+#ifdef HAVE_CTN_DICOM
+  {"Dicom"},
+#endif
+};
+const int ImageFile::s_iImportFormatCount = sizeof(s_aszImportFormatName) / sizeof(const char*);
 
 
 
@@ -90,7 +135,7 @@ ImageFile::getCenterCoordinates (unsigned int& iXCenter, unsigned int& iYCenter)
     iXCenter = m_nx / 2;
   else
     iXCenter = (m_nx - 1) / 2;
-
+  
   if (isEven (m_ny))
     iYCenter = m_ny / 2;
   else
@@ -106,7 +151,7 @@ ImageFile::filterResponse (const char* const domainName, double bw, const char*
   
   unsigned int iXCenter, iYCenter;
   getCenterCoordinates (iXCenter, iYCenter);
-
+  
   for (unsigned int ix = 0; ix < m_nx; ix++)
     for (unsigned int iy = 0; iy < m_ny; iy++) {
       long lD2 = ((ix - iXCenter) * (ix - iXCenter)) + ((iy - iYCenter) * (iy - iYCenter));
@@ -708,9 +753,9 @@ ImageFile::scaleImage (ImageFile& result) const
         if (result.isComplex()) {
           if (isComplex())
             vResultImag[ix][iy] = (1 - dXFrac) * (1 - dYFrac) * vImag[scaleNX][scaleNY] + 
-          dXFrac * (1 - dYFrac) * vImag[scaleNX+1][scaleNY] + 
-          dYFrac * (1 - dXFrac) * vImag[scaleNX][scaleNY+1] +
-          dXFrac * dYFrac * vImag[scaleNX+1][scaleNY+1];
+            dXFrac * (1 - dYFrac) * vImag[scaleNX+1][scaleNY] + 
+            dYFrac * (1 - dXFrac) * vImag[scaleNX][scaleNY+1] +
+            dXFrac * dYFrac * vImag[scaleNX+1][scaleNY+1];
           else
             vResultImag[ix][iy] = 0;
         }
@@ -855,7 +900,7 @@ ImageFile::fftRows (ImageFile& result) const
   
   fftw_plan plan = fftw_create_plan (m_nx, FFTW_FORWARD, FFTW_IN_PLACE);
   std::complex<double>* pcRow = new std::complex<double> [m_nx];
-
+  
   unsigned int ix, iy;
   unsigned int iArray = 0;
   for (iy = 0; iy < m_ny; iy++) {
@@ -866,12 +911,12 @@ ImageFile::fftRows (ImageFile& result) const
       else
         in[ix].im = 0;
     }
-
+    
     fftw_one (plan, in, NULL);
-
+    
     for (ix = 0; ix < m_nx; ix++)
       pcRow[ix] = std::complex<double>(in[ix].re, in[ix].im);
-
+    
     Fourier::shuffleFourierToNaturalOrder (pcRow, m_nx);
     for (ix = 0; ix < m_nx; ix++) {
       vReal[ix][iy] = pcRow[ix].real();
@@ -879,11 +924,11 @@ ImageFile::fftRows (ImageFile& result) const
     }
   }
   delete [] pcRow;
-   
-   fftw_destroy_plan (plan);
-   delete in;
-
-   return true;
+  
+  fftw_destroy_plan (plan);
+  delete in;
+  
+  return true;
 }     
 
 bool
@@ -906,7 +951,7 @@ ImageFile::ifftRows (ImageFile& result) const
   
   fftw_plan plan = fftw_create_plan (m_nx, FFTW_BACKWARD, FFTW_IN_PLACE);
   std::complex<double>* pcRow = new std::complex<double> [m_nx];
-
+  
   unsigned int ix, iy;
   unsigned int iArray = 0;
   for (iy = 0; iy < m_ny; iy++) {
@@ -916,16 +961,16 @@ ImageFile::ifftRows (ImageFile& result) const
         dImag = vImag[ix][iy];
       pcRow[ix] = std::complex<double> (vReal[ix][iy], dImag);
     }
-
+    
     Fourier::shuffleNaturalToFourierOrder (pcRow, m_nx);
-
+    
     for (ix = 0; ix < m_nx; ix++) {
       in[ix].re = pcRow[ix].real();
       in[ix].im = pcRow[ix].imag();
     }
-
+    
     fftw_one (plan, in, NULL);
-
+    
     for (ix = 0; ix < m_nx; ix++) {
       vReal[ix][iy] = in[ix].re;
       vImag[ix][iy] = in[ix].im;
@@ -933,10 +978,10 @@ ImageFile::ifftRows (ImageFile& result) const
   }
   delete [] pcRow;
   
-   fftw_destroy_plan (plan);
-   delete in;
-
-   return true;
+  fftw_destroy_plan (plan);
+  delete in;
+  
+  return true;
 }
 
 bool
@@ -1183,12 +1228,12 @@ ImageFile::square (ImageFile& result) const
 }
 
 int
-ImageFile::convertFormatNameToID (const char* const formatName)
+ImageFile::convertExportFormatNameToID (const char* const formatName)
 {
-  int formatID = FORMAT_INVALID;
+  int formatID = EXPORT_FORMAT_INVALID;
   
-  for (int i = 0; i < s_iFormatCount; i++)
-    if (strcasecmp (formatName, s_aszFormatName[i]) == 0) {
+  for (int i = 0; i < s_iExportFormatCount; i++)
+    if (strcasecmp (formatName, s_aszExportFormatName[i]) == 0) {
       formatID = i;
       break;
     }
@@ -1197,49 +1242,341 @@ ImageFile::convertFormatNameToID (const char* const formatName)
 }
 
 const char*
-ImageFile::convertFormatIDToName (int formatID)
+ImageFile::convertExportFormatIDToName (int formatID)
 {
   static const char *formatName = "";
   
-  if (formatID >= 0 && formatID < s_iFormatCount)
-    return (s_aszFormatName[formatID]);
+  if (formatID >= 0 && formatID < s_iExportFormatCount)
+    return (s_aszExportFormatName[formatID]);
   
   return (formatName);
 }
 
 const char*
-ImageFile::convertFormatIDToTitle (const int formatID)
+ImageFile::convertExportFormatIDToTitle (const int formatID)
 {
   static const char *formatTitle = "";
   
-  if (formatID >= 0 && formatID < s_iFormatCount)
-    return (s_aszFormatTitle[formatID]);
+  if (formatID >= 0 && formatID < s_iExportFormatCount)
+    return (s_aszExportFormatTitle[formatID]);
+  
+  return (formatTitle);
+}
+
+int
+ImageFile::convertImportFormatNameToID (const char* const formatName)
+{
+  int formatID = IMPORT_FORMAT_INVALID;
+  
+  for (int i = 0; i < s_iImportFormatCount; i++)
+    if (strcasecmp (formatName, s_aszImportFormatName[i]) == 0) {
+      formatID = i;
+      break;
+    }
+    
+    return (formatID);
+}
+
+const char*
+ImageFile::convertImportFormatIDToName (int formatID)
+{
+  static const char *formatName = "";
+  
+  if (formatID >= 0 && formatID < s_iImportFormatCount)
+    return (s_aszImportFormatName[formatID]);
+  
+  return (formatName);
+}
+
+const char*
+ImageFile::convertImportFormatIDToTitle (const int formatID)
+{
+  static const char *formatTitle = "";
+  
+  if (formatID >= 0 && formatID < s_iImportFormatCount)
+    return (s_aszImportFormatTitle[formatID]);
   
   return (formatTitle);
 }
 
 bool
-ImageFile::exportImage (const char* const pszFormat, const char* const pszFilename, int nxcell, int nycell, double densmin, double densmax)
+ImageFile::importImage (const char* const pszFormat, const char* const pszFilename)
 {
-  int iFormatID = convertFormatNameToID (pszFormat);
-  if (iFormatID == FORMAT_INVALID) {
-    sys_error (ERR_SEVERE, "Invalid format %s [ImageFile::exportImage]", pszFormat);
+  int iFormatID = convertImportFormatNameToID (pszFormat);
+  
+  if (iFormatID == IMPORT_FORMAT_PPM)
+    return readImagePPM (pszFilename);
+#ifdef HAVE_PNG
+  else if (iFormatID == IMPORT_FORMAT_PNG)
+    return readImagePNG (pszFilename);
+#endif
+#ifdef HAVE_CTN_DICOM
+  else if (iFormatID == IMPORT_FORMAT_DICOM)
+    return readImageDicom (pszFilename);
+#endif
+  
+  sys_error (ERR_SEVERE, "Invalid format %s [ImageFile::importImage]", pszFormat);
+  return false;
+}
+
+bool
+ImageFile::readImageDicom (const char* const pszFile)
+{
+  return false;
+}
+
+void
+ImageFile::skipSpacePPM (FILE* fp)
+{
+  int c = fgetc (fp);
+  while (isspace (c) || c == '#') {
+    if (c == '#') {   // comment until end of line
+      c = fgetc(fp);
+      while (c != 13 && c != 10)
+        c = fgetc(fp);
+    }
+    else
+      c = fgetc(fp);
+  }
+  
+  ungetc (c, fp);
+}
+
+bool
+ImageFile::readImagePPM (const char* const pszFile)
+{
+  FILE* fp = fopen (pszFile, "r");
+  if ((fp = fopen (pszFile, "r")) == NULL)
+    return false;
+  char cSignature = toupper(fgetc(fp));
+  if (cSignature != 'P') {
+    fclose(fp);
+    return false;
+  }
+  cSignature = fgetc(fp);
+  if (cSignature == '5' || cSignature == '6') { // binary modes
+    fclose(fp);
+    fp = fopen(pszFile, "rb"); // reopen in binary mode
+    fgetc(fp);
+    fgetc(fp);
+  } else if (cSignature != '2' && cSignature != '3') {
+    fclose(fp);
+    return false;
+  }
+  
+  int nRows, nCols, iMaxValue;
+  skipSpacePPM (fp); 
+  if (fscanf (fp, "%d", &nCols) != 1) {
+    fclose(fp);
+    return false;
+  }
+  skipSpacePPM (fp);
+  if (fscanf (fp, "%d", &nRows) != 1) {
+    fclose(fp);
+    return false;
+  }
+  skipSpacePPM (fp);
+  if (fscanf (fp, "%d", &iMaxValue) != 1) {
+    fclose(fp);
+    return false;
+  }
+  setArraySize (nRows, nCols);
+  
+  if (cSignature == '5' || cSignature == '6') { // binary modes
+    int c = fgetc(fp);
+    if (c == 13) {
+      c = fgetc(fp);
+      if (c != 10)  // read msdos 13-10 newline
+        ungetc(c, fp);
+    }
+  } else
+    skipSpacePPM (fp); // ascii may have comments
+  
+  double dMaxValue = iMaxValue;
+  ImageFileArray v = getArray();
+  for (int iy = nRows - 1; iy >= 0; iy--) {
+    for (int ix = 0; ix < nCols; ix++) {
+      int iGS, iR, iG, iB;
+      double dR, dG, dB;
+      switch (cSignature) {
+      case '2':
+        if (fscanf(fp, "%d ", &iGS) != 1) {
+          fclose(fp);
+          return false;
+        }
+        v[ix][iy] = iGS / dMaxValue;
+        break;
+      case '5':
+        iGS = fgetc(fp);
+        if (iGS == EOF) {
+          fclose(fp);
+          return false;
+        }
+        v[ix][iy] = iGS / dMaxValue;
+        break;
+      case '3':
+        if (fscanf (fp, "%d %d %d ", &iR, &iG, &iB) != 3) {
+          fclose(fp);
+          return false;
+        }
+        dR = iR / dMaxValue;
+        dG = iG / dMaxValue;
+        dB = iB / dMaxValue;
+        v[ix][iy] = colorToGrayscale (dR, dG, dB);
+        break;
+      case '6':
+        iR = fgetc(fp);
+        iG = fgetc(fp);
+        iB = fgetc(fp);
+        if (iB == EOF) {
+          fclose(fp);
+          return false;
+        }
+        dR = iR / dMaxValue;
+        dG = iG / dMaxValue;
+        dB = iB / dMaxValue;
+        v[ix][iy] = colorToGrayscale (dR, dG, dB);
+        break;
+      }
+    }
+  }
+  
+  fclose(fp);
+  return true;
+}
+
+#ifdef HAVE_PNG
+bool
+ImageFile::readImagePNG (const char* const pszFile)
+{
+  FILE* fp = fopen(pszFile, "rb");
+  if (!fp) 
+    return false;
+  unsigned char header[8];
+  fread (header, 1, 8, fp);
+  if (png_sig_cmp (header, 0, 8)) {
+    fclose (fp);
+    return false;
+  }
+  
+  png_structp png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+  if (!png_ptr) {
+    fclose(fp);
+    return false;
+  }
+  
+  png_infop info_ptr = png_create_info_struct(png_ptr);
+  if (!info_ptr) {
+    png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
+    fclose(fp);
+    return false;
+  }
+  
+  png_infop end_info = png_create_info_struct(png_ptr);
+  if (!end_info) {
+    png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
+    fclose(fp);
     return false;
   }
   
-  if (iFormatID == FORMAT_PGM)
+  if (setjmp(png_ptr->jmpbuf)) {
+    png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
+    fclose(fp);
+    return false;
+  }
+  
+  png_init_io(png_ptr, fp);
+  png_set_sig_bytes(png_ptr, 8);
+  png_read_info(png_ptr, info_ptr);
+  
+  int width = png_get_image_width (png_ptr, info_ptr);
+  int height = png_get_image_height (png_ptr, info_ptr);
+  int bit_depth = png_get_bit_depth (png_ptr, info_ptr);
+  int color_type = png_get_color_type (png_ptr, info_ptr);
+  
+  if (color_type == PNG_COLOR_TYPE_PALETTE && bit_depth <= 8) 
+    png_set_expand(png_ptr);
+  
+  if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) 
+    png_set_expand(png_ptr);
+  
+  if (bit_depth < 8)
+    png_set_packing(png_ptr);
+  
+  if (color_type & PNG_COLOR_MASK_ALPHA)
+    png_set_strip_alpha(png_ptr);
+  
+  if (bit_depth == 16)
+    png_set_swap(png_ptr); // convert to little-endian format
+  
+  png_read_update_info(png_ptr, info_ptr); // update with transformations
+  int rowbytes = png_get_rowbytes (png_ptr, info_ptr);
+  bit_depth = png_get_bit_depth (png_ptr, info_ptr);
+  color_type = png_get_color_type (png_ptr, info_ptr);
+  
+  png_bytep* row_pointers = new png_bytep [height];
+  int i;
+  for (i = 0; i < height; i++)
+    row_pointers[i] = new unsigned char [rowbytes];
+  
+  png_read_image(png_ptr, row_pointers);
+  
+  setArraySize (width, height);
+  ImageFileArray v = getArray();
+  for (int iy = 0; iy < height; iy++) {
+    for (int ix = 0; ix < width; ix++) {
+      double dV;
+      if (color_type == PNG_COLOR_TYPE_GRAY) {
+        if (bit_depth == 8)
+          dV = row_pointers[iy][ix] / 255.;
+        else if (bit_depth == 16) {
+          int iBase = ix * 2;
+          dV = (row_pointers[iy][iBase] + (row_pointers[iy][iBase+1] << 8)) / 65536.;
+        }
+      } else if (color_type == PNG_COLOR_TYPE_RGB) {
+        if (bit_depth == 8) {
+          int iBase = ix * 3;
+          double dR = row_pointers[iy][iBase] / 255.;
+          double dG = row_pointers[iy][iBase+1] / 255.;
+          double dB = row_pointers[iy][iBase+2] / 255.;
+          dV = colorToGrayscale (dR, dG, dR);
+        }
+      }
+      v[ix][height-iy-1] = dV;
+    }
+  }
+  
+  png_read_end(png_ptr, end_info);
+  png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
+  
+  for (i = 0; i < height; i++)
+    delete row_pointers[i];
+  delete row_pointers;
+  
+  fclose (fp);
+  return true;
+}
+#endif
+
+bool
+ImageFile::exportImage (const char* const pszFormat, const char* const pszFilename, int nxcell, int nycell, double densmin, double densmax)
+{
+  int iFormatID = convertExportFormatNameToID (pszFormat);
+  
+  if (iFormatID == EXPORT_FORMAT_PGM)
     return writeImagePGM (pszFilename, nxcell, nycell, densmin, densmax);
-  else if (iFormatID == FORMAT_PGMASCII)
+  else if (iFormatID == EXPORT_FORMAT_PGMASCII)
     return writeImagePGMASCII (pszFilename, nxcell, nycell, densmin, densmax);
-  else if (iFormatID == FORMAT_PNG)
+  else if (iFormatID == EXPORT_FORMAT_PNG)
     return writeImagePNG (pszFilename, 8, nxcell, nycell, densmin, densmax);
-  else if (iFormatID == FORMAT_PNG16)
+  else if (iFormatID == EXPORT_FORMAT_PNG16)
     return writeImagePNG (pszFilename, 16, nxcell, nycell, densmin, densmax);
   
   sys_error (ERR_SEVERE, "Invalid format %s [ImageFile::exportImage]", pszFormat);
   return false;
 }
 
+
 bool
 ImageFile::writeImagePGM (const char* const outfile, int nxcell, int nycell, double densmin, double densmax)
 {
index 3d7b7ba..291a883 100644 (file)
@@ -63,6 +63,18 @@ Package=<4>
 
 ###############################################################################
 
+Project: "ctn_lib"=..\..\dicom\ctn\winctn\ctn_lib\ctn_lib.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
 Project: "ctsim"=.\ctsim\ctsim.dsp - Package Owner=<4>
 
 Package=<5>
@@ -120,6 +132,18 @@ Package=<4>
 
 ###############################################################################
 
+Project: "dcm_w_disp"=..\..\dicom\ctn\winctn\ctn_apps\dcm_w_disp\dcm_w_disp.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
 Project: "jpeg"=..\..\wx2.2.5\src\jpeg\JpegVC.dsp - Package Owner=<4>
 
 Package=<5>
index 2747a57..c3d80b1 100644 (file)
@@ -3,60 +3,16 @@
 <pre>
 <h1>Build Log</h1>
 <h3>
---------------------Configuration: libctsim - Win32 Debug--------------------
+--------------------Configuration: ctsim - Win32 Debug--------------------
 </h3>
 <h3>Command Lines</h3>
-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP1F2.tmp" with contents
-[
-/nologo /G6 /MTd /W3 /Gm /Gi /GR /GX /Zi /Od /Gy /I "..\..\..\wx2.2.5\src\png" /I "..\..\..\wx2.2.5\src\zlib" /I "..\..\INCLUDE" /I "..\..\getopt" /I "..\..\..\fftw-2.1.3\fftw" /I "..\..\..\fftw-2.1.3\rfftw" /I "..\..\..\wx2.2.5\include" /D "_DEBUG" /D "HAVE_WXWIN" /D "HAVE_STRING_H" /D "HAVE_GETOPT_H" /D "WIN32" /D "_MBCS" /D "_LIB" /D "MSVC" /D "HAVE_FFTW" /D "HAVE_PNG" /D "HAVE_SGP" /D "HAVE_WXWINDOWS" /D "__WXMSW__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /FR"Debug/" /Fp"Debug/libctsim.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c 
-"C:\ctsim\libctsim\scanner.cpp"
-]
-Creating command line "cl.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP1F2.tmp" 
-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP1F3.tmp" with contents
+Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP65.tmp" with contents
 [
-/nologo /out:"Debug\libctsim.lib" 
-.\Debug\array2dfile.obj
-.\Debug\backprojectors.obj
-.\Debug\clip.obj
-.\Debug\consoleio.obj
-.\Debug\dlgezplot.obj
-.\Debug\ezplot.obj
-.\Debug\ezset.obj
-.\Debug\ezsupport.obj
-.\Debug\filter.obj
-.\Debug\fnetorderstream.obj
-.\Debug\fourier.obj
-.\Debug\getopt.obj
-.\Debug\getopt1.obj
-.\Debug\globalvars.obj
-.\Debug\hashtable.obj
-.\Debug\imagefile.obj
-.\Debug\interpolator.obj
-.\Debug\mathfuncs.obj
-.\Debug\phantom.obj
-.\Debug\plotfile.obj
-.\Debug\pol.obj
-.\Debug\procsignal.obj
-.\Debug\projections.obj
-.\Debug\reconstruct.obj
-.\Debug\scanner.obj
-.\Debug\sgp.obj
-.\Debug\strfuncs.obj
-.\Debug\syserror.obj
-.\Debug\trace.obj
-.\Debug\transformmatrix.obj
-.\Debug\xform.obj
+/nologo /G6 /MTd /W3 /Gm /Gi /GR /GX /Zi /Od /Gy /I "\wx2.2.5\include" /I "..\..\..\fftw-2.1.3\fftw" /I "\wx2.2.5\src\png" /I "\wx2.2.5\src\zlib" /I "..\..\include" /I "..\..\getopt" /I "..\..\..\fftw-2.1.3\rfftw" /D VERSION=\"3.0.0beta1\" /D "_DEBUG" /D "__WXMSW__" /D "HAVE_SGP" /D "HAVE_PNG" /D "HAVE_WXWINDOWS" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "HAVE_STRING_H" /D "HAVE_FFTW" /D "HAVE_RFFTW" /D "HAVE_GETOPT_H" /D "MSVC" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "STRICT" /D CTSIMVERSION=\"3.0.4\" /D CTSIMVERSION=\"3.0.0alpha5\" /FR"Debug/" /Fp"Debug/ctsim.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c 
+"C:\ctsim\src\ctsim.cpp"
 ]
-Creating command line "link.exe -lib @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP1F3.tmp"
-<h3>Output Window</h3>
-Compiling...
-scanner.cpp
-Creating library...
-<h3>
---------------------Configuration: ctsim - Win32 Debug--------------------
-</h3>
-<h3>Command Lines</h3>
-Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP1F4.tmp" with contents
+Creating command line "cl.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP65.tmp" 
+Creating temporary file "C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP66.tmp" with contents
 [
 winmm.lib rpcrt4.lib ws2_32.lib ../libctsim/Debug/libctsim.lib libcmtd.lib ..\..\..\fftw-2.1.3\Win32\FFTW2st\Debug\FFTW2st.lib ..\..\..\fftw-2.1.3\Win32\RFFTW2st\Debug\RFFTW2st.lib wxd.lib xpmd.lib tiffd.lib zlibd.lib pngd.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib opengl32.lib glu32.lib htmlhelp.lib /nologo /subsystem:windows /incremental:yes /pdb:"Debug/ctsim.pdb" /debug /machine:I386 /out:"Debug/ctsim.exe" /pdbtype:sept /libpath:"\wx2.2.5\lib" 
 .\Debug\backgroundmgr.obj
@@ -83,8 +39,10 @@ winmm.lib rpcrt4.lib ws2_32.lib ../libctsim/Debug/libctsim.lib libcmtd.lib ..\..
 \wx2.2.5\lib\zlibd.lib
 \wx2.2.5\lib\tiffd.lib
 ]
-Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP1F4.tmp"
+Creating command line "link.exe @C:\DOCUME~1\kevin\LOCALS~1\Temp\RSP66.tmp"
 <h3>Output Window</h3>
+Compiling...
+ctsim.cpp
 Linking...
 
 
index 478ef7b..8a33c9b 100644 (file)
@@ -42,7 +42,7 @@ RSC=rc.exe
 # PROP Target_Dir ""
 MTL=midl.exe
 # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /G6 /MT /W3 /GR /GX /O2 /I "\wx2.2.5\src\png" /I "\wx2.2.5\src\zlib" /I "..\..\INCLUDE" /I "..\..\getopt" /I "..\..\..\fftw-2.1.3\fftw" /I "..\..\..\fftw-2.1.3\rfftw" /I "..\..\..\wx2.2.5\include" /D "NDEBUG" /D "HAVE_STRING_H" /D "HAVE_GETOPT_H" /D "WIN32" /D "_MBCS" /D "_LIB" /D "MSVC" /D "HAVE_FFTW" /D "HAVE_PNG" /D "HAVE_SGP" /D "HAVE_WXWINDOWS" /D "__WXMSW__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /YX /FD /c
+# ADD CPP /nologo /G6 /MT /W3 /GR /GX /O2 /I "\wx2.2.5\src\png" /I "\wx2.2.5\src\zlib" /I "..\..\INCLUDE" /I "..\..\getopt" /I "..\..\..\fftw-2.1.3\fftw" /I "..\..\..\fftw-2.1.3\rfftw" /I "..\..\..\wx2.2.5\include" /D "NDEBUG" /D "HAVE_STRING_H" /D "HAVE_GETOPT_H" /D "WIN32" /D "_MBCS" /D "_LIB" /D "MSVC" /D "HAVE_FFTW" /D "HAVE_PNG" /D "HAVE_SGP" /D "HAVE_WXWINDOWS" /D "__WXMSW__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "HAVE_CTN_DICOM" /YX /FD /c
 # SUBTRACT CPP /X
 # ADD BASE RSC /l 0x409 /d "NDEBUG"
 # ADD RSC /l 0x409 /d "NDEBUG"
@@ -67,7 +67,7 @@ LIB32=link.exe -lib
 # PROP Target_Dir ""
 MTL=midl.exe
 # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /G6 /MTd /W3 /Gm /Gi /GR /GX /Zi /Od /Gy /I "..\..\..\wx2.2.5\src\png" /I "..\..\..\wx2.2.5\src\zlib" /I "..\..\INCLUDE" /I "..\..\getopt" /I "..\..\..\fftw-2.1.3\fftw" /I "..\..\..\fftw-2.1.3\rfftw" /I "..\..\..\wx2.2.5\include" /D "_DEBUG" /D "HAVE_WXWIN" /D "HAVE_STRING_H" /D "HAVE_GETOPT_H" /D "WIN32" /D "_MBCS" /D "_LIB" /D "MSVC" /D "HAVE_FFTW" /D "HAVE_PNG" /D "HAVE_SGP" /D "HAVE_WXWINDOWS" /D "__WXMSW__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /FR /YX /FD /GZ /c
+# ADD CPP /nologo /G6 /MTd /W3 /Gm /Gi /GR /GX /Zi /Od /Gy /I "..\..\..\wx2.2.5\src\png" /I "..\..\..\wx2.2.5\src\zlib" /I "..\..\INCLUDE" /I "..\..\getopt" /I "..\..\..\fftw-2.1.3\fftw" /I "..\..\..\fftw-2.1.3\rfftw" /I "..\..\..\wx2.2.5\include" /D "_DEBUG" /D "HAVE_WXWIN" /D "HAVE_STRING_H" /D "HAVE_GETOPT_H" /D "WIN32" /D "_MBCS" /D "_LIB" /D "MSVC" /D "HAVE_FFTW" /D "HAVE_PNG" /D "HAVE_SGP" /D "HAVE_WXWINDOWS" /D "__WXMSW__" /D "__WIN95__" /D "__WIN32__" /D WINVER=0x0400 /D "HAVE_CTN_DICOM" /FR /YX /FD /GZ /c
 # SUBTRACT CPP /X
 # ADD BASE RSC /l 0x409 /d "_DEBUG"
 # ADD RSC /l 0x409 /d "_DEBUG"
@@ -118,6 +118,10 @@ SOURCE=..\..\libctsupport\consoleio.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\libctsim\ctndicom.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\libctgraphics\dlgezplot.cpp
 # End Source File
 # Begin Source File
@@ -268,6 +272,10 @@ SOURCE=..\..\include\ctglobals.h
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\include\ctndicom.h
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\include\ctsupport.h
 # End Source File
 # Begin Source File
index 9197d40..2eeb62b 100644 (file)
@@ -11,4 +11,5 @@
 #define IDH_DLG_COMPARISON     8611
 #define IDH_DLG_PREFERENCES    8612
 #define IDH_DLG_POLAR          8613
+#define IDH_DLG_IMPORT         8614
 
index 0d459ad..5d19270 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: ctsim.cpp,v 1.89 2001/02/25 10:52:55 kevin Exp $
+**  $Id: ctsim.cpp,v 1.90 2001/03/01 20:02:18 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
 #endif
 #endif
 
-static const char* rcsindent = "$Id: ctsim.cpp,v 1.89 2001/02/25 10:52:55 kevin Exp $";
+static const char* rcsindent = "$Id: ctsim.cpp,v 1.90 2001/03/01 20:02:18 kevin Exp $";
 
 struct option CTSimApp::ctsimOptions[] = 
 {
-       {"help", 0, 0, O_HELP},
-       {"version", 0, 0, O_VERSION},
+  {"help", 0, 0, O_HELP},
+  {"version", 0, 0, O_VERSION},
   {"print", 0, 0, O_PRINT},
-       {0, 0, 0, 0}
+  {0, 0, 0, 0}
 };
 
 IMPLEMENT_APP(CTSimApp)
 
 CTSimApp::CTSimApp()
 :  m_bAdvancedOptions(false), m_bSetModifyNewDocs(true), m_bVerboseLogging(false), m_bShowStartupTips(true),
-   m_iCurrentTip(0), m_bUseBackgroundTasks(false),
-  m_docManager(NULL), m_pFrame(NULL), m_pLog(0), m_pLogDoc(0), m_pConfig(0)
+m_iCurrentTip(0), m_bUseBackgroundTasks(false),
+m_docManager(NULL), m_pFrame(NULL), m_pLog(0), m_pLogDoc(0), m_pConfig(0)
 {
-       theApp = this;
+  theApp = this;
 }
 
 #ifdef HAVE_SYS_TIME_H
@@ -101,112 +101,112 @@ bool
 CTSimApp::OnInit()
 {
 #ifdef HAVE_SETPRIORITY
-       setpriority (PRIO_PROCESS, 0, 15);  // set to low scheduling priority
+  setpriority (PRIO_PROCESS, 0, 15);  // set to low scheduling priority
 #endif
-       
-       openConfig();
-       
-       g_bRunningWXWindows = true;
+  
+  openConfig();
+  
+  g_bRunningWXWindows = true;
   bool bPrintFiles = false;
-       // process options
-       while (1) {
-               int c = getopt_long (argc, argv, "", ctsimOptions, NULL);
-               if (c == -1)
-                       break;
-               
-               switch (c) {
-               case O_VERSION:
-                       std::cout << rcsindent << std::endl;
+  // process options
+  while (1) {
+    int c = getopt_long (argc, argv, "", ctsimOptions, NULL);
+    if (c == -1)
+      break;
+    
+    switch (c) {
+    case O_VERSION:
+      std::cout << rcsindent << std::endl;
 #ifdef CTSIMVERSION
-                       std::cout << "Version: CTSIMVERSION" << std::endl;
+      std::cout << "Version: CTSIMVERSION" << std::endl;
 #elif defined(VERSION)
-                       std::cout << "Version: VERSION" << std::endl;
+      std::cout << "Version: VERSION" << std::endl;
 #endif
-                       exit(0);
-               case O_HELP:
-               case '?':
-                       usage (argv[0]);
-                       exit (0);
+      exit(0);
+    case O_HELP:
+    case '?':
+      usage (argv[0]);
+      exit (0);
     case O_PRINT:
       bPrintFiles = true;
       break;
-               default:
-                       usage (argv[0]);
-                       exit (1);
-               }
-       }
-       
-       m_docManager = new wxDocManager (wxDEFAULT_DOCMAN_FLAGS, true);
-       
-       m_pDocTemplImage = new wxDocTemplate (m_docManager, "ImageFile", "*.if", "", "if", "ImageFile", "ImageView", CLASSINFO(ImageFileDocument), CLASSINFO(ImageFileView));
-       m_pDocTemplProjection = new wxDocTemplate (m_docManager, "ProjectionFile", "*.pj", "", "pj", "ProjectionFile", "ProjectionView", CLASSINFO(ProjectionFileDocument), CLASSINFO(ProjectionFileView));
-       m_pDocTemplPhantom = new wxDocTemplate (m_docManager, "PhantomFile", "*.phm", "", "phm", "PhantomFile", "PhantomView", CLASSINFO(PhantomFileDocument), CLASSINFO(PhantomFileView));
-       m_pDocTemplPlot = new wxDocTemplate (m_docManager, "PlotFile", "*.plt", "", "plt", "PlotFile", "PlotView", CLASSINFO(PlotFileDocument), CLASSINFO(PlotFileView));
-       m_pDocTemplText = new wxDocTemplate (m_docManager, "TextFile", "*.txt", "", "txt", "TextFile", "TextView", CLASSINFO(TextFileDocument), CLASSINFO(TextFileView), wxTEMPLATE_INVISIBLE);
+    default:
+      usage (argv[0]);
+      exit (1);
+    }
+  }
+  
+  m_docManager = new wxDocManager (wxDEFAULT_DOCMAN_FLAGS, true);
+  
+  m_pDocTemplImage = new wxDocTemplate (m_docManager, "ImageFile", "*.if", "", "if", "ImageFile", "ImageView", CLASSINFO(ImageFileDocument), CLASSINFO(ImageFileView));
+  m_pDocTemplProjection = new wxDocTemplate (m_docManager, "ProjectionFile", "*.pj", "", "pj", "ProjectionFile", "ProjectionView", CLASSINFO(ProjectionFileDocument), CLASSINFO(ProjectionFileView));
+  m_pDocTemplPhantom = new wxDocTemplate (m_docManager, "PhantomFile", "*.phm", "", "phm", "PhantomFile", "PhantomView", CLASSINFO(PhantomFileDocument), CLASSINFO(PhantomFileView));
+  m_pDocTemplPlot = new wxDocTemplate (m_docManager, "PlotFile", "*.plt", "", "plt", "PlotFile", "PlotView", CLASSINFO(PlotFileDocument), CLASSINFO(PlotFileView));
+  m_pDocTemplText = new wxDocTemplate (m_docManager, "TextFile", "*.txt", "", "txt", "TextFile", "TextView", CLASSINFO(TextFileDocument), CLASSINFO(TextFileView), wxTEMPLATE_INVISIBLE);
 #if wxUSE_GLCANVAS
-       m_pDocTemplGraph3d = new wxDocTemplate (m_docManager, "Graph3dFile", "*.g3d", "", "g3d", "Graph3dFile", "Graph3dView", CLASSINFO(Graph3dFileDocument), CLASSINFO(Graph3dFileView), wxTEMPLATE_INVISIBLE);
+  m_pDocTemplGraph3d = new wxDocTemplate (m_docManager, "Graph3dFile", "*.g3d", "", "g3d", "Graph3dFile", "Graph3dView", CLASSINFO(Graph3dFileDocument), CLASSINFO(Graph3dFileView), wxTEMPLATE_INVISIBLE);
 #endif
-
+  
 #if wxUSE_GIF
-       wxImage::AddHandler(new wxGIFHandler);     // Required for images in the online documentation
+  wxImage::AddHandler(new wxGIFHandler);     // Required for images in the online documentation
 #endif
-       
+  
 #if wxUSE_STREAMS && wxUSE_ZIPSTREAM && wxUSE_ZLIB
-       wxFileSystem::AddHandler(new wxZipFSHandler);     // Required for advanced HTML help
+  wxFileSystem::AddHandler(new wxZipFSHandler);     // Required for advanced HTML help
 #endif
-       
-       // Create the main frame window
-       int xDisplay, yDisplay;
-       ::wxDisplaySize (&xDisplay, &yDisplay);
-       m_pFrame = new MainFrame(m_docManager, (wxFrame *) NULL, -1, "CTSim", wxPoint(0, 0), 
-               wxSize(nearest<int>(xDisplay * .75), nearest<int>(yDisplay * .755)), wxDEFAULT_FRAME_STYLE);
-       
-       setIconForFrame (m_pFrame);
-       m_pFrame->Centre(wxBOTH);
-       m_pFrame->Show(true);  
-       SetTopWindow (m_pFrame);
-       
-       if (m_pConfig)
-               m_docManager->FileHistoryLoad(*m_pConfig);
-       
+  
+  // Create the main frame window
+  int xDisplay, yDisplay;
+  ::wxDisplaySize (&xDisplay, &yDisplay);
+  m_pFrame = new MainFrame(m_docManager, (wxFrame *) NULL, -1, "CTSim", wxPoint(0, 0), 
+    wxSize(nearest<int>(xDisplay * .75), nearest<int>(yDisplay * .755)), wxDEFAULT_FRAME_STYLE);
+  
+  setIconForFrame (m_pFrame);
+  m_pFrame->Centre(wxBOTH);
+  m_pFrame->Show(true);  
+  SetTopWindow (m_pFrame);
+  
+  if (m_pConfig)
+    m_docManager->FileHistoryLoad(*m_pConfig);
+  
 #ifdef CTSIM_MDI
-       m_pLogDoc = newTextDoc();
-       if (m_pLogDoc) {
-               m_pLog = m_pLogDoc->getTextCtrl();
-               m_pLogDoc->SetDocumentName("Log.txt");
-               m_pLogDoc->SetFilename("Log.txt");
-               m_pLogDoc->getView()->getFrame()->SetTitle("Log");
-               int xSize, ySize;
-               m_pFrame->GetClientSize(&xSize, &ySize);
-               int yLogSize = ySize / 4;
-               m_pLogDoc->getView()->getFrame()->SetSize (0, ySize - yLogSize, xSize, yLogSize);
-               m_pLogDoc->getView()->getFrame()->Show (true);
-       } else
+  m_pLogDoc = newTextDoc();
+  if (m_pLogDoc) {
+    m_pLog = m_pLogDoc->getTextCtrl();
+    m_pLogDoc->SetDocumentName("Log.txt");
+    m_pLogDoc->SetFilename("Log.txt");
+    m_pLogDoc->getView()->getFrame()->SetTitle("Log");
+    int xSize, ySize;
+    m_pFrame->GetClientSize(&xSize, &ySize);
+    int yLogSize = ySize / 4;
+    m_pLogDoc->getView()->getFrame()->SetSize (0, ySize - yLogSize, xSize, yLogSize);
+    m_pLogDoc->getView()->getFrame()->Show (true);
+  } else
 #else
-               m_pLog = new wxTextCtrl (m_pFrame, -1, "Log Window\n", wxPoint(0, 0), wxSize(0,0), wxTE_MULTILINE | wxTE_READONLY);
+    m_pLog = new wxTextCtrl (m_pFrame, -1, "Log Window\n", wxPoint(0, 0), wxSize(0,0), wxTE_MULTILINE | wxTE_READONLY);
 #endif
-       wxLog::SetActiveTarget (new wxLogTextCtrl(m_pLog));
-
-       wxString helpDir;
-       if (! m_pConfig->Read("HelpDir", &helpDir))
-               helpDir = ::wxGetCwd();
+  wxLog::SetActiveTarget (new wxLogTextCtrl(m_pLog));
+  
+  wxString helpDir;
+  if (! m_pConfig->Read("HelpDir", &helpDir))
+    helpDir = ::wxGetCwd();
 #ifdef CTSIM_WINHELP
-       if (! m_pFrame->getWinHelpController().Initialize(helpDir + "/ctsim"))
-               *m_pLog << "Cannot initialize the Windows Help system" << "\n";
+  if (! m_pFrame->getWinHelpController().Initialize(helpDir + "/ctsim"))
+    *m_pLog << "Cannot initialize the Windows Help system" << "\n";
 #else
-       if (! m_pFrame->getHtmlHelpController().Initialize(helpDir + "/ctsim") &&
-               ! m_pFrame->getHtmlHelpController().Initialize("/usr/local/man/ctsim"))
-               *m_pLog << "Cannot initialize the HTML Help system" << "\n";
-       else {
-           if (::wxDirExists ("/tmp"))
-               m_pFrame->getHtmlHelpController().SetTempDir(_T("/tmp"));
-           m_pFrame->getHtmlHelpController().UseConfig (m_pConfig);
-       }
+  if (! m_pFrame->getHtmlHelpController().Initialize(helpDir + "/ctsim") &&
+    ! m_pFrame->getHtmlHelpController().Initialize("/usr/local/man/ctsim"))
+    *m_pLog << "Cannot initialize the HTML Help system" << "\n";
+  else {
+    if (::wxDirExists ("/tmp"))
+      m_pFrame->getHtmlHelpController().SetTempDir(_T("/tmp"));
+    m_pFrame->getHtmlHelpController().UseConfig (m_pConfig);
+  }
 #endif
-
-       for (int i = optind + 1; i <= argc; i++) {
-               wxString filename = argv [i - 1];
-               wxDocument* pNewDoc = m_docManager->CreateDocument (filename, wxDOC_SILENT);
+  
+  for (int i = optind + 1; i <= argc; i++) {
+    wxString filename = argv [i - 1];
+    wxDocument* pNewDoc = m_docManager->CreateDocument (filename, wxDOC_SILENT);
     if (bPrintFiles) {
       wxView* pNewView = pNewDoc->GetFirstView();
       wxPrintout *printout = pNewView->OnCreatePrintout();
@@ -219,16 +219,16 @@ CTSimApp::OnInit()
       nullEvent.SetId (wxID_CLOSE);
       m_docManager->OnFileClose (nullEvent);
     }
-       }
+  }
   if (bPrintFiles) {
     wxCommandEvent closeEvent;
     closeEvent.SetInt (MAINMENU_FILE_EXIT);
     m_pFrame->AddPendingEvent(closeEvent);
   }
-
+  
   if (getStartupTips())
     ShowTips();
-
+  
   m_pBackgroundMgr = new BackgroundManager;
   return true;
 }
@@ -236,9 +236,9 @@ CTSimApp::OnInit()
 void
 CTSimApp::ShowTips()
 {
-    CTSimTipProvider tipProvider (m_iCurrentTip);
-    setStartupTips (::wxShowTip (m_pFrame, &tipProvider, getStartupTips()));
-    m_iCurrentTip = tipProvider.GetCurrentTip();
+  CTSimTipProvider tipProvider (m_iCurrentTip);
+  setStartupTips (::wxShowTip (m_pFrame, &tipProvider, getStartupTips()));
+  m_iCurrentTip = tipProvider.GetCurrentTip();
 }
 
 
@@ -246,31 +246,31 @@ CTSimApp::ShowTips()
 void
 CTSimApp::setIconForFrame(wxFrame* pFrame)
 {
-       wxIcon iconApp (ctsim16_xpm);
-       
-       if (iconApp.Ok())
-               pFrame->SetIcon (iconApp);
+  wxIcon iconApp (ctsim16_xpm);
+  
+  if (iconApp.Ok())
+    pFrame->SetIcon (iconApp);
 }
 
 void
 CTSimApp::usage(const char* program)
 {
-       std::cout << "usage: " << fileBasename(program) << " [files-to-open...] [OPTIONS]\n";
-       std::cout << "Computed Tomography Simulator (Graphical Shell)\n";
-       std::cout << "\n";
-       std::cout << "  --version Display version\n";
-       std::cout << "  --help    Display this help message\n";
+  std::cout << "usage: " << fileBasename(program) << " [files-to-open...] [OPTIONS]\n";
+  std::cout << "Computed Tomography Simulator (Graphical Shell)\n";
+  std::cout << "\n";
+  std::cout << "  --version Display version\n";
+  std::cout << "  --help    Display this help message\n";
 }
 
 int
 CTSimApp::OnExit()
 {
   closeConfig();
-
+  
 #ifdef HAVE_DMALLOC
-       dmalloc_shutdown();
+  dmalloc_shutdown();
 #endif
-       return 0;
+  return 0;
 }
 
 void
@@ -281,8 +281,8 @@ CTSimApp::openConfig()
 #else
   m_pConfig = new wxConfig("ctsim", "Kevin Rosenberg", ".ctsim", "", wxCONFIG_USE_LOCAL_FILE);
 #endif
-
-       wxConfigBase::Set(m_pConfig);
+  
+  wxConfigBase::Set(m_pConfig);
   m_pConfig->Read ("AdvancedOptions", &m_bAdvancedOptions);
   m_pConfig->Read ("SetModifyNewDocs", &m_bSetModifyNewDocs);
   m_pConfig->Read ("VerboseLogging", &m_bVerboseLogging);
@@ -300,20 +300,20 @@ CTSimApp::closeConfig()
   m_pConfig->Write ("StartupTips", m_bShowStartupTips);
   m_pConfig->Write ("CurrentTip", m_iCurrentTip);
   m_pConfig->Write ("UseBackgroundTasks", m_bUseBackgroundTasks);
-
-       delete m_pConfig;
+  
+  delete m_pConfig;
 }
 
 
 wxString
 CTSimApp::getUntitledFilename()
 {
-       static int untitledNumber = 1;
-       
-       wxString filename ("Untitled");
-       filename << untitledNumber++;
-       
-       return (filename);
+  static int untitledNumber = 1;
+  
+  wxString filename ("Untitled");
+  filename << untitledNumber++;
+  
+  return (filename);
 }
 
 
@@ -333,6 +333,7 @@ EVT_MENU(MAINMENU_FILE_PREFERENCES, MainFrame::OnPreferences)
 EVT_MENU(MAINMENU_HELP_ABOUT, MainFrame::OnAbout)
 EVT_MENU(MAINMENU_HELP_CONTENTS, MainFrame::OnHelpContents)
 EVT_MENU(MAINMENU_HELP_TIPS, MainFrame::OnHelpTips)
+EVT_MENU(MAINMENU_IMPORT, MainFrame::OnImport)
 EVT_MENU(IDH_QUICKSTART, MainFrame::OnHelpButton)
 EVT_MENU(MAINMENU_LOG_EVENT, MainFrame::OnLogEvent)
 EVT_BUTTON(IDH_DLG_RASTERIZE, MainFrame::OnHelpButton)
@@ -390,79 +391,83 @@ MainFrame::MainFrame(wxDocManager *manager, wxFrame *frame, wxWindowID id, const
 #endif
 {
   m_bShuttingDown = false;
-
-       //// Make a menubar
-       wxMenu *file_menu = new wxMenu;
-       
-       file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom...\tCtrl-P");
-       file_menu->Append(MAINMENU_FILE_CREATE_FILTER, "Create &Filter...\tCtrl-F");
-       file_menu->Append(wxID_OPEN, "&Open...\tCtrl-O");
-       
-       file_menu->AppendSeparator();
+  
+  //// Make a menubar
+  wxMenu *file_menu = new wxMenu;
+  
+  file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom...\tCtrl-P");
+  file_menu->Append(MAINMENU_FILE_CREATE_FILTER, "Create &Filter...\tCtrl-F");
+  file_menu->Append(wxID_OPEN, "&Open...\tCtrl-O");
+  
+  file_menu->AppendSeparator();
+  file_menu->Append (MAINMENU_IMPORT, "&Import...\tCtrl-I");
   file_menu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces...");
-       file_menu->Append(MAINMENU_FILE_EXIT, "E&xit");
-       
-       //  history of files visited
-       theApp->getDocManager()->FileHistoryAddFilesToMenu(file_menu);
-       theApp->getDocManager()->FileHistoryUseMenu(file_menu);
-       
+  file_menu->Append(MAINMENU_FILE_EXIT, "E&xit");
+  
+  //  history of files visited
+  theApp->getDocManager()->FileHistoryAddFilesToMenu(file_menu);
+  theApp->getDocManager()->FileHistoryUseMenu(file_menu);
+  
 #ifndef CTSIM_MDI
-       m_pWindowMenu = new wxMenu;
-       m_pWindowMenu->UpdateUI (this);
+  m_pWindowMenu = new wxMenu;
+  m_pWindowMenu->UpdateUI (this);
 #endif
-       
-       wxMenu* help_menu = new wxMenu;
-       help_menu->Append (MAINMENU_HELP_CONTENTS, "&Contents\tF1");
+  
+  wxMenu* help_menu = new wxMenu;
+  help_menu->Append (MAINMENU_HELP_CONTENTS, "&Contents\tF1");
   help_menu->Append (MAINMENU_HELP_TIPS, "&Tips");
   help_menu->Append (IDH_QUICKSTART, "&Quick Start");
 #if defined(CTSIM_WINHELP) && (defined(DEBUG) || defined(_DEBUG))
-       help_menu->Append (MAINMENU_HELP_SECONDARY, "&Secondary Help");
+  help_menu->Append (MAINMENU_HELP_SECONDARY, "&Secondary Help");
 #endif
-       help_menu->Append (MAINMENU_HELP_ABOUT, "&About");
-       
-       wxMenuBar* menu_bar = new wxMenuBar;
-       
-       menu_bar->Append(file_menu, "&File");
+  help_menu->Append (MAINMENU_HELP_ABOUT, "&About");
+  
+  wxMenuBar* menu_bar = new wxMenuBar;
+  
+  menu_bar->Append(file_menu, "&File");
 #ifndef CTSIM_MDI
-       menu_bar->Append(m_pWindowMenu, "&Window");
+  menu_bar->Append(m_pWindowMenu, "&Window");
 #endif
-       menu_bar->Append(help_menu, "&Help");
-       
-       SetMenuBar(menu_bar);
-       
+  menu_bar->Append(help_menu, "&Help");
+  
+  SetMenuBar(menu_bar);
+  
+  
 #ifndef CTSIM_MDI
-       int i;
-       for (i = 0; i < MAX_WINDOW_MENUITEMS; i++) {
-               m_apWindowMenuItems[i] = new wxMenuItem (m_pWindowMenu, MAINMENU_WINDOW_BASE+i, wxString("[EMPTY]"));
-               m_pWindowMenu->Append (m_apWindowMenuItems[i]);
-               m_pWindowMenu->Enable (MAINMENU_WINDOW_BASE+i, false);
-       }
+  int i;
+  for (i = 0; i < MAX_WINDOW_MENUITEMS; i++) {
+    m_apWindowMenuItems[i] = new wxMenuItem (m_pWindowMenu, MAINMENU_WINDOW_BASE+i, wxString("[EMPTY]"));
+    m_pWindowMenu->Append (m_apWindowMenuItems[i]);
+    m_pWindowMenu->Enable (MAINMENU_WINDOW_BASE+i, false);
+  }
 #endif
-       
-       m_iDefaultPhantomID = Phantom::PHM_HERMAN;
-       m_iDefaultFilterID = SignalFilter::FILTER_BANDLIMIT;
-       m_iDefaultFilterDomainID = SignalFilter::DOMAIN_FREQUENCY;
-       m_iDefaultFilterXSize = 256;
-       m_iDefaultFilterYSize = 256;
-       m_dDefaultFilterParam = 1.;
-       m_dDefaultFilterBandwidth = 1.;
-       m_dDefaultFilterInputScale = 1.;
-       m_dDefaultFilterOutputScale = 1.;
-       
-       wxAcceleratorEntry accelEntries[15];
-       accelEntries[0].Set (wxACCEL_CTRL, static_cast<int>('O'), wxID_OPEN);
-       accelEntries[2].Set (wxACCEL_CTRL, static_cast<int>('P'), MAINMENU_FILE_CREATE_PHANTOM);
-       accelEntries[3].Set (wxACCEL_CTRL, static_cast<int>('F'), MAINMENU_FILE_CREATE_FILTER);
-       accelEntries[4].Set (wxACCEL_NORMAL, WXK_F1, MAINMENU_HELP_CONTENTS);
+  
+  m_iDefaultPhantomID = Phantom::PHM_HERMAN;
+  m_iDefaultFilterID = SignalFilter::FILTER_BANDLIMIT;
+  m_iDefaultFilterDomainID = SignalFilter::DOMAIN_FREQUENCY;
+  m_iDefaultFilterXSize = 256;
+  m_iDefaultFilterYSize = 256;
+  m_dDefaultFilterParam = 1.;
+  m_dDefaultFilterBandwidth = 1.;
+  m_dDefaultFilterInputScale = 1.;
+  m_dDefaultFilterOutputScale = 1.;
+  m_iDefaultImportFormat = ImageFile::IMPORT_FORMAT_PPM;
+  
+  wxAcceleratorEntry accelEntries[16];
+  accelEntries[0].Set (wxACCEL_CTRL, static_cast<int>('O'), wxID_OPEN);
+  accelEntries[2].Set (wxACCEL_CTRL, static_cast<int>('P'), MAINMENU_FILE_CREATE_PHANTOM);
+  accelEntries[3].Set (wxACCEL_CTRL, static_cast<int>('F'), MAINMENU_FILE_CREATE_FILTER);
+  accelEntries[4].Set (wxACCEL_CTRL, static_cast<int>('I'), MAINMENU_IMPORT);
+  accelEntries[5].Set (wxACCEL_NORMAL, WXK_F1, MAINMENU_HELP_CONTENTS);
 #ifndef CTSIM_MDI
-       for (i = 0; i < 10; i++)
-               accelEntries[i+4].Set (wxACCEL_CTRL, static_cast<int>('0'+i), MAINMENU_WINDOW_BASE+i);
-       wxAcceleratorTable accelTable (15, accelEntries);
+  for (i = 0; i < 10; i++)
+    accelEntries[i+5].Set (wxACCEL_CTRL, static_cast<int>('0'+i), MAINMENU_WINDOW_BASE+i);
+  wxAcceleratorTable accelTable (15, accelEntries);
 #else
-       wxAcceleratorTable accelTable (5, accelEntries);
+  wxAcceleratorTable accelTable (5, accelEntries);
 #endif
-       
-       SetAcceleratorTable (accelTable);
+  
+  SetAcceleratorTable (accelTable);
 }
 
 MainFrame::~MainFrame()
@@ -470,117 +475,117 @@ MainFrame::~MainFrame()
   m_bShuttingDown = true; // Currently used so that Log Window will close
 #if 0
   // delete all non-modified documents
-       wxList& rListDocs = theApp->getDocManager()->GetDocuments();
-       for (wxNode* pNode = rListDocs.GetFirst(); pNode != NULL; pNode = pNode->GetNext()) {
-               wxDocument* pDoc = dynamic_cast<wxDocument*>(pNode->GetData());
+  wxList& rListDocs = theApp->getDocManager()->GetDocuments();
+  for (wxNode* pNode = rListDocs.GetFirst(); pNode != NULL; pNode = pNode->GetNext()) {
+    wxDocument* pDoc = dynamic_cast<wxDocument*>(pNode->GetData());
     if (pDoc && ! pDoc->IsModified()) {
       theApp->getDocManager()->RemoveDocument(pDoc);
       delete pDoc;
     }
-       }
+  }
 #endif
   ::wxYield();
-       if (theApp->getConfig())
-               theApp->getDocManager()->FileHistorySave (*theApp->getConfig());
+  if (theApp->getConfig())
+    theApp->getDocManager()->FileHistorySave (*theApp->getConfig());
   ::wxYield();
-       delete theApp->getDocManager(); 
-
+  delete theApp->getDocManager();      
+  
 }
 
 void
 MainFrame::OnSize (wxSizeEvent& event)
 {
 #ifdef CTSIM_MDI
-    if (theApp->getLogDoc()) {
-       int xSize, ySize;       
-               GetClientSize(&xSize, &ySize);
-               int yLogSize = ySize / 4;
+  if (theApp->getLogDoc()) {
+    int xSize, ySize;  
+    GetClientSize(&xSize, &ySize);
+    int yLogSize = ySize / 4;
                  theApp->getLogDoc()->getView()->getFrame()->SetSize (0, ySize - yLogSize, xSize, yLogSize);
-                 theApp->getLogDoc()->getView()->getFrame()->Show (true);
-    }
+      theApp->getLogDoc()->getView()->getFrame()->Show (true);
+  }
 #endif
-       
+  
 #if CTSIM_MDI
-       wxDocMDIParentFrame::OnSize (event);
+  wxDocMDIParentFrame::OnSize (event);
 #else
-       wxDocParentFrame::OnSize (event);
+  wxDocParentFrame::OnSize (event);
 #endif
 }
 
 void 
 MainFrame::OnCreatePhantom(wxCommandEvent& event)
 {
-       DialogGetPhantom dialogPhantom (this, m_iDefaultPhantomID);
-       int dialogReturn = dialogPhantom.ShowModal();
-       if (dialogReturn == wxID_OK) {
-               wxString selection (dialogPhantom.getPhantom());
+  DialogGetPhantom dialogPhantom (this, m_iDefaultPhantomID);
+  int dialogReturn = dialogPhantom.ShowModal();
+  if (dialogReturn == wxID_OK) {
+    wxString selection (dialogPhantom.getPhantom());
     if (theApp->getVerboseLogging())
-               *theApp->getLog() << "Selected phantom " << selection.c_str() << "\n";
-               wxString filename = selection + ".phm";
-               m_iDefaultPhantomID = Phantom::convertNameToPhantomID (selection.c_str());
-               theApp->getDocManager()->CreateDocument (filename, wxDOC_SILENT);
-       }
-       
+      *theApp->getLog() << "Selected phantom " << selection.c_str() << "\n";
+    wxString filename = selection + ".phm";
+    m_iDefaultPhantomID = Phantom::convertNameToPhantomID (selection.c_str());
+    theApp->getDocManager()->CreateDocument (filename, wxDOC_SILENT);
+  }
+  
 }
 
 void 
 MainFrame::OnCreateFilter (wxCommandEvent& WXUNUSED(event))
 {
-       DialogGetFilterParameters dialogFilter (this, m_iDefaultFilterXSize, m_iDefaultFilterYSize, m_iDefaultFilterID, m_dDefaultFilterParam, m_dDefaultFilterBandwidth, m_iDefaultFilterDomainID, m_dDefaultFilterInputScale, m_dDefaultFilterOutputScale);
-       int dialogReturn = dialogFilter.ShowModal();
-       if (dialogReturn == wxID_OK) {
-               wxString strFilter (dialogFilter.getFilterName());
-               wxString strDomain (dialogFilter.getDomainName());
-               m_iDefaultFilterID = SignalFilter::convertFilterNameToID (strFilter.c_str());
-               m_iDefaultFilterDomainID = SignalFilter::convertDomainNameToID (strDomain.c_str());
-               m_iDefaultFilterXSize = dialogFilter.getXSize();
-               m_iDefaultFilterYSize = dialogFilter.getYSize();
-               m_dDefaultFilterBandwidth = dialogFilter.getBandwidth();
-               m_dDefaultFilterParam= dialogFilter.getFilterParam();
-               m_dDefaultFilterInputScale = dialogFilter.getInputScale();
-               m_dDefaultFilterOutputScale = dialogFilter.getOutputScale();
-               std::ostringstream os;
-               os << "Generate Filter=" << strFilter.c_str() 
-                       << ", size=(" << static_cast<int>(m_iDefaultFilterXSize) << "," << static_cast<int>(m_iDefaultFilterYSize) 
-                       << "), domain=" << strDomain.c_str() << ", filterParam=" << m_dDefaultFilterParam << ", bandwidth=" << m_dDefaultFilterBandwidth 
-                       << ", inputScale=" << m_dDefaultFilterInputScale << ", outputScale=" << m_dDefaultFilterOutputScale;
-               *theApp->getLog() << os.str().c_str() << "\n";
-               wxString filename = "untitled.if";
-               ImageFileDocument* pFilterDoc = theApp->newImageDoc();
+  DialogGetFilterParameters dialogFilter (this, m_iDefaultFilterXSize, m_iDefaultFilterYSize, m_iDefaultFilterID, m_dDefaultFilterParam, m_dDefaultFilterBandwidth, m_iDefaultFilterDomainID, m_dDefaultFilterInputScale, m_dDefaultFilterOutputScale);
+  int dialogReturn = dialogFilter.ShowModal();
+  if (dialogReturn == wxID_OK) {
+    wxString strFilter (dialogFilter.getFilterName());
+    wxString strDomain (dialogFilter.getDomainName());
+    m_iDefaultFilterID = SignalFilter::convertFilterNameToID (strFilter.c_str());
+    m_iDefaultFilterDomainID = SignalFilter::convertDomainNameToID (strDomain.c_str());
+    m_iDefaultFilterXSize = dialogFilter.getXSize();
+    m_iDefaultFilterYSize = dialogFilter.getYSize();
+    m_dDefaultFilterBandwidth = dialogFilter.getBandwidth();
+    m_dDefaultFilterParam= dialogFilter.getFilterParam();
+    m_dDefaultFilterInputScale = dialogFilter.getInputScale();
+    m_dDefaultFilterOutputScale = dialogFilter.getOutputScale();
+    std::ostringstream os;
+    os << "Generate Filter=" << strFilter.c_str() 
+      << ", size=(" << static_cast<int>(m_iDefaultFilterXSize) << "," << static_cast<int>(m_iDefaultFilterYSize) 
+      << "), domain=" << strDomain.c_str() << ", filterParam=" << m_dDefaultFilterParam << ", bandwidth=" << m_dDefaultFilterBandwidth 
+      << ", inputScale=" << m_dDefaultFilterInputScale << ", outputScale=" << m_dDefaultFilterOutputScale;
+    *theApp->getLog() << os.str().c_str() << "\n";
+    wxString filename = "untitled.if";
+    ImageFileDocument* pFilterDoc = theApp->newImageDoc();
     pFilterDoc->setBadFileOpen();
-               if (! pFilterDoc) {
-                       sys_error (ERR_SEVERE, "Unable to create filter image");
-                       return;
-               }
-               ImageFile& rIF = pFilterDoc->getImageFile();
-               rIF.setArraySize (m_iDefaultFilterXSize, m_iDefaultFilterYSize);
-               rIF.filterResponse (strDomain.c_str(), m_dDefaultFilterBandwidth, strFilter.c_str(), m_dDefaultFilterParam, m_dDefaultFilterInputScale, m_dDefaultFilterOutputScale);
-               rIF.labelAdd (os.str().c_str());
+    if (! pFilterDoc) {
+      sys_error (ERR_SEVERE, "Unable to create filter image");
+      return;
+    }
+    ImageFile& rIF = pFilterDoc->getImageFile();
+    rIF.setArraySize (m_iDefaultFilterXSize, m_iDefaultFilterYSize);
+    rIF.filterResponse (strDomain.c_str(), m_dDefaultFilterBandwidth, strFilter.c_str(), m_dDefaultFilterParam, m_dDefaultFilterInputScale, m_dDefaultFilterOutputScale);
+    rIF.labelAdd (os.str().c_str());
     if (theApp->getAskDeleteNewDocs())
       pFilterDoc->Modify (true);
-               pFilterDoc->UpdateAllViews();
-               pFilterDoc->GetFirstView()->OnUpdate (NULL, NULL);
-               pFilterDoc->getView()->getFrame()->SetClientSize(m_iDefaultFilterXSize, m_iDefaultFilterYSize);
-               pFilterDoc->getView()->getFrame()->Show(true);
-       }
+    pFilterDoc->UpdateAllViews();
+    pFilterDoc->GetFirstView()->OnUpdate (NULL, NULL);
+    pFilterDoc->getView()->getFrame()->SetClientSize(m_iDefaultFilterXSize, m_iDefaultFilterYSize);
+    pFilterDoc->getView()->getFrame()->Show(true);
+  }
 }
 
 void
 CTSimApp::getCompatibleImages (const ImageFileDocument* pIFDoc, std::vector<ImageFileDocument*>& vecIF)
 {
-       const ImageFile& rIF = pIFDoc->getImageFile();
-       unsigned int nx = rIF.nx();
-       unsigned int ny = rIF.ny();
-       wxList& rListDocs = m_docManager->GetDocuments();
-       for (wxNode* pNode = rListDocs.GetFirst(); pNode != NULL; pNode = pNode->GetNext()) {
-               wxDocument* pDoc = reinterpret_cast<wxDocument*>(pNode->GetData());
-               ImageFileDocument* pIFCompareDoc = dynamic_cast<ImageFileDocument*>(pDoc);
-               if (pIFCompareDoc && (pIFDoc != pIFCompareDoc)) {
-                       const ImageFile& rCompareIF = pIFCompareDoc->getImageFile();
-                       if (rCompareIF.nx() == nx && rCompareIF.ny() == ny)
-                               vecIF.push_back (pIFCompareDoc);
-               }
-       }
+  const ImageFile& rIF = pIFDoc->getImageFile();
+  unsigned int nx = rIF.nx();
+  unsigned int ny = rIF.ny();
+  wxList& rListDocs = m_docManager->GetDocuments();
+  for (wxNode* pNode = rListDocs.GetFirst(); pNode != NULL; pNode = pNode->GetNext()) {
+    wxDocument* pDoc = reinterpret_cast<wxDocument*>(pNode->GetData());
+    ImageFileDocument* pIFCompareDoc = dynamic_cast<ImageFileDocument*>(pDoc);
+    if (pIFCompareDoc && (pIFDoc != pIFCompareDoc)) {
+      const ImageFile& rCompareIF = pIFCompareDoc->getImageFile();
+      if (rCompareIF.nx() == nx && rCompareIF.ny() == ny)
+        vecIF.push_back (pIFCompareDoc);
+    }
+  }
 }
 
 
@@ -599,78 +604,78 @@ MainFrame::OnHelpTips (wxCommandEvent& event)
 void 
 MainFrame::OnHelpContents (wxCommandEvent& event)
 {
-       showHelp (event.GetId());
+  showHelp (event.GetId());
 }
 
 void 
 MainFrame::OnHelpButton (wxCommandEvent& event)
 {
-       showHelp (event.GetId());
+  showHelp (event.GetId());
 }
 
 #if defined(CTSIM_WINHELP) && (defined(DEBUG) || defined(_DEBUG))
 void
 MainFrame::OnHelpSecondary (wxCommandEvent& event)
 {
-       m_htmlHelp.DisplayContents();
+  m_htmlHelp.DisplayContents();
 }
 #endif
 
 void
 MainFrame::showHelp (int commandID)
 {
-       switch (commandID) {
-               
-       case MAINMENU_HELP_CONTENTS:
+  switch (commandID) {
+    
+  case MAINMENU_HELP_CONTENTS:
 #ifdef CTSIM_WINHELP
-               m_winHelp.DisplayContents ();
+    m_winHelp.DisplayContents ();
 #else
-               m_htmlHelp.DisplayContents ();
+    m_htmlHelp.DisplayContents ();
 #endif
-               break;
-
-
-       default:
+    break;
+    
+    
+  default:
 #ifdef CTSIM_WINHELP
     m_winHelp.DisplaySection (commandID);
 #else
     m_htmlHelp.Display (commandID);
 #endif
-               break;
-       }
+    break;
+  }
 }
 
 void 
 MainFrame::OnExit (wxCommandEvent& WXUNUSED(event) )
 {
-       Close(true);
+  Close(true);
 }
 
 void
 MainFrame::OnUpdateUI (wxUpdateUIEvent& rEvent)
 {
 #ifndef CTSIM_MDI
-       int iPos = 0;
-       wxList& rListDocs = theApp->getDocManager()->GetDocuments();
-       wxNode* pNode = rListDocs.GetFirst();
-       while (iPos < MAX_WINDOW_MENUITEMS && pNode != NULL) {
-               wxDocument* pDoc = static_cast<wxDocument*>(pNode->GetData());
-               wxString strFilename = pDoc->GetFilename();
-               if (iPos < 10) {
-                       strFilename += "\tCtrl-";
-                       strFilename += static_cast<char>('0' + iPos);
-               }
-               static_cast<wxMenuItemBase*>(m_apWindowMenuItems[iPos])->SetName (strFilename);
-               m_apWindowMenuData[iPos] = pDoc;
-               m_pWindowMenu->Enable (MAINMENU_WINDOW_BASE+iPos, true);
-               iPos++;
-               pNode = pNode->GetNext();
-       }
-       for (int i = iPos; i < MAX_WINDOW_MENUITEMS; i++) {
-               m_pWindowMenu->Enable (MAINMENU_WINDOW_BASE+i, false);
-               static_cast<wxMenuItemBase*>(m_apWindowMenuItems[i])->SetName (wxString("[EMPTY]"));
-               m_apWindowMenuData[i] = NULL;
-       }
+  int iPos = 0;
+  wxList& rListDocs = theApp->getDocManager()->GetDocuments();
+  wxNode* pNode = rListDocs.GetFirst();
+  while (iPos < MAX_WINDOW_MENUITEMS && pNode != NULL) {
+    wxDocument* pDoc = static_cast<wxDocument*>(pNode->GetData());
+    wxString strFilename = pDoc->GetFilename();
+    if (iPos < 10) {
+      strFilename += "\tCtrl-";
+      strFilename += static_cast<char>('0' + iPos);
+    }
+    static_cast<wxMenuItemBase*>(m_apWindowMenuItems[iPos])->SetName (strFilename);
+    m_apWindowMenuData[iPos] = pDoc;
+    m_pWindowMenu->Enable (MAINMENU_WINDOW_BASE+iPos, true);
+    iPos++;
+    pNode = pNode->GetNext();
+  }
+  for (int i = iPos; i < MAX_WINDOW_MENUITEMS; i++) {
+    m_pWindowMenu->Enable (MAINMENU_WINDOW_BASE+i, false);
+    static_cast<wxMenuItemBase*>(m_apWindowMenuItems[i])->SetName (wxString("[EMPTY]"));
+    m_apWindowMenuData[i] = NULL;
+  }
 #endif 
 }
 
@@ -678,24 +683,24 @@ MainFrame::OnUpdateUI (wxUpdateUIEvent& rEvent)
 void 
 MainFrame::OnMRUFile (wxCommandEvent& event)
 {
-       wxString fileName (theApp->getDocManager()->GetHistoryFile(event.GetId() - wxID_FILE1));
-       if (fileName != "")
-               theApp->getDocManager()->CreateDocument(fileName, wxDOC_SILENT);
+  wxString fileName (theApp->getDocManager()->GetHistoryFile(event.GetId() - wxID_FILE1));
+  if (fileName != "")
+    theApp->getDocManager()->CreateDocument(fileName, wxDOC_SILENT);
 }
 #endif
 
 void 
 MainFrame::DoWindowMenu (int iMenuPosition, wxCommandEvent& event)
 {
-       if (wxDocument* pDoc = m_apWindowMenuData [iMenuPosition]) {
-               wxString strFilename = pDoc->GetFilename();
-               const wxView* pView = pDoc->GetFirstView();
-               if (pView) {
-                       wxFrame* pFrame = pView->GetFrame();
-                       pFrame->SetFocus();
-                       pFrame->Raise();
-               }
-       }
+  if (wxDocument* pDoc = m_apWindowMenuData [iMenuPosition]) {
+    wxString strFilename = pDoc->GetFilename();
+    const wxView* pView = pDoc->GetFirstView();
+    if (pView) {
+      wxFrame* pFrame = pView->GetFrame();
+      pFrame->SetFocus();
+      pFrame->Raise();
+    }
+  }
 }
 
 void MainFrame::OnWindowMenu0 (wxCommandEvent& event)
@@ -762,27 +767,27 @@ void MainFrame::OnWindowMenu19 (wxCommandEvent& event)
 class BitmapControl : public wxPanel
 {
 private:  
-       DECLARE_DYNAMIC_CLASS (BitmapControl)
-               DECLARE_EVENT_TABLE ()
-               wxBitmap* m_pBitmap;
-       
+  DECLARE_DYNAMIC_CLASS (BitmapControl)
+    DECLARE_EVENT_TABLE ()
+    wxBitmap* m_pBitmap;
+  
 public:
-       BitmapControl (wxBitmap* pBitmap, wxWindow *parent, wxWindowID id = -1,
-               const wxPoint& pos = wxDefaultPosition,
-               const wxSize& size = wxDefaultSize,
-               long style = wxSTATIC_BORDER,
-               const wxValidator& validator = wxDefaultValidator,
-               const wxString& name = "BitmapCtrl");
-       
-       
-       virtual ~BitmapControl();
-       
-       virtual wxSize GetBestSize() const;
-       
-       wxBitmap* getBitmap() 
-       { return m_pBitmap; }
-       
-       void OnPaint(wxPaintEvent& event);
+  BitmapControl (wxBitmap* pBitmap, wxWindow *parent, wxWindowID id = -1,
+    const wxPoint& pos = wxDefaultPosition,
+    const wxSize& size = wxDefaultSize,
+    long style = wxSTATIC_BORDER,
+    const wxValidator& validator = wxDefaultValidator,
+    const wxString& name = "BitmapCtrl");
+  
+  
+  virtual ~BitmapControl();
+  
+  virtual wxSize GetBestSize() const;
+  
+  wxBitmap* getBitmap() 
+  { return m_pBitmap; }
+  
+  void OnPaint(wxPaintEvent& event);
 };
 
 
@@ -797,18 +802,18 @@ BitmapControl::BitmapControl (wxBitmap* pBitmap, wxWindow* parent, wxWindowID id
                               long style, const wxValidator& validator, const wxString& name)
                               : m_pBitmap(pBitmap)
 {
-       Create(parent, id, pos, size, style, name);
-       
-       SetSize (GetBestSize());
+  Create(parent, id, pos, size, style, name);
+  
+  SetSize (GetBestSize());
 }
 
 wxSize
 BitmapControl::GetBestSize () const
 {
-       if (m_pBitmap)
-               return wxSize (m_pBitmap->GetWidth(), m_pBitmap->GetHeight());
-       else
-               return wxSize(0,0);
+  if (m_pBitmap)
+    return wxSize (m_pBitmap->GetWidth(), m_pBitmap->GetHeight());
+  else
+    return wxSize(0,0);
 }
 
 BitmapControl::~BitmapControl()
@@ -817,38 +822,38 @@ BitmapControl::~BitmapControl()
 void
 BitmapControl::OnPaint (wxPaintEvent& event)
 {
-       wxPaintDC dc(this);
-       if (m_pBitmap)
-               dc.DrawBitmap (*m_pBitmap, 0, 0);
+  wxPaintDC dc(this);
+  if (m_pBitmap)
+    dc.DrawBitmap (*m_pBitmap, 0, 0);
 }
 
 
 class BitmapDialog : public wxDialog {
 private:
-       BitmapControl* m_pBitmapCtrl;
-       
+  BitmapControl* m_pBitmapCtrl;
+  
 public:
-       BitmapDialog (wxBitmap* pBitmap, char const* pszTitle);
-       virtual ~BitmapDialog();
+  BitmapDialog (wxBitmap* pBitmap, char const* pszTitle);
+  virtual ~BitmapDialog();
 };
 
 BitmapDialog::BitmapDialog (wxBitmap* pBitmap, char const* pszTitle)
 : wxDialog(theApp->getMainFrame(), -1, wxString(pszTitle), wxDefaultPosition, wxDefaultSize, wxDIALOG_MODAL | wxDEFAULT_DIALOG_STYLE)
 {
-       wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);
-       
-       pTopSizer->Add (new BitmapControl (pBitmap, this), 0, wxALIGN_CENTER | wxALL, 5);
-       
-       wxBoxSizer* pButtonSizer = new wxBoxSizer (wxHORIZONTAL);
-       wxButton* pButtonOk = new wxButton (this, wxID_OK, "Ok");
-       pButtonSizer->Add (pButtonOk, 0, wxEXPAND | wxALL, 10);
-       
-       pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);
-       
-       SetAutoLayout (true);
-       SetSizer (pTopSizer);
-       pTopSizer->Fit (this);
-       pTopSizer->SetSizeHints (this);
+  wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);
+  
+  pTopSizer->Add (new BitmapControl (pBitmap, this), 0, wxALIGN_CENTER | wxALL, 5);
+  
+  wxBoxSizer* pButtonSizer = new wxBoxSizer (wxHORIZONTAL);
+  wxButton* pButtonOk = new wxButton (this, wxID_OK, "Ok");
+  pButtonSizer->Add (pButtonOk, 0, wxEXPAND | wxALL, 10);
+  
+  pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);
+  
+  SetAutoLayout (true);
+  SetSizer (pTopSizer);
+  pTopSizer->Fit (this);
+  pTopSizer->SetSizeHints (this);
 }
 
 BitmapDialog::~BitmapDialog()
@@ -870,6 +875,52 @@ MainFrame::OnPreferences (wxCommandEvent& WXUNUSED(event) )
   }
 }
 
+void 
+MainFrame::OnImport (wxCommandEvent& WXUNUSED(event) )
+{
+  DialogImportParameters dialogImport (this, m_iDefaultImportFormat);
+  if (dialogImport.ShowModal() != wxID_OK)
+    return;
+  
+  wxString strFormatName (dialogImport.getFormatName ());
+  m_iDefaultImportFormat = ImageFile::convertImportFormatNameToID (strFormatName.c_str());
+  
+  wxString strExt;
+  wxString strWildcard;
+  if (m_iDefaultImportFormat == ImageFile::IMPORT_FORMAT_PPM) {
+    strExt = ".ppm";
+    strWildcard = "PPM Files (*.ppm)|*.pgm|PGM Files (*.pgm)|*.pgm";
+  }
+#ifdef HAVE_PNG
+  else if (m_iDefaultImportFormat == ImageFile::IMPORT_FORMAT_PNG) {
+    strExt = ".png";
+    strWildcard = "PNG Files (*.png)|*.png";
+  }
+#endif
+  else {
+    return;
+  }
+  
+  wxString strFilename = wxFileSelector (wxString("Import Filename"), wxString(""), 
+    wxString(""), strExt, strWildcard, wxHIDE_READONLY | wxOPEN);
+  if (! strFilename.IsEmpty()) {
+    ImageFile* pIF = new ImageFile;
+    if (pIF->importImage (strFormatName.c_str(), strFilename.c_str())) {
+      ImageFileDocument* pIFDoc = theApp->newImageDoc();
+      pIFDoc->setImageFile(pIF);
+      pIFDoc->getView()->getFrame()->Show(true);
+      std::ostringstream os;
+      os << "Import file " << strFilename.c_str() << " (type " << strFormatName.c_str() << ")";
+      pIF->labelAdd (os.str().c_str());
+      if (theApp->getAskDeleteNewDocs())
+        pIFDoc->Modify (true);
+    pIFDoc->UpdateAllViews();
+    pIFDoc->GetFirstView()->OnUpdate (NULL, NULL);
+    pIFDoc->getView()->getFrame()->Show(true);
+    } else
+      delete pIF;
+  }
+}
 
 #include "./splash.xpm"
 void 
@@ -881,137 +932,137 @@ MainFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
   if (lFreeMem > 0)
     *theApp->getLog() << ",  Free Memory: " << lFreeMem << " MB";
   *theApp->getLog() << "\n";
-
+  
   wxBitmap bmp (splash);
-       if (bmp.Ok()) {
-               BitmapDialog dlg (&bmp, "About CTSim");
-               dlg.ShowModal();
-       } else {
-               wxString msg = "CTSim\nThe Open Source Computed Tomography Simulator\n";
+  if (bmp.Ok()) {
+    BitmapDialog dlg (&bmp, "About CTSim");
+    dlg.ShowModal();
+  } else {
+    wxString msg = "CTSim\nThe Open Source Computed Tomography Simulator\n";
 #ifdef CTSIMVERSION
-               msg += "Version ";
-               msg += CTSIMVERSION;
-               msg += "\n\n";
+    msg += "Version ";
+    msg += CTSIMVERSION;
+    msg += "\n\n";
 #elif defined(VERSION)
-               msg << "Version: " <<  VERSION << "\n\n";
+    msg << "Version: " <<  VERSION << "\n\n";
 #endif
-               msg += "Author: Kevin Rosenberg <kevin@rosenberg.net>\nUsage: ctsim [files-to-open..] [--help]";
-               
-               wxMessageBox(msg, "About CTSim", wxOK | wxICON_INFORMATION, this);
-       }
+    msg += "Author: Kevin Rosenberg <kevin@rosenberg.net>\nUsage: ctsim [files-to-open..] [--help]";
+    
+    wxMessageBox(msg, "About CTSim", wxOK | wxICON_INFORMATION, this);
+  }
 }
 
 
 ProjectionFileDocument*
 CTSimApp::newProjectionDoc()
 {
-       ProjectionFileDocument* newDoc = dynamic_cast<ProjectionFileDocument*>(m_pDocTemplProjection->CreateDocument (""));
-       if (newDoc) {
-               ProjectionFileView* pView = newDoc->getView();
-               if (pView) {
-                       wxFrame* pFrame = pView->getFrame();
-                       if (pFrame) {
-                               pFrame->SetSize (0,0);
-                               pFrame->Show (false);
-                       }
-               }
+  ProjectionFileDocument* newDoc = dynamic_cast<ProjectionFileDocument*>(m_pDocTemplProjection->CreateDocument (""));
+  if (newDoc) {
+    ProjectionFileView* pView = newDoc->getView();
+    if (pView) {
+      wxFrame* pFrame = pView->getFrame();
+      if (pFrame) {
+        pFrame->SetSize (0,0);
+        pFrame->Show (false);
+      }
+    }
     newDoc->SetDocumentName (m_pDocTemplProjection->GetDocumentName());
     newDoc->SetDocumentTemplate (m_pDocTemplProjection);
     newDoc->OnNewDocument();
-       }
-       
-       return newDoc;
+  }
+  
+  return newDoc;
 }
 
 ImageFileDocument*
 CTSimApp::newImageDoc()
 {
-       ImageFileDocument* newDoc = dynamic_cast<ImageFileDocument*>(m_pDocTemplImage->CreateDocument (""));
-       if (newDoc) {
-               ImageFileView* pView = newDoc->getView();
-               if (pView) {
-                       wxFrame* pFrame = pView->getFrame();
-                       if (pFrame) {
-                               pFrame->SetSize (0,0);
-                               pFrame->Show (false);
-                       }
-               }
+  ImageFileDocument* newDoc = dynamic_cast<ImageFileDocument*>(m_pDocTemplImage->CreateDocument (""));
+  if (newDoc) {
+    ImageFileView* pView = newDoc->getView();
+    if (pView) {
+      wxFrame* pFrame = pView->getFrame();
+      if (pFrame) {
+        pFrame->SetSize (0,0);
+        pFrame->Show (false);
+      }
+    }
     newDoc->SetDocumentName (m_pDocTemplImage->GetDocumentName());
     newDoc->SetDocumentTemplate (m_pDocTemplImage);
     newDoc->OnNewDocument();
-       }
-       
-       return newDoc;
+  }
+  
+  return newDoc;
 }
 
 PlotFileDocument*
 CTSimApp::newPlotDoc()
 {
-       PlotFileDocument* newDoc = dynamic_cast<PlotFileDocument*>(m_pDocTemplPlot->CreateDocument (""));
-       if (newDoc) {
-               PlotFileView* pView = newDoc->getView();
-               if (pView) {
-                       wxFrame* pFrame = pView->getFrame();
-                       if (pFrame) {
-                               wxSize size;
-                               m_pFrame->GetClientSize (&size.x, &size.y);
-                               pFrame->SetSize (size.x / 2, size.y / 2);
-                               pFrame->Show (false);
-                       }
-               }
+  PlotFileDocument* newDoc = dynamic_cast<PlotFileDocument*>(m_pDocTemplPlot->CreateDocument (""));
+  if (newDoc) {
+    PlotFileView* pView = newDoc->getView();
+    if (pView) {
+      wxFrame* pFrame = pView->getFrame();
+      if (pFrame) {
+        wxSize size;
+        m_pFrame->GetClientSize (&size.x, &size.y);
+        pFrame->SetSize (size.x / 2, size.y / 2);
+        pFrame->Show (false);
+      }
+    }
     newDoc->SetDocumentName (m_pDocTemplPlot->GetDocumentName());
     newDoc->SetDocumentTemplate (m_pDocTemplPlot);
     newDoc->OnNewDocument();
-       }
-       
-       return newDoc;
+  }
+  
+  return newDoc;
 }
 
 
 TextFileDocument*
 CTSimApp::newTextDoc()
 {
-       wxString strFilename (getUntitledFilename());
-       strFilename += ".txt";
-       
-       TextFileDocument* newDoc = dynamic_cast<TextFileDocument*>(m_pDocTemplText->CreateDocument (""));
-       if (newDoc) {
-               TextFileView* pView = newDoc->getView();
-               if (pView) {
-                       wxFrame* pFrame = pView->getFrame();
-                       if (pFrame) {
-                               wxSize size;
-                               m_pFrame->GetClientSize (&size.x, &size.y);;
-                               pFrame->SetSize (size.x / 2, size.y / 2);
-                               pFrame->Show (false);
-                       }
-               }
+  wxString strFilename (getUntitledFilename());
+  strFilename += ".txt";
+  
+  TextFileDocument* newDoc = dynamic_cast<TextFileDocument*>(m_pDocTemplText->CreateDocument (""));
+  if (newDoc) {
+    TextFileView* pView = newDoc->getView();
+    if (pView) {
+      wxFrame* pFrame = pView->getFrame();
+      if (pFrame) {
+        wxSize size;
+        m_pFrame->GetClientSize (&size.x, &size.y);;
+        pFrame->SetSize (size.x / 2, size.y / 2);
+        pFrame->Show (false);
+      }
+    }
     newDoc->SetDocumentName (m_pDocTemplText->GetDocumentName());
     newDoc->SetDocumentTemplate (m_pDocTemplText);
     newDoc->OnNewDocument();
-       }
-       
-       return newDoc;
+  }
+  
+  return newDoc;
 }
 
 
 PhantomFileDocument*
 CTSimApp::newPhantomDoc()
 {
-       PhantomFileDocument* newDoc = dynamic_cast<PhantomFileDocument*>(m_pDocTemplPhantom->CreateDocument (""));
-       if (newDoc) {
-               PhantomFileView* pView = newDoc->getView();
-               if (pView) {
-                       wxFrame* pFrame = pView->getFrame();
-                       if (pFrame)
-                               pFrame->SetSize (0,0);
-               }
+  PhantomFileDocument* newDoc = dynamic_cast<PhantomFileDocument*>(m_pDocTemplPhantom->CreateDocument (""));
+  if (newDoc) {
+    PhantomFileView* pView = newDoc->getView();
+    if (pView) {
+      wxFrame* pFrame = pView->getFrame();
+      if (pFrame)
+        pFrame->SetSize (0,0);
+    }
     newDoc->SetDocumentName (m_pDocTemplPhantom->GetDocumentName());
     newDoc->SetDocumentTemplate (m_pDocTemplPhantom);
     newDoc->OnNewDocument();
-       }
-       
-       return newDoc;
+  }
+  
+  return newDoc;
 }
 
 #if wxUSE_GLCANVAS
@@ -1019,19 +1070,19 @@ CTSimApp::newPhantomDoc()
 Graph3dFileDocument*
 CTSimApp::newGraph3dDoc()
 {
-       Graph3dFileDocument* newDoc = dynamic_cast<Graph3dFileDocument*>(m_pDocTemplGraph3d->CreateDocument (""));
-       if (newDoc) {
-               Graph3dFileView* pView = newDoc->getView();
-               if (pView) {
-                       wxFrame* pFrame = pView->getFrame();
-                       if (pFrame)
-                               pFrame->SetSize (0,0);
-               }
+  Graph3dFileDocument* newDoc = dynamic_cast<Graph3dFileDocument*>(m_pDocTemplGraph3d->CreateDocument (""));
+  if (newDoc) {
+    Graph3dFileView* pView = newDoc->getView();
+    if (pView) {
+      wxFrame* pFrame = pView->getFrame();
+      if (pFrame)
+        pFrame->SetSize (0,0);
+    }
     newDoc->SetDocumentName (m_pDocTemplGraph3d->GetDocumentName());
     newDoc->SetDocumentTemplate (m_pDocTemplGraph3d);
     newDoc->OnNewDocument();
-       }
-       
-       return newDoc;
+  }
+  
+  return newDoc;
 }
 #endif
index a4049f1..e80bbb7 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: ctsim.h,v 1.52 2001/02/22 15:00:20 kevin Exp $
+**  $Id: ctsim.h,v 1.53 2001/03/01 20:02:18 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
@@ -101,6 +101,7 @@ private:
   wxMenuItem* m_apWindowMenuItems[MAX_WINDOW_MENUITEMS];
   wxDocument* m_apWindowMenuData[MAX_WINDOW_MENUITEMS];
   
+  int m_iDefaultImportFormat;
   int m_iDefaultPhantomID;
   int m_iDefaultFilterID;
   int m_iDefaultFilterDomainID;
@@ -144,6 +145,7 @@ public:
   void OnLogEvent (wxCommandEvent& event);  // used by thread children
 
   void OnHelpButton (wxCommandEvent& event);
+  void OnImport (wxCommandEvent& event);
 
 #if defined(CTSIM_WINHELP) && (defined(DEBUG) || defined(_DEBUG))
   void OnHelpSecondary (wxCommandEvent& event);
@@ -292,7 +294,8 @@ enum {
     MAINMENU_FILE_EXIT,
     MAINMENU_FILE_PREFERENCES,
     MAINMENU_LOG_EVENT,
-        
+    MAINMENU_IMPORT,
+    
     PJMENU_FILE_PROPERTIES,
     PJMENU_RECONSTRUCT_FBP,
     PJMENU_RECONSTRUCT_FOURIER,
index d620b12..42fe44d 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: dialogs.cpp,v 1.44 2001/03/01 07:30:49 kevin Exp $
+**  $Id: dialogs.cpp,v 1.45 2001/03/01 20:02:18 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
@@ -1225,9 +1225,10 @@ DialogExportParameters::DialogExportParameters (wxWindow* pParent, int iDefaultF
   
   pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxALL, 5);
   
-  m_pRadioBoxFormat = new StringValueAndTitleRadioBox (this, _T("Export Type"), ImageFile::getFormatCount(), ImageFile::getFormatTitleArray(), ImageFile::getFormatNameArray());
+  m_pRadioBoxFormat = new StringValueAndTitleRadioBox (this, _T("File Type"), 
+    ImageFile::getExportFormatCount(), ImageFile::getExportFormatTitleArray(), ImageFile::getExportFormatNameArray());
   m_pRadioBoxFormat->SetSelection (iDefaultFormatID);
-  pTopSizer->Add (m_pRadioBoxFormat, 0, wxALL | wxALIGN_CENTER | wxEXPAND);
+  pTopSizer->Add (m_pRadioBoxFormat, 0, wxALL | wxALIGN_CENTER);
   
   pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
   
@@ -1255,6 +1256,51 @@ DialogExportParameters::getFormatName()
 }
 
 
+///////////////////////////////////////////////////////////////////////
+// CLASS IMPLEMENTATION
+//    DialogImportParameters
+///////////////////////////////////////////////////////////////////////
+
+DialogImportParameters::DialogImportParameters (wxWindow* pParent, int iDefaultFormatID)
+: wxDialog (pParent, -1, "Select ImportParameters", wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxCAPTION)
+{
+  wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL);
+  
+  pTopSizer->Add (new wxStaticText (this, -1, "Select Import Format"), 0, wxALIGN_CENTER | wxALL, 5);
+  
+  pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxALL, 5);
+  
+  m_pRadioBoxFormat = new StringValueAndTitleRadioBox (this, _T("File Type"), 
+    ImageFile::getImportFormatCount(), ImageFile::getImportFormatTitleArray(), ImageFile::getImportFormatNameArray());
+  m_pRadioBoxFormat->SetSelection (iDefaultFormatID);
+  pTopSizer->Add (m_pRadioBoxFormat, 0, wxALL | wxALIGN_CENTER);
+  
+  pTopSizer->Add (new wxStaticLine (this, -1, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL), 0, wxEXPAND | wxALL, 5);
+  
+  wxBoxSizer* pButtonSizer = new wxBoxSizer (wxHORIZONTAL);
+  wxButton* pButtonOk = new wxButton (this, wxID_OK, "Okay");
+  pButtonSizer->Add (pButtonOk, 0, wxEXPAND | wxALL, 10);
+  wxButton* pButtonCancel = new wxButton (this, wxID_CANCEL, "Cancel");
+  pButtonSizer->Add (pButtonCancel, 0, wxEXPAND | wxALL, 10);
+  CTSimHelpButton* pButtonHelp = new CTSimHelpButton (this, IDH_DLG_IMPORT);
+  pButtonSizer->Add (pButtonHelp, 0, wxEXPAND | wxALL, 10);
+  
+  pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER);
+  pButtonOk->SetDefault();
+
+  SetAutoLayout (true);
+  SetSizer (pTopSizer);
+  pTopSizer->Fit (this);
+  pTopSizer->SetSizeHints (this);
+}
+
+const char*
+DialogImportParameters::getFormatName()
+{
+  return m_pRadioBoxFormat->getSelectionStringValue();
+}
+
+
 /////////////////////////////////////////////////////////////////////
 // CLASS DiaglogGetXYSize Implementation
 /////////////////////////////////////////////////////////////////////
index 7de9203..5f6fb06 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: dialogs.h,v 1.32 2001/03/01 07:30:49 kevin Exp $
+**  $Id: dialogs.h,v 1.33 2001/03/01 20:02:18 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
@@ -316,6 +316,18 @@ class DialogExportParameters : public wxDialog
     StringValueAndTitleRadioBox* m_pRadioBoxFormat;
 };
 
+class DialogImportParameters : public wxDialog
+{
+ public:
+    DialogImportParameters (wxWindow* pParent, int iDefaultFormatID);
+    virtual ~DialogImportParameters () {}
+
+    const char* getFormatName();
+
+ private:
+    StringValueAndTitleRadioBox* m_pRadioBoxFormat;
+};
+
 class DialogAutoScaleParameters : public wxDialog
 {
  public:
index 74458f2..f902f19 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: views.cpp,v 1.122 2001/03/01 07:30:49 kevin Exp $
+**  $Id: views.cpp,v 1.123 2001/03/01 20:02:18 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
@@ -249,7 +249,7 @@ END_EVENT_TABLE()
 ImageFileView::ImageFileView() 
 : wxView(), m_pFrame(NULL), m_pCanvas(NULL), m_pFileMenu(0), m_bMinSpecified(false), m_bMaxSpecified(false)
 {
-  m_iDefaultExportFormatID = ImageFile::FORMAT_PNG;
+  m_iDefaultExportFormatID = ImageFile::EXPORT_FORMAT_PNG;
 }
 
 ImageFileView::~ImageFileView()
@@ -840,6 +840,8 @@ ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view)
   m_pFileMenu->Append(wxID_PRINT, "&Print...");
   m_pFileMenu->Append(wxID_PRINT_SETUP, "Print &Setup...");
   m_pFileMenu->Append(wxID_PREVIEW, "Print Preview");
+  m_pFileMenu->AppendSeparator();
+  m_pFileMenu->Append(MAINMENU_IMPORT, "&Import\tCtrl-I...");
 #ifdef CTSIM_MDI
   m_pFileMenu->AppendSeparator();
   m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces...");
@@ -1080,20 +1082,24 @@ ImageFileView::OnExport (wxCommandEvent& event)
     DialogExportParameters dialogExport (getFrameForChild(), m_iDefaultExportFormatID);
     if (dialogExport.ShowModal() == wxID_OK) {
       wxString strFormatName (dialogExport.getFormatName ());
-      m_iDefaultExportFormatID = ImageFile::convertFormatNameToID (strFormatName.c_str());
+      m_iDefaultExportFormatID = ImageFile::convertExportFormatNameToID (strFormatName.c_str());
       
       wxString strExt;
       wxString strWildcard;
-      if (m_iDefaultExportFormatID == ImageFile::FORMAT_PGM || m_iDefaultExportFormatID == ImageFile::FORMAT_PGMASCII) {
+      if (m_iDefaultExportFormatID == ImageFile::EXPORT_FORMAT_PGM || m_iDefaultExportFormatID == ImageFile::EXPORT_FORMAT_PGMASCII) {
         strExt = ".pgm";
         strWildcard = "PGM Files (*.pgm)|*.pgm";
       }
 #ifdef HAVE_PNG
-      else if (m_iDefaultExportFormatID == ImageFile::FORMAT_PNG || m_iDefaultExportFormatID == ImageFile::FORMAT_PNG16) {
+      else if (m_iDefaultExportFormatID == ImageFile::EXPORT_FORMAT_PNG || m_iDefaultExportFormatID == ImageFile::EXPORT_FORMAT_PNG16) {
         strExt = ".png";
         strWildcard = "PNG Files (*.png)|*.png";
       }
 #endif
+      else {
+        strExt = "";
+        strWildcard = "Miscellaneous (*.*)|*.*";
+      }
       
       const wxString& strFilename = wxFileSelector (wxString("Export Filename"), wxString(""), 
         wxString(""), strExt, strWildcard, wxOVERWRITE_PROMPT | wxHIDE_READONLY | wxSAVE);
@@ -2106,6 +2112,8 @@ PhantomFileView::CreateChildFrame(wxDocument *doc, wxView *view)
   m_pFileMenu->Append(wxID_PRINT, "&Print...");
   m_pFileMenu->Append(wxID_PRINT_SETUP, "Print &Setup...");
   m_pFileMenu->Append(wxID_PREVIEW, "Print Pre&view");
+  m_pFileMenu->AppendSeparator();
+  m_pFileMenu->Append(MAINMENU_IMPORT, "&Import\tCtrl-I...");
 #ifdef CTSIM_MDI
   m_pFileMenu->AppendSeparator();
   m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces...");
@@ -2554,6 +2562,8 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view)
   m_pFileMenu->Append(wxID_PRINT, "&Print...");
   m_pFileMenu->Append(wxID_PRINT_SETUP, "Print &Setup...");
   m_pFileMenu->Append(wxID_PREVIEW, "Print Pre&view");
+  m_pFileMenu->AppendSeparator();
+  m_pFileMenu->Append(MAINMENU_IMPORT, "&Import\tCtrl-I...");
 #ifdef CTSIM_MDI
   m_pFileMenu->AppendSeparator();
   m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces...");
@@ -2884,6 +2894,8 @@ PlotFileView::CreateChildFrame(wxDocument *doc, wxView *view)
   m_pFileMenu->Append(wxID_PRINT, "&Print...");
   m_pFileMenu->Append(wxID_PRINT_SETUP, "Print &Setup...");
   m_pFileMenu->Append(wxID_PREVIEW, "Print Pre&view");
+  m_pFileMenu->AppendSeparator();
+  m_pFileMenu->Append(MAINMENU_IMPORT, "&Import\tCtrl-I...");
 #ifdef CTSIM_MDI
   m_pFileMenu->AppendSeparator();
   m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces...");
@@ -3137,6 +3149,8 @@ TextFileView::CreateChildFrame (wxDocument *doc, wxView *view)
   m_pFileMenu->Append(wxID_PRINT, "&Print...");
   m_pFileMenu->Append(wxID_PRINT_SETUP, "Print &Setup...");
   m_pFileMenu->Append(wxID_PREVIEW, "Print Pre&view");
+  m_pFileMenu->AppendSeparator();
+  m_pFileMenu->Append(MAINMENU_IMPORT, "&Import\tCtrl-I...");
 #ifdef CTSIM_MDI
   m_pFileMenu->AppendSeparator();
   m_pFileMenu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces...");