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