00001 #include "vil_io_image_view_base.h"
00002
00003
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
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
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);
00075 return; }
00076 }
00077
00078 }
00079
00080
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
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
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);
00172 return; }
00173 }
00174 }
00175
00176 }
00177
00178 #if 0
00179
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
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