Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

vuVHImage.cpp

Go to the documentation of this file.
00001 #include <stdlib.h>
00002 #include <fstream.h>
00003 #include <string.h>
00004 #ifndef WIN32
00005 #include <unistd.h>
00006 #endif
00007 #include "vuVHImage.h"
00008 
00009 
00010 vuVHImage::vuVHImage() 
00011 {
00012     magic = 0;
00013     txtTable = NULL;
00014     data = NULL;
00015 }
00016 
00017 vuVHImage::vuVHImage(const vuString& filename)
00018 {
00019     magic = (dword)0;
00020     txtTable = NULL;
00021     data = NULL;
00022     loadSlice(filename);
00023 }
00024 
00025 vuVHImage::~vuVHImage()
00026 {
00027     if(txtTable) {
00028         delete txtTable;
00029         txtTable = NULL;
00030     }
00031     if(data) {
00032         delete data;
00033         data = NULL;
00034     }
00035 }
00036 
00037 bool vuVHImage::loadSlice(const vuString& filename)
00038 {
00039     bool ret = true;
00040     dword len = filename.getLength();
00041     if(!len) return false;
00042 
00043     bool uncompress = false;
00044     ifstream fs;
00045     vuString tmpfn;
00046     if(filename.substr(len-2,len).compare(".Z") == 0)
00047     {
00048 #ifdef WIN32
00049         return false;
00050 #else
00051         uncompress = true;
00052         tmpfn = vuString("/tmp/vutmp") + 
00053             vuString(getpgrp()) + vuString(".tmp");
00054         vuString commandstr = vuString("uncompress -c ") + filename +
00055             " > " + tmpfn;
00056         system(commandstr);
00057         fs.open(tmpfn);
00058 #endif
00059     } else fs.open(filename);
00060     try {
00061     if(fs.good()) {
00062         char head[156];
00063         fs.read(head,156);
00064         int p = 0;
00065         magic = swizzle(*(dword*)(head + p)); p+=sizeof(dword);
00066         if(magic != VH_MAGIC) throw;
00067         offset = swizzle(*(dword*)(head + p)); p+=sizeof(dword);
00068         width = swizzle(*(dword*)(head + p)); p+=sizeof(dword);
00069         height = swizzle(*(dword*)(head + p)); p+=sizeof(dword);
00070         depth = swizzle(*(dword*)(head + p)); p+=sizeof(dword);
00071         compressType = swizzle(*(dword*)(head + p)); p+=sizeof(dword);
00072         defaultWindowWidth = swizzle(*(dword*)(head + p)); p+=sizeof(dword);
00073         defaultLevelVal = swizzle(*(dword*)(head + p)); p+=sizeof(dword);
00074         defaultBGShade = swizzle(*(dword*)(head + p)); p+=sizeof(dword);
00075         overflowPixVal = swizzle(*(dword*)(head + p)); p+=sizeof(dword);
00076         underflowPixVal = swizzle(*(dword*)(head + p)); p+=sizeof(dword);
00077         blankLineTop = swizzle(*(dword*)(head + p)); p+=sizeof(dword);
00078         blankLineBot = swizzle(*(dword*)(head + p)); p+=sizeof(dword);
00079         hdrVersion = swizzle(*(word*)(head + p)); p+=sizeof(word);
00080         checksum = swizzle(*(word*)(head + p)); p+=sizeof(word);
00081         p+=sizeof(dword);
00082         dword txtlen = swizzle(*(dword*)(head + p)); p+=sizeof(dword);
00083         if(txtTable)
00084             delete txtTable;
00085         if(txtlen) 
00086         {
00087             txtTable = new char[txtlen+1];
00088             memset(txtTable,0,txtlen+1);
00089             fs.read(txtTable, txtlen);
00090         } else txtTable = NULL;
00091         
00092         if(data)
00093             delete data;
00094         data = new byte[width*height*2];
00095         fs.seekg(offset, ios::beg);
00096         fs.read((char*)data, (int)(width*height*2)); // ms: cast for gcc 3.0.4
00097         int i;
00098         word *wdat = (word*)data;
00099         for(i=width*height; i>0; i--, wdat++)
00100         {
00101             *wdat = swizzle(*wdat);
00102         }
00103 //      int nr = fs.
00104 //      cout << " numread = " << nr << endl;
00105 //      if(!nr == width*height*2)
00106 //          {
00107 //              cout << " reading data failed." << endl;
00108 //              return false;
00109 //          }
00110     } else throw;
00111     } catch (...) {
00112         ret = false;
00113     }
00114 
00115     if(uncompress) {
00116         fs.close();
00117         vuString commandstr = "rm -f " + tmpfn;
00118         system(commandstr);
00119     }
00120     
00121     return ret;
00122 }
00123 

Generated on Wed Dec 15 21:20:38 2004 for vuVolume by  doxygen 1.3.9.1