26 #ifndef MLN_UPSCALING_ART_SCALE3X_HH
27 # define MLN_UPSCALING_ART_SCALE3X_HH
34 # include <mln/core/concept/box.hh>
35 # include <mln/core/concept/image.hh>
36 # include <mln/core/alias/neighb2d.hh>
37 # include <mln/core/alias/dpoint2d.hh>
39 # include <mln/extension/adjust_duplicate.hh>
64 scale3x(const Image<I>& input);
67 # ifndef MLN_INCLUDE_ONLY
72 scale3x(const Image<I>& input_)
74 trace::entering(
"mln::upscaling::art::scale3x");
76 const I& input = exact(input_);
77 mln_precondition(input.is_valid());
78 mlc_is_a(mln_domain(I), Box)::check();
82 mln_domain(I) ext_domain(input.domain().pmin() * 3,
83 input.domain().pmax() * 3
84 + 2 * mln::down_right);
86 mln_concrete(I) output(ext_domain);
89 mln_piter(I) p(input.domain());
97 pA = p + mln::up_left,
99 pC = p + mln::up_right,
103 pG = p + mln::down_left,
105 pI = p + mln::down_right,
106 pOut = p * 3 + mln::down_right;
109 if (input(pD) == input(pB)
110 && input(pD) != input(pH)
111 && input(pB) != input(pF))
112 output(pOut + mln::up_left) = input(pD);
114 output(pOut + mln::up_left) = input(p);
118 if ((input(pD) == input(pB)
119 && input(pD) != input(pH)
120 && input(pB) != input(pF)
121 && input(pE) != input(pC))
122 || (input(pB) == input(pF)
123 && input(pB) != input(pD)
124 && input(pF) != input(pH)
125 && input(pE) != input(pA)))
126 output(pOut + mln::up) = input(pB);
128 output(pOut + mln::up) = input(p);
131 if (input(pB) == input(pF)
132 && input(pB) != input(pD)
133 && input(pF) != input(pH))
134 output(pOut + mln::up_right) = input(pF);
136 output(pOut + mln::up_right) = input(p);
140 if ((input(pH) == input(pD)
141 && input(pH) != input(pF)
142 && input(pD) != input(pB)
143 && input(pE) != input(pA))
144 || (input(pD) == input(pB)
145 && input(pD) != input(pH)
146 && input(pB) != input(pF)
147 && input(pE) != input(pG)))
148 output(pOut + mln::left) = input(pD);
150 output(pOut + mln::left) = input(p);
153 output(pOut) = input(p);
157 if ((input(pB) == input(pF)
158 && input(pB) != input(pD)
159 && input(pF) != input(pH)
160 && input(pE) != input(pI))
161 || (input(pF) == input(pH)
162 && input(pF) != input(pB)
163 && input(pH) != input(pD)
164 && input(pE) != input(pC)))
165 output(pOut + mln::right) = input(pF);
167 output(pOut + mln::right) = input(p);
170 if (input(pH) == input(pD)
171 && input(pH) != input(pF)
172 && input(pD) != input(pB))
173 output(pOut + mln::down_left) = input(pD);
175 output(pOut + mln::down_left) = input(p);
180 if ((input(pF) == input(pH)
181 && input(pF) != input(pB)
182 && input(pH) != input(pD)
183 && input(pE) != input(pG))
184 || (input(pH) == input(pD)
185 && input(pH) != input(pF)
186 && input(pD) != input(pB)
187 && input(pE) != input(pI)))
188 output(pOut + mln::down) = input(pH);
190 output(pOut + mln::down) = input(p);
194 if (input(pF) == input(pH)
195 && input(pF) != input(pB)
196 && input(pH) != input(pD))
197 output(pOut + mln::down_right) = input(pF);
199 output(pOut + mln::down_right) = input(p);
203 trace::exiting("mln::upscaling::art::scale3x");
208 # endif // ! MLN_INCLUDE_ONLY
218 #endif // ! MLN_UPSCALING_ART_SCALE3X_HH