27 #ifndef SCRIBO_CORE_PARAGRAPH_INFO_HH
28 # define SCRIBO_CORE_PARAGRAPH_INFO_HH
30 # include <scribo/core/line_info.hh>
31 # include <scribo/core/line_links.hh>
32 # include <scribo/core/tag/paragraph.hh>
33 # include <mln/util/array.hh>
34 # include <mln/accu/shape/bbox.hh>
64 unsigned nlines()
const;
72 float color_reliability()
const;
73 void set_color_reliability_(
float v);
75 bool is_valid()
const;
78 bool needs_stats_update()
const;
79 void force_stats_update();
81 void set_delta_baseline(
const int delta_baseline);
82 int delta_baseline()
const;
86 void update_tag(paragraph::Tag tag);
87 paragraph::Tag tag()
const;
95 float color_reliability_;
102 template <
typename L>
103 std::ostream& operator<<(std::ostream& ostr, const paragraph_info<L>&
info);
105 template <
typename L>
108 # ifndef MLN_INCLUDE_ONLY
111 template <
typename L>
113 : tag_(paragraph::None), is_valid_(false)
117 template <
typename L>
118 paragraph_info<L>::paragraph_info(
const line_links<L>& llinks)
119 : llinks_(llinks), tag_(paragraph::None), is_valid_(true)
123 template <
typename L>
127 line_ids_.append(line.id());
128 bbox_.take(line.bbox());
131 tag_ = paragraph::Needs_Precise_Stats_Update;
135 template <
typename L>
139 return bbox_.to_result();
142 template <
typename L>
146 mln_precondition(is_valid());
147 return llinks_.lines()(id);
150 template <
typename L>
152 paragraph_info<L>::line_ids()
const
157 template <
typename L>
159 paragraph_info<L>::nlines()
const
164 template <
typename L>
166 paragraph_info<L>::llinks()
const
171 template <
typename L>
173 paragraph_info<L>::color()
const
178 template <
typename L>
185 template <
typename L>
187 paragraph_info<L>::color_reliability()
const
189 return color_reliability_;
192 template <
typename L>
194 paragraph_info<L>::set_color_reliability_(
float v)
196 color_reliability_ = v;
199 template <
typename L>
201 paragraph_info<L>::is_valid()
const
203 return llinks_.is_valid() && is_valid_;
206 template <
typename L>
208 paragraph_info<L>::invalidate()
213 template <
typename L>
215 paragraph_info<L>::needs_stats_update()
const
217 return tag_ == paragraph::Needs_Precise_Stats_Update;
220 template <
typename L>
222 paragraph_info<L>::force_stats_update()
224 if (!needs_stats_update())
227 const line_set<L>& lines = llinks_.lines();
241 for_all_elements(e, line_ids_)
243 unsigned lid = line_ids_(e);
245 color_red.
take(lines(lid).color().
red());
246 color_green.
take(lines(lid).color().
green());
247 color_blue.
take(lines(lid).color().
blue());
248 sum2_red += mln::math::sqr<unsigned>(lines(lid).color().red());
249 sum2_green += mln::math::sqr<unsigned>(lines(lid).color().green());
250 sum2_blue += mln::math::sqr<unsigned>(lines(lid).color().blue());
258 var_red = sum2_red / (
float)line_ids_.nelements()
259 - mln::math::sqr<float>(color_red.
to_result()),
260 var_green = sum2_green / (
float)line_ids_.nelements()
261 - mln::math::
sqr<
float>(color_green.to_result()),
262 var_blue = sum2_blue / (
float)line_ids_.nelements()
263 - mln::math::
sqr<
float>(color_blue.to_result());
265 color_reliability_ = std::
sqrt(std::
max(var_red,
266 std::
max(var_green, var_blue)));
273 const
unsigned nelements = line_ids_.nelements();
275 for (
unsigned i = 0; i < nelements; ++i)
277 const line_id_t& current_id = line_ids_(i);
279 if (llinks_(current_id) != current_id)
281 const line_info<L>& current_line = lines(current_id);
282 const line_info<L>& left_line = lines(llinks_(current_id));
284 delta.take(left_line.baseline() - current_line.baseline());
291 median = lines(line_ids_(0)).x_height();
293 set_delta_baseline(median);
297 tag_ = paragraph::None;
300 template <
typename L>
302 paragraph_info<L>::set_delta_baseline(
const int delta_baseline)
304 delta_baseline_ = delta_baseline;
307 template <
typename L>
309 paragraph_info<L>::delta_baseline()
const
311 return delta_baseline_;
314 template <
typename L>
316 paragraph_info<L>::fast_merge(paragraph_info<L>& other)
318 tag_ = paragraph::Needs_Precise_Stats_Update;
319 other.update_tag(paragraph::Merged);
323 bbox_.take(other.bbox());
327 set_delta_baseline(
std::max(other.delta_baseline_, delta_baseline_));
329 line_ids_.append(other.line_ids());
332 template <
typename L>
334 paragraph_info<L>::update_tag(paragraph::Tag tag)
339 template <
typename L>
341 paragraph_info<L>::tag()
const
346 template <
typename L>
348 operator==(
const paragraph_info<L>& lhs,
const paragraph_info<L>& rhs)
354 lhs.line_ids() == rhs.line_ids()
355 && lhs.bbox() == rhs.bbox()
356 && lhs.llinks() == rhs.llinks()
357 && lhs.color() == rhs.color()
358 && lhs.color_reliability() == rhs.color_reliability()
359 && lhs.needs_stats_update() == rhs.needs_stats_update();
362 template <
typename L>
364 operator<<(std::ostream& ostr, const paragraph_info<L>&
info)
366 return ostr <<
"paragraph_info("
367 <<
"line_ids=" <<
info.line_ids()
368 <<
", bbox=" <<
info.bbox()
369 <<
", color=" <<
info.color()
370 <<
", color_reliability=" <<
info.color_reliability()
375 # endif // ! MLN_INCLUDE_ONLY
379 #endif // ! SCRIBO_CORE_PARAGRAPH_INFO_HH