vil_pixel_format.cxx
Go to the documentation of this file.
1 // This is core/vil/vil_pixel_format.cxx
2 #include <complex>
3 #include <string>
4 #include "vil_pixel_format.h"
5 //:
6 // \file
7 // \author Ian Scott.
8 //
9 // \verbatim
10 // Modifications
11 // 23 Oct.2003 - Peter Vanroose - Added support for 64-bit int pixels
12 // \endverbatim
13 
14 #include <cassert>
15 #ifdef _MSC_VER
16 # include <vcl_msvc_warnings.h>
17 #endif
18 
19 static unsigned component_size[] =
20 {
21  0, // VIL_PIXEL_FORMAT_UNKNOWN
22 
23 #if VXL_HAS_INT_64
24  sizeof(vxl_uint_64), // VIL_PIXEL_FORMAT_UINT_64
25  sizeof(vxl_int_64), // VIL_PIXEL_FORMAT_INT_64
26 #else
27  0, // VIL_PIXEL_FORMAT_UINT_64
28  0, // VIL_PIXEL_FORMAT_INT_64
29 #endif
30  sizeof(vxl_uint_32), // VIL_PIXEL_FORMAT_UINT_32
31  sizeof(vxl_int_32), // VIL_PIXEL_FORMAT_INT_32
32  sizeof(vxl_uint_16), // VIL_PIXEL_FORMAT_UINT_16
33  sizeof(vxl_int_16), // VIL_PIXEL_FORMAT_INT_16
34  sizeof(vxl_byte), // VIL_PIXEL_FORMAT_BYTE
35  sizeof(vxl_sbyte), // VIL_PIXEL_FORMAT_SBYTE
36  sizeof(float), // VIL_PIXEL_FORMAT_FLOAT
37  sizeof(double), // VIL_PIXEL_FORMAT_DOUBLE
38  0, // VIL_PIXEL_FORMAT_LONG_DOUBLE
39  sizeof(bool), // VIL_PIXEL_FORMAT_BOOL
40 
41 #if VXL_HAS_INT_64
42  sizeof(vxl_uint_64), // VIL_PIXEL_FORMAT_RGB_UINT_64
43  sizeof(vxl_int_64), // VIL_PIXEL_FORMAT_RGB_INT_64
44 #else
45  0, // VIL_PIXEL_FORMAT_RGB_UINT_64
46  0, // VIL_PIXEL_FORMAT_RGB_INT_64
47 #endif
48  sizeof(vxl_uint_32), // VIL_PIXEL_FORMAT_RGB_UINT_32
49  sizeof(vxl_int_32), // VIL_PIXEL_FORMAT_RGB_INT_32
50  sizeof(vxl_uint_16), // VIL_PIXEL_FORMAT_RGB_UINT_16
51  sizeof(vxl_int_16), // VIL_PIXEL_FORMAT_RGB_INT_16
52  sizeof(vxl_byte), // VIL_PIXEL_FORMAT_RGB_BYTE
53  sizeof(vxl_sbyte), // VIL_PIXEL_FORMAT_RGB_SBYTE
54  sizeof(float), // VIL_PIXEL_FORMAT_RGB_FLOAT
55  sizeof(double), // VIL_PIXEL_FORMAT_RGB_DOUBLE
56  0, // VIL_PIXEL_FORMAT_RGB_LONG_DOUBLE
57 
58 #if VXL_HAS_INT_64
59  sizeof(vxl_uint_64), // VIL_PIXEL_FORMAT_RGBA_UINT_64
60  sizeof(vxl_int_64), // VIL_PIXEL_FORMAT_RGBA_INT_64
61 #else
62  0, // VIL_PIXEL_FORMAT_RGBA_UINT_64
63  0, // VIL_PIXEL_FORMAT_RGBA_INT_64
64 #endif
65  sizeof(vxl_uint_32), // VIL_PIXEL_FORMAT_RGBA_UINT_32
66  sizeof(vxl_int_32), // VIL_PIXEL_FORMAT_RGBA_INT_32
67  sizeof(vxl_uint_16), // VIL_PIXEL_FORMAT_RGBA_UINT_16
68  sizeof(vxl_int_16), // VIL_PIXEL_FORMAT_RGBA_INT_16
69  sizeof(vxl_byte), // VIL_PIXEL_FORMAT_RGBA_BYTE
70  sizeof(vxl_sbyte), // VIL_PIXEL_FORMAT_RGBA_SBYTE
71  sizeof(float), // VIL_PIXEL_FORMAT_RGBA_FLOAT
72  0, // VIL_PIXEL_FORMAT_RGBA_LONG_DOUBLE
73 
74  sizeof(std::complex<float>), // VIL_PIXEL_FORMAT_COMPLEX_FLOAT
75  sizeof(std::complex<double>), // VIL_PIXEL_FORMAT_COMPLEX_DOUBLE
76 };
77 
78 
79 static unsigned num_components[] =
80 {
81  0, // VIL_PIXEL_FORMAT_UNKNOWN
82 
83 #if VXL_HAS_INT_64
84  1, // VIL_PIXEL_FORMAT_UINT_64
85  1, // VIL_PIXEL_FORMAT_INT_64
86 #else
87  0, // VIL_PIXEL_FORMAT_UINT_64
88  0, // VIL_PIXEL_FORMAT_INT_64
89 #endif
90  1, // VIL_PIXEL_FORMAT_UINT_32
91  1, // VIL_PIXEL_FORMAT_INT_32
92  1, // VIL_PIXEL_FORMAT_UINT_16
93  1, // VIL_PIXEL_FORMAT_INT_16
94  1, // VIL_PIXEL_FORMAT_BYTE
95  1, // VIL_PIXEL_FORMAT_SBYTE
96  1, // VIL_PIXEL_FORMAT_FLOAT
97  1, // VIL_PIXEL_FORMAT_DOUBLE
98  0, // VIL_PIXEL_FORMAT_LONG_DOUBLE
99  1, // VIL_PIXEL_FORMAT_BOOL
100 
101 #if VXL_HAS_INT_64
102  3, // VIL_PIXEL_FORMAT_RGB_UINT_64
103  3, // VIL_PIXEL_FORMAT_RGB_INT_64
104 #else
105  0, // VIL_PIXEL_FORMAT_RGB_UINT_64
106  0, // VIL_PIXEL_FORMAT_RGB_INT_64
107 #endif
108  3, // VIL_PIXEL_FORMAT_RGB_UINT_32
109  3, // VIL_PIXEL_FORMAT_RGB_INT_32
110  3, // VIL_PIXEL_FORMAT_RGB_UINT_16
111  3, // VIL_PIXEL_FORMAT_RGB_INT_16
112  3, // VIL_PIXEL_FORMAT_RGB_BYTE
113  3, // VIL_PIXEL_FORMAT_RGB_SBYTE
114  3, // VIL_PIXEL_FORMAT_RGB_FLOAT
115  3, // VIL_PIXEL_FORMAT_RGB_DOUBLE
116  0, // VIL_PIXEL_FORMAT_RGB_LONG_DOUBLE
117 
118 #if VXL_HAS_INT_64
119  4, // VIL_PIXEL_FORMAT_RGBA_UINT_64
120  4, // VIL_PIXEL_FORMAT_RGBA_INT_64
121 #else
122  0, // VIL_PIXEL_FORMAT_RGBA_UINT_64
123  0, // VIL_PIXEL_FORMAT_RGBA_INT_64
124 #endif
125  4, // VIL_PIXEL_FORMAT_RGBA_UINT_32
126  4, // VIL_PIXEL_FORMAT_RGBA_INT_32
127  4, // VIL_PIXEL_FORMAT_RGBA_UINT_16
128  4, // VIL_PIXEL_FORMAT_RGBA_INT_16
129  4, // VIL_PIXEL_FORMAT_RGBA_BYTE
130  4, // VIL_PIXEL_FORMAT_RGBA_SBYTE
131  4, // VIL_PIXEL_FORMAT_RGBA_FLOAT
132  4, // VIL_PIXEL_FORMAT_RGBA_DOUBLE
133  0, // VIL_PIXEL_FORMAT_RGBA_LONG_DOUBLE
134 
135  1, // VIL_PIXEL_FORMAT_COMPLEX_FLOAT
136  1, // VIL_PIXEL_FORMAT_COMPLEX_DOUBLE
137 };
138 
139 
140 static vil_pixel_format component_format[] =
141 {
142  VIL_PIXEL_FORMAT_UNKNOWN, // VIL_PIXEL_FORMAT_UNKNOWN
143 
144 #if VXL_HAS_INT_64
145  VIL_PIXEL_FORMAT_UINT_64, // VIL_PIXEL_FORMAT_UINT_64
146  VIL_PIXEL_FORMAT_INT_64, // VIL_PIXEL_FORMAT_INT_64
147 #else
148  VIL_PIXEL_FORMAT_UNKNOWN, // VIL_PIXEL_FORMAT_UINT_64
149  VIL_PIXEL_FORMAT_UNKNOWN, // VIL_PIXEL_FORMAT_INT_64
150 #endif
151  VIL_PIXEL_FORMAT_UINT_32, // VIL_PIXEL_FORMAT_UINT_32
152  VIL_PIXEL_FORMAT_INT_32, // VIL_PIXEL_FORMAT_INT_32
153  VIL_PIXEL_FORMAT_UINT_16, // VIL_PIXEL_FORMAT_UINT_16
154  VIL_PIXEL_FORMAT_INT_16, // VIL_PIXEL_FORMAT_INT_16
155  VIL_PIXEL_FORMAT_BYTE, // VIL_PIXEL_FORMAT_BYTE
156  VIL_PIXEL_FORMAT_SBYTE, // VIL_PIXEL_FORMAT_SBYTE
157  VIL_PIXEL_FORMAT_FLOAT, // VIL_PIXEL_FORMAT_FLOAT
158  VIL_PIXEL_FORMAT_DOUBLE, // VIL_PIXEL_FORMAT_DOUBLE
159  VIL_PIXEL_FORMAT_UNKNOWN, // VIL_PIXEL_FORMAT_LONG_DOUBLE
160  VIL_PIXEL_FORMAT_BOOL, // VIL_PIXEL_FORMAT_BOOL
161 
162 #if VXL_HAS_INT_64
163  VIL_PIXEL_FORMAT_UINT_64, // VIL_PIXEL_FORMAT_RGB_UINT_64
164  VIL_PIXEL_FORMAT_INT_64, // VIL_PIXEL_FORMAT_RGB_INT_64
165 #else
166  VIL_PIXEL_FORMAT_UNKNOWN, // VIL_PIXEL_FORMAT_RGB_UINT_64
167  VIL_PIXEL_FORMAT_UNKNOWN, // VIL_PIXEL_FORMAT_RGB_INT_64
168 #endif
169  VIL_PIXEL_FORMAT_UINT_32, // VIL_PIXEL_FORMAT_RGB_UINT_32
170  VIL_PIXEL_FORMAT_INT_32, // VIL_PIXEL_FORMAT_RGB_INT_32
171  VIL_PIXEL_FORMAT_UINT_16, // VIL_PIXEL_FORMAT_RGB_UINT_16
172  VIL_PIXEL_FORMAT_INT_16, // VIL_PIXEL_FORMAT_RGB_INT_16
173  VIL_PIXEL_FORMAT_BYTE, // VIL_PIXEL_FORMAT_RGB_BYTE
174  VIL_PIXEL_FORMAT_SBYTE, // VIL_PIXEL_FORMAT_RGB_SBYTE
175  VIL_PIXEL_FORMAT_FLOAT, // VIL_PIXEL_FORMAT_RGB_FLOAT
176  VIL_PIXEL_FORMAT_DOUBLE, // VIL_PIXEL_FORMAT_RGB_DOUBLE
177  VIL_PIXEL_FORMAT_UNKNOWN, // VIL_PIXEL_FORMAT_RGB_LONG_DOUBLE
178 
179 #if VXL_HAS_INT_64
180  VIL_PIXEL_FORMAT_UINT_64, // VIL_PIXEL_FORMAT_RGBA_UINT_64
181  VIL_PIXEL_FORMAT_INT_64, // VIL_PIXEL_FORMAT_RGBA_INT_64
182 #else
183  VIL_PIXEL_FORMAT_UNKNOWN, // VIL_PIXEL_FORMAT_RGBA_UINT_64
184  VIL_PIXEL_FORMAT_UNKNOWN, // VIL_PIXEL_FORMAT_RGBA_INT_64
185 #endif
186  VIL_PIXEL_FORMAT_UINT_32, // VIL_PIXEL_FORMAT_RGBA_UINT_32
187  VIL_PIXEL_FORMAT_INT_32, // VIL_PIXEL_FORMAT_RGBA_INT_32
188  VIL_PIXEL_FORMAT_UINT_16, // VIL_PIXEL_FORMAT_RGBA_UINT_16
189  VIL_PIXEL_FORMAT_INT_16, // VIL_PIXEL_FORMAT_RGBA_INT_16
190  VIL_PIXEL_FORMAT_BYTE, // VIL_PIXEL_FORMAT_RGBA_BYTE
191  VIL_PIXEL_FORMAT_SBYTE, // VIL_PIXEL_FORMAT_RGBA_SBYTE
192  VIL_PIXEL_FORMAT_FLOAT, // VIL_PIXEL_FORMAT_RGBA_FLOAT
193  VIL_PIXEL_FORMAT_DOUBLE, // VIL_PIXEL_FORMAT_RGBA_DOUBLE
194  VIL_PIXEL_FORMAT_UNKNOWN, // VIL_PIXEL_FORMAT_RGBA_LONG_DOUBLE
195 
196  VIL_PIXEL_FORMAT_COMPLEX_FLOAT, // VIL_PIXEL_FORMAT_COMPLEX_FLOAT
197  VIL_PIXEL_FORMAT_COMPLEX_DOUBLE,// VIL_PIXEL_FORMAT_COMPLEX_DOUBLE
198 };
199 
200 
201 //: Return the number of bytes used by each component of pixel format f
203 {
205  return component_size[f];
206 }
207 
208 //: Return the number of components in pixel format f
210 {
212  return num_components[f];
213 }
214 
215 
216 //: Return the number of components in pixel format f
218 {
220  return component_format[f];
221 }
222 
223 
224 //: output a pretty string representing the pixel format.
225 std::ostream & operator << (std::ostream &os, vil_pixel_format f)
226 {
227  switch (f)
228  {
229  case VIL_PIXEL_FORMAT_UNKNOWN: os << "VIL_PIXEL_FORMAT_UNKNOWN"; break;
230 
231 #if VXL_HAS_INT_64
232  case VIL_PIXEL_FORMAT_UINT_64: os << "vxl_uint_64"; break;
233  case VIL_PIXEL_FORMAT_INT_64: os << "vxl_int_64"; break;
234 #endif
235  case VIL_PIXEL_FORMAT_UINT_32: os << "vxl_uint_32"; break;
236  case VIL_PIXEL_FORMAT_INT_32: os << "vxl_int_32"; break;
237  case VIL_PIXEL_FORMAT_UINT_16: os << "vxl_uint_16"; break;
238  case VIL_PIXEL_FORMAT_INT_16: os << "vxl_int_16"; break;
239  case VIL_PIXEL_FORMAT_BYTE: os << "vxl_byte"; break;
240  case VIL_PIXEL_FORMAT_SBYTE: os << "vxl_sbyte"; break;
241  case VIL_PIXEL_FORMAT_FLOAT: os << "float"; break;
242  case VIL_PIXEL_FORMAT_DOUBLE: os << "double"; break;
243  case VIL_PIXEL_FORMAT_BOOL: os << "bool"; break;
244 
245 #if VXL_HAS_INT_64
246  case VIL_PIXEL_FORMAT_RGB_INT_64: os << "vil_rgb<vxl_int_64>"; break;
247  case VIL_PIXEL_FORMAT_RGB_UINT_64: os << "vil_rgb<vxl_uint_64>"; break;
248 #endif
249  case VIL_PIXEL_FORMAT_RGB_INT_32: os << "vil_rgb<vxl_int_32>"; break;
250  case VIL_PIXEL_FORMAT_RGB_UINT_32: os << "vil_rgb<vxl_uint_32>"; break;
251  case VIL_PIXEL_FORMAT_RGB_INT_16: os << "vil_rgb<vxl_int_16>"; break;
252  case VIL_PIXEL_FORMAT_RGB_UINT_16: os << "vil_rgb<vxl_uint_16>"; break;
253  case VIL_PIXEL_FORMAT_RGB_BYTE: os << "vil_rgb<vxl_byte>"; break;
254  case VIL_PIXEL_FORMAT_RGB_SBYTE: os << "vil_rgb<vxl_sbyte>"; break;
255  case VIL_PIXEL_FORMAT_RGB_FLOAT: os << "vil_rgb<float>"; break;
256  case VIL_PIXEL_FORMAT_RGB_DOUBLE: os << "vil_rgb<double>"; break;
257 
258 #if VXL_HAS_INT_64
259  case VIL_PIXEL_FORMAT_RGBA_INT_64: os << "vil_rgba<vxl_int_64>"; break;
260  case VIL_PIXEL_FORMAT_RGBA_UINT_64: os << "vil_rgba<vxl_uint_64>"; break;
261 #endif
262  case VIL_PIXEL_FORMAT_RGBA_INT_32: os << "vil_rgba<vxl_int_32>"; break;
263  case VIL_PIXEL_FORMAT_RGBA_UINT_32: os << "vil_rgba<vxl_uint_32>"; break;
264  case VIL_PIXEL_FORMAT_RGBA_INT_16: os << "vil_rgba<vxl_int_16>"; break;
265  case VIL_PIXEL_FORMAT_RGBA_UINT_16: os << "vil_rgba<vxl_uint_16>"; break;
266  case VIL_PIXEL_FORMAT_RGBA_BYTE: os << "vil_rgba<vxl_byte>"; break;
267  case VIL_PIXEL_FORMAT_RGBA_SBYTE: os << "vil_rgba<vxl_sbyte>"; break;
268  case VIL_PIXEL_FORMAT_RGBA_FLOAT: os << "vil_rgba<float>"; break;
269  case VIL_PIXEL_FORMAT_RGBA_DOUBLE: os << "vil_rgba<double>"; break;
270 
271  case VIL_PIXEL_FORMAT_COMPLEX_FLOAT: os << "complex<float>"; break;
272  case VIL_PIXEL_FORMAT_COMPLEX_DOUBLE: os << "complex<double>"; break;
273 
274  default: os << "VIL_PIXEL_FORMAT_INVALID"; break;
275  }
276  return os;
277 }
278 
279 
280 //: Convert a string into a pixel format.
281 // This uses the same encoding as operator<<.
283 {
284  std::string str(s);
285  if (str == "VIL_PIXEL_FORMAT_UNKNOWN") return VIL_PIXEL_FORMAT_UNKNOWN;
286 #if VXL_HAS_INT_64
287  if (str == "vxl_uint_64") return VIL_PIXEL_FORMAT_UINT_64;
288  if (str == "vxl_int_64") return VIL_PIXEL_FORMAT_INT_64;
289 #endif
290  if (str == "vxl_uint_32") return VIL_PIXEL_FORMAT_UINT_32;
291  if (str == "vxl_int_32") return VIL_PIXEL_FORMAT_INT_32;
292  if (str == "vxl_uint_16") return VIL_PIXEL_FORMAT_UINT_16;
293  if (str == "vxl_int_16") return VIL_PIXEL_FORMAT_INT_16;
294  if (str == "vxl_byte") return VIL_PIXEL_FORMAT_BYTE;
295  if (str == "vxl_sbyte") return VIL_PIXEL_FORMAT_SBYTE;
296  if (str == "float") return VIL_PIXEL_FORMAT_FLOAT;
297  if (str == "double") return VIL_PIXEL_FORMAT_DOUBLE;
298  if (str == "bool") return VIL_PIXEL_FORMAT_BOOL;
299 
300 #if VXL_HAS_INT_64
301  if (str == "vil_rgb<vxl_int_64>") return VIL_PIXEL_FORMAT_RGB_INT_64;
302  if (str == "vil_rgb<vxl_uint_64>") return VIL_PIXEL_FORMAT_RGB_UINT_64;
303 #endif
304  if (str == "vil_rgb<vxl_int_32>") return VIL_PIXEL_FORMAT_RGB_INT_32;
305  if (str == "vil_rgb<vxl_uint_32>") return VIL_PIXEL_FORMAT_RGB_UINT_32;
306  if (str == "vil_rgb<vxl_int_16>") return VIL_PIXEL_FORMAT_RGB_INT_16;
307  if (str == "vil_rgb<vxl_uint_16>") return VIL_PIXEL_FORMAT_RGB_UINT_16;
308  if (str == "vil_rgb<vxl_byte>") return VIL_PIXEL_FORMAT_RGB_BYTE;
309  if (str == "vil_rgb<vxl_sbyte>") return VIL_PIXEL_FORMAT_RGB_SBYTE;
310  if (str == "vil_rgb<float>") return VIL_PIXEL_FORMAT_RGB_FLOAT;
311  if (str == "vil_rgb<double>") return VIL_PIXEL_FORMAT_RGB_DOUBLE;
312 
313 #if VXL_HAS_INT_64
314  if (str == "vil_rgba<vxl_int_64>") return VIL_PIXEL_FORMAT_RGBA_INT_64;
315  if (str == "vil_rgba<vxl_uint_64>") return VIL_PIXEL_FORMAT_RGBA_UINT_64;
316 #endif
317  if (str == "vil_rgba<vxl_int_32>") return VIL_PIXEL_FORMAT_RGBA_INT_32;
318  if (str == "vil_rgba<vxl_uint_32>") return VIL_PIXEL_FORMAT_RGBA_UINT_32;
319  if (str == "vil_rgba<vxl_int_16>") return VIL_PIXEL_FORMAT_RGBA_INT_16;
320  if (str == "vil_rgba<vxl_uint_16>") return VIL_PIXEL_FORMAT_RGBA_UINT_16;
321  if (str == "vil_rgba<vxl_byte>") return VIL_PIXEL_FORMAT_RGBA_BYTE;
322  if (str == "vil_rgba<vxl_sbyte>") return VIL_PIXEL_FORMAT_RGBA_SBYTE;
323  if (str == "vil_rgba<float>") return VIL_PIXEL_FORMAT_RGBA_FLOAT;
324  if (str == "vil_rgba<double>") return VIL_PIXEL_FORMAT_RGBA_DOUBLE;
325 
326  if (str == "complex<float>") return VIL_PIXEL_FORMAT_COMPLEX_FLOAT;
327  if (str == "complex<double>") return VIL_PIXEL_FORMAT_COMPLEX_DOUBLE;
328 
330 }
vil_pixel_format
Describes the type of the concrete data.
vil_pixel_format vil_pixel_format_component_format(enum vil_pixel_format f)
Return the number of components in pixel format f.
std::complex<float> is a scalar for vil's purposes.
unsigned vil_pixel_format_sizeof_components(enum vil_pixel_format f)
Return the number of bytes used by each component of pixel format f.
unsigned vil_pixel_format_num_components(enum vil_pixel_format f)
Return the number of components in pixel format f.
vil_pixel_format vil_pixel_format_from_string(const char *s)
Convert a string into a pixel format.
std::ostream & operator<<(std::ostream &os, vil_pixel_format f)
output a pretty string representing the pixel format.
std::complex<double> is a scalar for vil's purposes.