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