core/vil/io/vil_io_image_view_base.cxx
Go to the documentation of this file.
00001 #include "vil_io_image_view_base.h"
00002 //:
00003 // \file
00004 #include <vcl_iostream.h>
00005 #include <vsl/vsl_binary_io.h>
00006 #include <vil/vil_image_view_base.h>
00007 #include <vil/vil_image_view.h>
00008 #include <vil/io/vil_io_image_view.h>
00009 
00010 //: Binary write image view base to stream
00011 VCL_DEFINE_SPECIALIZATION
00012 void vsl_b_write(vsl_b_ostream & os, vil_image_view_base_sptr const& view_base)
00013 {
00014   switch (view_base->pixel_format())
00015   {
00016 #if VXL_HAS_INT_64
00017    case VIL_PIXEL_FORMAT_UINT_64: {
00018      vil_image_view<vxl_uint_64> v(view_base);
00019      vsl_b_write(os, v);
00020      break; }
00021    case VIL_PIXEL_FORMAT_INT_64: {
00022      vil_image_view<vxl_int_64> v(view_base);
00023      vsl_b_write(os, v);
00024      break; }
00025 #endif
00026    case VIL_PIXEL_FORMAT_UINT_32: {
00027      vil_image_view<vxl_uint_32> v(view_base);
00028      vsl_b_write(os, v);
00029      break; }
00030    case VIL_PIXEL_FORMAT_INT_32: {
00031      vil_image_view<vxl_int_32> v(view_base);
00032      vsl_b_write(os, v);
00033      break; }
00034    case VIL_PIXEL_FORMAT_UINT_16: {
00035      vil_image_view<vxl_uint_16> v(view_base);
00036      vsl_b_write(os, v);
00037      break; }
00038    case VIL_PIXEL_FORMAT_INT_16: {
00039      vil_image_view<vxl_int_16> v(view_base);
00040      vsl_b_write(os, v);
00041      break; }
00042    case VIL_PIXEL_FORMAT_BYTE: {
00043      vil_image_view<vxl_byte> v(view_base);
00044      vsl_b_write(os, v);
00045      break; }
00046    case VIL_PIXEL_FORMAT_SBYTE: {
00047      vil_image_view<vxl_sbyte> v(view_base);
00048      vsl_b_write(os, v);
00049      break; }
00050    case VIL_PIXEL_FORMAT_FLOAT: {
00051      vil_image_view<float> v(view_base);
00052      vsl_b_write(os, v);
00053      break; }
00054    case VIL_PIXEL_FORMAT_DOUBLE: {
00055      vil_image_view<double> v(view_base);
00056      vsl_b_write(os, v);
00057      break; }
00058    case VIL_PIXEL_FORMAT_BOOL: {
00059      vil_image_view<bool> v(view_base);
00060      vsl_b_write(os, v);
00061      break; }
00062    // No version 1 complex images were ever written. Now added. It should work. Fix if necessary
00063    case VIL_PIXEL_FORMAT_COMPLEX_FLOAT: {
00064     vil_image_view<vcl_complex<float> > v(view_base);
00065     vsl_b_write(os, v);
00066     break; }
00067    case VIL_PIXEL_FORMAT_COMPLEX_DOUBLE: {
00068     vil_image_view<vcl_complex<double> > v(view_base);
00069     vsl_b_write(os, v);
00070     break; }
00071    default: {
00072       vcl_cerr << "I/O ERROR: vsl_b_write(vsl_b_ostream &, vil_image_view_base_sptr const&)\n"
00073                << "           Unknown pixel format "<< view_base->pixel_format() << '\n';
00074       os.os().clear(vcl_ios::badbit); // Set an unrecoverable IO error on stream
00075       return; }
00076   }
00077   //vcl_cerr << "warning: vsl_b_write not implemented for vil_image_view_base_sptr\n";
00078 }
00079 
00080 //: Binary load image view base from stream.
00081 VCL_DEFINE_SPECIALIZATION
00082 void vsl_b_read(vsl_b_istream& is, vil_image_view_base_sptr &view_base)
00083 {
00084   if (!is) return;
00085 
00086   unsigned ni,nj,np;
00087   vcl_ptrdiff_t istep,jstep,pstep;
00088   vil_memory_chunk_sptr chunk;
00089   vcl_ptrdiff_t offset;
00090 
00091   short w;
00092   vsl_b_read(is, w);
00093   if (w != 1) {
00094     vcl_cerr << "warning: vsl_b_read not implemented for vil_image_view binary io version: " << w <<  '\n';
00095     return;
00096   }
00097 
00098   vsl_b_read(is, ni);
00099   vsl_b_read(is, nj);
00100   vsl_b_read(is, np);
00101   vsl_b_read(is, istep);
00102   vsl_b_read(is, jstep);
00103   vsl_b_read(is, pstep);
00104   if (ni*nj*np==0) {
00105     vcl_cerr << "warning: vsl_b_read image ni*nj*np = 0\n";
00106     //image.set_size(0,0,0);
00107   }
00108   else {
00109     vsl_b_read(is, chunk);
00110     vsl_b_read(is, offset);
00111 
00112     switch (chunk->pixel_format()) {
00113 #if VXL_HAS_INT_64
00114      case VIL_PIXEL_FORMAT_UINT_64: {
00115        const vxl_uint_64* data = reinterpret_cast<const vxl_uint_64*>(chunk->data());
00116        view_base = new vil_image_view<vxl_uint_64>(chunk,data+offset,ni,nj,np,istep,jstep,pstep);
00117        break; }
00118      case VIL_PIXEL_FORMAT_INT_64: {
00119        const vxl_int_64* data = reinterpret_cast<const vxl_int_64*>(chunk->data());
00120        view_base = new vil_image_view<vxl_int_64>(chunk,data+offset,ni,nj,np,istep,jstep,pstep);
00121        break; }
00122 #endif
00123      case VIL_PIXEL_FORMAT_UINT_32: {
00124        const vxl_uint_32* data = reinterpret_cast<const vxl_uint_32*>(chunk->data());
00125        view_base = new vil_image_view<vxl_uint_32>(chunk,data+offset,ni,nj,np,istep,jstep,pstep);
00126        break; }
00127    case VIL_PIXEL_FORMAT_INT_32: {
00128        const vxl_int_32* data = reinterpret_cast<const vxl_int_32*>(chunk->data());
00129        view_base = new vil_image_view<vxl_int_32>(chunk,data+offset,ni,nj,np,istep,jstep,pstep);
00130        break; }
00131    case VIL_PIXEL_FORMAT_UINT_16: {
00132        const vxl_uint_16* data = reinterpret_cast<const vxl_uint_16*>(chunk->data());
00133        view_base = new vil_image_view<vxl_uint_16>(chunk,data+offset,ni,nj,np,istep,jstep,pstep);
00134        break; }
00135    case VIL_PIXEL_FORMAT_INT_16: {
00136        const vxl_int_16* data = reinterpret_cast<const vxl_int_16*>(chunk->data());
00137        view_base = new vil_image_view<vxl_int_16>(chunk,data+offset,ni,nj,np,istep,jstep,pstep);
00138        break; }
00139    case VIL_PIXEL_FORMAT_BYTE: {
00140        const vxl_byte* data = reinterpret_cast<const vxl_byte*>(chunk->data());
00141        view_base = new vil_image_view<vxl_byte>(chunk,data+offset,ni,nj,np,istep,jstep,pstep);
00142        break; }
00143    case VIL_PIXEL_FORMAT_SBYTE: {
00144        const vxl_sbyte* data = reinterpret_cast<const vxl_sbyte*>(chunk->data());
00145        view_base = new vil_image_view<vxl_sbyte>(chunk,data+offset,ni,nj,np,istep,jstep,pstep);
00146        break; }
00147    case VIL_PIXEL_FORMAT_FLOAT: {
00148        const float* data = reinterpret_cast<const float*>(chunk->data());
00149        view_base = new vil_image_view<float>(chunk,data+offset,ni,nj,np,istep,jstep,pstep);
00150        break; }
00151    case VIL_PIXEL_FORMAT_DOUBLE: {
00152        const double* data = reinterpret_cast<const double*>(chunk->data());
00153        view_base = new vil_image_view<double>(chunk,data+offset,ni,nj,np,istep,jstep,pstep);
00154        break; }
00155    case VIL_PIXEL_FORMAT_BOOL: {
00156        const bool* data = reinterpret_cast<const bool*>(chunk->data());
00157        view_base = new vil_image_view<bool>(chunk,data+offset,ni,nj,np,istep,jstep,pstep);
00158        break; }
00159     // No version 1 complex images were ever written. Now added. It should work. Fix if necessary
00160    case VIL_PIXEL_FORMAT_COMPLEX_FLOAT: {
00161        const vcl_complex<float>* data = reinterpret_cast<const vcl_complex<float>*>(chunk->data());
00162        view_base = new vil_image_view<vcl_complex<float> >(chunk,data+offset,ni,nj,np,istep,jstep,pstep);
00163        break; }
00164    case VIL_PIXEL_FORMAT_COMPLEX_DOUBLE: {
00165        const vcl_complex<double>* data = reinterpret_cast<const vcl_complex<double>*>(chunk->data());
00166        view_base = new vil_image_view<vcl_complex<double> >(chunk,data+offset,ni,nj,np,istep,jstep,pstep);
00167        break; }
00168    default: {
00169     vcl_cerr << "I/O ERROR: vsl_b_read(vsl_b_istream&, vil_image_view<T>&)\n"
00170              << "           Unknown version number "<< w << '\n';
00171     is.is().clear(vcl_ios::badbit); // Set an unrecoverable IO error on stream
00172     return; }
00173     }
00174   }
00175 //vcl_cerr << "warning: vsl_b_read not implemented for vil_image_view_base_sptr\n";
00176 }
00177 
00178 #if 0
00179 //: Binary write voxel world to stream
00180 void vsl_b_write(vsl_b_ostream & , vil_image_view_base const&)
00181 {
00182   vcl_cerr << "warning: vsl_b_write not implemented for vil_image_view_base\n";
00183 }
00184 
00185 //: Binary load voxel world from stream.
00186 void vsl_b_read(vsl_b_istream &, vil_image_view_base &)
00187 {
00188   vcl_cerr << "warning: vsl_b_read not implemented for vil_image_view_base\n";
00189 }
00190 #endif // 0