1 // This is core/vil/vil_print.h
2 #ifndef vil_print_h_
3 #define vil_print_h_
4 //:
5 // \file
6 // \author Ian Scott, Tim Cootes.
7 
8 #include <iomanip>
9 #include <iostream>
10 #include "vil_image_view.h"
11 #ifdef _MSC_VER
12 #  include <vcl_msvc_warnings.h>
13 #endif
14 
15 //: How to print value in vil_print_all(image_view)
16 // \relatesalso vil_image_view
17 template<class T>
18 void vil_print_value(std::ostream& s, const T& value, unsigned=0);
19 
20 // Specializations must be declared before use, so they need to be
21 // declared here.
22 
23 #ifndef DOXYGEN_SHOULD_SKIP_THIS
24 
25 #define vil_print_declare_specialization( T ) \
26   template <> \
27   void vil_print_value(std::ostream& os, const T & value, unsigned)
28 
29 vil_print_declare_specialization( bool );
30 vil_print_declare_specialization( vxl_byte );
31 vil_print_declare_specialization( vxl_sbyte );
32 vil_print_declare_specialization( vxl_int_16 );
33 vil_print_declare_specialization( vxl_uint_16 );
34 vil_print_declare_specialization( vxl_int_32 );
35 vil_print_declare_specialization( vxl_uint_32 );
36 #if VXL_HAS_INT_64
37 vil_print_declare_specialization( vxl_int_64 );
38 vil_print_declare_specialization( vxl_uint_64 );
39 #endif
40 vil_print_declare_specialization( float );
41 vil_print_declare_specialization( double );
42 vil_print_declare_specialization( std::complex<float> );
43 vil_print_declare_specialization( std::complex<double> );
44 vil_print_declare_specialization( vil_rgb<vxl_byte> );
45 vil_print_declare_specialization( vil_rgb<vxl_sbyte> );
46 vil_print_declare_specialization( vil_rgb<vxl_int_16> );
47 vil_print_declare_specialization( vil_rgb<vxl_uint_16> );
48 vil_print_declare_specialization( vil_rgb<vxl_int_32> );
49 vil_print_declare_specialization( vil_rgb<vxl_uint_32> );
50 #if VXL_HAS_INT_64
51 vil_print_declare_specialization( vil_rgb<vxl_int_64> );
52 vil_print_declare_specialization( vil_rgb<vxl_uint_64> );
53 #endif
54 vil_print_declare_specialization( vil_rgb<float> );
55 vil_print_declare_specialization( vil_rgb<double> );
56 vil_print_declare_specialization( vil_rgba<vxl_byte> );
57 vil_print_declare_specialization( vil_rgba<vxl_sbyte> );
58 vil_print_declare_specialization( vil_rgba<vxl_int_16> );
59 vil_print_declare_specialization( vil_rgba<vxl_uint_16> );
60 vil_print_declare_specialization( vil_rgba<vxl_int_32> );
61 vil_print_declare_specialization( vil_rgba<vxl_uint_32> );
62 #if VXL_HAS_INT_64
63 vil_print_declare_specialization( vil_rgba<vxl_int_64> );
64 vil_print_declare_specialization( vil_rgba<vxl_uint_64> );
65 #endif
66 vil_print_declare_specialization( vil_rgba<float> );
67 vil_print_declare_specialization( vil_rgba<double> );
68 
69 #undef vil_print_declare_specialization
70 
71 #endif // DOXYGEN_SHOULD_SKIP_THIS
72 
73 
74 //: Print all image data to os in a grid (rounds output to int)
75 // \relatesalso vil_image_view
76 template<class T>
77 inline void vil_print_all(std::ostream& os,const vil_image_view<T>& view, unsigned width=0)
78 {
79   if (!width) width = static_cast<unsigned>(os.width());
80   os<<view.is_a()<<' '<<view.nplanes()<<" planes, each "<<view.ni()<<" x "<<view.nj()
81     <<" istep: "<<(int)view.istep()<<' '
82     <<" jstep: "<<(int)view.jstep()<<' '
83     <<" planestep: "<<(int)view.planestep()<<'\n' << std::flush;
84   for (unsigned int p=0;p<view.nplanes();++p)
85   {
86     if (view.nplanes()>1) os<<"Plane "<<p<<":\n" << std::flush;
87     for (unsigned int j=0;j<view.nj();++j)
88     {
89       for (unsigned int i=0;i<view.ni();++i)
90       {
91         os<<' '<<std::setw(width);
92         vil_print_value(os,view(i,j,p), width);
93       }
94       os<<'\n'<<std::flush;
95     }
96   }
97 }
98 
99 //: Print all image data to os in a grid
100 // \relatesalso vil_image_view
101 void vil_print_all(std::ostream& os, vil_image_view_base_sptr const& view);
102 
103 #endif // vil_print_h_
104