1 // This is core/vil/vil_file_format.cxx 2 //: 3 // \file 4 #include <cstdlib> 5 #include "vil_file_format.h" 6 7 vil_file_format::~vil_file_format() = default; 8 9 #ifdef _MSC_VER 10 # include "vcl_msvc_warnings.h" 11 #endif 12 #include <vil/vil_config.h> // for list of configured file formats 13 #include "vil/vil_exception.h" 14 15 #if HAS_PNM 16 # include <vil/file_formats/vil_pnm.h> 17 #endif 18 19 #if HAS_IRIS 20 # include <vil/file_formats/vil_iris.h> 21 #endif 22 23 #if HAS_MIT 24 # include <vil/file_formats/vil_mit.h> 25 #endif 26 27 #if HAS_VIFF 28 # include <vil/file_formats/vil_viff.h> 29 #endif 30 31 #if HAS_PNG 32 # include <vil/file_formats/vil_png.h> 33 #endif 34 35 #if HAS_JPEG 36 # include <vil/file_formats/vil_jpeg.h> 37 #endif 38 39 #if HAS_TIFF 40 # include <vil/file_formats/vil_tiff.h> 41 # include <vil/file_formats/vil_pyramid_image_list.h> 42 #endif 43 44 #if HAS_BMP 45 # include <vil/file_formats/vil_bmp.h> 46 #endif 47 48 #if HAS_GIF 49 # include <vil/file_formats/vil_gif.h> 50 #endif 51 52 #if HAS_RAS 53 # include <vil/file_formats/vil_ras.h> 54 #endif 55 56 #if HAS_GEN 57 # include <vil/file_formats/vil_gen.h> 58 #endif 59 60 #if HAS_DCMTK 61 # include <vil/file_formats/vil_dicom.h> 62 #endif 63 64 #if HAS_NITF 65 # include <vil/file_formats/vil_nitf2_image.h> 66 #endif 67 68 #if HAS_J2K 69 # include <vil/file_formats/vil_j2k_image.h> 70 #endif 71 72 #if HAS_OPENJPEG2 73 # include <vil/file_formats/vil_openjpeg.h> 74 #endif 75 76 #if HAS_SGI 77 # include <vil/file_formats/vil_sgi.h> 78 #endif 79 80 // constexpr unsigned MAX_FILE_FORMATS = 256; 81 //: Local class to hold file format list 82 // Clears list on deletion. 83 struct vil_file_format_storage 84 { 85 std::list<vil_file_format *> l; vil_file_format_storagevil_file_format_storage86 vil_file_format_storage() 87 { 88 #if HAS_JPEG 89 l.push_back(new vil_jpeg_file_format); 90 #endif 91 #if HAS_PNG 92 l.push_back(new vil_png_file_format); 93 #endif 94 #if HAS_PNM 95 l.push_back(new vil_pnm_file_format); 96 l.push_back(new vil_pbm_file_format); 97 l.push_back(new vil_pgm_file_format); 98 l.push_back(new vil_ppm_file_format); 99 #endif 100 #if HAS_IRIS 101 l.push_back(new vil_iris_file_format); 102 #endif 103 #if HAS_MIT 104 l.push_back(new vil_mit_file_format); 105 #endif 106 #if HAS_VIFF 107 l.push_back(new vil_viff_file_format); 108 #endif 109 #if HAS_BMP 110 l.push_back(new vil_bmp_file_format); 111 #endif 112 #if HAS_GIF 113 l.push_back(new vil_gif_file_format); 114 #endif 115 #if HAS_RAS 116 l.push_back(new vil_ras_file_format); 117 #endif 118 #if HAS_GEN 119 l.push_back(new vil_gen_file_format); 120 #endif 121 // the DCMTK based reader is more complete, so use try that 122 // before the vil implementation 123 #if HAS_DCMTK 124 l.push_back(new vil_dicom_file_format); 125 #endif 126 127 #if HAS_NITF 128 l.push_back(new vil_nitf2_file_format); 129 #endif 130 131 #if HAS_J2K 132 l.push_back(new vil_j2k_file_format); 133 #endif 134 135 #if HAS_OPENJPEG2 136 l.push_back(new vil_openjpeg_jp2_file_format); 137 l.push_back(new vil_openjpeg_j2k_file_format); 138 #endif 139 140 #if HAS_TIFF 141 l.push_back(new vil_tiff_file_format); 142 l.push_back(new vil_pyramid_image_list_format); 143 #endif 144 145 #if HAS_SGI 146 l.push_back(new vil_sgi_file_format); 147 #endif 148 } 149 ~vil_file_format_storagevil_file_format_storage150 ~vil_file_format_storage() 151 { 152 for (auto & i : l) 153 { 154 if (i) 155 { 156 delete i; 157 } 158 } 159 } 160 }; 161 162 //: The function will take ownership of ff; 163 void add_file_format(vil_file_format * ff)164vil_file_format::add_file_format(vil_file_format * ff) 165 { 166 std::list<vil_file_format *> & l = all(); 167 168 // Always add runtime-loaded formats to the front to allow them to replace 169 // built-in formats 170 l.push_front(ff); 171 } 172 173 174 std::list<vil_file_format *> & all()175vil_file_format::all() 176 { 177 static vil_file_format_storage storage; 178 return storage.l; 179 } 180