26 #ifndef SCRIBO_FILTER_PARAGRAPHS_BBOX_OVERLAP_HH
27 # define SCRIBO_FILTER_PARAGRAPHS_BBOX_OVERLAP_HH
35 # include <mln/core/concept/image.hh>
36 # include <mln/core/concept/neighborhood.hh>
37 # include <mln/core/concept/function.hh>
38 # include <mln/core/image/dmorph/image_if.hh>
39 # include <mln/data/transform.hh>
40 # include <mln/util/array.hh>
41 # include <mln/draw/box_plain.hh>
43 # include <scribo/core/paragraph_set.hh>
44 # include <scribo/util/box_intersection.hh>
69 # ifndef MLN_INCLUDE_ONLY
75 struct order_paragraphs_id
85 const unsigned l1_nsites = parset_(l1).bbox().nsites();
86 const unsigned l2_nsites = parset_(l2).bbox().nsites();
88 if (l1_nsites == l2_nsites)
90 return l1_nsites > l2_nsites;
103 mln_trace(
"scribo::filter::paragraphs_bbox_overlap");
105 mln_precondition(parset.is_valid());
111 mln::util::array<
bool> not_to_ignore(parset.nelements() + 1, true);
112 not_to_ignore(0) = false;
114 paragraph_set<L> output = parset.
duplicate();
116 mln::util::array<paragraph_id_t> candidate;
117 candidate.reserve(parset.nelements());
118 for_all_paragraphs(cur_id, parset)
119 if (parset(cur_id).is_valid())
120 candidate.append(cur_id);
122 std::sort(candidate.hook_std_vector_().begin(),
123 candidate.hook_std_vector_().end(),
124 internal::order_paragraphs_id<L>(parset));
126 for_all_elements(e, candidate)
128 paragraph_id_t cur_id = candidate(e);
132 if (parset(cur_id).nlines() > 3)
150 const unsigned tl = billboard(b_.
pmin());
152 const unsigned bl = billboard.at_(b_.
pmax().
row(), b_.
pmin().
col());
153 const unsigned br = billboard(b_.
pmax());
155 typedef std::set<unsigned> set_t;
170 if (!not_to_ignore(mc)
171 || (labels.size() > 1 && labels.find(0) == labels.end()))
174 not_to_ignore(cur_id) =
false;
178 for (set_t::const_iterator it = labels.begin();
179 it != labels.end(); ++it)
182 mln_assertion(*it != mc);
185 box2d b_i = scribo::util::box_intersection(b_, b2);
192 output(mc).fast_merge(output(cur_id));
239 output.invalidate(not_to_ignore);
241 for_all_paragraphs(p, output)
242 if (output(p).is_valid())
243 output(p).force_stats_update();
249 # endif // ! MLN_INCLUDE_ONLY
255 #endif // ! SCRIBO_FILTER_PARAGRAPHS_BBOX_OVERLAP_HH