00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef HxExportData_h
00010 #define HxExportData_h
00011
00012 #include "HxPixOpCategory.h"
00013 #include "HxTagList.h"
00014 #include "HxByte.h"
00015 #include "HxVec2Int.h"
00016 #include "HxVec2Double.h"
00017 #include "HxVec3Int.h"
00018 #include "HxVec3Double.h"
00019 #include "HxComplex.h"
00020
00021 class HxInOutDataIdxId
00022 {
00023 public:
00024 typedef HxTagTransInVar TransVarianceCategory;
00025
00026 HxInOutDataIdxId() : _i(-1) {}
00027
00028 int next() { return ++_i; }
00029 int current() const { return _i; }
00030
00031 private:
00032 int _i;
00033 };
00034
00035 class HxInOutDataIdxYZX
00036 {
00037 public:
00038 typedef HxTagTransVar TransVarianceCategory;
00039
00040 HxInOutDataIdxId(int w, int h, int) : _w(w), _wh(w*h) {}
00041
00042 int next(int x, int y, int z) { return _i = z*_wh+y*_w+x; }
00043 int current() const { return _i; }
00044
00045 private:
00046 int _w, _wh, _i;
00047 };
00048
00049 template<class ArithT, class DataT, class PutOpT, class DataIndexT>
00050 class HxExportData
00051 {
00052 public:
00053 typedef HxTagPixOpOut DirectionCategory;
00054 typedef DataIndexT::TransVarianceCategory TransVarianceCategory;
00055 typedef HxTag1Phase PhaseCategory;
00056
00057 HxExportData(HxTagList&);
00058
00059 void doIt(const ArithT& x)
00060 { *_data++ = x.x(); }
00061
00062 static HxString className();
00063 private:
00064 DataT* _data;
00065 };
00066
00067
00068 template<class ArithT, class DataT>
00069 inline
00070 HxExportData<ArithT, DataT>::HxExportData(HxTagList& tags)
00071 {
00072 _data = (DataT*)HxGetTag<void*>(tags, "dataPtr", ((void*)0));
00073 }
00074
00075 template<class ArithT, class DataT>
00076 inline HxString
00077 HxExportData<ArithT, DataT>::className()
00078 {
00079 return HxPixOpMakeName<DataT>("ExportData");
00080 }
00081
00082 template<>
00083 inline void
00084 HxExportData<HxVec2Int, HxByte>::doIt(const HxVec2Int& x)
00085 {
00086 *_data++ = x.x();
00087 *_data++ = x.y();
00088 }
00089
00090 template<>
00091 inline void
00092 HxExportData<HxVec2Int, short>::doIt(const HxVec2Int& x)
00093 {
00094 *_data++ = x.x();
00095 *_data++ = x.y();
00096 }
00097
00098 template<>
00099 inline void
00100 HxExportData<HxVec2Int, int>::doIt(const HxVec2Int& x)
00101 {
00102 *_data++ = x.x();
00103 *_data++ = x.y();
00104 }
00105
00106 template<>
00107 inline void
00108 HxExportData<HxVec2Double, float>::doIt(const HxVec2Double& x)
00109 {
00110 *_data++ = x.x();
00111 *_data++ = x.y();
00112 }
00113
00114 template<>
00115 inline void
00116 HxExportData<HxVec2Double, double>::doIt(const HxVec2Double& x)
00117 {
00118 *_data++ = x.x();
00119 *_data++ = x.y();
00120 }
00121
00122 template<>
00123 inline void
00124 HxExportData<HxComplex, float>::doIt(const HxComplex& x)
00125 {
00126 *_data++ = x.x();
00127 *_data++ = x.y();
00128 }
00129
00130 template<>
00131 inline void
00132 HxExportData<HxComplex, double>::doIt(const HxComplex& x)
00133 {
00134 *_data++ = x.x();
00135 *_data++ = x.y();
00136 }
00137
00138 template<>
00139 inline void
00140 HxExportData<HxVec3Int, HxByte>::doIt(const HxVec3Int& x)
00141 {
00142 *_data++ = x.x();
00143 *_data++ = x.y();
00144 *_data++ = x.z();
00145 }
00146
00147 template<>
00148 inline void
00149 HxExportData<HxVec3Int, short>::doIt(const HxVec3Int& x)
00150 {
00151 *_data++ = x.x();
00152 *_data++ = x.y();
00153 *_data++ = x.z();
00154 }
00155
00156 template<>
00157 inline void
00158 HxExportData<HxVec3Int, int>::doIt(const HxVec3Int& x)
00159 {
00160 *_data++ = x.x();
00161 *_data++ = x.y();
00162 *_data++ = x.z();
00163 }
00164
00165 template<>
00166 inline void
00167 HxExportData<HxVec3Double, float>::doIt(const HxVec3Double& x)
00168 {
00169 *_data++ = x.x();
00170 *_data++ = x.y();
00171 *_data++ = x.z();
00172 }
00173
00174 template<>
00175 inline void
00176 HxExportData<HxVec3Double, double>::doIt(const HxVec3Double& x)
00177 {
00178 *_data++ = x.x();
00179 *_data++ = x.y();
00180 *_data++ = x.z();
00181 }
00182
00183 #endif