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)164 vil_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()175 vil_file_format::all()
176 {
177   static vil_file_format_storage storage;
178   return storage.l;
179 }
180