Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members   Related Pages  

MicrosoftMonoBMP_RT.cpp

00001 /*****************************************************************************
00002  *
00003  * File :       MicrosoftMonoBMP_RT.cpp
00004  *
00005  * Module :     ImageLib.a
00006  *
00007  * Author :     Derek Magee, School of Computer Science, Leeds University.
00008  *
00009  * Created :    31 October 1997
00010  *
00011  *****************************************************************************
00012  *
00013  * Source code for Image Library MkII
00014  *
00015  * The author, Derek Magee, gives permission for this code to be copied,
00016  * modified and distributed within the University of Leeds subject to the
00017  * following conditions:-
00018  *
00019  * - The code is not to be used for commercial gain.
00020  * - The code and use thereof will be attributed to the author where
00021  *   appropriate (inluding demonstrations which rely on it's use).
00022  * - All modified, distributions of the source files will retain this header.
00023  *
00024  *****************************************************************************
00025  *
00026  * Description:
00027  *
00028  * Methods for reading and writing monochrome Microsoft v3 bitmap files.
00029  *
00030  *****************************************************************************
00031  *
00032  * Revision History:
00033  *
00034  * Date         By              Revision
00035  *
00036  * 31/10/97     DRM             Created.
00037 
00038  *
00039  ****************************************************************************/
00040 
00041 #include "MicrosoftMonoBMP_RT.h"
00042 
00043 
00044 MicrosoftMonoBMP_RT::MicrosoftMonoBMP_RT(const char *filename)
00045 {
00046 /* 
00047  * This is the constructor method for the MicrosoftMonoBMP_RT class. It copies the
00048  * string pointed to by filename into the file_name buffer, truncating if
00049  * it is greater than this buffer and initialises other parameters to sensible
00050  * values.
00051  */
00052 
00053     set_filename(filename);
00054     FileSize = IMAGE_DATA_OFFSET_M;
00055     ImageWidth = 0;
00056     ImageHeight = 0;
00057     HorizResolution = 0;
00058     VertResolution = 0;
00059     pallete_false_r = PALETTE0_R;
00060     pallete_false_g = PALETTE0_G;
00061     pallete_false_b = PALETTE0_B;
00062     pallete_false_grey = PALETTE0_GREY ;
00063     pallete_true_r = PALETTE1_R;
00064     pallete_true_g = PALETTE1_G;
00065     pallete_true_b = PALETTE1_B;
00066     pallete_true_grey = PALETTE1_GREY ;
00067     file_pnt = NULL;
00068     raw_data = NULL;
00069 }
00070 
00071 MicrosoftMonoBMP_RT::~MicrosoftMonoBMP_RT()
00072 {
00073 /*
00074  * This is the destructor for the class MicrosoftMonoBMP_RT. It frees allocated 
00075  * memory.
00076  */
00077 
00078     delete raw_data;
00079 }
00080 
00081 void MicrosoftMonoBMP_RT::set_filename(const char *filename)
00082 {
00083 /* 
00084  * copy string pointed to by filename into buffer file_name truncating if
00085  * length is greater than MAX_FILENAME_LEN.
00086  */
00087 
00088     strncpy(file_name, filename, MAX_FILENAME_LEN);
00089 
00090     /* Ensure string is terminated if length = MAX_FILENAME_LEN */
00091     file_name[MAX_FILENAME_LEN] = '\0';
00092 }
00093 
00094 bool MicrosoftMonoBMP_RT::set_size(unsigned int width, unsigned int height)
00095 {
00096 /*
00097  * Method sets the parameters ImageWidth and ImageHeight to width and height
00098  * and ensures that the memory allocated to raw_data is large enough to contain
00099  * this ammount of data. The method returns false if memory allocation is
00100  * unsuccessful and true otherwise.
00101  */
00102 
00103     bool ret_val ;
00104 
00105     /* First free memory currently associated with raw_data (if any) */ 
00106     delete raw_data ;    
00107 
00108     ImageWidth = width ;
00109     ImageHeight = height ;
00110 
00111     if(allocate_storage()){
00112     /* memory allocation was sucessful */
00113         ret_val = true ;
00114     }
00115     else{
00116         ret_val = false ;
00117     }
00118 
00119     calculate_filesize();
00120  
00121     return ret_val ;
00122 }
00123 
00124 bool MicrosoftMonoBMP_RT::read_byte(unsigned char *inp_chr)
00125 {
00126 /*
00127  * Reads a byte from stream pointed to by file_pnt into *inp_chr. Returns
00128  * false if cannot
00129  * read or invalid file pointer.
00130  */
00131 
00132     bool ret_val = true ;
00133     int char_read;
00134     if(file_pnt == NULL){
00135     /* Invalid file pointer */
00136         ret_val = false ;
00137     }
00138     else if( (char_read = fgetc(file_pnt)) == EOF){
00139     /* Could not read character from file */
00140         ret_val = false ;
00141     }
00142     else{
00143     /* Character read Ok */
00144         *inp_chr = (unsigned char) char_read ;
00145     }
00146     return ret_val ; 
00147 }
00148 
00149 bool MicrosoftMonoBMP_RT::read_word(unsigned int *inp_word)
00150 {
00151 /*
00152  * Reads a little endian word from stream pointed to by file_pnt into
00153  * *inp_word. Returns false if cannot read or invalid file pointer.
00154  */
00155 
00156     unsigned char inp1;
00157     unsigned char inp2;
00158     bool ret_val = true ;
00159 
00160     ret_val = read_byte(&inp1);
00161     
00162     if(ret_val){
00163     /* First byte read OK */
00164         ret_val = read_byte(&inp2);
00165     }
00166 
00167     if(ret_val){
00168     /* Both bytes read OK */
00169         *inp_word = inp1 + (((unsigned int)(inp2))<<8) ;
00170     }
00171 
00172     return ret_val ; 
00173 }
00174 
00175 bool MicrosoftMonoBMP_RT::read_dword(unsigned int *inp_word)
00176 {
00177 /*
00178  * Reads a little endian double word from stream pointed to by file_pnt into
00179  * *inp_word. Returns false if cannot read or invalid file pointer.
00180  */
00181 
00182     unsigned char inp1;
00183     unsigned char inp2;
00184     unsigned char inp3;
00185     unsigned char inp4;
00186     bool ret_val = true ;
00187 
00188     ret_val = read_byte(&inp1);
00189     
00190     if(ret_val){
00191     /* First byte read OK */
00192         ret_val = read_byte(&inp2);
00193     }
00194 
00195     if(ret_val){
00196     /* Second byte read OK */
00197         ret_val = read_byte(&inp3);
00198     }
00199 
00200     if(ret_val){
00201     /* Third byte read OK */
00202         ret_val = read_byte(&inp4);
00203     }
00204 
00205     if(ret_val){
00206     /* All 4 bytes read OK */
00207         *inp_word = (unsigned int)inp1 +
00208                     (((unsigned int)(inp2))<<8) +
00209                     (((unsigned int)(inp3))<<16) +
00210                     (((unsigned int)(inp4))<<24) ;
00211     }
00212 
00213     return ret_val ; 
00214 }
00215 
00216 
00217 
00218 bool MicrosoftMonoBMP_RT::write_byte(char chr)
00219 {
00220 /*
00221  * Writes a byte (chr) to stream pointed to by file_pnt. Returns
00222  * false if cannot write or invalid file pointer.
00223  */
00224 
00225     bool ret_val = true ;
00226 
00227     if(file_pnt == NULL){
00228     /* Invalid file pointer */
00229         ret_val = false ;
00230     }
00231     else if( fputc((int)chr, file_pnt) == EOF){
00232     /* Could not write character to file */
00233         ret_val = false ;
00234     }
00235     else{
00236     /* Character written Ok */
00237         ret_val = true ; 
00238     }
00239 
00240     return ret_val ; 
00241 }
00242 
00243 bool MicrosoftMonoBMP_RT::write_word(unsigned int wrd)
00244 {
00245 /*
00246  *  Writes a little endian word (wrd) to stream pointed to by file_pnt. 
00247  *  Returns false if cannot write or invalid file pointer.
00248  */
00249 
00250     unsigned int low_b;
00251     unsigned int hi_b;
00252     bool ret_val = true ;
00253 
00254     low_b = wrd&0xFF ;
00255     hi_b  = ( wrd >> 8 ) & 0xFF ;
00256 
00257     ret_val = write_byte((int)low_b);
00258     
00259     if(ret_val){
00260     /* First byte written OK */
00261         ret_val = write_byte((int)hi_b);
00262     }
00263 
00264     return ret_val ; 
00265 }
00266 
00267 bool MicrosoftMonoBMP_RT::write_dword(unsigned int wrd)
00268 {
00269 /*
00270  * Writes a little endian double word to stream pointed to by file_pnt. 
00271  * *inp_word. Returns false if cannot write or invalid file pointer.
00272  */
00273 
00274     char by1;
00275     char by2;
00276     char by3;
00277     char by4;
00278     bool ret_val = true ;
00279 
00280     by1 = wrd&0xFF ;
00281     by2 = ( wrd >> 8 ) & 0xFF ;
00282     by3 = ( wrd >> 16 ) & 0xFF ;
00283     by4 = ( wrd >> 24 ) & 0xFF ;
00284     ret_val = write_byte(by1);
00285     
00286     if(ret_val){
00287     /* First byte writtten OK */
00288         ret_val = write_byte(by2);
00289     }
00290 
00291     if(ret_val){
00292     /* Second byte written OK */
00293         ret_val = write_byte(by3);
00294     }
00295 
00296     if(ret_val){
00297     /* Third byte written OK */
00298         ret_val = write_byte(by4);
00299     }
00300 
00301     return ret_val ; 
00302 }
00303 
00304 
00305 bool MicrosoftMonoBMP_RT::allocate_storage()
00306 {
00307 /*
00308  * Allocates memory for raw_data based on ImageWidth and ImageHeight.
00309  */
00310 
00311     unsigned int storage_bytes_per_row;
00312 
00313     storage_bytes_per_row = ImageWidth / 8 ;
00314 
00315 
00316     if(ImageWidth & 0xF){
00317     /* Bits per row is not divisible by 8 */
00318         storage_bytes_per_row++ ;
00319     }
00320 
00321     raw_data = new char[storage_bytes_per_row * ImageHeight];
00322 
00323     if(raw_data==NULL) return false;
00324     else               return true;
00325 }
00326 
00327 void MicrosoftMonoBMP_RT::calculate_filesize()
00328 {
00329 /*
00330  * Calculates the filesize from ImageWidth and ImageHeight and stores this in 
00331  * FileSize.
00332  */
00333 
00334     unsigned int bytes_per_row;
00335 
00336     bytes_per_row = ImageWidth / 8 ;
00337 
00338     if(ImageWidth & 0xF){
00339     /* Bits per row is not divisible by 8 */
00340         bytes_per_row++ ;
00341     }
00342 
00343     while( bytes_per_row & 0x03 ){
00344     /* Bytes per row is not divisible by 4 */
00345         bytes_per_row++ ;
00346     }
00347 
00348     FileSize = bytes_per_row * ImageHeight + IMAGE_DATA_OFFSET_M ;
00349 }
00350 
00351 bool MicrosoftMonoBMP_RT::read()
00352 {
00353 /*
00354  * Method to read file data from file into the object 
00355  */
00356 
00357     bool ret_val = true ;
00358     unsigned int bytes_in=0;
00359     unsigned char *d_pointer;
00360     unsigned char pad;
00361     unsigned int line;
00362     unsigned int pixel;
00363 
00364     if((file_pnt = fopen(file_name,"rb"))==NULL){
00365     /* Could not open file */
00366         ret_val = false;
00367     }
00368     else{
00369     /* Read in header info */
00370         ret_val &= read_byte(&type1);
00371         ret_val &= read_byte(&type2);
00372         ret_val &= read_dword(&FileSize);
00373         ret_val &= read_dword(&reserved);
00374         ret_val &= read_dword(&data_off);
00375         ret_val &= read_dword(&head_size);
00376         ret_val &= read_dword(&ImageWidth);
00377         ret_val &= read_dword(&ImageHeight);
00378         ret_val &= read_word(&no_planes);
00379         ret_val &= read_word(&bits_per_pixel);
00380         ret_val &= read_dword(&comp_method);
00381         ret_val &= read_dword(&bitmap_size);
00382         ret_val &= read_dword(&HorizResolution);
00383         ret_val &= read_dword(&VertResolution);
00384         ret_val &= read_dword(&no_cols);
00385         ret_val &= read_dword(&no_sig_cols);
00386 
00387         /* Read in palette */
00388         ret_val &= read_byte(&pallete_false_b);
00389         ret_val &= read_byte(&pallete_false_g);
00390         ret_val &= read_byte(&pallete_false_r);
00391         ret_val &= read_byte(&pad);
00392         ret_val &= read_byte(&pallete_true_b);
00393         ret_val &= read_byte(&pallete_true_g);
00394         ret_val &= read_byte(&pallete_true_r);
00395         ret_val &= read_byte(&pad);
00396     }
00397     ret_val &= check_header_valid();
00398 
00399     if(ret_val){
00400     /* No problems so far */
00401        ret_val = allocate_storage();
00402     }
00403     if(ret_val){
00404     /* Read in data */
00405         d_pointer = (unsigned char *)raw_data ;
00406 
00407         for(line=0 ; line<ImageHeight && ret_val ; line ++){
00408  
00409             bytes_in = 0;
00410             for(pixel=0 ; pixel<ImageWidth / 8  && ret_val ; pixel ++){
00411                 ret_val &= read_byte(d_pointer++);
00412                 bytes_in++;
00413             }
00414 
00415             if(ImageWidth & 0xF){
00416             /* No of pixels is not divisible by 8 */
00417                 ret_val &= read_byte(d_pointer++);
00418                 bytes_in++;
00419             }
00420 
00421             while(bytes_in & 0x03){
00422             /* Discard padding */
00423                 ret_val &= read_byte(&pad);
00424                 bytes_in++;
00425             }
00426         }  
00427     }
00428 
00429     if( file_pnt == NULL ||
00430         fclose(file_pnt) == EOF ){
00431     /* Error closing file */
00432         ret_val = false ;
00433     }
00434     return ret_val;
00435 }
00436          
00437 bool MicrosoftMonoBMP_RT::check_header_valid()
00438 {
00439 /* 
00440  * Checks header of file is valid.
00441  */
00442 
00443     bool ret_val ;
00444 
00445     if( type1           != 'B'                  ||
00446         type2           != 'M'                  ||
00447         data_off        != IMAGE_DATA_OFFSET_M  ||
00448         head_size       != HEADER_SIZE_M        ||
00449         no_planes       != NO_OF_IMAGE_PLANES_M ||
00450         bits_per_pixel  != BITS_PER_PIXEL_M     ||           
00451         comp_method     != COMPRESSION_METHOD_M   ){
00452     /* Bitmap file header is invalid */
00453         ret_val = false ;
00454     }
00455     else{
00456         ret_val = true ;
00457     }
00458  
00459     return ret_val ;
00460 }
00461 
00462 #define NEXT_BIT bitmask = bitmask>>1; \
00463                  if(!bitmask) {bitmask=0x80 ; buff_pnt++;} 
00464                
00465 void MicrosoftMonoBMP_RT::extract_data(int *rgb)
00466 {
00467 /*
00468  * Converts raw data from raw_data to RGB in the buffer rgb.
00469  * Note: Also flips the image vertically as bitmaps are stored upsidedown.
00470  */
00471 
00472     unsigned int lines;
00473     unsigned int pixels;
00474     unsigned int bytes_read;
00475     char     *buff_pnt = raw_data;
00476     unsigned int p_off;
00477     unsigned int bytes_per_line;
00478     unsigned char bitmask = 0x80;
00479 
00480     bytes_per_line = ImageWidth / 8 ;
00481 
00482     if(ImageWidth & 0xF){
00483     /* Bits per line is not divisible by 8 */
00484         bytes_per_line++;
00485     }
00486    
00487     p_off = (ImageWidth*ImageHeight);
00488  
00489     for(lines=0 ; lines<ImageHeight ; lines ++){
00490     /* For each line in the image */
00491 
00492         if(bitmask != 0x80){
00493         /* We are in the middle of a byte */
00494             bitmask = 0x80 ;
00495             buff_pnt++;
00496         }
00497          
00498         /* Set pointer to beginning of previous line */
00499         p_off -= ImageWidth ;
00500 
00501         /* Loop through pixels in the line */
00502         for(pixels=0; pixels<ImageWidth ; pixels++){
00503 
00504             if(*buff_pnt & bitmask){
00505                 rgb[p_off*3] = pallete_true_r ;
00506                 rgb[p_off*3+1] = pallete_true_g ;
00507                 rgb[p_off*3+2] = pallete_true_b ;
00508 
00509             }
00510             else{
00511                 rgb[p_off*3] = pallete_false_r ;
00512                 rgb[p_off*3+1] = pallete_false_g ;
00513                 rgb[p_off*3+2] = pallete_false_b ;
00514             }
00515             NEXT_BIT
00516 
00517             p_off++;
00518         }
00519 
00520         /* Set pointer to beginning of current line */
00521         p_off -= ImageWidth ;
00522     }
00523 } 
00524 
00525 void MicrosoftMonoBMP_RT::extract_data_grey(int *grey)
00526 {
00527 /*
00528  * Converts raw data from raw_data to greyscale in the buffer grey.
00529  * Note: Also flips the image vertically as bitmaps are stored upsidedown.
00530  */
00531 
00532     unsigned int lines;
00533     unsigned int pixels;
00534     unsigned int bytes_read;
00535     char     *buff_pnt = raw_data;
00536     unsigned int p_off;
00537     unsigned int bytes_per_line;
00538     unsigned char bitmask = 0x80;
00539 
00540     bytes_per_line = ImageWidth / 8 ;
00541 
00542     if(ImageWidth & 0xF){
00543     /* Bits per line is not divisible by 8 */
00544         bytes_per_line++;
00545     }
00546 
00547     p_off = (ImageWidth*ImageHeight);
00548 
00549     for(lines=0 ; lines<ImageHeight ; lines ++){
00550     /* For each line in the image */
00551 
00552         if(bitmask != 0x80){
00553         /* We are in the middle of a byte */
00554             bitmask = 0x80 ;
00555             buff_pnt++;
00556         }
00557 
00558         /* Set pointer to beginning of previous line */
00559         p_off -= ImageWidth ;
00560 
00561         /* Loop through pixels in the line */
00562         for(pixels=0; pixels<ImageWidth ; pixels++){
00563 
00564             if(*buff_pnt & bitmask){
00565                 grey[p_off] = pallete_true_grey ;
00566 
00567             }
00568             else{
00569                 grey[p_off] = pallete_false_grey ;
00570             }
00571             NEXT_BIT
00572 
00573             p_off++;
00574         }
00575 
00576         /* Set pointer to beginning of current line */
00577         p_off -= ImageWidth ;
00578     }
00579 }
00580 
00581                
00582 void MicrosoftMonoBMP_RT::put_data(int *rgb)
00583 {
00584 /*
00585  * Converts RGB data from the buffer rgb to raw bitmap data 
00586  * which is stored in the buffer raw_data.
00587  * Note: Also flips the image vertically as bitmaps are stored upsidedown.
00588  */
00589 
00590     unsigned int lines;
00591     unsigned int pixels;
00592     char *buff_pnt = raw_data;
00593     unsigned int p_off;
00594     unsigned char bitmask = 0x80 ;
00595    
00596     p_off = (ImageWidth*ImageHeight);
00597  
00598     for(lines=0 ; lines<ImageHeight ; lines ++){
00599     /* For each line in the image */
00600 
00601         if(bitmask != 0x80){
00602         /* We are in the middle of a byte */
00603             bitmask = 0x80 ;
00604             buff_pnt++;
00605         }
00606 
00607         /* Set pointer to beginning of previous line */
00608         p_off -= ImageWidth ;
00609 
00610         /* Loop through pixels in the line */
00611         for(pixels=0; pixels<ImageWidth ; pixels++){
00612             if(rgb[p_off*3] || rgb[p_off*3+1] || rgb[p_off*3+2]){
00613             /* Any component is true */
00614                 *buff_pnt |= bitmask ;
00615             }
00616             else{
00617                 *buff_pnt &= ~bitmask ;
00618             }
00619             NEXT_BIT
00620             
00621             p_off++;
00622         }
00623 
00624         /* Set pointer to beginning of current line */
00625         p_off -= ImageWidth ;
00626     }
00627 } 
00628 
00629 void MicrosoftMonoBMP_RT::put_data_grey(int *grey)
00630 {
00631 /*
00632  * Converts greyscale data from the buffer grey to raw bitmap data  
00633  * which is stored in the buffer raw_data.
00634  * Note: Also flips the image vertically as bitmaps are stored upsidedown.
00635  */
00636 
00637     unsigned int lines;
00638     unsigned int pixels;
00639     char *buff_pnt = raw_data;
00640     unsigned int p_off;
00641     unsigned char bitmask = 0x80 ;
00642   
00643     p_off = (ImageWidth*ImageHeight);
00644 
00645     for(lines=0 ; lines<ImageHeight ; lines ++){
00646     /* For each line in the image */
00647 
00648         if(bitmask != 0x80){
00649         /* We are in the middle of a byte */
00650             bitmask = 0x80 ;
00651             buff_pnt++;
00652         }
00653 
00654         /* Set pointer to beginning of previous line */
00655         p_off -= ImageWidth ;
00656 
00657         /* Loop through pixels in the line */
00658         for(pixels=0; pixels<ImageWidth ; pixels++){
00659             if(grey[p_off]){
00660             /* Component is true */
00661                 *buff_pnt |= bitmask ;
00662             }
00663             else{
00664                 *buff_pnt &= ~bitmask ;
00665             }
00666             NEXT_BIT
00667 
00668             p_off++;
00669         }
00670 
00671         /* Set pointer to beginning of current line */
00672         p_off -= ImageWidth ;
00673     }
00674 } 
00675 
00676 
00677 bool MicrosoftMonoBMP_RT::write()
00678 {
00679 /*
00680  * Method to write file data to file from the object 
00681  */
00682 
00683     bool ret_val = true ;
00684     unsigned int bytes_in=0;
00685     char *d_pointer;
00686     char pad;
00687     unsigned int line;
00688     unsigned int pixel;
00689     if((file_pnt = fopen(file_name,"wb"))==NULL){
00690     /* Could not open file */
00691         ret_val = false;
00692     }
00693     else{
00694     /* Write header info */
00695         ret_val &= write_byte('B');
00696         ret_val &= write_byte('M');
00697         ret_val &= write_dword(FileSize);
00698         ret_val &= write_dword(0);
00699         ret_val &= write_dword(IMAGE_DATA_OFFSET_M);
00700         ret_val &= write_dword(HEADER_SIZE_M);
00701         ret_val &= write_dword(ImageWidth);
00702         ret_val &= write_dword(ImageHeight);
00703         ret_val &= write_word(NO_OF_IMAGE_PLANES_M);
00704         ret_val &= write_word(BITS_PER_PIXEL_M);
00705         ret_val &= write_dword(COMPRESSION_METHOD_M);
00706         ret_val &= write_dword(SIZE_OF_BITMAP_M);
00707         ret_val &= write_dword(HorizResolution);
00708         ret_val &= write_dword(VertResolution);
00709         ret_val &= write_dword(NO_COLOURS_USED_M);
00710         ret_val &= write_dword(NO_SIGNIFICANT_COLS_M);
00711 
00712         /* Write palette */
00713         ret_val &= write_byte(pallete_false_b);
00714         ret_val &= write_byte(pallete_false_g);
00715         ret_val &= write_byte(pallete_false_r);
00716         ret_val &= write_byte(0);
00717         ret_val &= write_byte(pallete_true_b);
00718         ret_val &= write_byte(pallete_true_g);
00719         ret_val &= write_byte(pallete_true_r);
00720         ret_val &= write_byte(0);
00721     }
00722 
00723     if(ret_val){
00724     /* Write data */
00725     
00726         d_pointer = raw_data ;
00727 
00728         for(line=0 ; line<ImageHeight && ret_val ; line ++){
00729  
00730             bytes_in = 0;
00731             for(pixel=0 ; pixel<ImageWidth/8 && ret_val ; pixel ++){
00732                 ret_val &= write_byte(*(d_pointer++));
00733                 bytes_in++;
00734             }
00735 
00736             if(ImageWidth & 0xF){
00737             /* No of pixels is not divisible by 8 */
00738                 ret_val &= write_byte(*(d_pointer++));
00739                 bytes_in++;
00740             }
00741 
00742             while(bytes_in & 0x03){
00743             /* Pad with zeros */
00744                 ret_val &= write_byte(0);
00745                 bytes_in++;
00746             }
00747         }  
00748     }
00749 
00750     if( file_pnt == NULL ||
00751         fclose(file_pnt) == EOF ){
00752     /* Error closing file */
00753         ret_val = false ;
00754     }
00755 
00756     return ret_val;
00757 }
00758          

Generated at Fri Aug 13 17:29:21 2004 for libRTImage by doxygen1.2.8.1 written by Dimitri van Heesch, © 1997-2001