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 virtual ~ImageStateImpl();
00078
00079 SharedPtrType CloneState(bool cc=true) const;
00080
00081
00082 virtual ImageStateBasePtr Clone(bool cc=true) const;
00083
00084 virtual std::size_t MemSize() const;
00085
00086 virtual DataType GetType() const;
00087
00088 virtual DataDomain GetDomain() const;
00089
00090 virtual void SetSpatialOrigin(const Point& o);
00091
00092 virtual void CenterSpatialOrigin();
00093
00094 virtual Point GetSpatialOrigin() const;
00095
00096 virtual Extent GetExtent() const;
00097
00098 virtual Extent GetLogicalExtent() const;
00099
00100 virtual Real GetReal(const Point &p) const;
00101
00102 virtual void SetReal(const Point &p, const Real& r);
00103
00104 virtual Complex GetComplex(const Point &p) const;
00105
00106 virtual void SetComplex(const Point &p, const Complex& c);
00107
00108 virtual Real GetIntpolReal(const Vec3 &v) const;
00109 virtual Real GetIntpolReal(const Vec2 &v) const;
00110 virtual Real GetIntpolReal(const Real &d) const;
00111
00112 virtual Complex GetIntpolComplex(const Vec3 &v) const;
00113 virtual Complex GetIntpolComplex(const Vec2 &v) const;
00114 virtual Complex GetIntpolComplex(const Real &d) const;
00115
00116 virtual PixelSampling& GetSampling();
00117
00118 virtual const PixelSampling& GetSampling() const;
00119
00120 virtual void SetSampling(const PixelSampling& s);
00121
00122 virtual Vec3 GetAbsoluteOrigin() const;
00123
00124 virtual void SetAbsoluteOrigin(const Vec3& c);
00125
00126 virtual Vec3 IndexToCoord(const Point &p) const;
00127
00128 virtual Vec3 CoordToIndex(const Vec3& c) const;
00129
00130 virtual Vec3 FractionalIndexToCoord(const Vec3 &p) const;
00131
00132 void AdjustPhaseOrigin(const Point& p);
00133
00134
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145 T& Value(const Point& p)
00146 {
00147 assert(domain_.GetExtent().Contains(p));
00148 return data_.Value(domain_.Point2Index(p));
00149 }
00150
00151
00152 const T& Value(const Point& p) const
00153 {
00154 assert(domain_.GetExtent().Contains(p));
00155 return data_.Value(domain_.Point2Index(p));
00156 }
00157
00159 T GetCheckedValue(const Point& p) const;
00160
00162 void SetCheckedValue(const Point& p, const T& v);
00163
00164
00165
00166
00167
00168 T CalcIntpolValue(const Vec3& v) const;
00169 T CalcIntpolValue(const Vec2& v) const;
00170 T CalcIntpolValue(const Real& v) const;
00171
00172
00173 T& Value(const Index& i);
00174
00175
00176 const T& Value(const Index& i) const;
00177
00178
00179 T& Value(std::size_t i);
00180
00181
00182 const T& Value(std::size_t i) const;
00183
00185 ValueHolder<T>& Data();
00187 const ValueHolder<T>& Data() const;
00188
00189
00190 Size GetSize() const;
00191
00192
00193
00194 virtual void ApplyIP(ImageStateNonModVisitorBase& v) const;
00195
00196 virtual void Apply(ImageStateNonModVisitorBase& v) const;
00197
00198 virtual void ApplyIP(ImageStateModIPVisitorBase& v);
00199
00200 virtual void ApplyIP(const ImageStateConstModIPVisitorBase& v);
00201
00202 virtual ImageStateBasePtr Apply(ImageStateModIPVisitorBase& v) const;
00203
00204 virtual ImageStateBasePtr Apply(const ImageStateConstModIPVisitorBase& v) const;
00205
00206 virtual ImageStateBasePtr Apply(ImageStateModOPVisitorBase& v) const;
00207
00208 virtual ImageStateBasePtr Apply(const ImageStateConstModOPVisitorBase& v) const;
00209
00210 virtual ImageStateBasePtr Apply(ImageStateMorphVisitorBase& v);
00211
00212
00213 virtual ImageStateBase& operator+=(Real v);
00214 virtual ImageStateBase& operator+=(const Complex& v);
00215 virtual ImageStateBase& operator-=(Real v);
00216 virtual ImageStateBase& operator-=(const Complex& v);
00217 virtual ImageStateBase& operator*=(Real v);
00218 virtual ImageStateBase& operator*=(const Complex& v);
00219 virtual ImageStateBase& operator/=(Real v);
00220 virtual ImageStateBase& operator/=(const Complex& v);
00221
00222 protected:
00223
00224 template <typename U> void add_scalar(const U& v);
00225 template <typename U> void mul_scalar(const U& v);
00226
00227 private:
00228 D domain_;
00229 ValueHolder<T> data_;
00230 PixelSampling sampling_;
00231 geom::Vec3 absolute_origin_;
00232 };
00233
00234
00235 }}}
00236
00237 #endif