00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef IMAGE_STATE_IMPL_HH
00026 #define IMAGE_STATE_IMPL_HH
00027
00028 #include <iostream>
00029 #include <boost/shared_ptr.hpp>
00030
00031 #include <ost/base.hh>
00032 #include <ost/img/value_util.hh>
00033 #include <ost/img/pixel_sampling.hh>
00034
00035 #include "image_state_base.hh"
00036 #include "image_state_visitor_fw.hh"
00037 #include "value_holder.hh"
00038
00039 namespace ost { namespace img {
00040
00041 class Size;
00042
00043 namespace image_state {
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 template <typename T, class D>
00059 class TEMPLATE_EXPORT ImageStateImpl: public ImageStateBase
00060 {
00061 public:
00062 typedef ImageStateImpl<T,D> StateType;
00063 typedef boost::shared_ptr<ImageStateImpl<T,D> > SharedPtrType;
00064
00065 ImageStateImpl();
00066
00067 ImageStateImpl(const ImageStateImpl<T,D>& s);
00068
00069 ImageStateImpl<T,D>& operator=(const ImageStateImpl<T,D>& s);
00070
00071
00072 ImageStateImpl(const Extent& e, const PixelSampling& s);
00073
00074
00075 ImageStateImpl(const Extent& e, const PixelSampling& s, const Vec3& c);
00076
00077
00078
00079
00080
00081 template <typename U>
00082 ImageStateImpl(const Extent& e, ValueHolder<U>& d, const PixelSampling& s):
00083 domain_(e),
00084 data_(domain_.GetExtent().GetSize(),d),
00085 sampling_(s)
00086 {
00087 assert(d.GetPhysicalSize()*sizeof(U)==data_.GetPhysicalSize()*sizeof(T));
00088 }
00089
00090 virtual ~ImageStateImpl();
00091
00092 SharedPtrType CloneState(bool cc=true) const;
00093
00094
00095 virtual ImageStateBasePtr Clone(bool cc=true) const;
00096
00097 virtual long MemSize() const;
00098
00099 virtual DataType GetType() const;
00100
00101 virtual DataDomain GetDomain() const;
00102
00103 virtual void SetSpatialOrigin(const Point& o);
00104
00105 virtual void CenterSpatialOrigin();
00106
00107 virtual Point GetSpatialOrigin() const;
00108
00109 virtual Extent GetExtent() const;
00110
00111 virtual Extent GetLogicalExtent() const;
00112
00113 virtual Real GetReal(const Point &p) const;
00114
00115 virtual void SetReal(const Point &p, const Real& r);
00116
00117 virtual Complex GetComplex(const Point &p) const;
00118
00119 virtual void SetComplex(const Point &p, const Complex& c);
00120
00121 virtual Real GetIntpolReal(const Vec3 &v) const;
00122 virtual Real GetIntpolReal(const Vec2 &v) const;
00123 virtual Real GetIntpolReal(const Real &d) const;
00124
00125 virtual Complex GetIntpolComplex(const Vec3 &v) const;
00126 virtual Complex GetIntpolComplex(const Vec2 &v) const;
00127 virtual Complex GetIntpolComplex(const Real &d) const;
00128
00129 virtual PixelSampling& GetSampling();
00130
00131 virtual const PixelSampling& GetSampling() const;
00132
00133 virtual void SetSampling(const PixelSampling& s);
00134
00135 virtual Vec3 GetAbsoluteOrigin() const;
00136
00137 virtual void SetAbsoluteOrigin(const Vec3& c);
00138
00139 virtual Vec3 IndexToCoord(const Point &p) const;
00140
00141 virtual Vec3 CoordToIndex(const Vec3& c) const;
00142
00143 virtual Vec3 FractionalIndexToCoord(const Vec3 &p) const;
00144
00145 void AdjustPhaseOrigin(const Point& p);
00146
00147
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158 T& Value(const Point& p);
00159
00160
00161 const T& Value(const Point& p) const;
00162
00164 T GetCheckedValue(const Point& p) const;
00165
00167 void SetCheckedValue(const Point& p, const T& v);
00168
00169
00170
00171
00172
00173 T CalcIntpolValue(const Vec3& v) const;
00174 T CalcIntpolValue(const Vec2& v) const;
00175 T CalcIntpolValue(const Real& v) const;
00176
00177
00178 T& Value(const Index& i);
00179
00180
00181 const T& Value(const Index& i) const;
00182
00183
00184 T& Value(unsigned int i);
00185
00186
00187 const T& Value(unsigned int i) const;
00188
00190 ValueHolder<T>& Data();
00192 const ValueHolder<T>& Data() const;
00193
00194
00195 Size GetSize() const;
00196
00197
00198
00199 virtual void ApplyIP(ImageStateNonModVisitorBase& v) const;
00200
00201 virtual void Apply(ImageStateNonModVisitorBase& v) const;
00202
00203 virtual void ApplyIP(ImageStateModIPVisitorBase& v);
00204
00205 virtual void ApplyIP(const ImageStateConstModIPVisitorBase& v);
00206
00207 virtual ImageStateBasePtr Apply(ImageStateModIPVisitorBase& v) const;
00208
00209 virtual ImageStateBasePtr Apply(const ImageStateConstModIPVisitorBase& v) const;
00210
00211 virtual ImageStateBasePtr Apply(ImageStateModOPVisitorBase& v) const;
00212
00213 virtual ImageStateBasePtr Apply(const ImageStateConstModOPVisitorBase& v) const;
00214
00215 virtual ImageStateBasePtr Apply(ImageStateMorphVisitorBase& v);
00216
00217
00218 virtual ImageStateBase& operator+=(Real v);
00219 virtual ImageStateBase& operator+=(const Complex& v);
00220 virtual ImageStateBase& operator-=(Real v);
00221 virtual ImageStateBase& operator-=(const Complex& v);
00222 virtual ImageStateBase& operator*=(Real v);
00223 virtual ImageStateBase& operator*=(const Complex& v);
00224 virtual ImageStateBase& operator/=(Real v);
00225 virtual ImageStateBase& operator/=(const Complex& v);
00226
00227 virtual void operator+=(const Function& b);
00228 virtual void operator-=(const Function& b);
00229 virtual void operator*=(const Function& b);
00230 virtual void operator/=(const Function& b);
00231
00232 protected:
00233
00234 template <typename U> void add_scalar(const U& v);
00235 template <typename U> void mul_scalar(const U& v);
00236
00237 private:
00238 D domain_;
00239 ValueHolder<T> data_;
00240 PixelSampling sampling_;
00241 geom::Vec3 absolute_origin_;
00242 };
00243
00244
00245 }}}
00246
00247 #endif