00001 #include "TorstensFilters.h"
00002 #include "VolSet.h"
00003
00004 using namespace SpecFVRNS;
00005
00006 VolumeSet::VolumeSet(int nvolumes)
00007 {
00008 m_Volumes = NULL;
00009 m_Filter = NULL;
00010 createVolumes(nvolumes,true);
00011 }
00012
00013 VolumeSet::~VolumeSet()
00014 {
00015 destroyData(true);
00016 }
00017
00018 void VolumeSet::createVolumes(int nvolumes, bool initFilter)
00019 {
00020 cout << "initializing " << nvolumes << " volumes" << endl;
00021 if(m_Volumes) destroyData(initFilter);
00022 m_NVolumes = nvolumes;
00023 if(initFilter) {
00024 cout << "reseting filter" << endl;
00025 m_Filter = new TorstensFilters(d0_c3_4ef);
00026 }
00027
00028 if(nvolumes) {
00029 m_Volumes = new Volume*[m_NVolumes];
00030 int c;
00031 for(c=0; c<m_NVolumes; c++)
00032 m_Volumes[c]= new Volume;
00033 if(!initFilter) setFilter(m_Filter);
00034 } else
00035 m_Volumes = NULL;
00036 m_Recomp=false;
00037 }
00038
00039 void VolumeSet::destroyData(bool destroyFilter)
00040 {
00041 if(m_Volumes) {
00042 int c;
00043 for(c=0;c<m_NVolumes;c++) {
00044 if(m_Volumes[c]) delete m_Volumes[c];
00045 }
00046 delete m_Volumes;
00047 m_Volumes = NULL;
00048 m_NVolumes = 0;
00049 }
00050 if(destroyFilter && m_Filter) {
00051 delete m_Filter;
00052 m_Filter=NULL;
00053 }
00054 }
00055
00056 #define FILTER_SET_SUB(x) \
00057 m_Filter = new TorstensFilters((x)); \
00058 ITERATE_VOLS(setFilter(m_Filter)); \
00059 //cout << #x << " : Filter width = " << m_Filter->getWidth() << endl;
00060
00061 bool VolumeSet::setFilter(int num)
00062 {
00063 Filter* tmp = m_Filter;
00064 switch(num) {
00065 case 0: FILTER_SET_SUB(d0_c0_1ef); break;
00066 case 1: FILTER_SET_SUB(d0_c0_2ef); break;
00067 case 2: FILTER_SET_SUB(d0_c0_3ef); break;
00068 case 3: FILTER_SET_SUB(d0_c0_4ef); break;
00069 case 4: FILTER_SET_SUB(d0_c1_1ef); break;
00070 case 5: FILTER_SET_SUB(d0_c1_2ef); break;
00071 case 6: FILTER_SET_SUB(d0_c1_3ef); break;
00072 case 7: FILTER_SET_SUB(d0_c1_4ef); break;
00073 case 8: FILTER_SET_SUB(d0_c2_1ef); break;
00074 case 9: FILTER_SET_SUB(d0_c2_2ef); break;
00075 case 10: FILTER_SET_SUB(d0_c2_3ef); break;
00076 case 11: FILTER_SET_SUB(d0_c2_4ef); break;
00077 case 12: FILTER_SET_SUB(d0_c3_1ef); break;
00078 case 13: FILTER_SET_SUB(d0_c3_2ef); break;
00079 case 14: FILTER_SET_SUB(d0_c3_3ef); break;
00080 case 15: FILTER_SET_SUB(d0_c3_4ef); break;
00081 case 16: FILTER_SET_SUB(d0_cn_1ef); break;
00082 case 17: FILTER_SET_SUB(d0_cn_2ef); break;
00083 case 18: FILTER_SET_SUB(d0_cn_3ef); break;
00084 case 19: FILTER_SET_SUB(d0_cn_4ef); break;
00085 default: return false;
00086 }
00087 if (tmp) delete tmp;
00088 m_Recomp = true;
00089 return true;
00090 }
00091
00092 bool VolumeSet::setFilter(Filter* filter)
00093 {
00094 if(filter == m_Filter) return true;
00095 Filter* tmp = m_Filter;
00096 m_Filter = filter;
00097 int c;
00098 for( c=0; c<m_NVolumes; c++) {
00099 if(m_Volumes[c]) m_Volumes[c]->setFilter(m_Filter);
00100 }
00101
00102
00103 if (tmp) delete tmp;
00104 m_Recomp = true;
00105 return true;
00106 }
00107
00108
00109 bool VolumeSet::read(char* in, float s, float m_pad, dword a_pad )
00110 {
00111 if (!in) return false;
00112 createVolumes(1);
00113 if(!m_Filter) {
00114 cout << "No Filter set!" << endl;
00115 return false;
00116 }
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 cout <<"read not implemented anymore"<<endl;
00142 return false;
00143
00144 }
00145
00146 bool VolumeSet::write_fvr(char* fn)
00147 {
00148 if(!fn) return false;
00149 if(m_NVolumes == 0) return false;
00150 m_Volumes[0]->write_fvr(fn);
00151 return true;
00152 }
00153
00154 void VolumeSet::buildColourVolumes(byte *data,
00155 dword xsize, dword ysize, dword zsize,
00156 dword dsize, const vuTFIntensity &tfunc,
00157 float osamp, float m_pad, dword a_pad)
00158 {
00159 createVolumes(tfunc.getNComponents()-1);
00160 if(!m_Filter) {
00161 cerr <<"No filter defined."<<endl;
00162 return;
00163 }
00164 int c;
00165 for(c=0;c<m_NVolumes;c++) {
00166 m_Volumes[c]->setFilter(m_Filter);
00167 m_Volumes[c]->convert(data, xsize, ysize, zsize, dsize,
00168 tfunc, c, osamp, m_pad, a_pad);
00169 }
00170 }