46 typename T::Point firstPoint( 0, 0, 0 );
47 typename T::Point lastPoint( 0, 0, 0 );
48 T nullImage(
typename T::Domain(firstPoint, lastPoint ));
52 fin = fopen( filename.c_str() ,
"r" );
56 trace.
error() <<
"LongvolReader : can't open " << filename << endl;
68 for (
char *line = fgets( buf, 128, fin );
69 line && strcmp( line,
".\n" ) != 0 ;
70 line = fgets( line, 128, fin ), ++linecount
74 if ( line[strlen( line ) - 1] !=
'\n' )
76 trace.
error() <<
"LongvolReader: Line " << linecount <<
" too long" << std::endl;
81 for ( i = 0; line[i] && line[i] !=
':'; ++i )
84 if ( i == 0 || i >= 126 || line[i] !=
':' )
86 trace.
error() <<
"LongvolReader: Invalid header read at line " << linecount << std::endl;
92 if ( fieldcount == MAX_HEADERNUMLINES )
94 trace.
warning() <<
"LongvolReader: Too many lines in HEADER, ignoring\n";
97 if ( fieldcount > MAX_HEADERNUMLINES )
101 if ( line[ strlen( line ) - 1 ] ==
'\n' )
102 line[ strlen( line ) - 1 ] = 0;
106 header[ fieldcount++ ] =
HeaderField( line, line + i + 2 );
113 for (
int i = 0; requiredHeaders[i]; ++i )
115 if ( getHeaderValue(
"Version" , header ) != NULL &&
116 ( strcmp( requiredHeaders[i],
"Int-Endian" ) == 0 ||
117 strcmp( requiredHeaders[i],
"Lvoxel-Endian" ) == 0 ) )
121 if ( getHeaderField( requiredHeaders[i] , header ) == -1 )
123 trace.
error() <<
"LongvolReader: Required Header Field missing: "
124 << requiredHeaders[i] << std::endl;
125 throw dgtalexception;
132 getHeaderValueAsInt(
"X", &sx, header );
133 getHeaderValueAsInt(
"Y", &sy, header );
134 getHeaderValueAsInt(
"Z", &sz, header );
136 if ( getHeaderValue(
"Version", header ) == NULL )
138 int rawsx, rawsy, rawsz;
141 count += (long)fread( &rawsx,
sizeof(
int ), 1, fin );
142 count += (long)fread( &rawsy,
sizeof(
int ), 1, fin );
143 count += (long)fread( &rawsz,
sizeof(
int ), 1, fin );
147 trace.
error() <<
"LongvolReader: can't read file (raw header)\n";
148 throw dgtalexception;
152 if ( sx != rawsx || sy != rawsy || sz != rawsz )
154 trace.
warning() <<
"LongvolReader: Warning : Incoherent longvol header with raw header !\n";
158 if ( getHeaderValueAsInt(
"Voxel-Size", &voxsize, header ) == 0 && voxsize !=
sizeof(
voxel ) )
160 trace.
error() <<
"LongvolReader: This file was generated with a voxel-size that we do not support.\n";
161 throw dgtalexception;
166 count = (long)fread( &tmp,
sizeof(
char ), 1, fin );
168 if ( count != 1 || tmp !=
'\n' )
170 trace.
error() <<
"LongvolReader: I thouhgt I would have read a \\n !\n";
171 throw dgtalexception;
178 firstPoint = T::Point::zero;
179 lastPoint[0] = sx - 1;
180 lastPoint[1] = sy - 1;
181 lastPoint[2] = sz - 1;
182 typename T::Domain domain( firstPoint, lastPoint );
191 typename T::Domain::ConstIterator it = domain.begin();
192 long int total = sx * sy * sz;
194 while (( count < total ) && ( fin ) )
196 read_word(fin , val);
197 image.setValue(( *it ), val );
202 if ( count != total )
204 trace.
error() <<
"LongvolReader: can't read file (raw data) !\n";
205 throw dgtalexception;
213 trace.
error() <<
"LongvolReader: not enough memory\n" ;
214 throw dgtalexception;
221 template <
typename T>
224 "X",
"Y",
"Z",
"Lvoxel-Size",
"Int-Endian",
"Lvoxel-Endian",
"Alpha-Color", NULL
237 for (
int i = 0; i < MAX_HEADERNUMLINES; ++i )
239 if ( header[i].type != NULL && strcmp( header[i].type, type ) == 0 )
254 int i = getHeaderField( type, header );
257 return header[i].
value;
267 int i = getHeaderField( type, header );
271 return sscanf( header[i].value,
"%d", dest ) != 0;