OpenStructure
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
image_state_base.hh
Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // This file is part of the OpenStructure project <www.openstructure.org>
3 //
4 // Copyright (C) 2008-2011 by the OpenStructure authors
5 // Copyright (C) 2003-2010 by the IPLT authors
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License as published by the Free
9 // Software Foundation; either version 3.0 of the License, or (at your option)
10 // any later version.
11 // This library is distributed in the hope that it will be useful, but WITHOUT
12 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
14 // details.
15 //
16 // You should have received a copy of the GNU Lesser General Public License
17 // along with this library; if not, write to the Free Software Foundation, Inc.,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 //------------------------------------------------------------------------------
20 
21 /*
22  image state base
23 
24  Author: Ansgar Philippsen
25 */
26 
27 #ifndef IMAGE_STATE_BASE_H
28 #define IMAGE_STATE_BASE_H
29 
30 #include "image_state_base_fw.hh"
31 
32 #include <ost/base.hh>
33 #include <ost/img/module_config.hh>
34 #include <ost/img/data.hh>
35 
37 #include "type_fw.hh"
38 
39 namespace ost { namespace img {
40 
41 class PixelSampling;
42 
43 namespace image_state {
44 
45 /*
46  Abstract base class for the image state. A polymorphic pointer
47  to this is managed by instantiations of the Image class.
48 
49  At this level, the SpatialOrigin and SpatialSampling are
50  stored, but the interpretation is left to the 'user' of
51  the image state, either the Image class or any ImageStateVisitor
52 */
54 public:
55 
56  virtual ~ImageStateBase() {}
57 
58  // provide deep copy
59  virtual ImageStateBasePtr Clone(bool cc=true) const = 0;
60 
61  virtual size_t MemSize() const = 0;
62 
64  // abstract virtual methods
65  // to be implemented in ImageState
66 
67  // Reset extent, only re-allocating memory
68  /*
69  still needed ? its probably better to offer this
70  on the lower level of ImageStateImpl
71  */
72  //virtual void ResetExtent(const Extent& e) = 0;
73 
75  virtual DataType GetType() const = 0;
76 
78  virtual DataDomain GetDomain() const = 0;
79 
81  virtual void SetSpatialOrigin(const Point& o) = 0;
82 
84  virtual Point GetSpatialOrigin() const = 0;
85 
86 
88 
93  virtual Extent GetExtent() const = 0;
94 
96 
100  virtual Extent GetLogicalExtent() const = 0;
101 
103 
106  virtual Real GetReal(const Point &p) const = 0;
107 
109 
112  virtual void SetReal(const Point &p, const Real& r) = 0;
113 
114  // retrive value at Point as Complex
115  /*
116  This call is potentially slow, but boundary checked
117  */
118  virtual Complex GetComplex(const Point &p) const = 0;
119 
121 
124  virtual void SetComplex(const Point &p, const Complex& c) = 0;
125 
126  virtual Real GetIntpolReal(const Vec3 &v) const = 0;
127  virtual Real GetIntpolReal(const Vec2 &v) const = 0;
128  virtual Real GetIntpolReal(const Real &d) const = 0;
129 
130  virtual Complex GetIntpolComplex(const Vec3 &v) const = 0;
131  virtual Complex GetIntpolComplex(const Vec2 &v) const = 0;
132  virtual Complex GetIntpolComplex(const Real &d) const = 0;
133 
134  virtual PixelSampling& GetSampling() = 0;
135 
136  virtual const PixelSampling& GetSampling() const = 0;
137 
138  virtual void SetSampling(const PixelSampling& s) = 0;
139 
140  virtual Vec3 GetAbsoluteOrigin() const = 0;
141 
142  virtual void SetAbsoluteOrigin(const Vec3& c) = 0;
143 
144  // Index to coordinate conversion
145  /*
146  Returns the physical dimensions of a given Point based on
147  the sampling of the current domain and the absolute coordinates
148  of the origin of the image
149  */
150  virtual Vec3 IndexToCoord(const Point &p) const = 0;
151 
152  // Convert coordinates back to (fractional) indices
153  /*
154  Returns the location within the Data that corresponds to
155  the given physical coordinate, bases on the sampling of
156  the current domain and the absolute coordinates
157  of the origin of the image
158  */
159  virtual Vec3 CoordToIndex(const Vec3& c) const = 0;
160 
161  /*
162  Returns the physical dimensions of a given Vec which contains
163  fractional Point coordinated. The returned value is based on
164  the sampling of the current domain and the absolute coordinates
165  of the origin of the image
166  */
167  virtual Vec3 FractionalIndexToCoord(const Vec3 &p) const =0;
168 
169  // visitor interface
170 
171  // apply const visitor, ie to extract info
172  virtual void ApplyIP(ImageStateNonModVisitorBase& v) const = 0;
173  // apply const visitor (same as ApplyIP(ImageStateNonModVisitorBase&)
174  virtual void Apply(ImageStateNonModVisitorBase& v) const = 0;
175 
176  // apply in-place visitor, usually modifies this
177  virtual void ApplyIP(ImageStateModIPVisitorBase& v) = 0;
178  // apply in-place visitor to clone of this, return result
179  virtual ImageStateBasePtr Apply(ImageStateModIPVisitorBase& v) const = 0;
180 
181  // apply in-place const visitor, usually modifies this
182  virtual void ApplyIP(const ImageStateConstModIPVisitorBase& v) = 0;
183  // apply in-place const visitor to clone of this, return result
184  virtual ImageStateBasePtr Apply(const ImageStateConstModIPVisitorBase& v) const = 0;
185 
186  // apply out-of-place visitor and return result
187  // NOTE: it is not possible to apply an out-of-place visitor in-place!
188  // that is handled by the calling API (ie ImageHandle)
189  virtual ImageStateBasePtr Apply(ImageStateModOPVisitorBase& v) const = 0;
190 
191  // apply out-of-place const visitor and return result
192  virtual ImageStateBasePtr Apply(const ImageStateConstModOPVisitorBase& v) const = 0;
193 
194  // apply morph visitor, with the expectation that returning state has modified this
195  virtual ImageStateBasePtr Apply(ImageStateMorphVisitorBase& v) = 0;
196 
197  // operators
198  virtual ImageStateBase& operator+=(Real v) = 0;
199  virtual ImageStateBase& operator+=(const Complex& v) = 0;
200  virtual ImageStateBase& operator-=(Real v) = 0;
201  virtual ImageStateBase& operator-=(const Complex& v) = 0;
202  virtual ImageStateBase& operator*=(Real v) = 0;
203  virtual ImageStateBase& operator*=(const Complex& v) = 0;
204  virtual ImageStateBase& operator/=(Real v) = 0;
205  virtual ImageStateBase& operator/=(const Complex& v) = 0;
206 
207  ImageStateBase& operator+=(const ImageStateBase& b);
208  ImageStateBase& operator-=(const ImageStateBase& b);
209  ImageStateBase& operator*=(const ImageStateBase& b);
210  ImageStateBase& operator/=(const ImageStateBase& b);
211 
212 protected:
215 
216 private:
217  // assignement is forbidden
218  ImageStateBase& operator=(const ImageStateBase& s);
219 };
220 
221 }}} // namespaces
222 
223 #endif