core/vil/vil_print.cxx
Go to the documentation of this file.
00001 // This is core/vil/vil_print.cxx
00002 #include "vil_print.h"
00003 //:
00004 // \file
00005 // \brief Various functions for manipulating image views
00006 // \author Tim Cootes - Manchester
00007 //
00008 // \verbatim
00009 //  Modifications
00010 //   23 Oct.2003 - Peter Vanroose - Added support for 64-bit int pixels
00011 // \endvarbatim
00012 
00013 #include <vxl_config.h> // for vxl_uint_32 etc.
00014 #include <vcl_complex.h>
00015 #include <vil/vil_rgb.h>
00016 #include <vil/vil_rgba.h>
00017 
00018 //: Explicit overload for bool
00019 VCL_DEFINE_SPECIALIZATION
00020 void vil_print_value(vcl_ostream& os, const bool& value)
00021 {
00022   os<<int(value);
00023 }
00024 
00025 //: Explicit overload for byte
00026 VCL_DEFINE_SPECIALIZATION
00027 void vil_print_value(vcl_ostream& os, const vxl_byte& value)
00028 {
00029   os.width(3);
00030   os<<int(value);
00031 }
00032 
00033 //: Explicit overload for signed byte
00034 VCL_DEFINE_SPECIALIZATION
00035 void vil_print_value(vcl_ostream& os, const vxl_sbyte& value)
00036 {
00037   os.width(3);
00038   os<<int(value);
00039 }
00040 
00041 //: Explicit overload for short
00042 VCL_DEFINE_SPECIALIZATION
00043 void vil_print_value(vcl_ostream& os, const vxl_int_16& value)
00044 {
00045   int v=value;
00046   if (v<0) { v=-v; os<<'-'; } else os<<' ';
00047   if (v<10)    os<<'0';
00048   if (v<100)   os<<'0';
00049   if (v<1000)  os<<'0';
00050   if (v<10000) os<<'0';
00051   os<<v;
00052 }
00053 
00054 //: Explicit overload for unsigned short
00055 VCL_DEFINE_SPECIALIZATION
00056 void vil_print_value(vcl_ostream& os, const vxl_uint_16& value)
00057 {
00058   if (value<10)    os<<'0';
00059   if (value<100)   os<<'0';
00060   if (value<1000)  os<<'0';
00061   if (value<10000) os<<'0';
00062   os<<value;
00063 }
00064 
00065 //: Explicit overload for int
00066 VCL_DEFINE_SPECIALIZATION
00067 void vil_print_value(vcl_ostream& os, const vxl_int_32& value)
00068 {
00069   int v=value;
00070   if (v<0) { v=-v; os<<'-'; } else os<<' ';
00071   if (v<10)       os<<'0';
00072   if (v<100)      os<<'0';
00073   if (v<1000)     os<<'0';
00074   if (v<10000)    os<<'0';
00075   if (v<100000)   os<<'0';
00076   if (v<1000000)  os<<'0';
00077   if (v<10000000) os<<'0';
00078   os<<v;
00079 }
00080 
00081 //: Explicit overload for unsigned int
00082 VCL_DEFINE_SPECIALIZATION
00083 void vil_print_value(vcl_ostream& os, const vxl_uint_32& value)
00084 {
00085   if (value<10)       os<<'0';
00086   if (value<100)      os<<'0';
00087   if (value<1000)     os<<'0';
00088   if (value<10000)    os<<'0';
00089   if (value<100000)   os<<'0';
00090   if (value<1000000)  os<<'0';
00091   if (value<10000000) os<<'0';
00092   os<<value;
00093 }
00094 
00095 #if VXL_HAS_INT_64
00096 
00097 //: Explicit overload for unsigned long
00098 VCL_DEFINE_SPECIALIZATION
00099 void vil_print_value(vcl_ostream& os, const vxl_uint_64& value)
00100 {
00101 #ifdef VCL_VC_6 // IMS. This Hack could be replaced by code which
00102   os << "****"; // splits the 64bit int and does the right thing.
00103 #else
00104   if (value<10)       os<<'0';
00105   if (value<100)      os<<'0';
00106   if (value<1000)     os<<'0';
00107   if (value<10000)    os<<'0';
00108   if (value<100000)   os<<'0';
00109   if (value<1000000)  os<<'0';
00110   if (value<10000000) os<<'0';
00111   os<<value;
00112 #endif
00113 }
00114 
00115 //: Explicit overload for long
00116 VCL_DEFINE_SPECIALIZATION
00117 void vil_print_value(vcl_ostream& os, const vxl_int_64& value)
00118 {
00119 #ifdef VCL_VC_6 // IMS. This Hack could be replaced by code which
00120   os << "****"; // splits the 64bit int and does the right thing.
00121 #else
00122   vxl_int_64 v=value;
00123   if (v<0) { v=-v; os<<'-'; } else os<<' ';
00124   if (v<10)       os<<'0';
00125   if (v<100)      os<<'0';
00126   if (v<1000)     os<<'0';
00127   if (v<10000)    os<<'0';
00128   if (v<100000)   os<<'0';
00129   if (v<1000000)  os<<'0';
00130   if (v<10000000) os<<'0';
00131   os<<v;
00132 #endif
00133 }
00134 
00135 #endif
00136 
00137 //: Explicit overload for float
00138 VCL_DEFINE_SPECIALIZATION
00139 void vil_print_value(vcl_ostream& os, const float& value)
00140 {
00141   os<<value;
00142 }
00143 
00144 //: Explicit overload for double
00145 VCL_DEFINE_SPECIALIZATION
00146 void vil_print_value(vcl_ostream& os, const double& value)
00147 {
00148   os<<value;
00149 }
00150 
00151 //: Explicit overload for complex float
00152 VCL_DEFINE_SPECIALIZATION
00153 void vil_print_value(vcl_ostream& os, const vcl_complex<float>& value)
00154 {
00155   os<<value;
00156 }
00157 
00158 //: Explicit overload for complex double
00159 VCL_DEFINE_SPECIALIZATION
00160 void vil_print_value(vcl_ostream& os, const vcl_complex<double>& value)
00161 {
00162   os<<value;
00163 }
00164 
00165 //: Explicit overload of print for rgb<byte>
00166 VCL_DEFINE_SPECIALIZATION
00167 void vil_print_value(vcl_ostream& os, const vil_rgb<vxl_byte>& value)
00168 {
00169   int r = int(value.r);
00170   if (r<10)  os<<'0';
00171   if (r<100) os<<'0';
00172   os<<r<<'/';
00173   int g = int(value.g);
00174   if (g<10)  os<<'0';
00175   if (g<100) os<<'0';
00176   os<<g<<'/';
00177   int b = int(value.b);
00178   if (b<10)  os<<'0';
00179   if (b<100) os<<'0';
00180   os<<b;
00181 }
00182 
00183 //: Explicit overload of print for rgb<sbyte>
00184 VCL_DEFINE_SPECIALIZATION
00185 void vil_print_value(vcl_ostream& os, vil_rgb<vxl_sbyte> const& value)
00186 {
00187   int r = int(value.r);
00188   if (r<0) r=-r,os<<'-'; else os<<'+';
00189   if (r<10)  os<<'0';
00190   if (r<100) os<<'0';
00191   os<<r<<'/';
00192   int g = int(value.g);
00193   if (g<0) g=-g,os<<'-'; else os<<'+';
00194   if (g<10)  os<<'0';
00195   if (g<100) os<<'0';
00196   os<<g<<'/';
00197   int b = int(value.b);
00198   if (b<0) b=-b,os<<'-'; else os<<'+';
00199   if (b<10)  os<<'0';
00200   if (b<100) os<<'0';
00201   os<<b;
00202 }
00203 
00204 //: Explicit overload of print for rgb<short>
00205 VCL_DEFINE_SPECIALIZATION
00206 void vil_print_value(vcl_ostream& os, const vil_rgb<vxl_int_16>& value)
00207 {
00208   vil_print_value(os, value.r);
00209   os<<'/';
00210   vil_print_value(os, value.g);
00211   os<<'/';
00212   vil_print_value(os, value.b);
00213 }
00214 
00215 //: Explicit overload of print for rgb<unsigned short>
00216 VCL_DEFINE_SPECIALIZATION
00217 void vil_print_value(vcl_ostream& os, const vil_rgb<vxl_uint_16>& value)
00218 {
00219   vil_print_value(os, value.r);
00220   os<<'/';
00221   vil_print_value(os, value.g);
00222   os<<'/';
00223   vil_print_value(os, value.b);
00224 }
00225 
00226 //: Explicit overload of print for rgb<int>
00227 VCL_DEFINE_SPECIALIZATION
00228 void vil_print_value(vcl_ostream& os, const vil_rgb<vxl_int_32>& value)
00229 {
00230   vil_print_value(os, value.r);
00231   os<<'/';
00232   vil_print_value(os, value.g);
00233   os<<'/';
00234   vil_print_value(os, value.b);
00235 }
00236 
00237 //: Explicit overload of print for rgb<unsigned int>
00238 VCL_DEFINE_SPECIALIZATION
00239 void vil_print_value(vcl_ostream& os, const vil_rgb<vxl_uint_32>& value)
00240 {
00241   vil_print_value(os, value.r);
00242   os<<'/';
00243   vil_print_value(os, value.g);
00244   os<<'/';
00245   vil_print_value(os, value.b);
00246 }
00247 
00248 #if VXL_HAS_INT_64
00249 
00250 //: Explicit overload of print for rgb<long>
00251 VCL_DEFINE_SPECIALIZATION
00252 void vil_print_value(vcl_ostream& os, const vil_rgb<vxl_int_64>& value)
00253 {
00254   vil_print_value(os, value.r);
00255   os<<'/';
00256   vil_print_value(os, value.g);
00257   os<<'/';
00258   vil_print_value(os, value.b);
00259 }
00260 
00261 //: Explicit overload of print for rgb<unsigned long>
00262 VCL_DEFINE_SPECIALIZATION
00263 void vil_print_value(vcl_ostream& os, const vil_rgb<vxl_uint_64>& value)
00264 {
00265   vil_print_value(os, value.r);
00266   os<<'/';
00267   vil_print_value(os, value.g);
00268   os<<'/';
00269   vil_print_value(os, value.b);
00270 }
00271 
00272 #endif
00273 
00274 //: Explicit overload of print for rgb<float>
00275 VCL_DEFINE_SPECIALIZATION
00276 void vil_print_value(vcl_ostream& os, const vil_rgb<float>& value)
00277 {
00278   os<<value.r<<'/'<<value.g<<'/'<<value.b;
00279 }
00280 
00281 
00282 //: Explicit overload of print for rgb<double>
00283 VCL_DEFINE_SPECIALIZATION
00284 void vil_print_value(vcl_ostream& os, const vil_rgb<double>& value)
00285 {
00286   os<<value.r<<'/'<<value.g<<'/'<<value.b;
00287 }
00288 
00289 //: Explicit overload of print for rgba<byte>
00290 VCL_DEFINE_SPECIALIZATION
00291 void vil_print_value(vcl_ostream& os, const vil_rgba<vxl_byte>& value)
00292 {
00293   int r = int(value.r);
00294   if (r<10)  os<<'0';
00295   if (r<100) os<<'0';
00296   os<<r<<'/';
00297   int g = int(value.g);
00298   if (g<10)  os<<'0';
00299   if (g<100) os<<'0';
00300   os<<g<<'/';
00301   int b = int(value.b);
00302   if (b<10)  os<<'0';
00303   if (b<100) os<<'0';
00304   os<<b<<'/';
00305   int a = int(value.a);
00306   if (a<10)  os<<'0';
00307   if (a<100) os<<'0';
00308   os<<a;
00309 }
00310 
00311 //: Explicit overload of print for rgba<sbyte>
00312 VCL_DEFINE_SPECIALIZATION
00313 void vil_print_value(vcl_ostream& os, const vil_rgba<vxl_sbyte>& value)
00314 {
00315   int r = int(value.r);
00316   if (r<0) r=-r,os<<'-'; else os<<'+';
00317   if (r<10)  os<<'0';
00318   if (r<100) os<<'0';
00319   os<<r<<'/';
00320   int g = int(value.g);
00321   if (g<0) g=-g,os<<'-'; else os<<'+';
00322   if (g<10)  os<<'0';
00323   if (g<100) os<<'0';
00324   os<<g<<'/';
00325   int b = int(value.b);
00326   if (b<0) b=-b,os<<'-'; else os<<'+';
00327   if (b<10)  os<<'0';
00328   if (b<100) os<<'0';
00329   os<<b<<'/';
00330   int a = int(value.a);
00331   if (a<0) a=-a,os<<'-'; else os<<'+';
00332   if (a<10)  os<<'0';
00333   if (a<100) os<<'0';
00334   os<<a;
00335 }
00336 
00337 //: Explicit overload of print for rgba<short>
00338 VCL_DEFINE_SPECIALIZATION
00339 void vil_print_value(vcl_ostream& os, const vil_rgba<vxl_int_16>& value)
00340 {
00341   vil_print_value(os, value.r);
00342   os<<'/';
00343   vil_print_value(os, value.g);
00344   os<<'/';
00345   vil_print_value(os, value.b);
00346   os<<'/';
00347   vil_print_value(os, value.a);
00348 }
00349 
00350 //: Explicit overload of print for rgba<unsigned short>
00351 VCL_DEFINE_SPECIALIZATION
00352 void vil_print_value(vcl_ostream& os, const vil_rgba<vxl_uint_16>& value)
00353 {
00354   vil_print_value(os, value.r);
00355   os<<'/';
00356   vil_print_value(os, value.g);
00357   os<<'/';
00358   vil_print_value(os, value.b);
00359   os<<'/';
00360   vil_print_value(os, value.a);
00361 }
00362 
00363 //: Explicit overload of print for rgba<int>
00364 VCL_DEFINE_SPECIALIZATION
00365 void vil_print_value(vcl_ostream& os, const vil_rgba<vxl_int_32>& value)
00366 {
00367   vil_print_value(os, value.r);
00368   os<<'/';
00369   vil_print_value(os, value.g);
00370   os<<'/';
00371   vil_print_value(os, value.b);
00372   os<<'/';
00373   vil_print_value(os, value.a);
00374 }
00375 
00376 //: Explicit overload of print for rgba<unsigned int>
00377 VCL_DEFINE_SPECIALIZATION
00378 void vil_print_value(vcl_ostream& os, const vil_rgba<vxl_uint_32>& value)
00379 {
00380   vil_print_value(os, value.r);
00381   os<<'/';
00382   vil_print_value(os, value.g);
00383   os<<'/';
00384   vil_print_value(os, value.b);
00385   os<<'/';
00386   vil_print_value(os, value.a);
00387 }
00388 
00389 #if VXL_HAS_INT_64
00390 
00391 //: Explicit overload of print for rgba<long>
00392 VCL_DEFINE_SPECIALIZATION
00393 void vil_print_value(vcl_ostream& os, const vil_rgba<vxl_int_64>& value)
00394 {
00395   vil_print_value(os, value.r);
00396   os<<'/';
00397   vil_print_value(os, value.g);
00398   os<<'/';
00399   vil_print_value(os, value.b);
00400   os<<'/';
00401   vil_print_value(os, value.a);
00402 }
00403 
00404 //: Explicit overload of print for rgba<unsigned long>
00405 VCL_DEFINE_SPECIALIZATION
00406 void vil_print_value(vcl_ostream& os, const vil_rgba<vxl_uint_64>& value)
00407 {
00408   vil_print_value(os, value.r);
00409   os<<'/';
00410   vil_print_value(os, value.g);
00411   os<<'/';
00412   vil_print_value(os, value.b);
00413   os<<'/';
00414   vil_print_value(os, value.a);
00415 }
00416 
00417 #endif
00418 
00419 //: Explicit overload of print for rgba<float>
00420 VCL_DEFINE_SPECIALIZATION
00421 void vil_print_value(vcl_ostream& os, const vil_rgba<float>& value)
00422 {
00423   os<<value.r<<'/'<<value.g<<'/'<<value.b<<'/'<<value.a;
00424 }
00425 
00426 //: Explicit overload of print for rgba<double>
00427 VCL_DEFINE_SPECIALIZATION
00428 void vil_print_value(vcl_ostream& os, const vil_rgba<double>& value)
00429 {
00430   os<<value.r<<'/'<<value.g<<'/'<<value.b<<'/'<<value.a;
00431 }
00432 
00433 void vil_print_all(vcl_ostream& os, vil_image_view_base_sptr const& view)
00434 {
00435 #define docase(T) \
00436    case T: \
00437      vil_print_all(os, static_cast<vil_image_view< vil_pixel_format_type_of<T >::type > >(view) );\
00438      break
00439 
00440   switch ( view->pixel_format() )
00441   {
00442 #if VXL_HAS_INT_64
00443     docase( VIL_PIXEL_FORMAT_UINT_64 );
00444     docase( VIL_PIXEL_FORMAT_INT_64 );
00445 #endif
00446     docase( VIL_PIXEL_FORMAT_UINT_32 );
00447     docase( VIL_PIXEL_FORMAT_INT_32 );
00448     docase( VIL_PIXEL_FORMAT_UINT_16 );
00449     docase( VIL_PIXEL_FORMAT_INT_16 );
00450     docase( VIL_PIXEL_FORMAT_BYTE );
00451     docase( VIL_PIXEL_FORMAT_SBYTE );
00452     docase( VIL_PIXEL_FORMAT_FLOAT );
00453     docase( VIL_PIXEL_FORMAT_DOUBLE );
00454     docase( VIL_PIXEL_FORMAT_BOOL );
00455 
00456 #if VXL_HAS_INT_64
00457     docase( VIL_PIXEL_FORMAT_RGB_UINT_64 );
00458     docase( VIL_PIXEL_FORMAT_RGB_INT_64 );
00459 #endif
00460     docase( VIL_PIXEL_FORMAT_RGB_UINT_32 );
00461     docase( VIL_PIXEL_FORMAT_RGB_INT_32 );
00462     docase( VIL_PIXEL_FORMAT_RGB_UINT_16 );
00463     docase( VIL_PIXEL_FORMAT_RGB_INT_16 );
00464     docase( VIL_PIXEL_FORMAT_RGB_BYTE );
00465     docase( VIL_PIXEL_FORMAT_RGB_SBYTE );
00466     docase( VIL_PIXEL_FORMAT_RGB_FLOAT );
00467     docase( VIL_PIXEL_FORMAT_RGB_DOUBLE );
00468 
00469 #if VXL_HAS_INT_64
00470     docase( VIL_PIXEL_FORMAT_RGBA_UINT_64 );
00471     docase( VIL_PIXEL_FORMAT_RGBA_INT_64 );
00472 #endif
00473     docase( VIL_PIXEL_FORMAT_RGBA_UINT_32 );
00474     docase( VIL_PIXEL_FORMAT_RGBA_INT_32 );
00475     docase( VIL_PIXEL_FORMAT_RGBA_UINT_16 );
00476     docase( VIL_PIXEL_FORMAT_RGBA_INT_16 );
00477     docase( VIL_PIXEL_FORMAT_RGBA_BYTE );
00478     docase( VIL_PIXEL_FORMAT_RGBA_SBYTE );
00479     docase( VIL_PIXEL_FORMAT_RGBA_FLOAT );
00480     docase( VIL_PIXEL_FORMAT_RGBA_DOUBLE );
00481 
00482     docase( VIL_PIXEL_FORMAT_COMPLEX_FLOAT );
00483     docase( VIL_PIXEL_FORMAT_COMPLEX_DOUBLE );
00484 
00485     default: ;
00486   }
00487 #undef docase
00488 }