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_WORLD_INTER_PIXEL_DISPLAY_EDGE_HH
00027 # define MLN_WORLD_INTER_PIXEL_DISPLAY_EDGE_HH
00028
00032
00033 # include <mln/core/image/image2d.hh>
00034 # include <mln/core/image/dmorph/image_if.hh>
00035 # include <mln/data/fill.hh>
00036 # include <mln/world/inter_pixel/dim2/is_edge.hh>
00037 # include <mln/opt/at.hh>
00038
00039 namespace mln
00040 {
00041
00042 namespace world
00043 {
00044
00045 namespace inter_pixel
00046 {
00047
00048 template <typename I>
00049 inline
00050 I display_edge(const I& ima, mln_value(I) bg, unsigned zoom)
00051 {
00052 box2d b = ima.bbox();
00053
00054 I output(make::box2d((b.pmin()[0] / 2) * (zoom + 1), (b.pmin()[1] / 2) * (zoom + 1),
00055 (b.pmax()[0] / 2 + 1) * (zoom + 1) - 2, (b.pmax()[1] / 2 + 1) * (zoom + 1) - 2));
00056 data::fill(output, bg);
00057 typedef image_if<const I, dim2::is_edge> edge_t;
00058 edge_t edge = ima | dim2::is_edge();
00059 mln_piter(edge_t) p(edge.domain());
00060 for_all(p)
00061 if (p.row() % 2)
00062 {
00063 unsigned row = (p.row() / 2 + 1) * (zoom + 1) - 1;
00064 unsigned col = (p.col() / 2) * (zoom + 1);
00065 for (unsigned i = 0; i < zoom; ++i)
00066 opt::at(output, row, col + i) = ima(p);
00067 }
00068 else
00069 {
00070 unsigned row = (p.row() / 2) * (zoom + 1);
00071 unsigned col = (p.col() / 2 + 1) * (zoom + 1) - 1;
00072 for (unsigned i = 0; i < zoom; ++i)
00073 opt::at(output, row + i, col) = ima(p);
00074 }
00075 return output;
00076 }
00077
00078 }
00079
00080 }
00081
00082 }
00083
00084 #endif // ! MLN_WORLD_INTER_PIXEL_DISPLAY_EDGE_HH