Olena-patches
Threads by month
- ----- 2025 -----
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- 9625 discussions
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Olena, a generic and efficient image processing platform".
The branch exp/TL has been updated
via 6a4f5c64f4ab191a6e69fdb0751b917b4454a545 (commit)
via f4024c0f648bac243f0cb60c04ae3e895a9e08d3 (commit)
via 899735d56c85aa43f081a0fb183d0b7d7698cf70 (commit)
via f6801ca6b20d3439a2c79cbddb64d703c5b27e60 (commit)
via 81f1b95ffa4a93800125ac751de2086893bf4f0d (commit)
via 0a09504ba4f2512f8c82cd73b954d97f859da57f (commit)
via 38c46783a22cddd8b99524d1979c48f33e4de6d7 (commit)
via 6850b80deff3dbc90abd13f8923f182a1ea201ac (commit)
via 75a0e90175493882bd06f42658528143b5788129 (commit)
via 9e1435d37beb2b0b9cd3d7c5cac4d82fe71a4011 (commit)
via 34062afdd8cfdb76e2afc29e884540fb085e0b42 (commit)
via daec0fb172ffa4fe95569ea34d4bb5898acdfdf7 (commit)
via 84a382e74cae76fd681bde2d6473a1975b62ec98 (commit)
via 2e932719df7f8d3db303fd17cd6b75e1de75c7b3 (commit)
via 309be63b08b612bbfb16d95723476fdcdb9adf8c (commit)
via c70b3a64688d3df3a20594b25f2b881bb5949535 (commit)
via 1df707ba5800782c898057332448cb5d92acc995 (commit)
via 0aa95fef8db6db963f10674225031013a010a77c (commit)
via 1683d096635a12b58d3df18294f50f84662babb1 (commit)
via b5e43857359de8024e8ac0d9d851543bfd8e80e9 (commit)
via 03eb6db89b595d2ad404cf894ecfd1a5a7aa7f16 (commit)
via ceb847dc3fed22960515c81ae86ed575a7e03d6c (commit)
via cbb253decdcf96a51d71c10a781101b391bf461b (commit)
from 57e5da750504563b272d09e46958d139abbd66fe (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
6a4f5c6 Merge branch 'exp/newdoc' into exp/TL
-----------------------------------------------------------------------
Summary of changes:
milena/ChangeLog | 205 ++++
milena/doc/Doxyfile.in | 3 +-
milena/doc/examples-outputs.mk | 54 +
milena/doc/examples.dox | 12 +-
milena/doc/examples.mk | 3 +
milena/doc/examples/extended_image.cc | 51 +
milena/doc/examples/sub_image.cc | 46 +
milena/doc/examples/transformed_image.cc | 31 +
milena/doc/figures.mk | 13 +
.../figures/{logical-not-1.pbm => sub_image-1.pbm} | 2 +-
.../figures/{logical-not-1.pbm => sub_image-2.pbm} | Bin 117 -> 115 bytes
milena/doc/mln/core/alias/box1d.dox | 4 +-
milena/doc/mln/core/alias/box2d.dox | 4 +-
milena/doc/mln/core/alias/box2d_h.dox | 4 +-
milena/doc/mln/core/alias/box3d.dox | 4 +-
milena/doc/mln/core/image/images.dox | 272 +++++-
milena/doc/mln/core/image/morphers.dox | 9 +-
milena/doc/mln/core/macros.dox | 79 ++
milena/doc/mln/labeling/labeling.dox | 39 +-
milena/doc/mln/literal/literal.dox | 14 +
milena/doc/mln/main.dox | 6 +
milena/doc/mln/value/value.dox | 22 +-
milena/doc/outputs.mk | 3 +
...-right-instantiation.txt => extended_image.txt} | 0
...{accu-right-instantiation.txt => sub_image.txt} | 0
...ght-instantiation.txt => transformed_image.txt} | 0
milena/doc/programs-examples.mk | 9 +-
milena/doc/ref-guide.tex | 37 +-
milena/mln/algebra/vec.hh | 15 +
milena/mln/core/concept/image.hh | 63 +-
milena/mln/core/concept/iterator.hh | 47 +-
milena/mln/core/concept/neighborhood.hh | 2 +-
milena/mln/core/concept/site_set.hh | 2 +-
milena/mln/core/concept/value.hh | 2 +-
milena/mln/core/concept/window.hh | 2 +-
milena/mln/core/image/dmorph/extended.hh | 41 +-
milena/mln/core/image/dmorph/sub_image.hh | 37 +-
milena/mln/core/image/dmorph/transformed_image.hh | 33 +-
milena/mln/core/macros.hh | 1174 +++++++++++++++++++-
milena/mln/core/pixter1d.hh | 2 -
milena/mln/core/routine/duplicate.hh | 24 +-
milena/mln/core/site_set/box.hh | 51 +
milena/mln/core/var.hh | 26 +-
milena/mln/data/convert.hh | 1 -
milena/mln/data/transform.hh | 51 +-
milena/mln/debug/trace.hh | 18 +
milena/mln/fun/p2b/antilogy.hh | 16 +-
milena/mln/fun/p2b/big_chess.hh | 30 +-
milena/mln/fun/p2b/chess.hh | 22 +-
milena/mln/fun/p2b/has.hh | 12 +-
milena/mln/fun/p2b/tautology.hh | 15 +-
milena/mln/fun/p2p/fold.hh | 16 +-
milena/mln/fun/p2p/mirror.hh | 29 +-
milena/mln/fun/p2p/translation.hh | 19 +-
milena/mln/fun/p2v/elifs.hh | 16 +-
milena/mln/fun/p2v/iota.hh | 23 +-
milena/mln/fun/p2v/ternary.hh | 23 +-
milena/mln/fun/x2v/bilinear.hh | 12 +-
milena/mln/fun/x2v/l1_norm.hh | 8 +-
milena/mln/fun/x2v/nneighbor.hh | 67 +-
milena/mln/fun/x2v/trilinear.hh | 11 +-
milena/mln/io/pdf/load.hh | 12 +-
milena/mln/literal/black.hh | 10 +-
milena/mln/literal/colors.hh | 89 ++-
milena/mln/literal/identity.hh | 10 +-
milena/mln/literal/max.hh | 10 +-
milena/mln/literal/min.hh | 9 +-
milena/mln/literal/one.hh | 10 +-
milena/mln/literal/origin.hh | 10 +-
milena/mln/literal/white.hh | 8 +-
milena/mln/literal/zero.hh | 11 +-
milena/mln/make/vec.hh | 7 +-
milena/mln/trait/value_.hh | 87 ++-
milena/mln/value/qt/rgb32.hh | 2 +-
74 files changed, 2835 insertions(+), 276 deletions(-)
create mode 100644 milena/doc/examples/extended_image.cc
create mode 100644 milena/doc/examples/sub_image.cc
create mode 100644 milena/doc/examples/transformed_image.cc
copy milena/doc/figures/{logical-not-1.pbm => sub_image-1.pbm} (95%)
copy milena/doc/figures/{logical-not-1.pbm => sub_image-2.pbm} (92%)
create mode 100644 milena/doc/mln/core/macros.dox
create mode 100644 milena/doc/mln/literal/literal.dox
copy milena/doc/outputs/{accu-right-instantiation.txt => extended_image.txt} (100%)
copy milena/doc/outputs/{accu-right-instantiation.txt => sub_image.txt} (100%)
copy milena/doc/outputs/{accu-right-instantiation.txt => transformed_image.txt} (100%)
hooks/post-receive
--
Olena, a generic and efficient image processing platform
1
0

13 May '13
This is a merge commit message of the following branches:
Merge: 57e5da7 f4024c0
Conflicts:
milena/ChangeLog
milena/ChangeLog | 205 ++++
milena/doc/Doxyfile.in | 3 +-
milena/doc/examples-outputs.mk | 54 +
milena/doc/examples.dox | 12 +-
milena/doc/examples.mk | 3 +
milena/doc/examples/extended_image.cc | 51 +
milena/doc/examples/sub_image.cc | 46 +
milena/doc/examples/transformed_image.cc | 31 +
milena/doc/figures.mk | 13 +
milena/doc/figures/sub_image-1.pbm | 5 +
milena/doc/figures/sub_image-2.pbm | Bin 0 -> 115 bytes
milena/doc/mln/core/alias/box1d.dox | 4 +-
milena/doc/mln/core/alias/box2d.dox | 4 +-
milena/doc/mln/core/alias/box2d_h.dox | 4 +-
milena/doc/mln/core/alias/box3d.dox | 4 +-
milena/doc/mln/core/image/images.dox | 272 +++++-
milena/doc/mln/core/image/morphers.dox | 9 +-
milena/doc/mln/core/macros.dox | 79 ++
milena/doc/mln/labeling/labeling.dox | 39 +-
milena/doc/mln/literal/literal.dox | 14 +
milena/doc/mln/main.dox | 6 +
milena/doc/mln/value/value.dox | 22 +-
milena/doc/outputs.mk | 3 +
milena/doc/programs-examples.mk | 9 +-
milena/doc/ref-guide.tex | 37 +-
milena/mln/algebra/vec.hh | 15 +
milena/mln/core/concept/image.hh | 63 +-
milena/mln/core/concept/iterator.hh | 47 +-
milena/mln/core/concept/neighborhood.hh | 2 +-
milena/mln/core/concept/site_set.hh | 2 +-
milena/mln/core/concept/value.hh | 2 +-
milena/mln/core/concept/window.hh | 2 +-
milena/mln/core/image/dmorph/extended.hh | 41 +-
milena/mln/core/image/dmorph/sub_image.hh | 37 +-
milena/mln/core/image/dmorph/transformed_image.hh | 33 +-
milena/mln/core/macros.hh | 1174 ++++++++++++++++++++-
milena/mln/core/pixter1d.hh | 2 -
milena/mln/core/routine/duplicate.hh | 24 +-
milena/mln/core/site_set/box.hh | 51 +
milena/mln/core/var.hh | 26 +-
milena/mln/data/convert.hh | 1 -
milena/mln/data/transform.hh | 51 +-
milena/mln/debug/trace.hh | 18 +
milena/mln/fun/p2b/antilogy.hh | 16 +-
milena/mln/fun/p2b/big_chess.hh | 30 +-
milena/mln/fun/p2b/chess.hh | 22 +-
milena/mln/fun/p2b/has.hh | 12 +-
milena/mln/fun/p2b/tautology.hh | 15 +-
milena/mln/fun/p2p/fold.hh | 16 +-
milena/mln/fun/p2p/mirror.hh | 29 +-
milena/mln/fun/p2p/translation.hh | 19 +-
milena/mln/fun/p2v/elifs.hh | 16 +-
milena/mln/fun/p2v/iota.hh | 23 +-
milena/mln/fun/p2v/ternary.hh | 23 +-
milena/mln/fun/x2v/bilinear.hh | 12 +-
milena/mln/fun/x2v/l1_norm.hh | 8 +-
milena/mln/fun/x2v/nneighbor.hh | 67 +-
milena/mln/fun/x2v/trilinear.hh | 11 +-
milena/mln/io/pdf/load.hh | 12 +-
milena/mln/literal/black.hh | 10 +-
milena/mln/literal/colors.hh | 89 ++-
milena/mln/literal/identity.hh | 10 +-
milena/mln/literal/max.hh | 10 +-
milena/mln/literal/min.hh | 9 +-
milena/mln/literal/one.hh | 10 +-
milena/mln/literal/origin.hh | 10 +-
milena/mln/literal/white.hh | 8 +-
milena/mln/literal/zero.hh | 11 +-
milena/mln/make/vec.hh | 7 +-
milena/mln/trait/value_.hh | 87 ++-
milena/mln/value/qt/rgb32.hh | 2 +-
71 files changed, 2839 insertions(+), 275 deletions(-)
diff --cc milena/ChangeLog
index 8a0bc09,89d615b..0b4eefd
--- a/milena/ChangeLog
+++ b/milena/ChangeLog
@@@ -1,40 -1,208 +1,245 @@@
+ 2013-05-13 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/mln/labeling/labeling.dox: Write general documentation on
+ labeling.
+
+ 2013-05-13 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/ref-guide.tex: Mention *_without_localization routines in
+ reference guide.
+
+ 2013-05-13 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Document sub_image morpher.
+
+ * doc/examples-outputs.mk,
+ * doc/examples.mk,
+ * doc/figures.mk,
+ * doc/outputs.mk,
+ * doc/programs-examples.mk: Regen.
+
+ * doc/examples.dox: Revamp layout and add link to the new sub_image
+ example.
+
+ * doc/examples/sub_image.cc,
+ * doc/outputs/sub_image.txt,
+ * doc/figures/sub_image-1.pbm,
+ * doc/figures/sub_image-2.pbm: New.
+
+ * mln/core/image/dmorph/sub_image.hh: Write documentation.
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/routine/duplicate.hh: Document this routine.
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Small fixes in documentation.
+
+ * doc/mln/core/image/morphers.dox: Add a reference to duplicate().
+
+ * mln/core/pixter1d.hh: Remove \internal commands.
+
+ * mln/data/transform.hh: Improve layout of pseudo-code.
+
+ * mln/io/pdf/load.hh: Remove duplicate '*' in comments.
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Improve documentation of several macros.
+
+ * mln/core/concept/iterator.hh: Document arguments.
+
+ * mln/core/macros.hh: Add more documentation details for iterator
+ related macros.
+
+ * mln/core/var.hh: Fix typos.
+
+ * mln/debug/trace.hh: Add documentation to mln_trace and
+ mln_trace_warning.
+
+ * mln/trait/value_.hh: Add documentation to several common macros.
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Fix missing parts of mln::box interface in documentation.
+
+ * doc/mln/core/alias/box1d.dox,
+ * doc/mln/core/alias/box2d.dox,
+ * doc/mln/core/alias/box2d_h.dox,
+ * doc/mln/core/alias/box3d.dox: Make class inherit from box_impl.
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/var.hh: Document mln_VAR().
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Cross reference algebra::vec and make::vec in their respective
+ documentation.
+
+ * mln/algebra/vec.hh,
+ * mln/make/vec.hh: Here.
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Document extended and transformed_image morphers.
+
+ * doc/examples-outputs.mk,
+ * doc/examples.mk,
+ * doc/outputs.mk: Regen.
+
+ * doc/examples.dox: Add link to new examples.
+
+ * doc/outputs/extended_image.txt,
+ * doc/outputs/transformed_image.txt,
+ * doc/examples/extended_image.cc,
+ * doc/examples/transformed_image.cc: New.
+
+ * doc/programs-examples.mk: Add new example programs.
+
+ * mln/core/image/dmorph/extended.hh,
+ * mln/core/image/dmorph/transformed_image.hh: Write documentation
+ and insert example code.
+
+ * mln/fun/p2p/fold.hh,
+ * mln/fun/p2p/mirror.hh,
+ * mln/fun/p2p/translation.hh: Make references to
+ transformed_image.
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/site_set/box.hh: Add shrink() and to_smaller() members.
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add a module related to literals.
+
+ * doc/mln/literal/literal.dox: New.
+
+ * mln/literal/black.hh,
+ * mln/literal/colors.hh,
+ * mln/literal/identity.hh,
+ * mln/literal/max.hh,
+ * mln/literal/min.hh,
+ * mln/literal/one.hh,
+ * mln/literal/origin.hh,
+ * mln/literal/white.hh,
+ * mln/literal/zero.hh: Move to literal module.
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Small fixes in existing documentation.
+
+ * mln/data/convert.hh: Remove a duplicate \overload.
+
+ * mln/core/macros.hh: Fix definitions.
+
+ * mln/value/qt/rgb32.hh: Fix invalid cross reference.
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/concept/iterator.hh: Document iterator macros.
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Move concepts in their related type module.
+
+ * mln/core/concept/image.hh,
+ * mln/core/concept/neighborhood.hh,
+ * mln/core/concept/site_set.hh,
+ * mln/core/concept/value.hh,
+ * mln/core/concept/window.hh: Here.
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/Doxyfile.in: Hide 'It' symbol.
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/mln/core/image/images.dox: Document generic image interface.
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/mln/main.dox: Set macro module as top level entry.
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * mln/core/concept/image.hh: Document Image concept.
+
+ 2013-04-30 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/mln/value/value/dox: Specify that built-in types can be
+ used.
+
+ 2013-04-29 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Introduce a new module for useful macros.
+
+ * doc/mln/core/macros.dox: New.
+
+ * doc/mln/main.dox: New module.
+
+ * mln/core/macros.hh: Add comments.
+
+ 2013-04-29 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Improve documentation in fun::p2b, fun::p2p, fun::p2v and
+ fun::x2v.
+
+ * mln/fun/p2b/antilogy.hh,
+ * mln/fun/p2b/big_chess.hh,
+ * mln/fun/p2b/chess.hh,
+ * mln/fun/p2b/has.hh,
+ * mln/fun/p2b/tautology.hh,
+ * mln/fun/p2p/fold.hh,
+ * mln/fun/p2p/mirror.hh,
+ * mln/fun/p2p/translation.hh,
+ * mln/fun/p2v/elifs.hh,
+ * mln/fun/p2v/iota.hh,
+ * mln/fun/p2v/ternary.hh,
+ * mln/fun/x2v/bilinear.hh,
+ * mln/fun/x2v/l1_norm.hh,
+ * mln/fun/x2v/nneighbor.hh,
+ * mln/fun/x2v/trilinear.hh: Here.
+
+2013-04-24 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Handle 16 bits value types with io::magick.
+
+ * mln/io/magick/load.hh,
+ * mln/io/magick/save.hh: Enable portions of code supporting 16bits
+ images if GraphicsMagick supports it.
+
+2013-04-24 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Relax conversion dispatch.
+
+ * mln/convert/impl/from_value_to_value.hh: Disable dispatch and
+ rely on from_to().
+
+ * mln/value/rgb.hh: Add a from_to_() overload to handle conversion
+ from rgb<n> to rgb<m>.
+
+2013-04-23 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * tests/io/magick/save.cc: Kill compilation warnings.
+
+2013-04-23 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add save options to magick::save.
+
+ * mln/io/magick/save.hh: Add save_options structure.
+
+2013-04-23 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add a new routine to get image headers thanks to GraphicsMagick.
+
+ * mln/io/magick/get_header.hh,
+ * mln/tests/io/magick/get_header.cc: New
+
+ * mln/tests/io/magick/Makefile.am: New target.
+
2013-04-29 Guillaume Lazzara <z(a)lrde.epita.fr>
* tests/fun/Makefile.am: Remove duplicate subdir entry for v2v.
hooks/post-receive
--
Olena, a generic and efficient image processing platform
1
0

13 May '13
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Olena, a generic and efficient image processing platform".
The branch exp/smearing has been updated
via e64193117ab24a970897b3a02d22716f3255039a (commit)
via 6894b3702ca310f811f33289e80a7e3da671c935 (commit)
via 2b4a5820ba65bfc99e72803eb610eccad0ddedd1 (commit)
via bf4788982c0d1cd562ea806bfeb123cffb5b0900 (commit)
from 1935bc36690804e3ee07a7c2344538c9d80287c8 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
e641931 NEWS: Notify new Smearing algorithm.
6894b37 doc/doc.bib: Add a reference for Smearing layout analysis.
2b4a582 Regenerate auto-generated files.
bf47889 Add Smearing layout analysis algorithm.
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 8 +
NEWS | 2 +-
doc/doc.bib | 11 +
scribo/ChangeLog | 23 ++
scribo/headers.mk | 6 +
scribo/scribo/layout/internal/smearing/bbox2d.hh | 151 +++++++++
.../layout/internal/smearing/classification.hh | 147 +++++++++
scribo/scribo/layout/internal/smearing/crla.hh | 219 +++++++++++++
.../scribo/layout/internal/smearing/draw_region.hh | 121 +++++++
scribo/scribo/layout/internal/smearing/labeling.hh | 340 ++++++++++++++++++++
scribo/scribo/layout/smearing.hh | 223 +++++++++++++
scribo/tests/layout/Makefile.am | 10 +-
scribo/tests/layout/smearing-nontext.pbm | 5 +
.../alignment_3.pbm => layout/smearing-text.pbm} | Bin 12167 -> 11996 bytes
scribo/tests/layout/{xy_cut.cc => smearing.cc} | 19 +-
scribo/tests/unit_test/unit-tests.mk | 6 +
16 files changed, 1279 insertions(+), 12 deletions(-)
create mode 100644 scribo/scribo/layout/internal/smearing/bbox2d.hh
create mode 100644 scribo/scribo/layout/internal/smearing/classification.hh
create mode 100644 scribo/scribo/layout/internal/smearing/crla.hh
create mode 100644 scribo/scribo/layout/internal/smearing/draw_region.hh
create mode 100644 scribo/scribo/layout/internal/smearing/labeling.hh
create mode 100644 scribo/scribo/layout/smearing.hh
create mode 100644 scribo/tests/layout/smearing-nontext.pbm
copy scribo/tests/{img/alignment_3.pbm => layout/smearing-text.pbm} (95%)
copy scribo/tests/layout/{xy_cut.cc => smearing.cc} (78%)
hooks/post-receive
--
Olena, a generic and efficient image processing platform
1
0

13 May '13
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Olena, a generic and efficient image processing platform".
The branch exp/smearing has been created
at 1935bc36690804e3ee07a7c2344538c9d80287c8 (commit)
- Log -----------------------------------------------------------------
No new revisions were added by this update.
-----------------------------------------------------------------------
hooks/post-receive
--
Olena, a generic and efficient image processing platform
1
0

13 May '13
---
ChangeLog | 4 ++++
NEWS | 2 +-
2 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 3615da4..63c5836 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2013-05-13 Guillaume Lazzara <z(a)lrde.epita.fr>
+ * NEWS: Notify new Smearing algorithm.
+
+2013-05-13 Guillaume Lazzara <z(a)lrde.epita.fr>
+
* doc/doc.bib: Add a reference for Smearing layout analysis.
2013-04-18 Guillaume Lazzara <z(a)lrde.epita.fr>
diff --git a/NEWS b/NEWS
index 26ce3c0..525b0e4 100644
--- a/NEWS
+++ b/NEWS
@@ -33,7 +33,7 @@
* Add support for Tesseract 3.02.
- * Add the layout analysis algorithm XY-Cut.
+ * Add new layout analysis algorithms: XY-Cut and Smearing.
* Olena 2.0 September 16, 2011
--
1.7.2.5
1
0

olena: olena-2.0-555-g6894b37 doc/doc.bib: Add a reference for Smearing layout analysis.
by Guillaume Lazzara 13 May '13
by Guillaume Lazzara 13 May '13
13 May '13
---
ChangeLog | 4 ++++
doc/doc.bib | 11 +++++++++++
2 files changed, 15 insertions(+), 0 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 5c08e1b..3615da4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-05-13 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * doc/doc.bib: Add a reference for Smearing layout analysis.
+
2013-04-18 Guillaume Lazzara <z(a)lrde.epita.fr>
Remove unstable viewer.
diff --git a/doc/doc.bib b/doc/doc.bib
index 2c04307..03eb0fb 100644
--- a/doc/doc.bib
+++ b/doc/doc.bib
@@ -73,4 +73,15 @@
pages={2373--2376},
year={2009},
organization={IEEE}
+}
+
+@article{ogorman1993pami,
+ title={The document spectrum for page layout analysis},
+ author={L. O'Gorman},
+ journal={Pattern Analysis and Machine Intelligence},
+ volume={15},
+ number={11},
+ pages={1162--1173},
+ year={1993},
+ publisher={IEEE}
}
\ No newline at end of file
--
1.7.2.5
1
0

13 May '13
* headers.mk,
* tests/unit_test/unit-tests.mk: Regen.
---
scribo/ChangeLog | 7 +++++++
scribo/headers.mk | 6 ++++++
scribo/tests/unit_test/unit-tests.mk | 6 ++++++
3 files changed, 19 insertions(+), 0 deletions(-)
diff --git a/scribo/ChangeLog b/scribo/ChangeLog
index b10317a..0489e45 100644
--- a/scribo/ChangeLog
+++ b/scribo/ChangeLog
@@ -1,5 +1,12 @@
2013-05-13 Guillaume Lazzara <z(a)lrde.epita.fr>
+ Regenerate auto-generated files.
+
+ * headers.mk,
+ * tests/unit_test/unit-tests.mk: Regen.
+
+2013-05-13 Guillaume Lazzara <z(a)lrde.epita.fr>
+
Add Smearing layout analysis algorithm.
* scribo/layout/internal/smearing/bbox2d.hh,
diff --git a/scribo/headers.mk b/scribo/headers.mk
index 3160b85..8c14299 100644
--- a/scribo/headers.mk
+++ b/scribo/headers.mk
@@ -167,6 +167,12 @@ scribo/io/xml/load.hh \
scribo/io/xml/save.hh \
scribo/layout/internal/hist_info.hh \
scribo/layout/internal/node.hh \
+scribo/layout/internal/smearing/bbox2d.hh \
+scribo/layout/internal/smearing/classification.hh \
+scribo/layout/internal/smearing/crla.hh \
+scribo/layout/internal/smearing/draw_region.hh \
+scribo/layout/internal/smearing/labeling.hh \
+scribo/layout/smearing.hh \
scribo/layout/xy_cut.hh \
scribo/make/all.hh \
scribo/make/debug_filename.hh \
diff --git a/scribo/tests/unit_test/unit-tests.mk b/scribo/tests/unit_test/unit-tests.mk
index 38946e1..7f66f71 100644
--- a/scribo/tests/unit_test/unit-tests.mk
+++ b/scribo/tests/unit_test/unit-tests.mk
@@ -324,6 +324,12 @@ scribo_io_xml_internal_print_image_coords \
scribo_io_xml_internal_time_info \
scribo_layout_internal_hist_info \
scribo_layout_internal_node \
+scribo_layout_internal_smearing_bbox2d \
+scribo_layout_internal_smearing_classification \
+scribo_layout_internal_smearing_crla \
+scribo_layout_internal_smearing_draw_region \
+scribo_layout_internal_smearing_labeling \
+scribo_layout_smearing \
scribo_layout_xy_cut \
scribo_make_all \
scribo_make_debug_filename \
--
1.7.2.5
1
0

olena: olena-2.0-553-gbf47889 Add Smearing layout analysis algorithm.
by Guillaume Lazzara 13 May '13
by Guillaume Lazzara 13 May '13
13 May '13
* scribo/layout/internal/smearing/bbox2d.hh,
* scribo/layout/internal/smearing/classification.hh,
* scribo/layout/internal/smearing/crla.hh,
* scribo/layout/internal/smearing/draw_region.hh,
* scribo/layout/internal/smearing/labeling.hh,
* scribo/layout/smearing.hh,
* tests/layout/smearing-nontext.pbm,
* tests/layout/smearing-text.pbm,
* tests/layout/smearing.cc: New.
* tests/layout/Makefile.am: New target.
---
scribo/ChangeLog | 16 +
scribo/scribo/layout/internal/smearing/bbox2d.hh | 151 +++++++++
.../layout/internal/smearing/classification.hh | 147 +++++++++
scribo/scribo/layout/internal/smearing/crla.hh | 219 +++++++++++++
.../scribo/layout/internal/smearing/draw_region.hh | 121 +++++++
scribo/scribo/layout/internal/smearing/labeling.hh | 340 ++++++++++++++++++++
scribo/scribo/layout/smearing.hh | 223 +++++++++++++
scribo/tests/layout/Makefile.am | 10 +-
scribo/tests/layout/smearing-nontext.pbm | 5 +
.../alignment_3.pbm => layout/smearing-text.pbm} | Bin 12167 -> 11996 bytes
scribo/tests/layout/{xy_cut.cc => smearing.cc} | 19 +-
11 files changed, 1240 insertions(+), 11 deletions(-)
create mode 100644 scribo/scribo/layout/internal/smearing/bbox2d.hh
create mode 100644 scribo/scribo/layout/internal/smearing/classification.hh
create mode 100644 scribo/scribo/layout/internal/smearing/crla.hh
create mode 100644 scribo/scribo/layout/internal/smearing/draw_region.hh
create mode 100644 scribo/scribo/layout/internal/smearing/labeling.hh
create mode 100644 scribo/scribo/layout/smearing.hh
create mode 100644 scribo/tests/layout/smearing-nontext.pbm
copy scribo/tests/{img/alignment_3.pbm => layout/smearing-text.pbm} (95%)
copy scribo/tests/layout/{xy_cut.cc => smearing.cc} (78%)
diff --git a/scribo/ChangeLog b/scribo/ChangeLog
index 90de65c..b10317a 100644
--- a/scribo/ChangeLog
+++ b/scribo/ChangeLog
@@ -1,3 +1,19 @@
+2013-05-13 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ Add Smearing layout analysis algorithm.
+
+ * scribo/layout/internal/smearing/bbox2d.hh,
+ * scribo/layout/internal/smearing/classification.hh,
+ * scribo/layout/internal/smearing/crla.hh,
+ * scribo/layout/internal/smearing/draw_region.hh,
+ * scribo/layout/internal/smearing/labeling.hh,
+ * scribo/layout/smearing.hh,
+ * tests/layout/smearing-nontext.pbm,
+ * tests/layout/smearing-text.pbm,
+ * tests/layout/smearing.cc: New.
+
+ * tests/layout/Makefile.am: New target.
+
2013-04-26 Guillaume Lazzara <z(a)lrde.epita.fr>
* scribo/binarization/sauvola_ms_split.hh: Make use of all arguments.
diff --git a/scribo/scribo/layout/internal/smearing/bbox2d.hh b/scribo/scribo/layout/internal/smearing/bbox2d.hh
new file mode 100644
index 0000000..502e279
--- /dev/null
+++ b/scribo/scribo/layout/internal/smearing/bbox2d.hh
@@ -0,0 +1,151 @@
+// Copyright (C) 2013 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/// \file
+///
+/// \brief 2D box class used in Smearing algorithm.
+
+/// FIXME: Use box2d ?
+
+#ifndef SCRIBO_LAYOUT_INTERNAL_SMEARING_BBOX2D_HH
+# define SCRIBO_LAYOUT_INTERNAL_SMEARING_BBOX2D_HH
+
+# include <mln/core/alias/point2d.hh>
+
+namespace scribo
+{
+
+ namespace layout
+ {
+
+ namespace internal
+ {
+
+ namespace smearing
+ {
+
+ using namespace mln;
+
+ //---------------------------
+ // Bounding box 2D
+ //---------------------------
+
+ class bbox2d
+ {
+ public:
+ bbox2d();
+
+ bbox2d(const unsigned n,
+ const point2d& pmin,
+ const point2d& pmax);
+
+ point2d& pmin();
+ const point2d& pmin() const;
+
+ point2d& pmax();
+ const point2d& pmax() const;
+
+ point2d pcenter() const;
+
+ unsigned bbox_number() const;
+
+ private:
+ unsigned n_;
+ point2d pmin_;
+ point2d pmax_;
+ };
+
+# ifndef MLN_INCLUDE_ONLY
+
+ inline
+ bbox2d::bbox2d()
+ : n_(0), pmin_(point2d(0, 0)), pmax_(point2d(0, 0))
+ {
+ }
+
+ inline
+ bbox2d::bbox2d(const unsigned n,
+ const point2d& pmin,
+ const point2d& pmax)
+ : n_(n), pmin_(pmin), pmax_(pmax)
+ {
+ }
+
+ inline
+ point2d&
+ bbox2d::pmin()
+ {
+ return pmin_;
+ }
+
+ inline
+ const point2d&
+ bbox2d::pmin() const
+ {
+ return pmin_;
+ }
+
+ inline
+ point2d&
+ bbox2d::pmax()
+ {
+ return pmax_;
+ }
+
+ inline
+ const point2d&
+ bbox2d::pmax() const
+ {
+ return pmax_;
+ }
+
+ inline
+ point2d
+ bbox2d::pcenter() const
+ {
+ point2d p(pmin_.row() + (pmax_.row() - pmin_.row()) / 2,
+ pmin_.col() + (pmax_.col() - pmin_.col()) / 2);
+
+ return p;
+ }
+
+ inline
+ unsigned
+ bbox2d::bbox_number() const
+ {
+ return n_;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace scribo::layout::internal::smearing
+
+ } // end of namespace scribo::layout::internal
+
+ } // end of namespace scribo::layout
+
+} // end of namespace scribo
+
+#endif // ! SCRIBO_LAYOUT_INTERNAL_SMEARING_BBOX2D_HH
diff --git a/scribo/scribo/layout/internal/smearing/classification.hh b/scribo/scribo/layout/internal/smearing/classification.hh
new file mode 100644
index 0000000..32c2405
--- /dev/null
+++ b/scribo/scribo/layout/internal/smearing/classification.hh
@@ -0,0 +1,147 @@
+// Copyright (C) 2013 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/// \file
+///
+/// \brief Routines used in scribo::layout::smearing
+
+#ifndef SCRIBO_LAYOUT_INTERNAL_SMEARING_CLASSIFICATION_HH
+# define SCRIBO_LAYOUT_INTERNAL_SMEARING_CLASSIFICATION_HH
+
+# include <mln/core/image/image2d.hh>
+# include <scribo/layout/internal/smearing/bbox2d.hh>
+
+
+namespace scribo
+{
+
+ namespace layout
+ {
+
+ namespace internal
+ {
+
+ namespace smearing
+ {
+
+ using namespace mln;
+
+
+ template<typename V>
+ void classify_component(const bbox2d& bbox,
+ V label,
+ image2d<V>& labeled_img);
+
+ template<typename V>
+ void compute_region_info(const image2d<bool>& input,
+ const image2d<V>& labeled_img,
+ const bbox2d& bbox,
+ float& brl,
+ float& tc);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ //---------------------------
+ // Classify component
+ //---------------------------
+
+ template<typename V>
+ inline
+ void classify_component(const bbox2d& bbox,
+ V label,
+ image2d<V>& labeled_img)
+ {
+ const unsigned id = bbox.bbox_number();
+ const point2d& pmin = bbox.pmin();
+ const point2d& pmax = bbox.pmax();
+ box2d b(pmin, pmax);
+ mln_piter_(box2d) p(b);
+
+ for_all(p)
+ {
+ V& pixel = labeled_img(p);
+ if (pixel == id)
+ pixel = label;
+ }
+ }
+
+ //---------------------------
+ // Compute region information
+ //---------------------------
+
+ template<typename V>
+ inline
+ void compute_region_info(const image2d<bool>& input,
+ const image2d<V>& labeled_img,
+ const bbox2d& bbox,
+ float& brl,
+ float& tc)
+ {
+ const unsigned id = bbox.bbox_number();
+ const point2d& pmin = bbox.pmin();
+ const point2d& pmax = bbox.pmax();
+
+ for (int i = pmin.row(); i <= pmax.row(); ++i)
+ {
+ for (int j = pmin.col(); j <= pmax.col(); ++j)
+ {
+ const unsigned label_pixel = labeled_img.at_(i, j);
+
+ if (label_pixel == id)
+ {
+ const bool pixel = input.at_(i, j);
+
+ if (pixel)
+ {
+ if (j > 0 && input.at_(i, j - 1) == 0)
+ ++tc;
+
+ int k = j + 1;
+ for (; input.at_(i, k); ++k);
+ brl += (k - j);
+
+ j = k;
+ }
+ }
+ }
+ }
+
+ if (tc == 0.0f)
+ tc = 1.0f;
+ }
+
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace scribo::layout::internal::smearing
+
+ } // end of namespace scribo::layout::internal
+
+ } // end of namespace scribo::layout
+
+} // end of namespace scribo
+
+#endif // ! SCRIBO_LAYOUT_INTERNAL_SMEARING_CLASSIFICATION_HH
diff --git a/scribo/scribo/layout/internal/smearing/crla.hh b/scribo/scribo/layout/internal/smearing/crla.hh
new file mode 100644
index 0000000..431ed79
--- /dev/null
+++ b/scribo/scribo/layout/internal/smearing/crla.hh
@@ -0,0 +1,219 @@
+// Copyright (C) 2013 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/// \file
+///
+/// \brief Routines used in scribo::layout::smearing
+
+#ifndef SCRIBO_LAYOUT_INTERNAL_SMEARING_CRLA_HH
+# define SCRIBO_LAYOUT_INTERNAL_SMEARING_CRLA_HH
+
+#include <mln/core/image/image2d.hh>
+#include <mln/pw/all.hh>
+#include <mln/core/image/dmorph/image_if.hh>
+
+
+namespace scribo
+{
+
+ namespace layout
+ {
+
+ namespace internal
+ {
+
+ namespace smearing
+ {
+
+
+ using namespace mln;
+
+
+ template< typename V >
+ void horizontal_CRLA(const image2d<V>& input,
+ image2d<V>& output,
+ const unsigned threshold,
+ const V bound);
+
+ template< typename V >
+ void vertical_CRLA(const image2d<V>& input,
+ image2d<V>& output,
+ const unsigned threshold,
+ const V bound);
+
+ template< typename V >
+ void CRLA(const image2d<V>& input,
+ image2d<V>& output,
+ const unsigned hthreshold,
+ const unsigned hthreshold2,
+ const unsigned vthreshold,
+ const V bound);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ //---------------------------
+ // Horizontal CRLA
+ //---------------------------
+
+ template< typename V >
+ inline
+ void horizontal_CRLA(const image2d<V>& input,
+ image2d<V>& output,
+ const unsigned threshold,
+ const V bound)
+ {
+ unsigned count = 0;
+ unsigned nrows = input.nrows();
+ unsigned ncols = input.ncols();
+ V last_pixel_value = 0;
+
+ for (unsigned i = 0; i < nrows; ++i)
+ {
+ for (unsigned j = 0; j < ncols; ++j)
+ {
+ V current_pixel = input.at_(i, j);
+
+ if (current_pixel == 0)
+ {
+ if (last_pixel_value)
+ {
+ unsigned k = j + 1;
+ for (; input.at_(i, k) == 0 && (k < ncols); ++k);
+
+ count = k - j;
+ current_pixel = input.at_(i, k);
+
+ if (last_pixel_value == current_pixel &&
+ current_pixel <= bound &&
+ count < threshold)
+ for (unsigned l = j; l <= k; ++l)
+ output.at_(i, l) = last_pixel_value;
+
+ j = k;
+ output.at_(i, j) = current_pixel;
+ last_pixel_value = current_pixel;
+ }
+ }
+ else
+ {
+ output.at_(i, j) = current_pixel;
+ last_pixel_value = current_pixel;
+ }
+ }
+ }
+ }
+
+ //---------------------------
+ // Vertical CRLA
+ //---------------------------
+
+ template< typename V >
+ inline
+ void vertical_CRLA(const image2d<V>& input,
+ image2d<V>& output,
+ const unsigned threshold,
+ const V bound)
+ {
+ unsigned count = 0;
+ unsigned nrows = input.nrows();
+ unsigned ncols = input.ncols();
+ V last_pixel_value = 0;
+
+ for (unsigned j = 0; j < ncols; ++j)
+ {
+ for (unsigned i = 0; i < nrows; ++i)
+ {
+ V current_pixel = input.at_(i, j);
+
+ if (current_pixel == 0)
+ {
+ if (last_pixel_value)
+ {
+ unsigned k = i + 1;
+ for (; !input.at_(k, j) && (k < nrows); ++k);
+
+ count = k - i;
+ current_pixel = input.at_(k, j);
+
+ if (last_pixel_value == current_pixel &&
+ current_pixel <= bound &&
+ count < threshold)
+ for (unsigned l = i; l <= k; ++l)
+ output.at_(l, j) = last_pixel_value;
+
+ i = k;
+ output.at_(i, j) = current_pixel;
+ last_pixel_value = current_pixel;
+ }
+ }
+ else
+ {
+ output.at_(i, j) = current_pixel;
+ last_pixel_value = current_pixel;
+ }
+ }
+ }
+ }
+
+ //---------------------------
+ // CRLA
+ //---------------------------
+
+ template< typename V >
+ inline
+ void CRLA(const image2d<V>& input,
+ image2d<V>& output,
+ const unsigned hthreshold,
+ const unsigned hthreshold2,
+ const unsigned vthreshold,
+ const V bound)
+ {
+ const box2d& domain = input.domain();
+ image2d<V> himg(domain);
+ image2d<V> vimg(domain);
+ data::fill(himg, 0);
+ data::fill(vimg, 0);
+
+ horizontal_CRLA(input, himg, hthreshold, bound);
+ vertical_CRLA(input, vimg, vthreshold, bound);
+
+ data::fill((output |(pw::value(himg) == pw::value(vimg))).rw(), pw::value(himg));
+
+ horizontal_CRLA(output, output, hthreshold2, bound);
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace scribo::layout::internal::smearing
+
+ } // end of namespace scribo::layout::internal
+
+ } // end of namespace scribo::layout
+
+} // end of namespace scribo
+
+#endif // ! SCRIBO_LAYOUT_INTERNAL_SMEARING_CRLA_HH
+
diff --git a/scribo/scribo/layout/internal/smearing/draw_region.hh b/scribo/scribo/layout/internal/smearing/draw_region.hh
new file mode 100644
index 0000000..ec1a415
--- /dev/null
+++ b/scribo/scribo/layout/internal/smearing/draw_region.hh
@@ -0,0 +1,121 @@
+// Copyright (C) 2013 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/// \file
+///
+/// \brief Routines used in scribo::layout::smearing
+
+#ifndef SCRIBO_LAYOUT_INTERNAL_SMEARING_DRAW_REGION_HH
+# define SCRIBO_LAYOUT_INTERNAL_SMEARING_DRAW_REGION_HH
+
+# include <mln/core/image/image2d.hh>
+# include <scribo/layout/internal/smearing/bbox2d.hh>
+
+
+namespace scribo
+{
+
+ namespace layout
+ {
+
+ namespace internal
+ {
+
+ namespace smearing
+ {
+
+ using namespace mln;
+
+
+ template< typename V >
+ void remove_text_region(const bbox2d& bbox,
+ const image2d<bool>& input,
+ image2d<bool>& output,
+ image2d<V>& labeled_img_orig,
+ const image2d<V>& labeled_img);
+
+ template< typename V >
+ void draw_region(const bbox2d& bbox,
+ const image2d<bool>& input,
+ image2d<bool>& output,
+ image2d<V>& labeled_img);
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template< typename V >
+ void remove_text_region(const bbox2d& bbox,
+ const image2d<bool>& input,
+ image2d<bool>& output,
+ image2d<V>& labeled_img_orig,
+ const image2d<V>& labeled_img)
+ {
+ const unsigned id = bbox.bbox_number();
+ box2d b(bbox.pmin(), bbox.pmax());
+ mln_piter_(box2d) p(b);
+
+ for_all(p)
+ {
+ const bool pixel = input(p);
+ const V label_pixel = labeled_img(p);
+
+ if (pixel && label_pixel == id)
+ {
+ output(p) = true;
+ labeled_img_orig(p) = 0;
+ }
+ }
+ }
+
+ template< typename V >
+ void draw_region(const bbox2d& bbox,
+ const image2d<bool>& input,
+ image2d<bool>& output,
+ image2d<V>& labeled_img)
+ {
+ const unsigned id = bbox.bbox_number();
+ box2d b(bbox.pmin(), bbox.pmax());
+ mln_piter_(box2d) p(b);
+
+ for_all(p)
+ {
+ const bool pixel = input(p);
+ const V label_pixel = labeled_img(p);
+
+ if (pixel && label_pixel == id)
+ output(p) = true;
+ }
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace scribo::layout::internal::smearing
+
+ } // end of namespace scribo::layout::internal
+
+ } // end of namespace scribo::layout
+
+} // end of namespace scribo
+
+#endif // ! SCRIBO_LAYOUT_INTERNAL_SMEARING_DRAW_REGION_HH
diff --git a/scribo/scribo/layout/internal/smearing/labeling.hh b/scribo/scribo/layout/internal/smearing/labeling.hh
new file mode 100644
index 0000000..bc55741
--- /dev/null
+++ b/scribo/scribo/layout/internal/smearing/labeling.hh
@@ -0,0 +1,340 @@
+// Copyright (C) 2013 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/// \file
+///
+/// \brief Routines used in scribo::layout::smearing
+
+#ifndef SCRIBO_LAYOUT_INTERNAL_SMEARING_LABELING_HH
+# define SCRIBO_LAYOUT_INTERNAL_SMEARING_LABELING_HH
+
+#include <mln/core/image/image2d.hh>
+#include <scribo/layout/internal/smearing/bbox2d.hh>
+
+
+namespace scribo
+{
+
+ namespace layout
+ {
+
+ namespace internal
+ {
+
+ namespace smearing
+ {
+
+
+ using namespace mln;
+
+ struct labeling_position
+ {
+ labeling_position(const int x_, const int y_);
+ int x;
+ int y;
+ };
+
+
+ template< typename V >
+ void propagate(const labeling_position& position,
+ std::vector< labeling_position >& next_position_list,
+ const image2d<V>& input, image2d<unsigned>& labeled_image,
+ const unsigned nb_labels, bbox2d& bbox, const V value);
+
+
+ template< typename V >
+ void component_labeling(const image2d<V>& input,
+ unsigned& nb_labels,
+ std::vector<bbox2d>& bbox_list,
+ image2d<unsigned>& labeled_image,
+ const V bound);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+
+ //---------------------------
+ // Labeling position
+ //---------------------------
+
+ labeling_position::labeling_position(const int x_, const int y_)
+ : x(x_),
+ y(y_)
+ {
+ }
+
+ //---------------------------
+ // Propagate labeling
+ //---------------------------
+
+ template< typename V >
+ inline
+ void propagate(const labeling_position& position,
+ std::vector< labeling_position >& next_position_list,
+ const image2d<V>& input, image2d<unsigned>& labeled_image,
+ const unsigned nb_labels, bbox2d& bbox, const V value)
+ {
+ int x = position.x;
+ int y = position.y;
+ int nx;
+ int ny;
+ int ncols = input.ncols();
+ int nrows = input.nrows();
+
+ bool increment_xlr = false;
+ bool increment_ylr = false;
+ bool decrement_xul = false;
+ bool decrement_yul = false;
+
+ point2d& pmin = bbox.pmin();
+ point2d& pmax = bbox.pmax();
+ const int xul = pmin.col();
+ const int yul = pmin.row();
+ const int xlr = pmax.col();
+ const int ylr = pmax.row();
+
+ {
+ nx = x + 1;
+
+ if (nx < ncols)
+ {
+ unsigned& pixel = labeled_image.at_(y, nx);
+ if (input.at_(y, nx) == value && !pixel)
+ {
+ if (xlr < nx)
+ increment_xlr = true;
+ pixel = nb_labels;
+ next_position_list.push_back(labeling_position(nx, y));
+ }
+ }
+ }
+
+ {
+ nx = x + 1;
+ ny = y + 1;
+
+ if (nx < ncols && ny < nrows)
+ {
+ unsigned& pixel = labeled_image.at_(ny, nx);
+ if (input.at_(ny, nx) == value && !pixel)
+ {
+ if (xlr < nx)
+ increment_xlr = true;
+ if (ylr < ny)
+ increment_ylr = true;
+ pixel = nb_labels;
+ next_position_list.push_back(labeling_position(nx, ny));
+ }
+ }
+ }
+
+ {
+ ny = y + 1;
+
+ if (ny < nrows)
+ {
+ unsigned& pixel = labeled_image.at_(ny, x);
+ if (input.at_(ny, x) == value && !pixel)
+ {
+ if (ylr < ny)
+ increment_ylr = true;
+ pixel = nb_labels;
+ next_position_list.push_back(labeling_position(x, ny));
+ }
+ }
+ }
+
+ {
+ nx = x - 1;
+ ny = y + 1;
+
+ if (nx >= 0 && ny < nrows)
+ {
+ unsigned& pixel = labeled_image.at_(ny, nx);
+ if (input.at_(ny, nx) == value && !pixel)
+ {
+ if (xul > nx)
+ decrement_xul = true;
+ if (ylr < ny)
+ increment_ylr = true;
+ pixel = nb_labels;
+ next_position_list.push_back(labeling_position(nx, ny));
+ }
+ }
+ }
+
+ {
+ nx = x - 1;
+
+ if (nx >= 0)
+ {
+ unsigned& pixel = labeled_image.at_(y, nx);
+ if (input.at_(y, nx) == value && !pixel)
+ {
+ if (xul > nx)
+ decrement_xul = true;
+ pixel = nb_labels;
+ next_position_list.push_back(labeling_position(nx, y));
+ }
+ }
+ }
+
+ {
+ nx = x - 1;
+ ny = y - 1;
+
+ if (nx >= 0 && ny >= 0)
+ {
+ unsigned& pixel = labeled_image.at_(ny, nx);
+ if (input.at_(ny, nx) == value && !pixel)
+ {
+ if (xul > nx)
+ decrement_xul = true;
+ if (yul > ny)
+ decrement_yul = true;
+ pixel = nb_labels;
+ next_position_list.push_back(labeling_position(nx, ny));
+ }
+ }
+ }
+
+ {
+ ny = y - 1;
+
+ if (ny >= 0)
+ {
+ unsigned& pixel = labeled_image.at_(ny, x);
+ if (input.at_(ny, x) == value && !pixel)
+ {
+ if (yul > ny)
+ decrement_yul = true;
+ pixel = nb_labels;
+ next_position_list.push_back(labeling_position(x, ny));
+ }
+ }
+ }
+
+ {
+ nx = x + 1;
+ ny = y - 1;
+
+ if (nx < ncols && ny >= 0)
+ {
+ unsigned& pixel = labeled_image.at_(ny, nx);
+ if (input.at_(ny, nx) == value && !pixel)
+ {
+ if (xlr < nx)
+ increment_xlr = true;
+ if (yul > ny)
+ decrement_yul = true;
+ pixel = nb_labels;
+ next_position_list.push_back(labeling_position(nx, ny));
+ }
+ }
+ }
+
+ if (increment_xlr)
+ ++pmax.col();
+ if (increment_ylr)
+ ++pmax.row();
+ if (decrement_xul)
+ --pmin.col();
+ if (decrement_yul)
+ --pmin.row();
+ }
+
+ //---------------------------
+ // Component labeling
+ //---------------------------
+
+ template< typename V >
+ inline
+ void component_labeling(const image2d<V>& input,
+ unsigned& nb_labels,
+ std::vector<bbox2d>& bbox_list,
+ image2d<unsigned>& labeled_image,
+ const V bound)
+ {
+ std::vector<labeling_position> position_list;
+ std::vector<labeling_position> next_position_list;
+ unsigned nrows = input.nrows();
+ unsigned ncols = input.ncols();
+
+ next_position_list.reserve(8);
+
+ for (unsigned i = 0; i < nrows; ++i)
+ {
+ for (unsigned j = 0; j < ncols; ++j)
+ {
+ if (input.at_(i, j) && !labeled_image.at_(i, j))
+ {
+ V value = input.at_(i, j);
+
+ if (value <= bound)
+ {
+ ++nb_labels;
+ position_list.clear();
+ position_list.push_back(labeling_position(j, i));
+
+ labeled_image.at_(i, j) = nb_labels;
+
+ point2d p(i, j);
+ bbox2d bbox(nb_labels, p, p);
+
+ while (!position_list.empty())
+ {
+ unsigned nb_positions = position_list.size();
+ next_position_list.clear();
+
+ for (unsigned k = 0; k < nb_positions; ++k)
+ {
+ const labeling_position& position = position_list[k];
+
+ propagate(position, next_position_list, input,
+ labeled_image, nb_labels, bbox, value);
+ }
+
+ position_list.clear();
+ position_list = next_position_list;
+ }
+
+ bbox_list.push_back(bbox);
+ }
+ }
+ }
+ }
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace scribo::layout::internal::smearing
+
+ } // end of namespace scribo::layout::internal
+
+ } // end of namespace scribo::layout
+
+} // end of namespace scribo
+
+#endif // ! SCRIBO_LAYOUT_INTERNAL_SMEARING_LABELING_HH
diff --git a/scribo/scribo/layout/smearing.hh b/scribo/scribo/layout/smearing.hh
new file mode 100644
index 0000000..2574876
--- /dev/null
+++ b/scribo/scribo/layout/smearing.hh
@@ -0,0 +1,223 @@
+// Copyright (C) 2013 EPITA Research and Development Laboratory (LRDE)
+//
+// This file is part of Olena.
+//
+// Olena is free software: you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation, version 2 of the License.
+//
+// Olena is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Olena. If not, see <http://www.gnu.org/licenses/>.
+//
+// As a special exception, you may use this file as part of a free
+// software project without restriction. Specifically, if other files
+// instantiate templates or use macros or inline functions from this
+// file, or you compile this file and link it with other files to produce
+// an executable, this file does not by itself cause the resulting
+// executable to be covered by the GNU General Public License. This
+// exception does not however invalidate any other reasons why the
+// executable file might be covered by the GNU General Public License.
+
+/// \file
+///
+/// \brief Smearing layout analysis algorithm.
+
+#ifndef SCRIBO_LAYOUT_SMEARING_HH
+# define SCRIBO_LAYOUT_SMEARING_HH
+
+# include <mln/core/image/image2d.hh>
+# include <mln/util/couple.hh>
+
+# include <scribo/layout/internal/smearing/crla.hh>
+# include <scribo/layout/internal/smearing/labeling.hh>
+# include <scribo/layout/internal/smearing/classification.hh>
+# include <scribo/layout/internal/smearing/draw_region.hh>
+
+
+namespace scribo
+{
+
+ namespace layout
+ {
+
+ using namespace mln;
+
+ /*! \brief The Smearing layout analysis algorithm. This algorithm
+ is an implementation according to paper \cite ogorman1993pami.
+
+ \param[in] A binary image.
+
+ \return A couple of binary images. The first one contains the
+ text components and the second one the non-text components.
+
+ \ingroup grpalgolayout
+ */
+ template <typename I>
+ util::couple<mln_concrete(I), mln_concrete(I)>
+ smearing(const Image<I>& input);
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template <typename I>
+ util::couple<mln_concrete(I), mln_concrete(I)>
+ smearing(const Image<I>& input_)
+ {
+ mln_trace("scribo::layout::smearing");
+
+ using namespace internal::smearing;
+
+ typedef mln_value(I) V;
+ mlc_is(V,bool)::check();
+
+ const I& input = exact(input_);
+ mln_precondition(input.is_valid());
+
+ //-------------------------
+ // Initialization
+ //-------------------------
+
+ const box2d& domain = input.domain();
+ image2d<bool> output_text(domain);
+ image2d<bool> output_non_text(domain);
+ data::fill(output_text, false);
+ data::fill(output_non_text, false);
+
+
+ //-------------------------
+ // Component labeling
+ //-------------------------
+
+ std::vector<bbox2d> bbox_list;
+ image2d<unsigned> labeled_img(domain);
+ data::fill(labeled_img, 0);
+ unsigned nlabels = 0;
+
+ internal::smearing::component_labeling(input, nlabels,
+ bbox_list, labeled_img, true);
+
+ //-------------------------
+ // Classification
+ //-------------------------
+
+ std::vector<bbox2d>::iterator it_begin = bbox_list.begin();
+ std::vector<bbox2d>::iterator it_end = bbox_list.end();
+
+ for (; it_begin != it_end; ++it_begin)
+ {
+ const bbox2d& bbox = (*it_begin);
+ const unsigned height = bbox.pmax().row() - bbox.pmin().row();
+ unsigned c = 0;
+
+ if (height < 120)
+ c = 1;
+ else if (height >= 120 && height < 360)
+ c = 2;
+ else
+ c = 3;
+
+ internal::smearing::classify_component(bbox, c, labeled_img);
+ }
+
+ //-------------------------
+ // First pass
+ //-------------------------
+
+ {
+ image2d<unsigned> output_CRLA(domain);
+ data::fill(output_CRLA, 0);
+ const unsigned bound = 1;
+
+ internal::smearing::CRLA(labeled_img, output_CRLA, 360, 15, 360, bound);
+
+ image2d<unsigned> f_labeled_img(domain);
+ data::fill(f_labeled_img, 0);
+ nlabels = 0;
+ bbox_list.clear();
+
+ internal::smearing::component_labeling(output_CRLA, nlabels,
+ bbox_list, f_labeled_img,
+ bound);
+
+ it_begin = bbox_list.begin();
+ it_end = bbox_list.end();
+
+ for (; it_begin != it_end; ++it_begin)
+ {
+ float brl = 0.0f;
+ float tc = 0.0f;
+ const bbox2d& bbox = (*it_begin);
+ const unsigned width = bbox.pmax().col() - bbox.pmin().col();
+
+ internal::smearing::compute_region_info(input, f_labeled_img,
+ bbox, brl, tc);
+
+ const float mbrl = brl / tc;
+ const float mtc = tc / width;
+
+ if (mbrl >= 0.4f && mbrl <= 15.0f && mtc >= 1.0f && mtc <= 3.8f)
+ internal::smearing::remove_text_region(bbox, input, output_text,
+ labeled_img, f_labeled_img);
+ }
+ }
+
+ //-------------------------
+ // Second pass
+ //-------------------------
+
+ {
+ image2d<unsigned> output_CRLA(domain);
+ data::fill(output_CRLA, 0);
+ const unsigned bound = 2;
+
+ internal::smearing::CRLA(labeled_img, output_CRLA, 360, 60, 360, bound);
+
+ image2d<unsigned> s_labeled_img(domain);
+ data::fill(s_labeled_img, 0);
+ nlabels = 0;
+ bbox_list.clear();
+
+ internal::smearing::component_labeling(output_CRLA, nlabels,
+ bbox_list, s_labeled_img,
+ bound);
+
+ it_begin = bbox_list.begin();
+ it_end = bbox_list.end();
+
+ for (; it_begin != it_end; ++it_begin)
+ {
+ float brl = 0.0f;
+ float tc = 0.0f;
+ const bbox2d& bbox = (*it_begin);
+ const unsigned width = bbox.pmax().col() - bbox.pmin().col();
+
+ internal::smearing::compute_region_info(input, s_labeled_img,
+ bbox, brl, tc);
+
+ const float mbrl = brl / tc;
+ const float mtc = tc / width;
+
+ if (mbrl >= 2.2f && mbrl <= 45.0f && mtc >= 1.2f && mtc <= 9.0f)
+ internal::smearing::draw_region(bbox, input, output_text,
+ s_labeled_img);
+ else
+ internal::smearing::draw_region(bbox, input, output_non_text,
+ s_labeled_img);
+ }
+ }
+
+ return mln::make::couple(output_text, output_non_text);
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+ } // end of namespace scribo::layout
+
+} // end of namespace scribo
+
+#endif // ! SCRIBO_LAYOUT_SMEARING_HH
diff --git a/scribo/tests/layout/Makefile.am b/scribo/tests/layout/Makefile.am
index 09990b1..0eab5d5 100644
--- a/scribo/tests/layout/Makefile.am
+++ b/scribo/tests/layout/Makefile.am
@@ -1,5 +1,4 @@
-# Copyright (C) 2013 EPITA Research and Development
-# Laboratory (LRDE).
+# Copyright (C) 2013 EPITA Research and Development Laboratory (LRDE).
#
# This file is part of Olena.
#
@@ -17,6 +16,11 @@
include $(top_srcdir)/scribo/tests/tests.mk
-check_PROGRAMS = xy_cut
+check_PROGRAMS = smearing \
+ xy_cut
+
+
+EXTRA_DIST = smearing-nontext.pbm \
+ smearing-text.pbm
TESTS = $(check_PROGRAMS)
diff --git a/scribo/tests/layout/smearing-nontext.pbm b/scribo/tests/layout/smearing-nontext.pbm
new file mode 100644
index 0000000..0bffbcf
--- /dev/null
+++ b/scribo/tests/layout/smearing-nontext.pbm
@@ -0,0 +1,5 @@
+P4
+# Generated by Milena 1.0 http://olena.lrde.epita.fr
+# EPITA Research and Development Laboratory (LRDE)
+436 216
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð
\ No newline at end of file
diff --git a/scribo/tests/img/alignment_3.pbm b/scribo/tests/layout/smearing-text.pbm
similarity index 95%
copy from scribo/tests/img/alignment_3.pbm
copy to scribo/tests/layout/smearing-text.pbm
index 89ec978..1975c01 100644
Binary files a/scribo/tests/img/alignment_3.pbm and b/scribo/tests/layout/smearing-text.pbm differ
diff --git a/scribo/tests/layout/xy_cut.cc b/scribo/tests/layout/smearing.cc
similarity index 78%
copy from scribo/tests/layout/xy_cut.cc
copy to scribo/tests/layout/smearing.cc
index 3601d64..d5185db 100644
--- a/scribo/tests/layout/xy_cut.cc
+++ b/scribo/tests/layout/smearing.cc
@@ -28,22 +28,25 @@
#include <iostream>
#include <mln/io/pbm/load.hh>
#include <mln/make/box2d.hh>
-#include <scribo/layout/xy_cut.hh>
+#include <mln/data/compare.hh>
+#include <scribo/layout/smearing.hh>
#include "tests/data.hh"
using namespace mln;
-int main(int argc, char** argv)
+int main()
{
image2d<bool> input;
io::pbm::load(input, SCRIBO_IMG_DIR "/alignment_3.pbm");
- util::array<box2d> bb = scribo::layout::xy_cut(input, 10, 10);
+ util::couple<image2d<bool>, image2d<bool> >
+ res = scribo::layout::smearing(input);
- mln_assertion(bb.nelements() == 4);
- mln_assertion(bb[0] == make::box2d(20,66, 38,140));
- mln_assertion(bb[1] == make::box2d(11,171, 38,221));
- mln_assertion(bb[2] == make::box2d(0,237, 38,384));
- mln_assertion(bb[3] == make::box2d(50,60, 215,402));
+ image2d<bool> ref1, ref2;
+ io::pbm::load(ref1, SCRIBO_TESTS_DIR "/layout/smearing-text.pbm");
+ io::pbm::load(ref2, SCRIBO_TESTS_DIR "/layout/smearing-nontext.pbm");
+
+ mln_assertion(ref1 == res.first());
+ mln_assertion(ref2 == res.second());
}
--
1.7.2.5
1
0
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Olena, a generic and efficient image processing platform".
The branch exp/values has been updated
discards f37b6039c9899c78f98ccd1e7ffa7eedb859a6df (commit)
discards e9454b5c16ceb5d4cd662c4d9cde7ffd66d37596 (commit)
discards 42c92be12e2271098726909965f6b103d4030114 (commit)
via 603278260ef9e95226a337b7691a6fd7c0605f7f (commit)
via 958a4e264302b659b9994fd19695cd2ea9eecc65 (commit)
via beb556f05b8a7b7f0dc7abc80cf094d6ebf2e3f5 (commit)
via 1935bc36690804e3ee07a7c2344538c9d80287c8 (commit)
via 51571df5ecf647d4f8d258bba3714ac78d9cf19d (commit)
via 806244e44b676343c967c44ca3563492e0d817ad (commit)
via 1cd17e32b4fc61239195c688394cd92c3fc44167 (commit)
via efabb3bcb01ae366f463abf4fa14303efce4cda7 (commit)
via 276ad3db3217651981534e7a5908c0b8954d2502 (commit)
via bd478ecf1a53fd1c42b3c267f220aab3f146c4ca (commit)
via 81824c6b2a74d526744302b38a5479989c961f76 (commit)
via 92344248afe3b83428d1db46b156e745451e5ce5 (commit)
via ce97be8f1743324174f965410d1249994eba3e8d (commit)
via 289bcac105fb22c53d37d73a32c1f1402bc5c358 (commit)
via 83d9bff14f8b49b346c6342855d612a37c58cfd0 (commit)
via aa8db8d1be7bdf624312762a1630355d3fec543a (commit)
via e2f4e925bc23a4698abe15108d0ec754bbf67c29 (commit)
via 07333d2c000f65cfabcc4702b704b5abf4126278 (commit)
via 1a302adfd37c3aebe33a477d64cb0304150e37c9 (commit)
via b0051dcaccff406bf3176e17f4abfb95a71822dd (commit)
via 13b61491d6933f69e26cb421e1448f094351cae9 (commit)
via 77d7b3a938fe16dc7216117a80158007706e1236 (commit)
via 9cf87e52f51dbc3344e7aca36a884b8ae0892bed (commit)
via ce8691742261a97e214f5e99024e319cc9e761e2 (commit)
via 9df9980fe8d9d1b2e7cd68ef41aa6bad00f261c0 (commit)
via 002e0e957be01c8a22605d884b9b1dd591e1ee5b (commit)
via 592a16814171acc776241e80db25673125619bda (commit)
via 979d54b458e41fc3bac8f347742d6a42a03df2a1 (commit)
via 22f1827a91aba6dd05a98e784d53d4e76a1498cd (commit)
via 733ef50fa2606d41c09badbe0f2204d16a806d61 (commit)
via 02fa89bb503205bdda6c35b477db63d637e36d31 (commit)
via 1b8c3754d59e04b11e38b19232b138e8cc42f8eb (commit)
via 11438e15a022b02513161e8191679c4409d6b4be (commit)
via 07973346bd57c8bef7e0346c28b6469da5db91e2 (commit)
via b3c468886a96090e094f3c7d79e48e489954997f (commit)
via 81e04f2a8a3166a165634524c0a73d7e9dc4f952 (commit)
via 0987e7f285f366e8129e1c1d439367e269932279 (commit)
via 17105bad97c497797a9f5ac257aca1b25c9a3678 (commit)
via 1c93a61f5b62f6ca9d96b8349d5140874adc0bce (commit)
via dde0e23d75e77e157992b656322044fad5c1f9e1 (commit)
via bc91dfb5dd05ce8b4f6b68f7f4eec1926b3aef0f (commit)
via 73774f40bae141b0b7cf507d6df8893279a46ea7 (commit)
via c173d75dba1a8d8a03c8fee43947145d2570ab64 (commit)
via 52ab07c654f83ee4968524f7e372599b762df21d (commit)
via 6a7f9e5a35954f24d74bd276193ddd257b230cac (commit)
via 8b40c86f5258ba437638b5e5d5d538ff3dcbe1c1 (commit)
via 3e5f8ace4ca6039eb22a587f463ec41014c66eec (commit)
via e048c0b0d60d75ca4458f7235179dfa283580fb2 (commit)
via 7c236c79dc621193afcf23c2ad0689a280b9e868 (commit)
via 42ff098b62214a8e3ff9984c6c554b051a93ad2e (commit)
via 04402f0a54a522e695cb3e492edc9cc9d280daf4 (commit)
via 0b442682e8f59c4e411ff0590b203bb1dcf04668 (commit)
via 5528729cfe130744aa8aa7d317af9d3a58146a2b (commit)
via cf3ad8f314f476fcac9768d2663d9afcd7661ef4 (commit)
via c57275b2a386c1fc291b4e1e800023eed552942d (commit)
via 409c1433fbb3845715a9f5b817f65d70ad161d90 (commit)
via 09c6148c1a2c9eda201e638b1ab6f5ebc7082745 (commit)
via c72cffc104bdffa902ebbdedc993ad5ddae8af5d (commit)
via cdcfe668b182ed328bae6dbd0d14528f72c50d4d (commit)
via c0f8681d2958afb11d3b4f5585de4804bc6524d4 (commit)
via 2f40e47c6660deb2d8f12c2ad403fffff6b44eb1 (commit)
via e3089252d712c2b0839f9798a98a99f690f959e2 (commit)
via b5d61ebe4059d8e89e1a40d7fd26545219172813 (commit)
via 5e4d3053fa3f8c92e02cbef811673b7c2a79040a (commit)
via 272ccdacb752b2352c26decdd648cbcf85b42b53 (commit)
via 73c3a74aea4d833e899baf0d69cd88e2c597908f (commit)
via dc7c3b9944d4b691b2099f10fba965714f82014f (commit)
via 5cd01f612dd0d318156ed7f7d369153f52a084d9 (commit)
via 5f3a088f08e99c16191c8e9461ae7052e9db8562 (commit)
via ea9c608068f019514e068fa629b18e53085ae5a3 (commit)
This update added new revisions after undoing existing revisions. That is
to say, the old revision is not a strict subset of the new revision. This
situation occurs when you --force push a change and generate a repository
containing something like this:
* -- * -- B -- O -- O -- O (f37b6039c9899c78f98ccd1e7ffa7eedb859a6df)
\
N -- N -- N (603278260ef9e95226a337b7691a6fd7c0605f7f)
When this happens we assume that you've already had alert emails for all
of the O revisions, and so we here report only the revisions in the N
branch from the common base, B.
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
6032782 NEWS: Add entry for labeling::values.
958a4e2 Regen auto-generated files.
beb556f mln/labeling/values.hh: Labeling algorithm for gray-level images.
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 127 ++++++-
GScribo/BUGS | 1 -
GScribo/GScribo.pro | 83 ----
GScribo/GScribo.pro.user | 405 -------------------
GScribo/GScribo.pro.user.1.3 | 283 -------------
GScribo/PagesWidget/pagesdelegate.cpp | 20 -
GScribo/PagesWidget/pagesdelegate.h | 18 -
GScribo/PagesWidget/pagesmodel.cpp | 55 ---
GScribo/PagesWidget/pagesmodel.h | 43 --
GScribo/PagesWidget/pageswidget.cpp | 49 ---
GScribo/PagesWidget/pageswidget.h | 55 ---
GScribo/Preferences/generaloptions.cpp | 44 --
GScribo/Preferences/generaloptions.h | 34 --
GScribo/Preferences/generaloptions.ui | 100 -----
GScribo/Preferences/ocroptions.cpp | 53 ---
GScribo/Preferences/ocroptions.h | 33 --
GScribo/Preferences/ocroptions.ui | 62 ---
GScribo/Preferences/optionwidget.h | 15 -
GScribo/Preferences/preferencesdialog.cpp | 98 -----
GScribo/Preferences/preferencesdialog.h | 42 --
GScribo/Preferences/preferencesdialog.ui | 121 ------
GScribo/Preferences/preprocessingoptions.cpp | 45 ---
GScribo/Preferences/preprocessingoptions.h | 32 --
GScribo/Preferences/preprocessingoptions.ui | 76 ----
GScribo/Preferences/segmentationoptions.cpp | 33 --
GScribo/Preferences/segmentationoptions.h | 31 --
GScribo/Preferences/segmentationoptions.ui | 52 ---
GScribo/Processing/preprocess.cpp | 11 -
GScribo/Processing/preprocess.h | 26 --
GScribo/Processing/process.cpp | 21 -
GScribo/Processing/process.h | 29 --
GScribo/Processing/progressdialog.cpp | 16 -
GScribo/Processing/progressdialog.h | 22 -
GScribo/Processing/runner.cpp | 183 ---------
GScribo/Processing/runner.h | 58 ---
GScribo/Rendering/abstractregionitem.h | 13 -
GScribo/Rendering/backgroundtexture.h | 12 -
GScribo/Rendering/graphicsview.cpp | 150 -------
GScribo/Rendering/graphicsview.h | 43 --
GScribo/Rendering/regionitem.cpp | 59 ---
GScribo/Rendering/regionitem.h | 80 ----
GScribo/Rendering/rootgraphicsitem.h | 30 --
GScribo/Rendering/scene.cpp | 273 -------------
GScribo/Rendering/scene.h | 118 ------
GScribo/Rendering/selection.cpp | 36 --
GScribo/Rendering/selection.h | 20 -
GScribo/TODO | 100 -----
GScribo/XmlWidget/attributesmodel.cpp | 69 ----
GScribo/XmlWidget/attributesmodel.h | 48 ---
GScribo/XmlWidget/selectionproxy.h | 47 ---
GScribo/XmlWidget/xmlattributes.cpp | 23 --
GScribo/XmlWidget/xmlattributes.h | 33 --
GScribo/XmlWidget/xmldelegate.h | 30 --
GScribo/XmlWidget/xmlitem.cpp | 43 --
GScribo/XmlWidget/xmlitem.h | 90 -----
GScribo/XmlWidget/xmlmodel.cpp | 87 ----
GScribo/XmlWidget/xmlmodel.h | 44 --
GScribo/XmlWidget/xmlview.cpp | 88 ----
GScribo/XmlWidget/xmlview.h | 79 ----
GScribo/XmlWidget/xmlwidget.cpp | 34 --
GScribo/XmlWidget/xmlwidget.h | 54 ---
GScribo/aboutdialog.h | 25 --
GScribo/aboutdialog.ui | 136 -------
GScribo/configs.h | 134 -------
GScribo/dir.h | 7 -
GScribo/dockwidget.h | 22 -
GScribo/main.cpp | 23 --
GScribo/mainwindow.cpp | 415 --------------------
GScribo/mainwindow.h | 120 ------
GScribo/mainwindow.ui | 35 --
GScribo/region.h | 56 ---
GScribo/regionwidget.cpp | 70 ----
GScribo/regionwidget.h | 40 --
GScribo/variantpointer.h | 19 -
GScribo/xml.cpp | 206 ----------
GScribo/xml.h | 93 -----
Makefile.am | 28 +-
NEWS | 3 +-
configure.ac | 14 +-
distrib/macports/Portfile.in | 4 +-
doc/Makefile.am | 4 +-
milena/ChangeLog | 102 +++++
milena/apps/mesh-segm-skel/Makefile.am | 2 +-
milena/doc/Doxyfile.in | 31 +-
milena/doc/Makefile.am | 9 +-
milena/doc/examples/multi_files_f1.cc.raw | 6 +
milena/doc/examples/multi_files_f2.cc.raw | 6 +
milena/doc/examples/multi_files_main.cc.raw | 16 +
milena/doc/examples/multiple_def.cc.raw | 9 +
milena/doc/examples/typenametemplate.cc.raw | 1 +
milena/doc/examples/undef_global_vars.cc.raw | 1 +
milena/doc/examples/wrongvaluetype.cc.raw | 2 +
milena/doc/mln/convert.dox | 4 +-
milena/doc/mln/labeling/labeling.dox | 6 +
milena/doc/ref-guide.tex | 69 +++-
milena/mln/labeling/background.hh | 4 +-
milena/mln/labeling/colorize.hh | 42 ++-
milena/mln/labeling/compute.hh | 100 +++---
milena/mln/labeling/compute_image.hh | 74 ++--
milena/mln/labeling/flat_zones.hh | 18 +-
milena/mln/labeling/foreground.hh | 8 +-
milena/mln/labeling/mean_values.hh | 11 +-
milena/mln/labeling/n_max.hh | 77 ++--
milena/mln/labeling/pack.hh | 34 ++-
milena/mln/labeling/regional_maxima.hh | 19 +-
milena/mln/labeling/regional_minima.hh | 19 +-
milena/mln/labeling/relabel.hh | 71 ++--
milena/mln/labeling/superpose.hh | 5 +-
milena/mln/labeling/value.hh | 24 +-
milena/mln/labeling/value_and_compute.hh | 22 +-
milena/mln/labeling/wrap.hh | 35 +-
milena/mln/topo/complex.hh | 44 +-
milena/mln/trait/ch_value.hh | 66 +++-
milena/mln/trait/concrete.hh | 65 +++-
milena/mln/win/rectangle2d.hh | 13 +-
milena/tests/labeling/n_max.cc | 5 +-
scribo/ChangeLog | 81 ++++
scribo/doc/Doxyfile.in | 16 +-
scribo/doc/Makefile.am | 2 +-
scribo/doc/scribo/core/component_set.dox | 90 -----
scribo/scribo/binarization/sauvola_ms_split.hh | 4 +
scribo/scribo/core/component_set.hh | 102 +++++-
scribo/scribo/core/line_set.hh | 4 +-
scribo/scribo/core/object_links.hh | 53 ++-
scribo/scribo/debug/logger.hh | 2 +-
.../toolchain/internal/text_in_picture_functor.hh | 22 +-
scribo/scribo/util/component_precise_outline.hh | 9 +-
scribo/src/primitive/extract/lines_pattern.cc | 2 +-
scribo/src/text_in_picture.cc | 22 +-
swilena/ChangeLog | 280 +++++++++++++
swilena/Makefile.am | 11 +-
swilena/box.ixx | 2 +-
swilena/box2d.i | 7 +-
swilena/box_piter.ixx | 3 +-
swilena/complex.ixx | 330 ++++++++++++++++
swilena/complex2.i | 111 ++++++
swilena/concat.ixx | 4 +-
swilena/image2d.ixx | 30 ++-
swilena/image2d_int.i | 5 +-
swilena/image2d_int_u8.i | 4 +-
swilena/image2d_point2d.i | 53 +++
swilena/image2d_rgb8.i | 63 +++
swilena/int_u.ixx | 24 +-
swilena/morpho.ixx | 23 +-
swilena/ppm.ixx | 57 +++
swilena/python-utils.ixx | 3 +-
swilena/python/Makefile.am | 192 +++++++++-
swilena/python/complex2-misc.py | 99 +++++
swilena/python/data.py | 26 --
swilena/python/data.py.in | 26 ++
swilena/python/installcheck.mk | 116 ++++++
swilena/python/ltihooks.py | 60 ---
swilena/python/max-tree.py | 57 +++
swilena/python/morpho-segm.py | 2 +-
swilena/python/sps-gdb-local.in | 6 +
swilena/python/sps-local.in | 2 +-
swilena/python/swilena.py | 10 +-
swilena/rgb.ixx | 159 ++++++++
swilena/rgb8.i | 40 ++
swilena/run.in | 50 ++--
160 files changed, 2820 insertions(+), 5997 deletions(-)
delete mode 100644 GScribo/BUGS
delete mode 100644 GScribo/GScribo.pro
delete mode 100644 GScribo/GScribo.pro.user
delete mode 100644 GScribo/GScribo.pro.user.1.3
delete mode 100644 GScribo/PagesWidget/pagesdelegate.cpp
delete mode 100644 GScribo/PagesWidget/pagesdelegate.h
delete mode 100644 GScribo/PagesWidget/pagesmodel.cpp
delete mode 100644 GScribo/PagesWidget/pagesmodel.h
delete mode 100644 GScribo/PagesWidget/pageswidget.cpp
delete mode 100644 GScribo/PagesWidget/pageswidget.h
delete mode 100644 GScribo/Preferences/generaloptions.cpp
delete mode 100644 GScribo/Preferences/generaloptions.h
delete mode 100644 GScribo/Preferences/generaloptions.ui
delete mode 100644 GScribo/Preferences/ocroptions.cpp
delete mode 100644 GScribo/Preferences/ocroptions.h
delete mode 100644 GScribo/Preferences/ocroptions.ui
delete mode 100644 GScribo/Preferences/optionwidget.h
delete mode 100644 GScribo/Preferences/preferencesdialog.cpp
delete mode 100644 GScribo/Preferences/preferencesdialog.h
delete mode 100644 GScribo/Preferences/preferencesdialog.ui
delete mode 100644 GScribo/Preferences/preprocessingoptions.cpp
delete mode 100644 GScribo/Preferences/preprocessingoptions.h
delete mode 100644 GScribo/Preferences/preprocessingoptions.ui
delete mode 100644 GScribo/Preferences/segmentationoptions.cpp
delete mode 100644 GScribo/Preferences/segmentationoptions.h
delete mode 100644 GScribo/Preferences/segmentationoptions.ui
delete mode 100644 GScribo/Processing/preprocess.cpp
delete mode 100644 GScribo/Processing/preprocess.h
delete mode 100644 GScribo/Processing/process.cpp
delete mode 100644 GScribo/Processing/process.h
delete mode 100644 GScribo/Processing/progressdialog.cpp
delete mode 100644 GScribo/Processing/progressdialog.h
delete mode 100644 GScribo/Processing/runner.cpp
delete mode 100644 GScribo/Processing/runner.h
delete mode 100644 GScribo/Rendering/abstractregionitem.h
delete mode 100644 GScribo/Rendering/backgroundtexture.h
delete mode 100644 GScribo/Rendering/graphicsview.cpp
delete mode 100644 GScribo/Rendering/graphicsview.h
delete mode 100644 GScribo/Rendering/regionitem.cpp
delete mode 100644 GScribo/Rendering/regionitem.h
delete mode 100644 GScribo/Rendering/rootgraphicsitem.h
delete mode 100644 GScribo/Rendering/scene.cpp
delete mode 100644 GScribo/Rendering/scene.h
delete mode 100644 GScribo/Rendering/selection.cpp
delete mode 100644 GScribo/Rendering/selection.h
delete mode 100644 GScribo/TODO
delete mode 100644 GScribo/XmlWidget/attributesmodel.cpp
delete mode 100644 GScribo/XmlWidget/attributesmodel.h
delete mode 100644 GScribo/XmlWidget/selectionproxy.h
delete mode 100644 GScribo/XmlWidget/xmlattributes.cpp
delete mode 100644 GScribo/XmlWidget/xmlattributes.h
delete mode 100644 GScribo/XmlWidget/xmldelegate.h
delete mode 100644 GScribo/XmlWidget/xmlitem.cpp
delete mode 100644 GScribo/XmlWidget/xmlitem.h
delete mode 100644 GScribo/XmlWidget/xmlmodel.cpp
delete mode 100644 GScribo/XmlWidget/xmlmodel.h
delete mode 100644 GScribo/XmlWidget/xmlview.cpp
delete mode 100644 GScribo/XmlWidget/xmlview.h
delete mode 100644 GScribo/XmlWidget/xmlwidget.cpp
delete mode 100644 GScribo/XmlWidget/xmlwidget.h
delete mode 100644 GScribo/aboutdialog.h
delete mode 100644 GScribo/aboutdialog.ui
delete mode 100644 GScribo/configs.h
delete mode 100644 GScribo/dir.h
delete mode 100644 GScribo/dockwidget.h
delete mode 100644 GScribo/main.cpp
delete mode 100644 GScribo/mainwindow.cpp
delete mode 100644 GScribo/mainwindow.h
delete mode 100644 GScribo/mainwindow.ui
delete mode 100644 GScribo/region.h
delete mode 100644 GScribo/regionwidget.cpp
delete mode 100644 GScribo/regionwidget.h
delete mode 100644 GScribo/variantpointer.h
delete mode 100644 GScribo/xml.cpp
delete mode 100644 GScribo/xml.h
create mode 100644 milena/doc/examples/multi_files_f1.cc.raw
create mode 100644 milena/doc/examples/multi_files_f2.cc.raw
create mode 100644 milena/doc/examples/multi_files_main.cc.raw
create mode 100644 milena/doc/examples/multiple_def.cc.raw
create mode 100644 milena/doc/examples/typenametemplate.cc.raw
create mode 100644 milena/doc/examples/undef_global_vars.cc.raw
create mode 100644 milena/doc/examples/wrongvaluetype.cc.raw
create mode 100644 milena/doc/mln/labeling/labeling.dox
delete mode 100644 scribo/doc/scribo/core/component_set.dox
create mode 100644 swilena/complex.ixx
create mode 100644 swilena/complex2.i
create mode 100644 swilena/image2d_point2d.i
create mode 100644 swilena/image2d_rgb8.i
create mode 100644 swilena/ppm.ixx
create mode 100644 swilena/python/complex2-misc.py
delete mode 100644 swilena/python/data.py
create mode 100644 swilena/python/data.py.in
create mode 100644 swilena/python/installcheck.mk
delete mode 100644 swilena/python/ltihooks.py
create mode 100644 swilena/python/max-tree.py
create mode 100644 swilena/python/sps-gdb-local.in
create mode 100644 swilena/rgb.ixx
create mode 100644 swilena/rgb8.i
hooks/post-receive
--
Olena, a generic and efficient image processing platform
1
0

13 May '13
---
ChangeLog | 4 ++++
NEWS | 3 +++
2 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 5c08e1b..13b8788 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-04-12 Guillaume Lazzara <z(a)lrde.epita.fr>
+
+ * NEWS: Add entry for labeling::values.
+
2013-04-18 Guillaume Lazzara <z(a)lrde.epita.fr>
Remove unstable viewer.
diff --git a/NEWS b/NEWS
index 26ce3c0..345d6de 100644
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,9 @@
* Speed up I/O accesses with ImageMagick/GraphicsMagick.
+ * Add labeling::values, an algorithm to label gray-level
+ images.
+
* Scribo
* New logger class.
--
1.7.2.5
1
0