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
00026
00027 #ifndef MLN_CANVAS_BROWSING_BACKDIAGONAL2D_HH
00028 # define MLN_CANVAS_BROWSING_BACKDIAGONAL2D_HH
00029
00033
00034 # include <mln/core/concept/browsing.hh>
00035 # include <mln/core/concept/image.hh>
00036
00037
00038 namespace mln
00039 {
00040
00041 namespace canvas
00042 {
00043
00044 namespace browsing
00045 {
00046
00048
00083 struct backdiagonal2d_t : public Browsing< backdiagonal2d_t >
00084 {
00085
00086
00087 backdiagonal2d_t();
00088
00089 template <typename F>
00090 void operator()(F& f) const;
00091 };
00092
00093 extern const backdiagonal2d_t backdiagonal2d;
00094
00095
00096
00097 # ifndef MLN_INCLUDE_ONLY
00098
00099 # ifndef MLN_WO_GLOBAL_VARS
00100
00101 const backdiagonal2d_t backdiagonal2d;
00102
00103 # endif // ! MLN_WO_GLOBAL_VARS
00104
00105 inline
00106 backdiagonal2d_t::backdiagonal2d_t()
00107 {
00108 }
00109
00110 template <typename F>
00111 inline
00112 void
00113 backdiagonal2d_t::operator()(F& f) const
00114 {
00115 trace::entering("canvas::browsing::backdiagonal2d");
00116
00117 typedef typename F::I I;
00118 typedef mln_deduce(I, psite, delta) dpsite;
00119 typedef mln_psite(I) psite;
00120
00121
00122 dpsite dp_first(-1, 0);
00123 dpsite dp_second(0, 1);
00124 dpsite dp_diag(1, 1);
00125
00126 mln_deduce(I, psite, delta) diag;
00127
00128 psite
00129 pmin = f.input.domain().pmin(),
00130 pmax = f.input.domain().pmax();
00131
00132
00133 f.p[0] = pmax[0];
00134 f.p[1] = pmin[1];
00135
00136 f.init();
00137
00138 while (f.input.domain().has(f.p))
00139 {
00140 psite start_diag = f.p;
00141
00142 f.init_diag();
00143 while (f.input.domain().has(f.p))
00144 {
00145 f.next();
00146 f.p = f.p + dp_diag;
00147 }
00148
00149
00150 f.p = start_diag + dp_first;
00151 }
00152 f.p = f.p - dp_first;
00153
00154 f.p = f.p + dp_second;
00155 while (f.input.domain().has(f.p))
00156 {
00157 psite start_diag = f.p;
00158
00159
00160 f.init_diag();
00161 while (f.input.domain().has(f.p))
00162 {
00163 f.next();
00164 f.p = f.p + dp_diag;
00165 }
00166 f.p = f.p - dp_diag;
00167
00168
00169 f.p = start_diag + dp_second;
00170 }
00171
00172 f.final();
00173 trace::exiting("canvas::browsing::backdiagonal2d");
00174 }
00175
00176 # endif // ! MLN_INCLUDE_ONLY
00177
00178 }
00179
00180 }
00181
00182 }
00183
00184 #endif // ! MLN_CANVAS_BROWSING_BACKDIAGONAL2D_HH