* doc/Doxyfile.in: update example_path and image_path. * doc/Makefile.am: Add new targets white-paper and ref-guide. * doc/doc.mk: update paths. * doc/tutorial/samples/accu-right-instanciation.cc, * doc/tutorial/samples/accu-wrong-instanciation.cc.raw, * doc/tutorial/samples/borderthickness.cc, * doc/tutorial/samples/box2d-bbox.cc, * doc/tutorial/samples/domain-display.cc, * doc/tutorial/samples/dpoint-1.cc, * doc/tutorial/samples/estim-sites.cc, * doc/tutorial/samples/extend.cc, * doc/tutorial/samples/extension-ignore.cc, * doc/tutorial/samples/fill-call-1.cc, * doc/tutorial/samples/fill-part-image.cc, * doc/tutorial/samples/fill-proto.cc.raw, * doc/tutorial/samples/fill-subdomain-shorter.cc, * doc/tutorial/samples/fill-subdomain.cc, * doc/tutorial/samples/fill-subimage-cfun.cc, * doc/tutorial/samples/fill.cc, * doc/tutorial/samples/forall-piter.cc, * doc/tutorial/samples/fun-p2v-1.cc, * doc/tutorial/samples/graph-data.cc, * doc/tutorial/samples/graph-iter.cc, * doc/tutorial/samples/ima-has.cc, * doc/tutorial/samples/ima-load.cc, * doc/tutorial/samples/ima-save.cc, * doc/tutorial/samples/ima-size.cc, * doc/tutorial/samples/ima2d-1.cc, * doc/tutorial/samples/ima2d-2.cc, * doc/tutorial/samples/ima2d-3.cc, * doc/tutorial/samples/ima2d-4.cc, * doc/tutorial/samples/ima2d-5.cc, * doc/tutorial/samples/ima2d-6-clone.cc, * doc/tutorial/samples/ima2d-7.cc, * doc/tutorial/samples/ima2d-restricted-1.cc.raw, * doc/tutorial/samples/ima2d-restricted-2.cc.raw, * doc/tutorial/samples/ima2d-restricted-3.cc.raw, * doc/tutorial/samples/ima2d-rot.cc, * doc/tutorial/samples/labeling-compute.cc, * doc/tutorial/samples/logical-not.cc, * doc/tutorial/samples/mln_var.cc, * doc/tutorial/samples/parray-append.cc, * doc/tutorial/samples/parray-bbox.cc, * doc/tutorial/samples/paste-call-1.cc, * doc/tutorial/samples/paste.cc, * doc/tutorial/samples/point-1.cc, * doc/tutorial/samples/predicate-1.cc, * doc/tutorial/examples/accu.cc, * doc/tutorial/samples/samples.mk, * doc/tutorial/examples/box.cc, * doc/tutorial/examples/cpp_issue.cc, * doc/examples/erosion.cc, * doc/tutorial/examples/for_Z.cc, * doc/examples/graph.cc, * doc/tutorial/examples/image2d.cc, * doc/tutorial/examples/image_flat.cc, * doc/tutorial/examples/image_if.cc, * doc/tutorial/examples/image_plain.cc, * doc/tutorial/examples/image_safe.cc, * doc/examples/labeling_algo.cc, * doc/examples/mk_graph.cc, * doc/tutorial/examples/p_array.2.cc, * doc/tutorial/examples/p_array.cc, * doc/tutorial/examples/p_image.cc, * doc/tutorial/examples/p_key.2.cc, * doc/tutorial/examples/p_key.cc, * doc/tutorial/examples/p_line2d.cc, * doc/tutorial/examples/p_mutable_array_of.cc, * doc/tutorial/examples/p_queue.cc, * doc/tutorial/examples/p_run.cc, * doc/tutorial/examples/p_vaccess.cc, * doc/tutorial/examples/proxy.cc, * doc/tutorial/examples/sub_image.cc, * doc/tutorial/examples/sub_image_if.cc, * doc/examples/tuto_bis.cc, * doc/examples/tuto_one.cc, * doc/tutorial/examples/vec.cc, * doc/tutorial/examples/win_multiple.cc, * doc/tutorial/examples/window.cc, * doc/tutorial/samples/tuto2_first_image.cc, * doc/tutorial/samples/tuto3_rw_image.cc, * doc/tutorial/samples/tuto4_genericity_and_algorithms.cc, * doc/tutorial/samples/win-create-1.cc, * doc/tutorial/samples/win-create-2.cc, * doc/tutorial/figures/extend-1.ppm, * doc/tutorial/figures/extend-2.ppm, * doc/tutorial/figures/extend-3.ppm, * doc/tutorial/figures/extend-4.ppm, * doc/tutorial/figures/extend-5.ppm, * doc/tutorial/figures/figures.mk, * doc/tutorial/figures/fill-subdomain-1.pbm, * doc/tutorial/figures/fill-subdomain-2.ppm, * doc/tutorial/figures/fill-subdomain-3.ppm, * doc/tutorial/figures/fill-subdomain-4.ppm, * doc/tutorial/figures/fill-subimage-cfun-1.ppm, * doc/tutorial/figures/ima2d-rot-1.ppm, * doc/tutorial/figures/ima2d-rot-2.ppm, * doc/tutorial/figures/ima_save.pbm, * doc/tutorial/figures/labeling-compute-1.pbm, * doc/tutorial/figures/labeling-compute-2.ppm, * doc/tutorial/figures/logical-not-1.pbm, * doc/tutorial/figures/logical-not-2.pbm, * doc/tutorial/figures/logical-not-3.pbm, * doc/tutorial/figures/tuto2_first_image-1.pbm, * doc/tutorial/figures/tuto3_rw_image-1.ppm, * doc/tutorial/figures/tuto3_rw_image-2.ppm, * doc/tutorial/figures/tuto3_rw_image-3.ppm, * doc/tutorial/figures/tuto4_genericity_and_algorithms-1.ppm, * doc/tutorial/figures/tuto4_genericity_and_algorithms-2.ppm, * doc/tutorial/figures/tuto4_genericity_and_algorithms-3.pbm, * doc/tutorial/figures/tuto4_genericity_and_algorithms-4.ppm, * doc/tutorial/figures/tuto4_genericity_and_algorithms-5.ppm, * doc/tutorial/figures/tuto4_genericity_and_algorithms-6.ppm, * doc/tutorial/figures/tuto4_genericity_and_algorithms-7.pgm, * doc/tutorial/figures/tuto4_genericity_and_algorithms-7.ppm, * doc/tutorial/figures/tuto4_genericity_and_algorithms-8.pgm, * doc/tutorial/figures/tuto4_genericity_and_algorithms-8.ppm, * doc/tutorial/figures/tuto4_genericity_and_algorithms-9.pgm, * doc/tutorial/figures/tuto4_genericity_and_algorithms-9.ppm, * doc/tutorial/generate_dist_files.sh, * doc/groups.hh, * doc/tutorial/img/small-enlarged.png, * doc/tutorial/img/small.png, * doc/tutorial/outputs/accu-right-instanciation.txt, * doc/tutorial/outputs/borderthickness.txt, * doc/tutorial/outputs/box2d-bbox.txt, * doc/tutorial/outputs/domain-display.txt, * doc/tutorial/outputs/dpoint-1.txt, * doc/tutorial/outputs/estim-sites.txt, * doc/tutorial/outputs/extend.txt, * doc/tutorial/outputs/extension-ignore.txt, * doc/tutorial/outputs/fill-call-1.txt, * doc/tutorial/outputs/fill-part-image.txt, * doc/tutorial/outputs/fill-subdomain-shorter.txt, * doc/tutorial/outputs/fill-subdomain.txt, * doc/tutorial/outputs/fill-subimage-cfun.txt, * doc/tutorial/outputs/fill.txt, * doc/tutorial/outputs/forall-piter.txt, * doc/tutorial/outputs/fun-p2v-1.txt, * doc/tutorial/outputs/graph-data.txt, * doc/tutorial/outputs/graph-iter.txt, * doc/tutorial/outputs/graph-output-1.txt, * doc/tutorial/outputs/ima-has.txt, * doc/tutorial/outputs/ima-save.txt, * doc/tutorial/outputs/ima-size.txt, * doc/tutorial/outputs/ima2d-1.txt, * doc/tutorial/outputs/ima2d-2.txt, * doc/tutorial/outputs/ima2d-3.txt, * doc/tutorial/outputs/ima2d-4.txt, * doc/tutorial/outputs/ima2d-5.txt, * doc/tutorial/outputs/ima2d-6-clone.txt, * doc/tutorial/outputs/ima2d-7.txt, * doc/tutorial/outputs/ima2d-decl-2.txt, * doc/tutorial/outputs/ima2d-display-1.txt, * doc/tutorial/outputs/ima2d-display-2.txt, * doc/tutorial/outputs/ima2d-display-output-1.txt, * doc/tutorial/outputs/ima2d-display-output-2.txt, * doc/tutorial/outputs/ima2d-rot.txt, * doc/tutorial/outputs/labeling-compute.txt, * doc/tutorial/outputs/logical-not.txt, * doc/tutorial/outputs/mln_var.txt, * doc/tutorial/outputs/outputs.mk, * doc/tutorial/outputs/parray-append.txt, * doc/tutorial/outputs/parray-bbox.txt, * doc/tutorial/outputs/parray-display-1.txt, * doc/tutorial/outputs/paste-call-1.txt, * doc/tutorial/outputs/paste.txt, * doc/tutorial/outputs/point-1.txt, * doc/tutorial/outputs/predicate-1.txt, * doc/tutorial/outputs/tuto2_first_image.txt, * doc/tutorial/outputs/tuto3_rw_image.txt, * doc/tutorial/outputs/tuto4_genericity_and_algorithms.txt, * doc/tutorial/outputs/win-create-1-display.txt, * doc/tutorial/outputs/win-create-1.txt, * doc/tutorial/outputs/win-create-2.txt, * doc/tutorial/tools/sample_utils.hh, * doc/tutorial/tools/split_sample.sh, * doc/tutorial/tools/todoxygen.sh, * doc/tutorial/examples/examples.mk, * doc/tutorial/samples/Makefile.am: Move to... * doc/examples/Makefile.am, * doc/examples/accu-right-instanciation.cc, * doc/examples/accu-wrong-instanciation.cc.raw, * doc/examples/borderthickness.cc, * doc/examples/box2d-bbox.cc, * doc/examples/domain-display.cc, * doc/examples/dpoint-1.cc, * doc/examples/estim-sites.cc, * doc/examples/examples.mk, * doc/examples/extend.cc, * doc/examples/extension-ignore.cc, * doc/examples/fill-call-1.cc, * doc/examples/fill-part-image.cc, * doc/examples/fill-proto.cc.raw, * doc/examples/fill-subdomain-shorter.cc, * doc/examples/fill-subdomain.cc, * doc/examples/fill-subimage-cfun.cc, * doc/examples/fill.cc, * doc/examples/forall-piter.cc, * doc/examples/fun-p2v-1.cc, * doc/examples/graph-data.cc, * doc/examples/graph-iter.cc, * doc/examples/ima-has.cc, * doc/examples/ima-load.cc, * doc/examples/ima-save.cc, * doc/examples/ima-size.cc, * doc/examples/ima2d-1.cc, * doc/examples/ima2d-2.cc, * doc/examples/ima2d-3.cc, * doc/examples/ima2d-4.cc, * doc/examples/ima2d-5.cc, * doc/examples/ima2d-6-clone.cc, * doc/examples/ima2d-7.cc, * doc/examples/ima2d-restricted-1.cc.raw, * doc/examples/ima2d-restricted-2.cc.raw, * doc/examples/ima2d-restricted-3.cc.raw, * doc/examples/ima2d-rot.cc, * doc/examples/labeling-compute.cc, * doc/examples/logical-not.cc, * doc/examples/mln_var.cc, * doc/examples/parray-append.cc, * doc/examples/parray-bbox.cc, * doc/examples/paste-call-1.cc, * doc/examples/paste.cc, * doc/examples/point-1.cc, * doc/examples/predicate-1.cc, * doc/examples/samples.mk, * doc/examples/trash/accu.cc, * doc/examples/trash/erosion.cc, * doc/examples/trash/for_Z.cc, * doc/examples/trash/graph.cc, * doc/examples/trash/image2d.cc, * doc/examples/trash/image_flat.cc, * doc/examples/trash/image_if.cc, * doc/examples/trash/image_plain.cc, * doc/examples/trash/box.cc, * doc/examples/trash/cpp_issue.cc, * doc/examples/trash/image_safe.cc, * doc/examples/trash/labeling_algo.cc, * doc/examples/trash/mk_graph.cc, * doc/examples/trash/p_array.2.cc, * doc/examples/trash/p_array.cc, * doc/examples/trash/p_image.cc, * doc/examples/trash/p_key.2.cc, * doc/examples/trash/p_key.cc, * doc/examples/trash/p_line2d.cc, * doc/examples/trash/p_mutable_array_of.cc, * doc/examples/trash/p_queue.cc, * doc/examples/trash/p_run.cc, * doc/examples/trash/p_vaccess.cc, * doc/examples/trash/proxy.cc, * doc/examples/trash/sub_image.cc, * doc/examples/trash/sub_image_if.cc, * doc/examples/trash/tuto_bis.cc, * doc/examples/trash/tuto_one.cc, * doc/examples/trash/vec.cc, * doc/examples/trash/win_multiple.cc, * doc/examples/tuto2_first_image.cc, * doc/examples/tuto3_rw_image.cc, * doc/examples/tuto4_genericity_and_algorithms.cc, * doc/examples/win-create-1.cc, * doc/examples/win-create-2.cc, * doc/figures/extend-1.ppm, * doc/figures/extend-2.ppm, * doc/figures/extend-3.ppm, * doc/figures/extend-4.ppm, * doc/figures/extend-5.ppm, * doc/figures/fill-subdomain-1.pbm, * doc/figures/fill-subdomain-2.ppm, * doc/figures/fill-subdomain-3.ppm, * doc/figures/fill-subdomain-4.ppm, * doc/figures/figures.mk, * doc/figures/fill-subimage-cfun-1.ppm, * doc/figures/ima2d-rot-1.ppm, * doc/figures/ima2d-rot-2.ppm, * doc/figures/ima_save.pbm, * doc/figures/labeling-compute-1.pbm, * doc/figures/labeling-compute-2.ppm, * doc/figures/logical-not-1.pbm, * doc/figures/logical-not-2.pbm, * doc/figures/logical-not-3.pbm, * doc/figures/tuto2_first_image-1.pbm, * doc/figures/tuto3_rw_image-1.ppm, * doc/figures/tuto3_rw_image-2.ppm, * doc/figures/tuto3_rw_image-3.ppm, * doc/figures/tuto4_genericity_and_algorithms-1., * doc/figures/tuto4_genericity_and_algorithms-2., * doc/figures/tuto4_genericity_and_algorithms-3., * doc/figures/tuto4_genericity_and_algorithms-4., * doc/figures/tuto4_genericity_and_algorithms-5., * doc/figures/tuto4_genericity_and_algorithms-6., * doc/figures/tuto4_genericity_and_algorithms-7., * doc/figures/tuto4_genericity_and_algorithms-7., * doc/figures/tuto4_genericity_and_algorithms-8., * doc/figures/tuto4_genericity_and_algorithms-8., * doc/figures/tuto4_genericity_and_algorithms-9., * doc/figures/tuto4_genericity_and_algorithms-9., * doc/generate_dist_files.sh, * doc/img/small-enlarged.png, * doc/img/small.png, * doc/outputs/accu-right-instanciation.txt, * doc/outputs/borderthickness.txt, * doc/outputs/box2d-bbox.txt, * doc/outputs/domain-display.txt, * doc/outputs/dpoint-1.txt, * doc/outputs/estim-sites.txt, * doc/outputs/extend.txt, * doc/outputs/extension-ignore.txt, * doc/outputs/fill-call-1.txt, * doc/outputs/fill-part-image.txt, * doc/outputs/fill-subdomain-shorter.txt, * doc/outputs/fill-subdomain.txt, * doc/outputs/fill-subimage-cfun.txt, * doc/outputs/fill.txt, * doc/outputs/forall-piter.txt, * doc/outputs/fun-p2v-1.txt, * doc/outputs/graph-data.txt, * doc/outputs/graph-iter.txt, * doc/outputs/graph-output-1.txt, * doc/outputs/ima-has.txt, * doc/outputs/ima-save.txt, * doc/outputs/ima-size.txt, * doc/outputs/ima2d-1.txt, * doc/outputs/ima2d-2.txt, * doc/outputs/ima2d-3.txt, * doc/outputs/ima2d-4.txt, * doc/outputs/ima2d-5.txt, * doc/outputs/ima2d-6-clone.txt, * doc/outputs/ima2d-7.txt, * doc/outputs/ima2d-decl-2.txt, * doc/outputs/ima2d-display-1.txt, * doc/outputs/ima2d-display-2.txt, * doc/outputs/ima2d-display-output-1.txt, * doc/outputs/ima2d-display-output-2.txt, * doc/outputs/ima2d-rot.txt, * doc/outputs/labeling-compute.txt, * doc/outputs/logical-not.txt, * doc/outputs/mln_var.txt, * doc/outputs/outputs.mk, * doc/outputs/parray-append.txt, * doc/outputs/parray-bbox.txt, * doc/outputs/parray-display-1.txt, * doc/outputs/paste-call-1.txt, * doc/outputs/paste.txt, * doc/outputs/point-1.txt, * doc/outputs/predicate-1.txt, * doc/outputs/tuto2_first_image.txt, * doc/outputs/tuto3_rw_image.txt, * doc/outputs/tuto4_genericity_and_algorithms.txt, * doc/outputs/win-create-1-display.txt, * doc/outputs/win-create-1.txt, * doc/outputs/win-create-2.txt, * doc/tools/sample_utils.hh, * doc/tools/split_sample.sh, * doc/tools/todoxygen.sh: ... here. * doc/tutorial/tutorial.tex: split into tutorial.tex and... * doc/ref_guide/ref_guide.tex: ... this file. * doc/ref_guide/Makefile.am: add new rules. * doc/tutorial/Makefile.am: update rules. * doc/white_paper/Makefile.am, * doc/white_paper/figures/house.png, * doc/white_paper/figures/house_rag.png, * doc/white_paper/figures/house_wshed.png, * doc/white_paper/figures/house_wshed_mean_colors.png, * doc/white_paper/white_paper.tex: introduce a new white paper. * mln/core/concept/image.hh, * mln/core/concept/object.hh, * mln/core/image/cast_image.hh, * mln/core/image/image1d.hh, * mln/core/image/image2d.hh, * mln/core/image/image2d_h.hh, * mln/core/image/image3d.hh, * mln/core/image/image_if.hh: test documentation group with doxygen. * mln/opt/all.hh: add doc for mln::opt namespace. * tests/util/soft_heap.cc: fix \file command. --- milena/ChangeLog | 391 ++++ milena/doc/Doxyfile.in | 18 +- milena/doc/Makefile.am | 69 +- milena/doc/doc.mk | 20 +- .../doc/{tutorial/samples => examples}/Makefile.am | 10 +- .../accu-right-instanciation.cc | 0 .../accu-wrong-instanciation.cc.raw | 0 .../samples => examples}/borderthickness.cc | 0 .../{tutorial/samples => examples}/box2d-bbox.cc | 0 .../samples => examples}/domain-display.cc | 0 .../doc/{tutorial/samples => examples}/dpoint-1.cc | 0 .../{tutorial/samples => examples}/estim-sites.cc | 0 milena/doc/examples/examples.mk | 88 + .../doc/{tutorial/samples => examples}/extend.cc | 2 +- .../samples => examples}/extension-ignore.cc | 0 .../{tutorial/samples => examples}/fill-call-1.cc | 0 .../samples => examples}/fill-part-image.cc | 0 .../samples => examples}/fill-proto.cc.raw | 0 .../samples => examples}/fill-subdomain-shorter.cc | 0 .../samples => examples}/fill-subdomain.cc | 2 +- .../samples => examples}/fill-subimage-cfun.cc | 2 +- milena/doc/{tutorial/samples => examples}/fill.cc | 0 .../{tutorial/samples => examples}/forall-piter.cc | 0 .../{tutorial/samples => examples}/fun-p2v-1.cc | 0 .../{tutorial/samples => examples}/graph-data.cc | 0 .../{tutorial/samples => examples}/graph-iter.cc | 2 +- .../doc/{tutorial/samples => examples}/ima-has.cc | 0 .../doc/{tutorial/samples => examples}/ima-load.cc | 0 .../doc/{tutorial/samples => examples}/ima-save.cc | 0 .../doc/{tutorial/samples => examples}/ima-size.cc | 0 .../doc/{tutorial/samples => examples}/ima2d-1.cc | 0 .../doc/{tutorial/samples => examples}/ima2d-2.cc | 0 .../doc/{tutorial/samples => examples}/ima2d-3.cc | 0 .../doc/{tutorial/samples => examples}/ima2d-4.cc | 0 .../doc/{tutorial/samples => examples}/ima2d-5.cc | 0 .../samples => examples}/ima2d-6-clone.cc | 0 .../doc/{tutorial/samples => examples}/ima2d-7.cc | 0 .../samples => examples}/ima2d-restricted-1.cc.raw | 0 .../samples => examples}/ima2d-restricted-2.cc.raw | 0 .../samples => examples}/ima2d-restricted-3.cc.raw | 0 .../{tutorial/samples => examples}/ima2d-rot.cc | 2 +- .../samples => examples}/labeling-compute.cc | 2 +- .../{tutorial/samples => examples}/logical-not.cc | 2 +- .../doc/{tutorial/samples => examples}/mln_var.cc | 0 .../samples => examples}/parray-append.cc | 0 .../{tutorial/samples => examples}/parray-bbox.cc | 0 .../{tutorial/samples => examples}/paste-call-1.cc | 0 milena/doc/{tutorial/samples => examples}/paste.cc | 0 .../doc/{tutorial/samples => examples}/point-1.cc | 0 .../{tutorial/samples => examples}/predicate-1.cc | 0 .../doc/{tutorial/samples => examples}/samples.mk | 0 .../{tutorial/examples => examples/trash}/accu.cc | 0 .../{tutorial/examples => examples/trash}/box.cc | 0 .../examples => examples/trash}/cpp_issue.cc | 0 milena/doc/examples/{ => trash}/erosion.cc | 0 .../{tutorial/examples => examples/trash}/for_Z.cc | 0 milena/doc/examples/{ => trash}/graph.cc | 0 .../examples => examples/trash}/image2d.cc | 0 .../examples => examples/trash}/image_flat.cc | 0 .../examples => examples/trash}/image_if.cc | 0 .../examples => examples/trash}/image_plain.cc | 0 .../examples => examples/trash}/image_safe.cc | 0 milena/doc/examples/{ => trash}/labeling_algo.cc | 0 milena/doc/examples/{ => trash}/mk_graph.cc | 0 .../examples => examples/trash}/p_array.2.cc | 0 .../examples => examples/trash}/p_array.cc | 0 .../examples => examples/trash}/p_image.cc | 0 .../examples => examples/trash}/p_key.2.cc | 0 .../{tutorial/examples => examples/trash}/p_key.cc | 0 .../examples => examples/trash}/p_line2d.cc | 0 .../trash}/p_mutable_array_of.cc | 0 .../examples => examples/trash}/p_queue.cc | 0 .../{tutorial/examples => examples/trash}/p_run.cc | 0 .../examples => examples/trash}/p_vaccess.cc | 0 .../{tutorial/examples => examples/trash}/proxy.cc | 0 .../examples => examples/trash}/sub_image.cc | 0 .../examples => examples/trash}/sub_image_if.cc | 0 milena/doc/examples/{ => trash}/tuto_bis.cc | 0 milena/doc/examples/{ => trash}/tuto_one.cc | 0 .../{tutorial/examples => examples/trash}/vec.cc | 0 .../examples => examples/trash}/win_multiple.cc | 0 .../examples => examples/trash}/window.cc | 0 .../samples => examples}/tuto2_first_image.cc | 2 +- .../samples => examples}/tuto3_rw_image.cc | 2 +- .../tuto4_genericity_and_algorithms.cc | 2 +- .../{tutorial/samples => examples}/win-create-1.cc | 0 .../{tutorial/samples => examples}/win-create-2.cc | 0 milena/doc/{tutorial => }/figures/extend-1.ppm | Bin 12406 -> 12406 bytes milena/doc/{tutorial => }/figures/extend-2.ppm | Bin 16546 -> 16546 bytes milena/doc/{tutorial => }/figures/extend-3.ppm | Bin 16546 -> 16546 bytes milena/doc/{tutorial => }/figures/extend-4.ppm | 0 milena/doc/{tutorial => }/figures/extend-5.ppm | Bin 12406 -> 12406 bytes milena/doc/{tutorial => }/figures/figures.mk | 0 .../{tutorial => }/figures/fill-subdomain-1.pbm | 0 .../{tutorial => }/figures/fill-subdomain-2.ppm | Bin 206 -> 206 bytes .../{tutorial => }/figures/fill-subdomain-3.ppm | Bin 206 -> 206 bytes .../{tutorial => }/figures/fill-subdomain-4.ppm | Bin 206 -> 206 bytes .../figures/fill-subimage-cfun-1.ppm | Bin 206 -> 206 bytes milena/doc/{tutorial => }/figures/ima2d-rot-1.ppm | Bin 235320 -> 235320 bytes milena/doc/{tutorial => }/figures/ima2d-rot-2.ppm | Bin 235320 -> 235320 bytes milena/doc/{tutorial => }/figures/ima_save.pbm | 0 .../{tutorial => }/figures/labeling-compute-1.pbm | 0 .../{tutorial => }/figures/labeling-compute-2.ppm | Bin 206 -> 206 bytes .../doc/{tutorial => }/figures/logical-not-1.pbm | 0 .../doc/{tutorial => }/figures/logical-not-2.pbm | 0 .../doc/{tutorial => }/figures/logical-not-3.pbm | 0 .../{tutorial => }/figures/tuto2_first_image-1.pbm | 0 .../{tutorial => }/figures/tuto3_rw_image-1.ppm | Bin 4918 -> 4918 bytes .../{tutorial => }/figures/tuto3_rw_image-2.ppm | 0 .../{tutorial => }/figures/tuto3_rw_image-3.ppm | Bin 12406 -> 12406 bytes .../figures/tuto4_genericity_and_algorithms-1.ppm | Bin 12406 -> 12406 bytes .../figures/tuto4_genericity_and_algorithms-2.ppm | Bin 12406 -> 12406 bytes .../figures/tuto4_genericity_and_algorithms-3.pbm | 0 .../figures/tuto4_genericity_and_algorithms-4.ppm | Bin 12406 -> 12406 bytes .../figures/tuto4_genericity_and_algorithms-5.ppm | Bin 12406 -> 12406 bytes .../figures/tuto4_genericity_and_algorithms-6.ppm | Bin 12406 -> 12406 bytes .../figures/tuto4_genericity_and_algorithms-7.pgm | 0 .../figures/tuto4_genericity_and_algorithms-7.ppm | Bin 24696 -> 24696 bytes .../figures/tuto4_genericity_and_algorithms-8.pgm | 0 .../figures/tuto4_genericity_and_algorithms-8.ppm | 0 .../figures/tuto4_genericity_and_algorithms-9.pgm | 0 .../figures/tuto4_genericity_and_algorithms-9.ppm | 0 milena/doc/{tutorial => }/generate_dist_files.sh | 2 +- milena/doc/groups.hh | 28 + milena/doc/{tutorial => }/img/small-enlarged.png | Bin 91556 -> 91556 bytes milena/doc/{tutorial => }/img/small.png | Bin 22653 -> 22653 bytes .../outputs/accu-right-instanciation.txt | 0 .../doc/{tutorial => }/outputs/borderthickness.txt | 0 milena/doc/{tutorial => }/outputs/box2d-bbox.txt | 0 .../doc/{tutorial => }/outputs/domain-display.txt | 0 milena/doc/{tutorial => }/outputs/dpoint-1.txt | 0 milena/doc/{tutorial => }/outputs/estim-sites.txt | 0 milena/doc/{tutorial => }/outputs/extend.txt | 0 .../{tutorial => }/outputs/extension-ignore.txt | 0 milena/doc/{tutorial => }/outputs/fill-call-1.txt | 0 .../doc/{tutorial => }/outputs/fill-part-image.txt | 0 .../outputs/fill-subdomain-shorter.txt | 0 .../doc/{tutorial => }/outputs/fill-subdomain.txt | 0 .../{tutorial => }/outputs/fill-subimage-cfun.txt | 0 milena/doc/{tutorial => }/outputs/fill.txt | 0 milena/doc/{tutorial => }/outputs/forall-piter.txt | 0 milena/doc/{tutorial => }/outputs/fun-p2v-1.txt | 0 milena/doc/{tutorial => }/outputs/graph-data.txt | 0 milena/doc/{tutorial => }/outputs/graph-iter.txt | 0 .../doc/{tutorial => }/outputs/graph-output-1.txt | 0 milena/doc/{tutorial => }/outputs/ima-has.txt | 0 milena/doc/{tutorial => }/outputs/ima-save.txt | 0 milena/doc/{tutorial => }/outputs/ima-size.txt | 0 milena/doc/{tutorial => }/outputs/ima2d-1.txt | 0 milena/doc/{tutorial => }/outputs/ima2d-2.txt | 0 milena/doc/{tutorial => }/outputs/ima2d-3.txt | 0 milena/doc/{tutorial => }/outputs/ima2d-4.txt | 0 milena/doc/{tutorial => }/outputs/ima2d-5.txt | 0 .../doc/{tutorial => }/outputs/ima2d-6-clone.txt | 0 milena/doc/{tutorial => }/outputs/ima2d-7.txt | 0 milena/doc/{tutorial => }/outputs/ima2d-decl-2.txt | 0 .../doc/{tutorial => }/outputs/ima2d-display-1.txt | 0 .../doc/{tutorial => }/outputs/ima2d-display-2.txt | 0 .../outputs/ima2d-display-output-1.txt | 0 .../outputs/ima2d-display-output-2.txt | 0 milena/doc/{tutorial => }/outputs/ima2d-rot.txt | 0 .../{tutorial => }/outputs/labeling-compute.txt | 0 milena/doc/{tutorial => }/outputs/logical-not.txt | 0 milena/doc/{tutorial => }/outputs/mln_var.txt | 0 milena/doc/{tutorial => }/outputs/outputs.mk | 0 .../doc/{tutorial => }/outputs/parray-append.txt | 0 milena/doc/{tutorial => }/outputs/parray-bbox.txt | 0 .../{tutorial => }/outputs/parray-display-1.txt | 0 milena/doc/{tutorial => }/outputs/paste-call-1.txt | 0 milena/doc/{tutorial => }/outputs/paste.txt | 0 milena/doc/{tutorial => }/outputs/point-1.txt | 0 milena/doc/{tutorial => }/outputs/predicate-1.txt | 0 .../{tutorial => }/outputs/tuto2_first_image.txt | 0 .../doc/{tutorial => }/outputs/tuto3_rw_image.txt | 0 .../outputs/tuto4_genericity_and_algorithms.txt | 0 .../outputs/win-create-1-display.txt | 0 milena/doc/{tutorial => }/outputs/win-create-1.txt | 0 milena/doc/{tutorial => }/outputs/win-create-2.txt | 0 milena/doc/ref_guide/Makefile.am | 24 + .../tutorial.tex => ref_guide/ref_guide.tex} | 443 +----- milena/doc/{tutorial => }/tools/sample_utils.hh | 0 milena/doc/{tutorial => }/tools/split_sample.sh | 0 milena/doc/{tutorial => }/tools/todoxygen.sh | 0 milena/doc/tutorial/Makefile.am | 61 +- milena/doc/tutorial/examples/examples.mk | 29 - milena/doc/tutorial/tutorial.tex | 1960 +------------------- milena/doc/white_paper/Makefile.am | 8 + milena/doc/white_paper/figures/house.png | Bin 0 -> 26653 bytes milena/doc/white_paper/figures/house_rag.png | Bin 0 -> 9454 bytes milena/doc/white_paper/figures/house_wshed.png | Bin 0 -> 27668 bytes .../figures/house_wshed_mean_colors.png | Bin 0 -> 6618 bytes milena/doc/white_paper/white_paper.tex | 384 ++++ milena/mln/core/concept/image.hh | 14 +- milena/mln/core/concept/object.hh | 3 +- milena/mln/core/image/cast_image.hh | 24 +- milena/mln/core/image/image1d.hh | 15 +- milena/mln/core/image/image2d.hh | 5 +- milena/mln/core/image/image2d_h.hh | 4 + milena/mln/core/image/image3d.hh | 13 +- milena/mln/core/image/image_if.hh | 24 +- milena/mln/opt/all.hh | 14 + milena/tests/util/soft_heap.cc | 2 +- 202 files changed, 1132 insertions(+), 2541 deletions(-) rename milena/doc/{tutorial/samples => examples}/Makefile.am (95%) rename milena/doc/{tutorial/samples => examples}/accu-right-instanciation.cc (100%) rename milena/doc/{tutorial/samples => examples}/accu-wrong-instanciation.cc.raw (100%) rename milena/doc/{tutorial/samples => examples}/borderthickness.cc (100%) rename milena/doc/{tutorial/samples => examples}/box2d-bbox.cc (100%) rename milena/doc/{tutorial/samples => examples}/domain-display.cc (100%) rename milena/doc/{tutorial/samples => examples}/dpoint-1.cc (100%) rename milena/doc/{tutorial/samples => examples}/estim-sites.cc (100%) create mode 100644 milena/doc/examples/examples.mk rename milena/doc/{tutorial/samples => examples}/extend.cc (97%) rename milena/doc/{tutorial/samples => examples}/extension-ignore.cc (100%) rename milena/doc/{tutorial/samples => examples}/fill-call-1.cc (100%) rename milena/doc/{tutorial/samples => examples}/fill-part-image.cc (100%) rename milena/doc/{tutorial/samples => examples}/fill-proto.cc.raw (100%) rename milena/doc/{tutorial/samples => examples}/fill-subdomain-shorter.cc (100%) rename milena/doc/{tutorial/samples => examples}/fill-subdomain.cc (96%) rename milena/doc/{tutorial/samples => examples}/fill-subimage-cfun.cc (93%) rename milena/doc/{tutorial/samples => examples}/fill.cc (100%) rename milena/doc/{tutorial/samples => examples}/forall-piter.cc (100%) rename milena/doc/{tutorial/samples => examples}/fun-p2v-1.cc (100%) rename milena/doc/{tutorial/samples => examples}/graph-data.cc (100%) rename milena/doc/{tutorial/samples => examples}/graph-iter.cc (98%) rename milena/doc/{tutorial/samples => examples}/ima-has.cc (100%) rename milena/doc/{tutorial/samples => examples}/ima-load.cc (100%) rename milena/doc/{tutorial/samples => examples}/ima-save.cc (100%) rename milena/doc/{tutorial/samples => examples}/ima-size.cc (100%) rename milena/doc/{tutorial/samples => examples}/ima2d-1.cc (100%) rename milena/doc/{tutorial/samples => examples}/ima2d-2.cc (100%) rename milena/doc/{tutorial/samples => examples}/ima2d-3.cc (100%) rename milena/doc/{tutorial/samples => examples}/ima2d-4.cc (100%) rename milena/doc/{tutorial/samples => examples}/ima2d-5.cc (100%) rename milena/doc/{tutorial/samples => examples}/ima2d-6-clone.cc (100%) rename milena/doc/{tutorial/samples => examples}/ima2d-7.cc (100%) rename milena/doc/{tutorial/samples => examples}/ima2d-restricted-1.cc.raw (100%) rename milena/doc/{tutorial/samples => examples}/ima2d-restricted-2.cc.raw (100%) rename milena/doc/{tutorial/samples => examples}/ima2d-restricted-3.cc.raw (100%) rename milena/doc/{tutorial/samples => examples}/ima2d-rot.cc (96%) rename milena/doc/{tutorial/samples => examples}/labeling-compute.cc (94%) rename milena/doc/{tutorial/samples => examples}/logical-not.cc (91%) rename milena/doc/{tutorial/samples => examples}/mln_var.cc (100%) rename milena/doc/{tutorial/samples => examples}/parray-append.cc (100%) rename milena/doc/{tutorial/samples => examples}/parray-bbox.cc (100%) rename milena/doc/{tutorial/samples => examples}/paste-call-1.cc (100%) rename milena/doc/{tutorial/samples => examples}/paste.cc (100%) rename milena/doc/{tutorial/samples => examples}/point-1.cc (100%) rename milena/doc/{tutorial/samples => examples}/predicate-1.cc (100%) rename milena/doc/{tutorial/samples => examples}/samples.mk (100%) rename milena/doc/{tutorial/examples => examples/trash}/accu.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/box.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/cpp_issue.cc (100%) rename milena/doc/examples/{ => trash}/erosion.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/for_Z.cc (100%) rename milena/doc/examples/{ => trash}/graph.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/image2d.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/image_flat.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/image_if.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/image_plain.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/image_safe.cc (100%) rename milena/doc/examples/{ => trash}/labeling_algo.cc (100%) rename milena/doc/examples/{ => trash}/mk_graph.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/p_array.2.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/p_array.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/p_image.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/p_key.2.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/p_key.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/p_line2d.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/p_mutable_array_of.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/p_queue.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/p_run.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/p_vaccess.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/proxy.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/sub_image.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/sub_image_if.cc (100%) rename milena/doc/examples/{ => trash}/tuto_bis.cc (100%) rename milena/doc/examples/{ => trash}/tuto_one.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/vec.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/win_multiple.cc (100%) rename milena/doc/{tutorial/examples => examples/trash}/window.cc (100%) rename milena/doc/{tutorial/samples => examples}/tuto2_first_image.cc (96%) rename milena/doc/{tutorial/samples => examples}/tuto3_rw_image.cc (94%) rename milena/doc/{tutorial/samples => examples}/tuto4_genericity_and_algorithms.cc (98%) rename milena/doc/{tutorial/samples => examples}/win-create-1.cc (100%) rename milena/doc/{tutorial/samples => examples}/win-create-2.cc (100%) rename milena/doc/{tutorial => }/figures/extend-1.ppm (100%) rename milena/doc/{tutorial => }/figures/extend-2.ppm (100%) rename milena/doc/{tutorial => }/figures/extend-3.ppm (100%) rename milena/doc/{tutorial => }/figures/extend-4.ppm (100%) rename milena/doc/{tutorial => }/figures/extend-5.ppm (100%) rename milena/doc/{tutorial => }/figures/figures.mk (100%) rename milena/doc/{tutorial => }/figures/fill-subdomain-1.pbm (100%) rename milena/doc/{tutorial => }/figures/fill-subdomain-2.ppm (100%) rename milena/doc/{tutorial => }/figures/fill-subdomain-3.ppm (100%) rename milena/doc/{tutorial => }/figures/fill-subdomain-4.ppm (100%) rename milena/doc/{tutorial => }/figures/fill-subimage-cfun-1.ppm (100%) rename milena/doc/{tutorial => }/figures/ima2d-rot-1.ppm (100%) rename milena/doc/{tutorial => }/figures/ima2d-rot-2.ppm (100%) rename milena/doc/{tutorial => }/figures/ima_save.pbm (100%) rename milena/doc/{tutorial => }/figures/labeling-compute-1.pbm (100%) rename milena/doc/{tutorial => }/figures/labeling-compute-2.ppm (100%) rename milena/doc/{tutorial => }/figures/logical-not-1.pbm (100%) rename milena/doc/{tutorial => }/figures/logical-not-2.pbm (100%) rename milena/doc/{tutorial => }/figures/logical-not-3.pbm (100%) rename milena/doc/{tutorial => }/figures/tuto2_first_image-1.pbm (100%) rename milena/doc/{tutorial => }/figures/tuto3_rw_image-1.ppm (100%) rename milena/doc/{tutorial => }/figures/tuto3_rw_image-2.ppm (100%) rename milena/doc/{tutorial => }/figures/tuto3_rw_image-3.ppm (100%) rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-1.ppm (100%) rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-2.ppm (100%) rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-3.pbm (100%) rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-4.ppm (100%) rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-5.ppm (100%) rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-6.ppm (100%) rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-7.pgm (100%) rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-7.ppm (100%) rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-8.pgm (100%) rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-8.ppm (100%) rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-9.pgm (100%) rename milena/doc/{tutorial => }/figures/tuto4_genericity_and_algorithms-9.ppm (100%) rename milena/doc/{tutorial => }/generate_dist_files.sh (92%) create mode 100644 milena/doc/groups.hh rename milena/doc/{tutorial => }/img/small-enlarged.png (100%) rename milena/doc/{tutorial => }/img/small.png (100%) rename milena/doc/{tutorial => }/outputs/accu-right-instanciation.txt (100%) rename milena/doc/{tutorial => }/outputs/borderthickness.txt (100%) rename milena/doc/{tutorial => }/outputs/box2d-bbox.txt (100%) rename milena/doc/{tutorial => }/outputs/domain-display.txt (100%) rename milena/doc/{tutorial => }/outputs/dpoint-1.txt (100%) rename milena/doc/{tutorial => }/outputs/estim-sites.txt (100%) rename milena/doc/{tutorial => }/outputs/extend.txt (100%) rename milena/doc/{tutorial => }/outputs/extension-ignore.txt (100%) rename milena/doc/{tutorial => }/outputs/fill-call-1.txt (100%) rename milena/doc/{tutorial => }/outputs/fill-part-image.txt (100%) rename milena/doc/{tutorial => }/outputs/fill-subdomain-shorter.txt (100%) rename milena/doc/{tutorial => }/outputs/fill-subdomain.txt (100%) rename milena/doc/{tutorial => }/outputs/fill-subimage-cfun.txt (100%) rename milena/doc/{tutorial => }/outputs/fill.txt (100%) rename milena/doc/{tutorial => }/outputs/forall-piter.txt (100%) rename milena/doc/{tutorial => }/outputs/fun-p2v-1.txt (100%) rename milena/doc/{tutorial => }/outputs/graph-data.txt (100%) rename milena/doc/{tutorial => }/outputs/graph-iter.txt (100%) rename milena/doc/{tutorial => }/outputs/graph-output-1.txt (100%) rename milena/doc/{tutorial => }/outputs/ima-has.txt (100%) rename milena/doc/{tutorial => }/outputs/ima-save.txt (100%) rename milena/doc/{tutorial => }/outputs/ima-size.txt (100%) rename milena/doc/{tutorial => }/outputs/ima2d-1.txt (100%) rename milena/doc/{tutorial => }/outputs/ima2d-2.txt (100%) rename milena/doc/{tutorial => }/outputs/ima2d-3.txt (100%) rename milena/doc/{tutorial => }/outputs/ima2d-4.txt (100%) rename milena/doc/{tutorial => }/outputs/ima2d-5.txt (100%) rename milena/doc/{tutorial => }/outputs/ima2d-6-clone.txt (100%) rename milena/doc/{tutorial => }/outputs/ima2d-7.txt (100%) rename milena/doc/{tutorial => }/outputs/ima2d-decl-2.txt (100%) rename milena/doc/{tutorial => }/outputs/ima2d-display-1.txt (100%) rename milena/doc/{tutorial => }/outputs/ima2d-display-2.txt (100%) rename milena/doc/{tutorial => }/outputs/ima2d-display-output-1.txt (100%) rename milena/doc/{tutorial => }/outputs/ima2d-display-output-2.txt (100%) rename milena/doc/{tutorial => }/outputs/ima2d-rot.txt (100%) rename milena/doc/{tutorial => }/outputs/labeling-compute.txt (100%) rename milena/doc/{tutorial => }/outputs/logical-not.txt (100%) rename milena/doc/{tutorial => }/outputs/mln_var.txt (100%) rename milena/doc/{tutorial => }/outputs/outputs.mk (100%) rename milena/doc/{tutorial => }/outputs/parray-append.txt (100%) rename milena/doc/{tutorial => }/outputs/parray-bbox.txt (100%) rename milena/doc/{tutorial => }/outputs/parray-display-1.txt (100%) rename milena/doc/{tutorial => }/outputs/paste-call-1.txt (100%) rename milena/doc/{tutorial => }/outputs/paste.txt (100%) rename milena/doc/{tutorial => }/outputs/point-1.txt (100%) rename milena/doc/{tutorial => }/outputs/predicate-1.txt (100%) rename milena/doc/{tutorial => }/outputs/tuto2_first_image.txt (100%) rename milena/doc/{tutorial => }/outputs/tuto3_rw_image.txt (100%) rename milena/doc/{tutorial => }/outputs/tuto4_genericity_and_algorithms.txt (100%) rename milena/doc/{tutorial => }/outputs/win-create-1-display.txt (100%) rename milena/doc/{tutorial => }/outputs/win-create-1.txt (100%) rename milena/doc/{tutorial => }/outputs/win-create-2.txt (100%) create mode 100644 milena/doc/ref_guide/Makefile.am copy milena/doc/{tutorial/tutorial.tex => ref_guide/ref_guide.tex} (81%) rename milena/doc/{tutorial => }/tools/sample_utils.hh (100%) rename milena/doc/{tutorial => }/tools/split_sample.sh (100%) rename milena/doc/{tutorial => }/tools/todoxygen.sh (100%) delete mode 100644 milena/doc/tutorial/examples/examples.mk create mode 100644 milena/doc/white_paper/Makefile.am create mode 100644 milena/doc/white_paper/figures/house.png create mode 100644 milena/doc/white_paper/figures/house_rag.png create mode 100644 milena/doc/white_paper/figures/house_wshed.png create mode 100644 milena/doc/white_paper/figures/house_wshed_mean_colors.png create mode 100644 milena/doc/white_paper/white_paper.tex diff --git a/milena/ChangeLog b/milena/ChangeLog index c514008..f5ca370 100644 --- a/milena/ChangeLog +++ b/milena/ChangeLog @@ -1,3 +1,394 @@ +2009-03-05 Guillaume Lazzara <lazzara@lrde.epita.fr> + + Update documentation. + + * doc/Doxyfile.in: update example_path and image_path. + + * doc/Makefile.am: Add new targets white-paper and ref-guide. + + * doc/doc.mk: update paths. + + * doc/tutorial/samples/accu-right-instanciation.cc, + * doc/tutorial/samples/accu-wrong-instanciation.cc.raw, + * doc/tutorial/samples/borderthickness.cc, + * doc/tutorial/samples/box2d-bbox.cc, + * doc/tutorial/samples/domain-display.cc, + * doc/tutorial/samples/dpoint-1.cc, + * doc/tutorial/samples/estim-sites.cc, + * doc/tutorial/samples/extend.cc, + * doc/tutorial/samples/extension-ignore.cc, + * doc/tutorial/samples/fill-call-1.cc, + * doc/tutorial/samples/fill-part-image.cc, + * doc/tutorial/samples/fill-proto.cc.raw, + * doc/tutorial/samples/fill-subdomain-shorter.cc, + * doc/tutorial/samples/fill-subdomain.cc, + * doc/tutorial/samples/fill-subimage-cfun.cc, + * doc/tutorial/samples/fill.cc, + * doc/tutorial/samples/forall-piter.cc, + * doc/tutorial/samples/fun-p2v-1.cc, + * doc/tutorial/samples/graph-data.cc, + * doc/tutorial/samples/graph-iter.cc, + * doc/tutorial/samples/ima-has.cc, + * doc/tutorial/samples/ima-load.cc, + * doc/tutorial/samples/ima-save.cc, + * doc/tutorial/samples/ima-size.cc, + * doc/tutorial/samples/ima2d-1.cc, + * doc/tutorial/samples/ima2d-2.cc, + * doc/tutorial/samples/ima2d-3.cc, + * doc/tutorial/samples/ima2d-4.cc, + * doc/tutorial/samples/ima2d-5.cc, + * doc/tutorial/samples/ima2d-6-clone.cc, + * doc/tutorial/samples/ima2d-7.cc, + * doc/tutorial/samples/ima2d-restricted-1.cc.raw, + * doc/tutorial/samples/ima2d-restricted-2.cc.raw, + * doc/tutorial/samples/ima2d-restricted-3.cc.raw, + * doc/tutorial/samples/ima2d-rot.cc, + * doc/tutorial/samples/labeling-compute.cc, + * doc/tutorial/samples/logical-not.cc, + * doc/tutorial/samples/mln_var.cc, + * doc/tutorial/samples/parray-append.cc, + * doc/tutorial/samples/parray-bbox.cc, + * doc/tutorial/samples/paste-call-1.cc, + * doc/tutorial/samples/paste.cc, + * doc/tutorial/samples/point-1.cc, + * doc/tutorial/samples/predicate-1.cc, + * doc/tutorial/examples/accu.cc, + * doc/tutorial/samples/samples.mk, + * doc/tutorial/examples/box.cc, + * doc/tutorial/examples/cpp_issue.cc, + * doc/examples/erosion.cc, + * doc/tutorial/examples/for_Z.cc, + * doc/examples/graph.cc, + * doc/tutorial/examples/image2d.cc, + * doc/tutorial/examples/image_flat.cc, + * doc/tutorial/examples/image_if.cc, + * doc/tutorial/examples/image_plain.cc, + * doc/tutorial/examples/image_safe.cc, + * doc/examples/labeling_algo.cc, + * doc/examples/mk_graph.cc, + * doc/tutorial/examples/p_array.2.cc, + * doc/tutorial/examples/p_array.cc, + * doc/tutorial/examples/p_image.cc, + * doc/tutorial/examples/p_key.2.cc, + * doc/tutorial/examples/p_key.cc, + * doc/tutorial/examples/p_line2d.cc, + * doc/tutorial/examples/p_mutable_array_of.cc, + * doc/tutorial/examples/p_queue.cc, + * doc/tutorial/examples/p_run.cc, + * doc/tutorial/examples/p_vaccess.cc, + * doc/tutorial/examples/proxy.cc, + * doc/tutorial/examples/sub_image.cc, + * doc/tutorial/examples/sub_image_if.cc, + * doc/examples/tuto_bis.cc, + * doc/examples/tuto_one.cc, + * doc/tutorial/examples/vec.cc, + * doc/tutorial/examples/win_multiple.cc, + * doc/tutorial/examples/window.cc, + * doc/tutorial/samples/tuto2_first_image.cc, + * doc/tutorial/samples/tuto3_rw_image.cc, + * doc/tutorial/samples/tuto4_genericity_and_algorithms.cc, + * doc/tutorial/samples/win-create-1.cc, + * doc/tutorial/samples/win-create-2.cc, + * doc/tutorial/figures/extend-1.ppm, + * doc/tutorial/figures/extend-2.ppm, + * doc/tutorial/figures/extend-3.ppm, + * doc/tutorial/figures/extend-4.ppm, + * doc/tutorial/figures/extend-5.ppm, + * doc/tutorial/figures/figures.mk, + * doc/tutorial/figures/fill-subdomain-1.pbm, + * doc/tutorial/figures/fill-subdomain-2.ppm, + * doc/tutorial/figures/fill-subdomain-3.ppm, + * doc/tutorial/figures/fill-subdomain-4.ppm, + * doc/tutorial/figures/fill-subimage-cfun-1.ppm, + * doc/tutorial/figures/ima2d-rot-1.ppm, + * doc/tutorial/figures/ima2d-rot-2.ppm, + * doc/tutorial/figures/ima_save.pbm, + * doc/tutorial/figures/labeling-compute-1.pbm, + * doc/tutorial/figures/labeling-compute-2.ppm, + * doc/tutorial/figures/logical-not-1.pbm, + * doc/tutorial/figures/logical-not-2.pbm, + * doc/tutorial/figures/logical-not-3.pbm, + * doc/tutorial/figures/tuto2_first_image-1.pbm, + * doc/tutorial/figures/tuto3_rw_image-1.ppm, + * doc/tutorial/figures/tuto3_rw_image-2.ppm, + * doc/tutorial/figures/tuto3_rw_image-3.ppm, + * doc/tutorial/figures/tuto4_genericity_and_algorithms-1.ppm, + * doc/tutorial/figures/tuto4_genericity_and_algorithms-2.ppm, + * doc/tutorial/figures/tuto4_genericity_and_algorithms-3.pbm, + * doc/tutorial/figures/tuto4_genericity_and_algorithms-4.ppm, + * doc/tutorial/figures/tuto4_genericity_and_algorithms-5.ppm, + * doc/tutorial/figures/tuto4_genericity_and_algorithms-6.ppm, + * doc/tutorial/figures/tuto4_genericity_and_algorithms-7.pgm, + * doc/tutorial/figures/tuto4_genericity_and_algorithms-7.ppm, + * doc/tutorial/figures/tuto4_genericity_and_algorithms-8.pgm, + * doc/tutorial/figures/tuto4_genericity_and_algorithms-8.ppm, + * doc/tutorial/figures/tuto4_genericity_and_algorithms-9.pgm, + * doc/tutorial/figures/tuto4_genericity_and_algorithms-9.ppm, + * doc/tutorial/generate_dist_files.sh, + * doc/groups.hh, + * doc/tutorial/img/small-enlarged.png, + * doc/tutorial/img/small.png, + * doc/tutorial/outputs/accu-right-instanciation.txt, + * doc/tutorial/outputs/borderthickness.txt, + * doc/tutorial/outputs/box2d-bbox.txt, + * doc/tutorial/outputs/domain-display.txt, + * doc/tutorial/outputs/dpoint-1.txt, + * doc/tutorial/outputs/estim-sites.txt, + * doc/tutorial/outputs/extend.txt, + * doc/tutorial/outputs/extension-ignore.txt, + * doc/tutorial/outputs/fill-call-1.txt, + * doc/tutorial/outputs/fill-part-image.txt, + * doc/tutorial/outputs/fill-subdomain-shorter.txt, + * doc/tutorial/outputs/fill-subdomain.txt, + * doc/tutorial/outputs/fill-subimage-cfun.txt, + * doc/tutorial/outputs/fill.txt, + * doc/tutorial/outputs/forall-piter.txt, + * doc/tutorial/outputs/fun-p2v-1.txt, + * doc/tutorial/outputs/graph-data.txt, + * doc/tutorial/outputs/graph-iter.txt, + * doc/tutorial/outputs/graph-output-1.txt, + * doc/tutorial/outputs/ima-has.txt, + * doc/tutorial/outputs/ima-save.txt, + * doc/tutorial/outputs/ima-size.txt, + * doc/tutorial/outputs/ima2d-1.txt, + * doc/tutorial/outputs/ima2d-2.txt, + * doc/tutorial/outputs/ima2d-3.txt, + * doc/tutorial/outputs/ima2d-4.txt, + * doc/tutorial/outputs/ima2d-5.txt, + * doc/tutorial/outputs/ima2d-6-clone.txt, + * doc/tutorial/outputs/ima2d-7.txt, + * doc/tutorial/outputs/ima2d-decl-2.txt, + * doc/tutorial/outputs/ima2d-display-1.txt, + * doc/tutorial/outputs/ima2d-display-2.txt, + * doc/tutorial/outputs/ima2d-display-output-1.txt, + * doc/tutorial/outputs/ima2d-display-output-2.txt, + * doc/tutorial/outputs/ima2d-rot.txt, + * doc/tutorial/outputs/labeling-compute.txt, + * doc/tutorial/outputs/logical-not.txt, + * doc/tutorial/outputs/mln_var.txt, + * doc/tutorial/outputs/outputs.mk, + * doc/tutorial/outputs/parray-append.txt, + * doc/tutorial/outputs/parray-bbox.txt, + * doc/tutorial/outputs/parray-display-1.txt, + * doc/tutorial/outputs/paste-call-1.txt, + * doc/tutorial/outputs/paste.txt, + * doc/tutorial/outputs/point-1.txt, + * doc/tutorial/outputs/predicate-1.txt, + * doc/tutorial/outputs/tuto2_first_image.txt, + * doc/tutorial/outputs/tuto3_rw_image.txt, + * doc/tutorial/outputs/tuto4_genericity_and_algorithms.txt, + * doc/tutorial/outputs/win-create-1-display.txt, + * doc/tutorial/outputs/win-create-1.txt, + * doc/tutorial/outputs/win-create-2.txt, + * doc/tutorial/tools/sample_utils.hh, + * doc/tutorial/tools/split_sample.sh, + * doc/tutorial/tools/todoxygen.sh, + * doc/tutorial/examples/examples.mk, + * doc/tutorial/samples/Makefile.am: Move to... + + + * doc/examples/Makefile.am, + * doc/examples/accu-right-instanciation.cc, + * doc/examples/accu-wrong-instanciation.cc.raw, + * doc/examples/borderthickness.cc, + * doc/examples/box2d-bbox.cc, + * doc/examples/domain-display.cc, + * doc/examples/dpoint-1.cc, + * doc/examples/estim-sites.cc, + * doc/examples/examples.mk, + * doc/examples/extend.cc, + * doc/examples/extension-ignore.cc, + * doc/examples/fill-call-1.cc, + * doc/examples/fill-part-image.cc, + * doc/examples/fill-proto.cc.raw, + * doc/examples/fill-subdomain-shorter.cc, + * doc/examples/fill-subdomain.cc, + * doc/examples/fill-subimage-cfun.cc, + * doc/examples/fill.cc, + * doc/examples/forall-piter.cc, + * doc/examples/fun-p2v-1.cc, + * doc/examples/graph-data.cc, + * doc/examples/graph-iter.cc, + * doc/examples/ima-has.cc, + * doc/examples/ima-load.cc, + * doc/examples/ima-save.cc, + * doc/examples/ima-size.cc, + * doc/examples/ima2d-1.cc, + * doc/examples/ima2d-2.cc, + * doc/examples/ima2d-3.cc, + * doc/examples/ima2d-4.cc, + * doc/examples/ima2d-5.cc, + * doc/examples/ima2d-6-clone.cc, + * doc/examples/ima2d-7.cc, + * doc/examples/ima2d-restricted-1.cc.raw, + * doc/examples/ima2d-restricted-2.cc.raw, + * doc/examples/ima2d-restricted-3.cc.raw, + * doc/examples/ima2d-rot.cc, + * doc/examples/labeling-compute.cc, + * doc/examples/logical-not.cc, + * doc/examples/mln_var.cc, + * doc/examples/parray-append.cc, + * doc/examples/parray-bbox.cc, + * doc/examples/paste-call-1.cc, + * doc/examples/paste.cc, + * doc/examples/point-1.cc, + * doc/examples/predicate-1.cc, + * doc/examples/samples.mk, + * doc/examples/trash/accu.cc, + * doc/examples/trash/erosion.cc, + * doc/examples/trash/for_Z.cc, + * doc/examples/trash/graph.cc, + * doc/examples/trash/image2d.cc, + * doc/examples/trash/image_flat.cc, + * doc/examples/trash/image_if.cc, + * doc/examples/trash/image_plain.cc, + * doc/examples/trash/box.cc, + * doc/examples/trash/cpp_issue.cc, + * doc/examples/trash/image_safe.cc, + * doc/examples/trash/labeling_algo.cc, + * doc/examples/trash/mk_graph.cc, + * doc/examples/trash/p_array.2.cc, + * doc/examples/trash/p_array.cc, + * doc/examples/trash/p_image.cc, + * doc/examples/trash/p_key.2.cc, + * doc/examples/trash/p_key.cc, + * doc/examples/trash/p_line2d.cc, + * doc/examples/trash/p_mutable_array_of.cc, + * doc/examples/trash/p_queue.cc, + * doc/examples/trash/p_run.cc, + * doc/examples/trash/p_vaccess.cc, + * doc/examples/trash/proxy.cc, + * doc/examples/trash/sub_image.cc, + * doc/examples/trash/sub_image_if.cc, + * doc/examples/trash/tuto_bis.cc, + * doc/examples/trash/tuto_one.cc, + * doc/examples/trash/vec.cc, + * doc/examples/trash/win_multiple.cc, + * doc/examples/tuto2_first_image.cc, + * doc/examples/tuto3_rw_image.cc, + * doc/examples/tuto4_genericity_and_algorithms.cc, + * doc/examples/win-create-1.cc, + * doc/examples/win-create-2.cc, + * doc/figures/extend-1.ppm, + * doc/figures/extend-2.ppm, + * doc/figures/extend-3.ppm, + * doc/figures/extend-4.ppm, + * doc/figures/extend-5.ppm, + * doc/figures/fill-subdomain-1.pbm, + * doc/figures/fill-subdomain-2.ppm, + * doc/figures/fill-subdomain-3.ppm, + * doc/figures/fill-subdomain-4.ppm, + * doc/figures/figures.mk, + * doc/figures/fill-subimage-cfun-1.ppm, + * doc/figures/ima2d-rot-1.ppm, + * doc/figures/ima2d-rot-2.ppm, + * doc/figures/ima_save.pbm, + * doc/figures/labeling-compute-1.pbm, + * doc/figures/labeling-compute-2.ppm, + * doc/figures/logical-not-1.pbm, + * doc/figures/logical-not-2.pbm, + * doc/figures/logical-not-3.pbm, + * doc/figures/tuto2_first_image-1.pbm, + * doc/figures/tuto3_rw_image-1.ppm, + * doc/figures/tuto3_rw_image-2.ppm, + * doc/figures/tuto3_rw_image-3.ppm, + * doc/figures/tuto4_genericity_and_algorithms-1., + * doc/figures/tuto4_genericity_and_algorithms-2., + * doc/figures/tuto4_genericity_and_algorithms-3., + * doc/figures/tuto4_genericity_and_algorithms-4., + * doc/figures/tuto4_genericity_and_algorithms-5., + * doc/figures/tuto4_genericity_and_algorithms-6., + * doc/figures/tuto4_genericity_and_algorithms-7., + * doc/figures/tuto4_genericity_and_algorithms-7., + * doc/figures/tuto4_genericity_and_algorithms-8., + * doc/figures/tuto4_genericity_and_algorithms-8., + * doc/figures/tuto4_genericity_and_algorithms-9., + * doc/figures/tuto4_genericity_and_algorithms-9., + * doc/generate_dist_files.sh, + * doc/img/small-enlarged.png, + * doc/img/small.png, + * doc/outputs/accu-right-instanciation.txt, + * doc/outputs/borderthickness.txt, + * doc/outputs/box2d-bbox.txt, + * doc/outputs/domain-display.txt, + * doc/outputs/dpoint-1.txt, + * doc/outputs/estim-sites.txt, + * doc/outputs/extend.txt, + * doc/outputs/extension-ignore.txt, + * doc/outputs/fill-call-1.txt, + * doc/outputs/fill-part-image.txt, + * doc/outputs/fill-subdomain-shorter.txt, + * doc/outputs/fill-subdomain.txt, + * doc/outputs/fill-subimage-cfun.txt, + * doc/outputs/fill.txt, + * doc/outputs/forall-piter.txt, + * doc/outputs/fun-p2v-1.txt, + * doc/outputs/graph-data.txt, + * doc/outputs/graph-iter.txt, + * doc/outputs/graph-output-1.txt, + * doc/outputs/ima-has.txt, + * doc/outputs/ima-save.txt, + * doc/outputs/ima-size.txt, + * doc/outputs/ima2d-1.txt, + * doc/outputs/ima2d-2.txt, + * doc/outputs/ima2d-3.txt, + * doc/outputs/ima2d-4.txt, + * doc/outputs/ima2d-5.txt, + * doc/outputs/ima2d-6-clone.txt, + * doc/outputs/ima2d-7.txt, + * doc/outputs/ima2d-decl-2.txt, + * doc/outputs/ima2d-display-1.txt, + * doc/outputs/ima2d-display-2.txt, + * doc/outputs/ima2d-display-output-1.txt, + * doc/outputs/ima2d-display-output-2.txt, + * doc/outputs/ima2d-rot.txt, + * doc/outputs/labeling-compute.txt, + * doc/outputs/logical-not.txt, + * doc/outputs/mln_var.txt, + * doc/outputs/outputs.mk, + * doc/outputs/parray-append.txt, + * doc/outputs/parray-bbox.txt, + * doc/outputs/parray-display-1.txt, + * doc/outputs/paste-call-1.txt, + * doc/outputs/paste.txt, + * doc/outputs/point-1.txt, + * doc/outputs/predicate-1.txt, + * doc/outputs/tuto2_first_image.txt, + * doc/outputs/tuto3_rw_image.txt, + * doc/outputs/tuto4_genericity_and_algorithms.txt, + * doc/outputs/win-create-1-display.txt, + * doc/outputs/win-create-1.txt, + * doc/outputs/win-create-2.txt, + * doc/tools/sample_utils.hh, + * doc/tools/split_sample.sh, + * doc/tools/todoxygen.sh: ... here. + + * doc/tutorial/tutorial.tex: split into tutorial.tex and... + * doc/ref_guide/ref_guide.tex: ... this file. + * doc/ref_guide/Makefile.am: add new rules. + + * doc/tutorial/Makefile.am: update rules. + + * doc/white_paper/Makefile.am, + * doc/white_paper/figures/house.png, + * doc/white_paper/figures/house_rag.png, + * doc/white_paper/figures/house_wshed.png, + * doc/white_paper/figures/house_wshed_mean_colors.png, + * doc/white_paper/white_paper.tex: introduce a new white paper. + + * mln/core/concept/image.hh, + * mln/core/concept/object.hh, + * mln/core/image/cast_image.hh, + * mln/core/image/image1d.hh, + * mln/core/image/image2d.hh, + * mln/core/image/image2d_h.hh, + * mln/core/image/image3d.hh, + * mln/core/image/image_if.hh: test documentation group with doxygen. + + * mln/opt/all.hh: add doc for mln::opt namespace. + + * tests/util/soft_heap.cc: fix \file command. + 2009-03-05 Thierry Geraud <thierry.geraud@lrde.epita.fr> Fix level::stretch and value::lut_vec. diff --git a/milena/doc/Doxyfile.in b/milena/doc/Doxyfile.in index 5d657a4..053cbe7 100644 --- a/milena/doc/Doxyfile.in +++ b/milena/doc/Doxyfile.in @@ -85,20 +85,20 @@ RECURSIVE = YES EXCLUDE = @top_srcdir@/milena/sandbox \ @top_srcdir@/milena/mln/core/concept/proxy.hxx \ @top_srcdir@/milena/trash \ - @top_srcdir@/milena/doc/tutorial/samples + @top_srcdir@/milena/doc/examples/trash EXCLUDE_SYMLINKS = YES EXCLUDE_PATTERNS = *spe.hh EXCLUDE_SYMBOLS = -EXAMPLE_PATH = @top_srcdir@/milena/doc/tutorial/samples \ - @top_builddir@/milena/doc/tutorial/samples \ - @top_builddir@/milena/doc/tutorial/outputs \ - @top_builddir@/milena/doc/tutorial/outputs/splitted \ - @top_srcdir@/milena/doc/tutorial/outputs +EXAMPLE_PATH = @top_srcdir@/milena/doc/examples \ + @top_builddir@/milena/doc/examples \ + @top_builddir@/milena/doc/outputs \ + @top_builddir@/milena/doc/outputs/splitted \ + @top_srcdir@/milena/doc/outputs EXAMPLE_PATTERNS = EXAMPLE_RECURSIVE = NO -IMAGE_PATH = @top_srcdir@/milena/doc/tutorial/img \ - @top_srcdir@/milena/doc/tutorial/figures \ - @top_builddir@/milena/doc/tutorial/figures +IMAGE_PATH = @top_srcdir@/milena/doc/img \ + @top_srcdir@/milena/doc/figures \ + @top_builddir@/milena/doc/figures INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO diff --git a/milena/doc/Makefile.am b/milena/doc/Makefile.am index aa1b30c..ad25545 100644 --- a/milena/doc/Makefile.am +++ b/milena/doc/Makefile.am @@ -2,32 +2,55 @@ include $(top_srcdir)/milena/doc/doc.mk -SUBDIRS = tutorial +SUBDIRS = tutorial white_paper DOXYGEN = doxygen -.PHONY: doc user-doc complete-doc html_complete html_user tutorial +.PHONY: doc user-doc complete-doc html-complete html-user tutorial white-paper regen-dist doc: user-doc -complete-doc: html_complete +complete-doc: html-complete -user-doc: html_user +user-doc: html-user -html_complete: Doxyfile tuto_html +html-complete: Doxyfile tuto-html ref-guide-html $(DOXYGEN) Doxyfile_complete -html_user: Doxyfile tuto_html +html-user: Doxyfile tuto-html ref-guide-html $(DOXYGEN) Doxyfile_user -tuto_html: - $(MAKE) -C tutorial tuto_html +tuto-html: data fig-convert + $(MAKE) -C tutorial tuto-html -tutorial: all +tutorial: data fig-convert $(MAKE) -C tutorial tutorial +white-paper: + $(MAKE) -C white_paper white-paper + +ref-guide: + $(MAKE) -C ref_guide ref-guide + +ref-guide-html: + $(MAKE) -C ref_guide ref-guide-html + + +data: + make -C examples data + fix-refdata: - $(MAKE) -C tutorial fix-refdata + make -C examples fix-refdata + +fig-convert: + @failcom='exit 1'; \ + list="$(FIGURES_BUILDDIR)/*.p*m"; for img in $$list; do \ + echo "Converting $$img to png"; \ + name=`basename $$img` \ + ext=`echo $$name | cut -d '.' -f 2`; \ + convert -scale 250 $$img $(FIGURES_BUILDDIR)/`basename $$img $$ext`png\ + || eval $$failcom; \ + done; edit = sed -e "s|@ID@|$$Id|" \ -e 's,@PACKAGE_NAME\@,$(PACKAGE_NAME),g' \ @@ -54,10 +77,32 @@ edit_user = sed -e 's,OUTPUT_DIRECTORY = ./complete/,OUTPUT_DIRECTORY -e 's,EXCLUDE_SYMBOLS =,EXCLUDE_SYMBOLS = *::internal* *_ mln::trait::*,g' +regen-dist: $(srcdir)/headers.stamp + +$(srcdir)/examples/examples.mk: $(srcdir)/headers.stamp +$(srcdir)/figures/figures.mk: $(srcdir)/headers.stamp +$(srcdir)/outputs/outputs.mk: $(srcdir)/headers.stamp + + +EXTRA_DIST = $(srcdir)/headers.stamp +$(srcdir)/headers.stamp: $(srcdir)/generate_dist_files.sh + @rm -f $@.tmp + @touch $@.tmp + cd $(srcdir) && ./generate_dist_files.sh + @mv -f $@.tmp $@ + + +include $(srcdir)/examples/examples.mk +include $(srcdir)/figures/figures.mk +include $(srcdir)/outputs/outputs.mk + -EXTRA_DIST = \ +EXTRA_DIST += \ Doxyfile.in \ -$(top_builddir)/milena/doc/user +user \ +tools/sample_utils.hh \ +tools/split_sample.sh \ +tools/todoxygen.sh CLEANFILES = \ Doxyfile_complete \ diff --git a/milena/doc/doc.mk b/milena/doc/doc.mk index 938c4c3..8f2bd33 100644 --- a/milena/doc/doc.mk +++ b/milena/doc/doc.mk @@ -5,14 +5,14 @@ include $(top_srcdir)/milena/tests/tests.mk AM_CPPFLAGS += -I$(top_srcdir)/milena/doc/tutorial/tools -TUTORIAL_SRCDIR = $(top_srcdir)/milena/doc/tutorial -OUTPUTS_SRCDIR = $(TUTORIAL_SRCDIR)/outputs -FIGURES_SRCDIR = $(TUTORIAL_SRCDIR)/figures -SAMPLES_SRCDIR = $(TUTORIAL_SRCDIR)/samples -IMG_SRCDIR = $(TUTORIAL_SRCDIR)/img +DOC_SRCDIR = $(top_srcdir)/milena/doc/ +OUTPUTS_SRCDIR = $(DOC_SRCDIR)/outputs +FIGURES_SRCDIR = $(DOC_SRCDIR)/figures +EXAMPLES_SRCDIR = $(DOC_SRCDIR)/examples +IMG_SRCDIR = $(DOC_SRCDIR)/img -TUTORIAL_BUILDDIR = $(top_builddir)/milena/doc/tutorial -OUTPUTS_BUILDDIR = $(TUTORIAL_BUILDDIR)/outputs -SPLITTED_OUTPUTS_BUILDDIR = $(TUTORIAL_BUILDDIR)/outputs/splitted -FIGURES_BUILDDIR = $(TUTORIAL_BUILDDIR)/figures -SAMPLES_BUILDDIR = $(TUTORIAL_BUILDDIR)/samples +DOC_BUILDDIR = $(top_builddir)/milena/doc/ +OUTPUTS_BUILDDIR = $(DOC_BUILDDIR)/outputs +SPLITTED_OUTPUTS_BUILDDIR = $(DOC_BUILDDIR)/outputs/splitted +FIGURES_BUILDDIR = $(DOC_BUILDDIR)/figures +EXAMPLES_BUILDDIR = $(DOC_BUILDDIR)/examples diff --git a/milena/doc/tutorial/samples/Makefile.am b/milena/doc/examples/Makefile.am similarity index 95% rename from milena/doc/tutorial/samples/Makefile.am rename to milena/doc/examples/Makefile.am index 899f8a8..74f68f1 100644 --- a/milena/doc/tutorial/samples/Makefile.am +++ b/milena/doc/examples/Makefile.am @@ -169,10 +169,10 @@ fix-refdata: split-samples: - mkdir -p $(SAMPLES_BUILDDIR) + mkdir -p $(EXAMPLES_BUILDDIR) @failcom='exit 1'; \ - list='$(SAMPLES_SRCDIR)/*.cc'; for file in $$list; do \ - $(TUTORIAL_SRCDIR)/tools/split_sample.sh $$file cc $(SAMPLES_BUILDDIR)\ + list='$(EXAMPLES_SRCDIR)/*.cc'; for file in $$list; do \ + $(DOC_SRCDIR)/tools/split_sample.sh $$file cc $(EXAMPLES_BUILDDIR)\ || eval $$failcom; \ done @@ -180,14 +180,14 @@ split-outputs: mkdir -p $(SPLITTED_OUTPUTS_BUILDDIR) @failcom='exit 1'; \ list='$(OUTPUTS_BUILDDIR)/*.txt'; for file in $$list; do \ - $(TUTORIAL_SRCDIR)/tools/split_sample.sh $$file txt $(SPLITTED_OUTPUTS_BUILDDIR)\ + $(DOC_SRCDIR)/tools/split_sample.sh $$file txt $(SPLITTED_OUTPUTS_BUILDDIR)\ || eval $$failcom; \ done clean-local: clean-figures rm -Rf $(OUTPUTS_BUILDDIR) - rm -f $(SAMPLES_BUILDDIR)/*.cc + rm -f $(EXAMPLES_BUILDDIR)/*.cc clean-figures: rm -Rf $(FIGURES_BUILDDIR) diff --git a/milena/doc/tutorial/samples/accu-right-instanciation.cc b/milena/doc/examples/accu-right-instanciation.cc similarity index 100% rename from milena/doc/tutorial/samples/accu-right-instanciation.cc rename to milena/doc/examples/accu-right-instanciation.cc diff --git a/milena/doc/tutorial/samples/accu-wrong-instanciation.cc.raw b/milena/doc/examples/accu-wrong-instanciation.cc.raw similarity index 100% rename from milena/doc/tutorial/samples/accu-wrong-instanciation.cc.raw rename to milena/doc/examples/accu-wrong-instanciation.cc.raw diff --git a/milena/doc/tutorial/samples/borderthickness.cc b/milena/doc/examples/borderthickness.cc similarity index 100% rename from milena/doc/tutorial/samples/borderthickness.cc rename to milena/doc/examples/borderthickness.cc diff --git a/milena/doc/tutorial/samples/box2d-bbox.cc b/milena/doc/examples/box2d-bbox.cc similarity index 100% rename from milena/doc/tutorial/samples/box2d-bbox.cc rename to milena/doc/examples/box2d-bbox.cc diff --git a/milena/doc/tutorial/samples/domain-display.cc b/milena/doc/examples/domain-display.cc similarity index 100% rename from milena/doc/tutorial/samples/domain-display.cc rename to milena/doc/examples/domain-display.cc diff --git a/milena/doc/tutorial/samples/dpoint-1.cc b/milena/doc/examples/dpoint-1.cc similarity index 100% rename from milena/doc/tutorial/samples/dpoint-1.cc rename to milena/doc/examples/dpoint-1.cc diff --git a/milena/doc/tutorial/samples/estim-sites.cc b/milena/doc/examples/estim-sites.cc similarity index 100% rename from milena/doc/tutorial/samples/estim-sites.cc rename to milena/doc/examples/estim-sites.cc diff --git a/milena/doc/examples/examples.mk b/milena/doc/examples/examples.mk new file mode 100644 index 0000000..65b0a3f --- /dev/null +++ b/milena/doc/examples/examples.mk @@ -0,0 +1,88 @@ +## Generated by ../generate_dist_files, do not modify. + +EXTRA_DIST += \ +examples/paste-call-1.cc \ +examples/dpoint-1.cc \ +examples/parray-append.cc \ +examples/trash \ +examples/trash/cpp_issue.cc \ +examples/trash/sub_image.cc \ +examples/trash/sub_image_if.cc \ +examples/trash/graph.cc \ +examples/trash/p_vaccess.cc \ +examples/trash/tuto_one.cc \ +examples/trash/win_multiple.cc \ +examples/trash/image2d.cc \ +examples/trash/image_plain.cc \ +examples/trash/p_run.cc \ +examples/trash/proxy.cc \ +examples/trash/p_array.2.cc \ +examples/trash/labeling_algo.cc \ +examples/trash/for_Z.cc \ +examples/trash/image_if.cc \ +examples/trash/p_key.cc \ +examples/trash/p_mutable_array_of.cc \ +examples/trash/p_queue.cc \ +examples/trash/image_flat.cc \ +examples/trash/p_image.cc \ +examples/trash/mk_graph.cc \ +examples/trash/box.cc \ +examples/trash/p_line2d.cc \ +examples/trash/p_array.cc \ +examples/trash/accu.cc \ +examples/trash/p_key.2.cc \ +examples/trash/window.cc \ +examples/trash/tuto_bis.cc \ +examples/trash/image_safe.cc \ +examples/trash/erosion.cc \ +examples/trash/vec.cc \ +examples/fill-proto.cc.raw \ +examples/ima2d-restricted-1.cc.raw \ +examples/graph-iter.cc \ +examples/labeling-compute.cc \ +examples/ima2d-7.cc \ +examples/ima2d-restricted-2.cc.raw \ +examples/fill-subimage-cfun.cc \ +examples/ima-save.cc \ +examples/point-1.cc \ +examples/box2d-bbox.cc \ +examples/forall-piter.cc \ +examples/ima-size.cc \ +examples/examples.mk \ +examples/borderthickness.cc \ +examples/Makefile.in \ +examples/ima-load.cc \ +examples/ima-has.cc \ +examples/win-create-1.cc \ +examples/samples.mk \ +examples/accu-wrong-instanciation.cc.raw \ +examples/accu-right-instanciation.cc \ +examples/ima2d-5.cc \ +examples/fill-subdomain.cc \ +examples/fill-subdomain-shorter.cc \ +examples/tuto3_rw_image.cc \ +examples/ima2d-2.cc \ +examples/extension-ignore.cc \ +examples/extend.cc \ +examples/Makefile.am \ +examples/parray-bbox.cc \ +examples/graph-data.cc \ +examples/mln_var.cc \ +examples/ima2d-4.cc \ +examples/predicate-1.cc \ +examples/ima2d-3.cc \ +examples/tuto2_first_image.cc \ +examples/ima2d-1.cc \ +examples/estim-sites.cc \ +examples/ima2d-6-clone.cc \ +examples/ima2d-restricted-3.cc.raw \ +examples/logical-not.cc \ +examples/fun-p2v-1.cc \ +examples/ima2d-rot.cc \ +examples/fill-part-image.cc \ +examples/domain-display.cc \ +examples/tuto4_genericity_and_algorithms.cc \ +examples/paste.cc \ +examples/fill.cc \ +examples/fill-call-1.cc \ +examples/win-create-2.cc diff --git a/milena/doc/tutorial/samples/extend.cc b/milena/doc/examples/extend.cc similarity index 97% rename from milena/doc/tutorial/samples/extend.cc rename to milena/doc/examples/extend.cc index 2f9ae0d..3448ddc 100644 --- a/milena/doc/tutorial/samples/extend.cc +++ b/milena/doc/examples/extend.cc @@ -1,7 +1,7 @@ #include <mln/essential/2d.hh> #include <mln/fun/p2b/big_chess.hh> #include <tests/data.hh> -#include <doc/tutorial/tools/sample_utils.hh> +#include <doc/tools/sample_utils.hh> namespace mln { diff --git a/milena/doc/tutorial/samples/extension-ignore.cc b/milena/doc/examples/extension-ignore.cc similarity index 100% rename from milena/doc/tutorial/samples/extension-ignore.cc rename to milena/doc/examples/extension-ignore.cc diff --git a/milena/doc/tutorial/samples/fill-call-1.cc b/milena/doc/examples/fill-call-1.cc similarity index 100% rename from milena/doc/tutorial/samples/fill-call-1.cc rename to milena/doc/examples/fill-call-1.cc diff --git a/milena/doc/tutorial/samples/fill-part-image.cc b/milena/doc/examples/fill-part-image.cc similarity index 100% rename from milena/doc/tutorial/samples/fill-part-image.cc rename to milena/doc/examples/fill-part-image.cc diff --git a/milena/doc/tutorial/samples/fill-proto.cc.raw b/milena/doc/examples/fill-proto.cc.raw similarity index 100% rename from milena/doc/tutorial/samples/fill-proto.cc.raw rename to milena/doc/examples/fill-proto.cc.raw diff --git a/milena/doc/tutorial/samples/fill-subdomain-shorter.cc b/milena/doc/examples/fill-subdomain-shorter.cc similarity index 100% rename from milena/doc/tutorial/samples/fill-subdomain-shorter.cc rename to milena/doc/examples/fill-subdomain-shorter.cc diff --git a/milena/doc/tutorial/samples/fill-subdomain.cc b/milena/doc/examples/fill-subdomain.cc similarity index 96% rename from milena/doc/tutorial/samples/fill-subdomain.cc rename to milena/doc/examples/fill-subdomain.cc index a5ec65e..a44d070 100644 --- a/milena/doc/tutorial/samples/fill-subdomain.cc +++ b/milena/doc/examples/fill-subdomain.cc @@ -1,5 +1,5 @@ #include <mln/essential/2d.hh> -#include <doc/tutorial/tools/sample_utils.hh> +#include <doc/tools/sample_utils.hh> int main() { using namespace mln; diff --git a/milena/doc/tutorial/samples/fill-subimage-cfun.cc b/milena/doc/examples/fill-subimage-cfun.cc similarity index 93% rename from milena/doc/tutorial/samples/fill-subimage-cfun.cc rename to milena/doc/examples/fill-subimage-cfun.cc index 2ff6c6c..06d2e0d 100644 --- a/milena/doc/tutorial/samples/fill-subimage-cfun.cc +++ b/milena/doc/examples/fill-subimage-cfun.cc @@ -1,5 +1,5 @@ #include <mln/essential/2d.hh> -#include <doc/tutorial/tools/sample_utils.hh> +#include <doc/tools/sample_utils.hh> // \{ bool row_oddity(mln::point2d p) { diff --git a/milena/doc/tutorial/samples/fill.cc b/milena/doc/examples/fill.cc similarity index 100% rename from milena/doc/tutorial/samples/fill.cc rename to milena/doc/examples/fill.cc diff --git a/milena/doc/tutorial/samples/forall-piter.cc b/milena/doc/examples/forall-piter.cc similarity index 100% rename from milena/doc/tutorial/samples/forall-piter.cc rename to milena/doc/examples/forall-piter.cc diff --git a/milena/doc/tutorial/samples/fun-p2v-1.cc b/milena/doc/examples/fun-p2v-1.cc similarity index 100% rename from milena/doc/tutorial/samples/fun-p2v-1.cc rename to milena/doc/examples/fun-p2v-1.cc diff --git a/milena/doc/tutorial/samples/graph-data.cc b/milena/doc/examples/graph-data.cc similarity index 100% rename from milena/doc/tutorial/samples/graph-data.cc rename to milena/doc/examples/graph-data.cc diff --git a/milena/doc/tutorial/samples/graph-iter.cc b/milena/doc/examples/graph-iter.cc similarity index 98% rename from milena/doc/tutorial/samples/graph-iter.cc rename to milena/doc/examples/graph-iter.cc index 2e52d7d..613283a 100644 --- a/milena/doc/tutorial/samples/graph-iter.cc +++ b/milena/doc/examples/graph-iter.cc @@ -1,6 +1,6 @@ #include <mln/essential/2d.hh> #include <mln/util/graph.hh> -#include <doc/tutorial/tools/sample_utils.hh> +#include <doc/tools/sample_utils.hh> struct viota_t : public mln::Function_p2v< viota_t > { diff --git a/milena/doc/tutorial/samples/ima-has.cc b/milena/doc/examples/ima-has.cc similarity index 100% rename from milena/doc/tutorial/samples/ima-has.cc rename to milena/doc/examples/ima-has.cc diff --git a/milena/doc/tutorial/samples/ima-load.cc b/milena/doc/examples/ima-load.cc similarity index 100% rename from milena/doc/tutorial/samples/ima-load.cc rename to milena/doc/examples/ima-load.cc diff --git a/milena/doc/tutorial/samples/ima-save.cc b/milena/doc/examples/ima-save.cc similarity index 100% rename from milena/doc/tutorial/samples/ima-save.cc rename to milena/doc/examples/ima-save.cc diff --git a/milena/doc/tutorial/samples/ima-size.cc b/milena/doc/examples/ima-size.cc similarity index 100% rename from milena/doc/tutorial/samples/ima-size.cc rename to milena/doc/examples/ima-size.cc diff --git a/milena/doc/tutorial/samples/ima2d-1.cc b/milena/doc/examples/ima2d-1.cc similarity index 100% rename from milena/doc/tutorial/samples/ima2d-1.cc rename to milena/doc/examples/ima2d-1.cc diff --git a/milena/doc/tutorial/samples/ima2d-2.cc b/milena/doc/examples/ima2d-2.cc similarity index 100% rename from milena/doc/tutorial/samples/ima2d-2.cc rename to milena/doc/examples/ima2d-2.cc diff --git a/milena/doc/tutorial/samples/ima2d-3.cc b/milena/doc/examples/ima2d-3.cc similarity index 100% rename from milena/doc/tutorial/samples/ima2d-3.cc rename to milena/doc/examples/ima2d-3.cc diff --git a/milena/doc/tutorial/samples/ima2d-4.cc b/milena/doc/examples/ima2d-4.cc similarity index 100% rename from milena/doc/tutorial/samples/ima2d-4.cc rename to milena/doc/examples/ima2d-4.cc diff --git a/milena/doc/tutorial/samples/ima2d-5.cc b/milena/doc/examples/ima2d-5.cc similarity index 100% rename from milena/doc/tutorial/samples/ima2d-5.cc rename to milena/doc/examples/ima2d-5.cc diff --git a/milena/doc/tutorial/samples/ima2d-6-clone.cc b/milena/doc/examples/ima2d-6-clone.cc similarity index 100% rename from milena/doc/tutorial/samples/ima2d-6-clone.cc rename to milena/doc/examples/ima2d-6-clone.cc diff --git a/milena/doc/tutorial/samples/ima2d-7.cc b/milena/doc/examples/ima2d-7.cc similarity index 100% rename from milena/doc/tutorial/samples/ima2d-7.cc rename to milena/doc/examples/ima2d-7.cc diff --git a/milena/doc/tutorial/samples/ima2d-restricted-1.cc.raw b/milena/doc/examples/ima2d-restricted-1.cc.raw similarity index 100% rename from milena/doc/tutorial/samples/ima2d-restricted-1.cc.raw rename to milena/doc/examples/ima2d-restricted-1.cc.raw diff --git a/milena/doc/tutorial/samples/ima2d-restricted-2.cc.raw b/milena/doc/examples/ima2d-restricted-2.cc.raw similarity index 100% rename from milena/doc/tutorial/samples/ima2d-restricted-2.cc.raw rename to milena/doc/examples/ima2d-restricted-2.cc.raw diff --git a/milena/doc/tutorial/samples/ima2d-restricted-3.cc.raw b/milena/doc/examples/ima2d-restricted-3.cc.raw similarity index 100% rename from milena/doc/tutorial/samples/ima2d-restricted-3.cc.raw rename to milena/doc/examples/ima2d-restricted-3.cc.raw diff --git a/milena/doc/tutorial/samples/ima2d-rot.cc b/milena/doc/examples/ima2d-rot.cc similarity index 96% rename from milena/doc/tutorial/samples/ima2d-rot.cc rename to milena/doc/examples/ima2d-rot.cc index 05e12ad..515f325 100644 --- a/milena/doc/tutorial/samples/ima2d-rot.cc +++ b/milena/doc/examples/ima2d-rot.cc @@ -1,5 +1,5 @@ #include <mln/essential/2d.hh> -#include <doc/tutorial/tools/sample_utils.hh> +#include <doc/tools/sample_utils.hh> int main() { using namespace mln; diff --git a/milena/doc/tutorial/samples/labeling-compute.cc b/milena/doc/examples/labeling-compute.cc similarity index 94% rename from milena/doc/tutorial/samples/labeling-compute.cc rename to milena/doc/examples/labeling-compute.cc index c91fc05..a22b471 100644 --- a/milena/doc/tutorial/samples/labeling-compute.cc +++ b/milena/doc/examples/labeling-compute.cc @@ -1,5 +1,5 @@ #include <mln/essential/2d.hh> -#include <doc/tutorial/tools/sample_utils.hh> +#include <doc/tools/sample_utils.hh> int main() { using namespace mln; diff --git a/milena/doc/tutorial/samples/logical-not.cc b/milena/doc/examples/logical-not.cc similarity index 91% rename from milena/doc/tutorial/samples/logical-not.cc rename to milena/doc/examples/logical-not.cc index 18651b0..ac718b8 100644 --- a/milena/doc/tutorial/samples/logical-not.cc +++ b/milena/doc/examples/logical-not.cc @@ -1,5 +1,5 @@ #include <mln/essential/2d.hh> -#include <doc/tutorial/tools/sample_utils.hh> +#include <doc/tools/sample_utils.hh> int main() { using namespace mln; diff --git a/milena/doc/tutorial/samples/mln_var.cc b/milena/doc/examples/mln_var.cc similarity index 100% rename from milena/doc/tutorial/samples/mln_var.cc rename to milena/doc/examples/mln_var.cc diff --git a/milena/doc/tutorial/samples/parray-append.cc b/milena/doc/examples/parray-append.cc similarity index 100% rename from milena/doc/tutorial/samples/parray-append.cc rename to milena/doc/examples/parray-append.cc diff --git a/milena/doc/tutorial/samples/parray-bbox.cc b/milena/doc/examples/parray-bbox.cc similarity index 100% rename from milena/doc/tutorial/samples/parray-bbox.cc rename to milena/doc/examples/parray-bbox.cc diff --git a/milena/doc/tutorial/samples/paste-call-1.cc b/milena/doc/examples/paste-call-1.cc similarity index 100% rename from milena/doc/tutorial/samples/paste-call-1.cc rename to milena/doc/examples/paste-call-1.cc diff --git a/milena/doc/tutorial/samples/paste.cc b/milena/doc/examples/paste.cc similarity index 100% rename from milena/doc/tutorial/samples/paste.cc rename to milena/doc/examples/paste.cc diff --git a/milena/doc/tutorial/samples/point-1.cc b/milena/doc/examples/point-1.cc similarity index 100% rename from milena/doc/tutorial/samples/point-1.cc rename to milena/doc/examples/point-1.cc diff --git a/milena/doc/tutorial/samples/predicate-1.cc b/milena/doc/examples/predicate-1.cc similarity index 100% rename from milena/doc/tutorial/samples/predicate-1.cc rename to milena/doc/examples/predicate-1.cc diff --git a/milena/doc/tutorial/samples/samples.mk b/milena/doc/examples/samples.mk similarity index 100% rename from milena/doc/tutorial/samples/samples.mk rename to milena/doc/examples/samples.mk diff --git a/milena/doc/tutorial/examples/accu.cc b/milena/doc/examples/trash/accu.cc similarity index 100% rename from milena/doc/tutorial/examples/accu.cc rename to milena/doc/examples/trash/accu.cc diff --git a/milena/doc/tutorial/examples/box.cc b/milena/doc/examples/trash/box.cc similarity index 100% rename from milena/doc/tutorial/examples/box.cc rename to milena/doc/examples/trash/box.cc diff --git a/milena/doc/tutorial/examples/cpp_issue.cc b/milena/doc/examples/trash/cpp_issue.cc similarity index 100% rename from milena/doc/tutorial/examples/cpp_issue.cc rename to milena/doc/examples/trash/cpp_issue.cc diff --git a/milena/doc/examples/erosion.cc b/milena/doc/examples/trash/erosion.cc similarity index 100% rename from milena/doc/examples/erosion.cc rename to milena/doc/examples/trash/erosion.cc diff --git a/milena/doc/tutorial/examples/for_Z.cc b/milena/doc/examples/trash/for_Z.cc similarity index 100% rename from milena/doc/tutorial/examples/for_Z.cc rename to milena/doc/examples/trash/for_Z.cc diff --git a/milena/doc/examples/graph.cc b/milena/doc/examples/trash/graph.cc similarity index 100% rename from milena/doc/examples/graph.cc rename to milena/doc/examples/trash/graph.cc diff --git a/milena/doc/tutorial/examples/image2d.cc b/milena/doc/examples/trash/image2d.cc similarity index 100% rename from milena/doc/tutorial/examples/image2d.cc rename to milena/doc/examples/trash/image2d.cc diff --git a/milena/doc/tutorial/examples/image_flat.cc b/milena/doc/examples/trash/image_flat.cc similarity index 100% rename from milena/doc/tutorial/examples/image_flat.cc rename to milena/doc/examples/trash/image_flat.cc diff --git a/milena/doc/tutorial/examples/image_if.cc b/milena/doc/examples/trash/image_if.cc similarity index 100% rename from milena/doc/tutorial/examples/image_if.cc rename to milena/doc/examples/trash/image_if.cc diff --git a/milena/doc/tutorial/examples/image_plain.cc b/milena/doc/examples/trash/image_plain.cc similarity index 100% rename from milena/doc/tutorial/examples/image_plain.cc rename to milena/doc/examples/trash/image_plain.cc diff --git a/milena/doc/tutorial/examples/image_safe.cc b/milena/doc/examples/trash/image_safe.cc similarity index 100% rename from milena/doc/tutorial/examples/image_safe.cc rename to milena/doc/examples/trash/image_safe.cc diff --git a/milena/doc/examples/labeling_algo.cc b/milena/doc/examples/trash/labeling_algo.cc similarity index 100% rename from milena/doc/examples/labeling_algo.cc rename to milena/doc/examples/trash/labeling_algo.cc diff --git a/milena/doc/examples/mk_graph.cc b/milena/doc/examples/trash/mk_graph.cc similarity index 100% rename from milena/doc/examples/mk_graph.cc rename to milena/doc/examples/trash/mk_graph.cc diff --git a/milena/doc/tutorial/examples/p_array.2.cc b/milena/doc/examples/trash/p_array.2.cc similarity index 100% rename from milena/doc/tutorial/examples/p_array.2.cc rename to milena/doc/examples/trash/p_array.2.cc diff --git a/milena/doc/tutorial/examples/p_array.cc b/milena/doc/examples/trash/p_array.cc similarity index 100% rename from milena/doc/tutorial/examples/p_array.cc rename to milena/doc/examples/trash/p_array.cc diff --git a/milena/doc/tutorial/examples/p_image.cc b/milena/doc/examples/trash/p_image.cc similarity index 100% rename from milena/doc/tutorial/examples/p_image.cc rename to milena/doc/examples/trash/p_image.cc diff --git a/milena/doc/tutorial/examples/p_key.2.cc b/milena/doc/examples/trash/p_key.2.cc similarity index 100% rename from milena/doc/tutorial/examples/p_key.2.cc rename to milena/doc/examples/trash/p_key.2.cc diff --git a/milena/doc/tutorial/examples/p_key.cc b/milena/doc/examples/trash/p_key.cc similarity index 100% rename from milena/doc/tutorial/examples/p_key.cc rename to milena/doc/examples/trash/p_key.cc diff --git a/milena/doc/tutorial/examples/p_line2d.cc b/milena/doc/examples/trash/p_line2d.cc similarity index 100% rename from milena/doc/tutorial/examples/p_line2d.cc rename to milena/doc/examples/trash/p_line2d.cc diff --git a/milena/doc/tutorial/examples/p_mutable_array_of.cc b/milena/doc/examples/trash/p_mutable_array_of.cc similarity index 100% rename from milena/doc/tutorial/examples/p_mutable_array_of.cc rename to milena/doc/examples/trash/p_mutable_array_of.cc diff --git a/milena/doc/tutorial/examples/p_queue.cc b/milena/doc/examples/trash/p_queue.cc similarity index 100% rename from milena/doc/tutorial/examples/p_queue.cc rename to milena/doc/examples/trash/p_queue.cc diff --git a/milena/doc/tutorial/examples/p_run.cc b/milena/doc/examples/trash/p_run.cc similarity index 100% rename from milena/doc/tutorial/examples/p_run.cc rename to milena/doc/examples/trash/p_run.cc diff --git a/milena/doc/tutorial/examples/p_vaccess.cc b/milena/doc/examples/trash/p_vaccess.cc similarity index 100% rename from milena/doc/tutorial/examples/p_vaccess.cc rename to milena/doc/examples/trash/p_vaccess.cc diff --git a/milena/doc/tutorial/examples/proxy.cc b/milena/doc/examples/trash/proxy.cc similarity index 100% rename from milena/doc/tutorial/examples/proxy.cc rename to milena/doc/examples/trash/proxy.cc diff --git a/milena/doc/tutorial/examples/sub_image.cc b/milena/doc/examples/trash/sub_image.cc similarity index 100% rename from milena/doc/tutorial/examples/sub_image.cc rename to milena/doc/examples/trash/sub_image.cc diff --git a/milena/doc/tutorial/examples/sub_image_if.cc b/milena/doc/examples/trash/sub_image_if.cc similarity index 100% rename from milena/doc/tutorial/examples/sub_image_if.cc rename to milena/doc/examples/trash/sub_image_if.cc diff --git a/milena/doc/examples/tuto_bis.cc b/milena/doc/examples/trash/tuto_bis.cc similarity index 100% rename from milena/doc/examples/tuto_bis.cc rename to milena/doc/examples/trash/tuto_bis.cc diff --git a/milena/doc/examples/tuto_one.cc b/milena/doc/examples/trash/tuto_one.cc similarity index 100% rename from milena/doc/examples/tuto_one.cc rename to milena/doc/examples/trash/tuto_one.cc diff --git a/milena/doc/tutorial/examples/vec.cc b/milena/doc/examples/trash/vec.cc similarity index 100% rename from milena/doc/tutorial/examples/vec.cc rename to milena/doc/examples/trash/vec.cc diff --git a/milena/doc/tutorial/examples/win_multiple.cc b/milena/doc/examples/trash/win_multiple.cc similarity index 100% rename from milena/doc/tutorial/examples/win_multiple.cc rename to milena/doc/examples/trash/win_multiple.cc diff --git a/milena/doc/tutorial/examples/window.cc b/milena/doc/examples/trash/window.cc similarity index 100% rename from milena/doc/tutorial/examples/window.cc rename to milena/doc/examples/trash/window.cc diff --git a/milena/doc/tutorial/samples/tuto2_first_image.cc b/milena/doc/examples/tuto2_first_image.cc similarity index 96% rename from milena/doc/tutorial/samples/tuto2_first_image.cc rename to milena/doc/examples/tuto2_first_image.cc index c9ef0fd..0e3a6a6 100644 --- a/milena/doc/tutorial/samples/tuto2_first_image.cc +++ b/milena/doc/examples/tuto2_first_image.cc @@ -1,5 +1,5 @@ #include <mln/essential/2d.hh> -#include <doc/tutorial/tools/sample_utils.hh> +#include <doc/tools/sample_utils.hh> int main() { using namespace mln; diff --git a/milena/doc/tutorial/samples/tuto3_rw_image.cc b/milena/doc/examples/tuto3_rw_image.cc similarity index 94% rename from milena/doc/tutorial/samples/tuto3_rw_image.cc rename to milena/doc/examples/tuto3_rw_image.cc index aedbefd..a130da8 100644 --- a/milena/doc/tutorial/samples/tuto3_rw_image.cc +++ b/milena/doc/examples/tuto3_rw_image.cc @@ -1,6 +1,6 @@ #include <mln/essential/2d.hh> #include <tests/data.hh> -#include <doc/tutorial/tools/sample_utils.hh> +#include <doc/tools/sample_utils.hh> int main() { using namespace mln; diff --git a/milena/doc/tutorial/samples/tuto4_genericity_and_algorithms.cc b/milena/doc/examples/tuto4_genericity_and_algorithms.cc similarity index 98% rename from milena/doc/tutorial/samples/tuto4_genericity_and_algorithms.cc rename to milena/doc/examples/tuto4_genericity_and_algorithms.cc index 1dac310..296638e 100644 --- a/milena/doc/tutorial/samples/tuto4_genericity_and_algorithms.cc +++ b/milena/doc/examples/tuto4_genericity_and_algorithms.cc @@ -2,7 +2,7 @@ #include <mln/binarization/threshold.hh> #include <mln/debug/colorize.hh> #include <tests/data.hh> -#include <doc/tutorial/tools/sample_utils.hh> +#include <doc/tools/sample_utils.hh> struct keep_specific_colors : public mln::Function_v2b<keep_specific_colors> { diff --git a/milena/doc/tutorial/samples/win-create-1.cc b/milena/doc/examples/win-create-1.cc similarity index 100% rename from milena/doc/tutorial/samples/win-create-1.cc rename to milena/doc/examples/win-create-1.cc diff --git a/milena/doc/tutorial/samples/win-create-2.cc b/milena/doc/examples/win-create-2.cc similarity index 100% rename from milena/doc/tutorial/samples/win-create-2.cc rename to milena/doc/examples/win-create-2.cc diff --git a/milena/doc/tutorial/figures/extend-1.ppm b/milena/doc/figures/extend-1.ppm similarity index 100% rename from milena/doc/tutorial/figures/extend-1.ppm rename to milena/doc/figures/extend-1.ppm diff --git a/milena/doc/tutorial/figures/extend-2.ppm b/milena/doc/figures/extend-2.ppm similarity index 100% rename from milena/doc/tutorial/figures/extend-2.ppm rename to milena/doc/figures/extend-2.ppm diff --git a/milena/doc/tutorial/figures/extend-3.ppm b/milena/doc/figures/extend-3.ppm similarity index 100% rename from milena/doc/tutorial/figures/extend-3.ppm rename to milena/doc/figures/extend-3.ppm diff --git a/milena/doc/tutorial/figures/extend-4.ppm b/milena/doc/figures/extend-4.ppm similarity index 100% rename from milena/doc/tutorial/figures/extend-4.ppm rename to milena/doc/figures/extend-4.ppm diff --git a/milena/doc/tutorial/figures/extend-5.ppm b/milena/doc/figures/extend-5.ppm similarity index 100% rename from milena/doc/tutorial/figures/extend-5.ppm rename to milena/doc/figures/extend-5.ppm diff --git a/milena/doc/tutorial/figures/figures.mk b/milena/doc/figures/figures.mk similarity index 100% rename from milena/doc/tutorial/figures/figures.mk rename to milena/doc/figures/figures.mk diff --git a/milena/doc/tutorial/figures/fill-subdomain-1.pbm b/milena/doc/figures/fill-subdomain-1.pbm similarity index 100% rename from milena/doc/tutorial/figures/fill-subdomain-1.pbm rename to milena/doc/figures/fill-subdomain-1.pbm diff --git a/milena/doc/tutorial/figures/fill-subdomain-2.ppm b/milena/doc/figures/fill-subdomain-2.ppm similarity index 100% rename from milena/doc/tutorial/figures/fill-subdomain-2.ppm rename to milena/doc/figures/fill-subdomain-2.ppm diff --git a/milena/doc/tutorial/figures/fill-subdomain-3.ppm b/milena/doc/figures/fill-subdomain-3.ppm similarity index 100% rename from milena/doc/tutorial/figures/fill-subdomain-3.ppm rename to milena/doc/figures/fill-subdomain-3.ppm diff --git a/milena/doc/tutorial/figures/fill-subdomain-4.ppm b/milena/doc/figures/fill-subdomain-4.ppm similarity index 100% rename from milena/doc/tutorial/figures/fill-subdomain-4.ppm rename to milena/doc/figures/fill-subdomain-4.ppm diff --git a/milena/doc/tutorial/figures/fill-subimage-cfun-1.ppm b/milena/doc/figures/fill-subimage-cfun-1.ppm similarity index 100% rename from milena/doc/tutorial/figures/fill-subimage-cfun-1.ppm rename to milena/doc/figures/fill-subimage-cfun-1.ppm diff --git a/milena/doc/tutorial/figures/ima2d-rot-1.ppm b/milena/doc/figures/ima2d-rot-1.ppm similarity index 100% rename from milena/doc/tutorial/figures/ima2d-rot-1.ppm rename to milena/doc/figures/ima2d-rot-1.ppm diff --git a/milena/doc/tutorial/figures/ima2d-rot-2.ppm b/milena/doc/figures/ima2d-rot-2.ppm similarity index 100% rename from milena/doc/tutorial/figures/ima2d-rot-2.ppm rename to milena/doc/figures/ima2d-rot-2.ppm diff --git a/milena/doc/tutorial/figures/ima_save.pbm b/milena/doc/figures/ima_save.pbm similarity index 100% rename from milena/doc/tutorial/figures/ima_save.pbm rename to milena/doc/figures/ima_save.pbm diff --git a/milena/doc/tutorial/figures/labeling-compute-1.pbm b/milena/doc/figures/labeling-compute-1.pbm similarity index 100% rename from milena/doc/tutorial/figures/labeling-compute-1.pbm rename to milena/doc/figures/labeling-compute-1.pbm diff --git a/milena/doc/tutorial/figures/labeling-compute-2.ppm b/milena/doc/figures/labeling-compute-2.ppm similarity index 100% rename from milena/doc/tutorial/figures/labeling-compute-2.ppm rename to milena/doc/figures/labeling-compute-2.ppm diff --git a/milena/doc/tutorial/figures/logical-not-1.pbm b/milena/doc/figures/logical-not-1.pbm similarity index 100% rename from milena/doc/tutorial/figures/logical-not-1.pbm rename to milena/doc/figures/logical-not-1.pbm diff --git a/milena/doc/tutorial/figures/logical-not-2.pbm b/milena/doc/figures/logical-not-2.pbm similarity index 100% rename from milena/doc/tutorial/figures/logical-not-2.pbm rename to milena/doc/figures/logical-not-2.pbm diff --git a/milena/doc/tutorial/figures/logical-not-3.pbm b/milena/doc/figures/logical-not-3.pbm similarity index 100% rename from milena/doc/tutorial/figures/logical-not-3.pbm rename to milena/doc/figures/logical-not-3.pbm diff --git a/milena/doc/tutorial/figures/tuto2_first_image-1.pbm b/milena/doc/figures/tuto2_first_image-1.pbm similarity index 100% rename from milena/doc/tutorial/figures/tuto2_first_image-1.pbm rename to milena/doc/figures/tuto2_first_image-1.pbm diff --git a/milena/doc/tutorial/figures/tuto3_rw_image-1.ppm b/milena/doc/figures/tuto3_rw_image-1.ppm similarity index 100% rename from milena/doc/tutorial/figures/tuto3_rw_image-1.ppm rename to milena/doc/figures/tuto3_rw_image-1.ppm diff --git a/milena/doc/tutorial/figures/tuto3_rw_image-2.ppm b/milena/doc/figures/tuto3_rw_image-2.ppm similarity index 100% rename from milena/doc/tutorial/figures/tuto3_rw_image-2.ppm rename to milena/doc/figures/tuto3_rw_image-2.ppm diff --git a/milena/doc/tutorial/figures/tuto3_rw_image-3.ppm b/milena/doc/figures/tuto3_rw_image-3.ppm similarity index 100% rename from milena/doc/tutorial/figures/tuto3_rw_image-3.ppm rename to milena/doc/figures/tuto3_rw_image-3.ppm diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-1.ppm b/milena/doc/figures/tuto4_genericity_and_algorithms-1.ppm similarity index 100% rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-1.ppm rename to milena/doc/figures/tuto4_genericity_and_algorithms-1.ppm diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-2.ppm b/milena/doc/figures/tuto4_genericity_and_algorithms-2.ppm similarity index 100% rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-2.ppm rename to milena/doc/figures/tuto4_genericity_and_algorithms-2.ppm diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-3.pbm b/milena/doc/figures/tuto4_genericity_and_algorithms-3.pbm similarity index 100% rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-3.pbm rename to milena/doc/figures/tuto4_genericity_and_algorithms-3.pbm diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-4.ppm b/milena/doc/figures/tuto4_genericity_and_algorithms-4.ppm similarity index 100% rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-4.ppm rename to milena/doc/figures/tuto4_genericity_and_algorithms-4.ppm diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-5.ppm b/milena/doc/figures/tuto4_genericity_and_algorithms-5.ppm similarity index 100% rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-5.ppm rename to milena/doc/figures/tuto4_genericity_and_algorithms-5.ppm diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-6.ppm b/milena/doc/figures/tuto4_genericity_and_algorithms-6.ppm similarity index 100% rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-6.ppm rename to milena/doc/figures/tuto4_genericity_and_algorithms-6.ppm diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-7.pgm b/milena/doc/figures/tuto4_genericity_and_algorithms-7.pgm similarity index 100% rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-7.pgm rename to milena/doc/figures/tuto4_genericity_and_algorithms-7.pgm diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-7.ppm b/milena/doc/figures/tuto4_genericity_and_algorithms-7.ppm similarity index 100% rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-7.ppm rename to milena/doc/figures/tuto4_genericity_and_algorithms-7.ppm diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-8.pgm b/milena/doc/figures/tuto4_genericity_and_algorithms-8.pgm similarity index 100% rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-8.pgm rename to milena/doc/figures/tuto4_genericity_and_algorithms-8.pgm diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-8.ppm b/milena/doc/figures/tuto4_genericity_and_algorithms-8.ppm similarity index 100% rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-8.ppm rename to milena/doc/figures/tuto4_genericity_and_algorithms-8.ppm diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-9.pgm b/milena/doc/figures/tuto4_genericity_and_algorithms-9.pgm similarity index 100% rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-9.pgm rename to milena/doc/figures/tuto4_genericity_and_algorithms-9.pgm diff --git a/milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-9.ppm b/milena/doc/figures/tuto4_genericity_and_algorithms-9.ppm similarity index 100% rename from milena/doc/tutorial/figures/tuto4_genericity_and_algorithms-9.ppm rename to milena/doc/figures/tuto4_genericity_and_algorithms-9.ppm diff --git a/milena/doc/tutorial/generate_dist_files.sh b/milena/doc/generate_dist_files.sh similarity index 92% rename from milena/doc/tutorial/generate_dist_files.sh rename to milena/doc/generate_dist_files.sh index 2df4c22..df2daad 100755 --- a/milena/doc/tutorial/generate_dist_files.sh +++ b/milena/doc/generate_dist_files.sh @@ -8,7 +8,7 @@ ## would be to only emit lines ended with newlines. ECHO_N=printf -for dir in samples figures outputs examples; do +for dir in figures outputs examples; do OUT="$dir/$dir.mk" echo "## Generated by ../generate_dist_files, do not modify." > $OUT echo >>$OUT diff --git a/milena/doc/groups.hh b/milena/doc/groups.hh new file mode 100644 index 0000000..30d9b6f --- /dev/null +++ b/milena/doc/groups.hh @@ -0,0 +1,28 @@ +/*! \defgroup modimage Image types. + * + * All the generic image types provided in Olena. + * + */ + +/*! \defgroup modimageconcrete Basic types. + * + * Concrete images. + * + * \ingroup modimage + */ + +/*! \defgroup modimagevaluemorpher Morpher on values. + * + * Morpher on image values. + * + * \ingroup modimage + */ + +/*! \defgroup modimagedomainmorpher Morpher on domain. + * + * Morpher on image domain. + * + * \ingroup modimage + */ + + diff --git a/milena/doc/tutorial/img/small-enlarged.png b/milena/doc/img/small-enlarged.png similarity index 100% rename from milena/doc/tutorial/img/small-enlarged.png rename to milena/doc/img/small-enlarged.png diff --git a/milena/doc/tutorial/img/small.png b/milena/doc/img/small.png similarity index 100% rename from milena/doc/tutorial/img/small.png rename to milena/doc/img/small.png diff --git a/milena/doc/tutorial/outputs/accu-right-instanciation.txt b/milena/doc/outputs/accu-right-instanciation.txt similarity index 100% rename from milena/doc/tutorial/outputs/accu-right-instanciation.txt rename to milena/doc/outputs/accu-right-instanciation.txt diff --git a/milena/doc/tutorial/outputs/borderthickness.txt b/milena/doc/outputs/borderthickness.txt similarity index 100% rename from milena/doc/tutorial/outputs/borderthickness.txt rename to milena/doc/outputs/borderthickness.txt diff --git a/milena/doc/tutorial/outputs/box2d-bbox.txt b/milena/doc/outputs/box2d-bbox.txt similarity index 100% rename from milena/doc/tutorial/outputs/box2d-bbox.txt rename to milena/doc/outputs/box2d-bbox.txt diff --git a/milena/doc/tutorial/outputs/domain-display.txt b/milena/doc/outputs/domain-display.txt similarity index 100% rename from milena/doc/tutorial/outputs/domain-display.txt rename to milena/doc/outputs/domain-display.txt diff --git a/milena/doc/tutorial/outputs/dpoint-1.txt b/milena/doc/outputs/dpoint-1.txt similarity index 100% rename from milena/doc/tutorial/outputs/dpoint-1.txt rename to milena/doc/outputs/dpoint-1.txt diff --git a/milena/doc/tutorial/outputs/estim-sites.txt b/milena/doc/outputs/estim-sites.txt similarity index 100% rename from milena/doc/tutorial/outputs/estim-sites.txt rename to milena/doc/outputs/estim-sites.txt diff --git a/milena/doc/tutorial/outputs/extend.txt b/milena/doc/outputs/extend.txt similarity index 100% rename from milena/doc/tutorial/outputs/extend.txt rename to milena/doc/outputs/extend.txt diff --git a/milena/doc/tutorial/outputs/extension-ignore.txt b/milena/doc/outputs/extension-ignore.txt similarity index 100% rename from milena/doc/tutorial/outputs/extension-ignore.txt rename to milena/doc/outputs/extension-ignore.txt diff --git a/milena/doc/tutorial/outputs/fill-call-1.txt b/milena/doc/outputs/fill-call-1.txt similarity index 100% rename from milena/doc/tutorial/outputs/fill-call-1.txt rename to milena/doc/outputs/fill-call-1.txt diff --git a/milena/doc/tutorial/outputs/fill-part-image.txt b/milena/doc/outputs/fill-part-image.txt similarity index 100% rename from milena/doc/tutorial/outputs/fill-part-image.txt rename to milena/doc/outputs/fill-part-image.txt diff --git a/milena/doc/tutorial/outputs/fill-subdomain-shorter.txt b/milena/doc/outputs/fill-subdomain-shorter.txt similarity index 100% rename from milena/doc/tutorial/outputs/fill-subdomain-shorter.txt rename to milena/doc/outputs/fill-subdomain-shorter.txt diff --git a/milena/doc/tutorial/outputs/fill-subdomain.txt b/milena/doc/outputs/fill-subdomain.txt similarity index 100% rename from milena/doc/tutorial/outputs/fill-subdomain.txt rename to milena/doc/outputs/fill-subdomain.txt diff --git a/milena/doc/tutorial/outputs/fill-subimage-cfun.txt b/milena/doc/outputs/fill-subimage-cfun.txt similarity index 100% rename from milena/doc/tutorial/outputs/fill-subimage-cfun.txt rename to milena/doc/outputs/fill-subimage-cfun.txt diff --git a/milena/doc/tutorial/outputs/fill.txt b/milena/doc/outputs/fill.txt similarity index 100% rename from milena/doc/tutorial/outputs/fill.txt rename to milena/doc/outputs/fill.txt diff --git a/milena/doc/tutorial/outputs/forall-piter.txt b/milena/doc/outputs/forall-piter.txt similarity index 100% rename from milena/doc/tutorial/outputs/forall-piter.txt rename to milena/doc/outputs/forall-piter.txt diff --git a/milena/doc/tutorial/outputs/fun-p2v-1.txt b/milena/doc/outputs/fun-p2v-1.txt similarity index 100% rename from milena/doc/tutorial/outputs/fun-p2v-1.txt rename to milena/doc/outputs/fun-p2v-1.txt diff --git a/milena/doc/tutorial/outputs/graph-data.txt b/milena/doc/outputs/graph-data.txt similarity index 100% rename from milena/doc/tutorial/outputs/graph-data.txt rename to milena/doc/outputs/graph-data.txt diff --git a/milena/doc/tutorial/outputs/graph-iter.txt b/milena/doc/outputs/graph-iter.txt similarity index 100% rename from milena/doc/tutorial/outputs/graph-iter.txt rename to milena/doc/outputs/graph-iter.txt diff --git a/milena/doc/tutorial/outputs/graph-output-1.txt b/milena/doc/outputs/graph-output-1.txt similarity index 100% rename from milena/doc/tutorial/outputs/graph-output-1.txt rename to milena/doc/outputs/graph-output-1.txt diff --git a/milena/doc/tutorial/outputs/ima-has.txt b/milena/doc/outputs/ima-has.txt similarity index 100% rename from milena/doc/tutorial/outputs/ima-has.txt rename to milena/doc/outputs/ima-has.txt diff --git a/milena/doc/tutorial/outputs/ima-save.txt b/milena/doc/outputs/ima-save.txt similarity index 100% rename from milena/doc/tutorial/outputs/ima-save.txt rename to milena/doc/outputs/ima-save.txt diff --git a/milena/doc/tutorial/outputs/ima-size.txt b/milena/doc/outputs/ima-size.txt similarity index 100% rename from milena/doc/tutorial/outputs/ima-size.txt rename to milena/doc/outputs/ima-size.txt diff --git a/milena/doc/tutorial/outputs/ima2d-1.txt b/milena/doc/outputs/ima2d-1.txt similarity index 100% rename from milena/doc/tutorial/outputs/ima2d-1.txt rename to milena/doc/outputs/ima2d-1.txt diff --git a/milena/doc/tutorial/outputs/ima2d-2.txt b/milena/doc/outputs/ima2d-2.txt similarity index 100% rename from milena/doc/tutorial/outputs/ima2d-2.txt rename to milena/doc/outputs/ima2d-2.txt diff --git a/milena/doc/tutorial/outputs/ima2d-3.txt b/milena/doc/outputs/ima2d-3.txt similarity index 100% rename from milena/doc/tutorial/outputs/ima2d-3.txt rename to milena/doc/outputs/ima2d-3.txt diff --git a/milena/doc/tutorial/outputs/ima2d-4.txt b/milena/doc/outputs/ima2d-4.txt similarity index 100% rename from milena/doc/tutorial/outputs/ima2d-4.txt rename to milena/doc/outputs/ima2d-4.txt diff --git a/milena/doc/tutorial/outputs/ima2d-5.txt b/milena/doc/outputs/ima2d-5.txt similarity index 100% rename from milena/doc/tutorial/outputs/ima2d-5.txt rename to milena/doc/outputs/ima2d-5.txt diff --git a/milena/doc/tutorial/outputs/ima2d-6-clone.txt b/milena/doc/outputs/ima2d-6-clone.txt similarity index 100% rename from milena/doc/tutorial/outputs/ima2d-6-clone.txt rename to milena/doc/outputs/ima2d-6-clone.txt diff --git a/milena/doc/tutorial/outputs/ima2d-7.txt b/milena/doc/outputs/ima2d-7.txt similarity index 100% rename from milena/doc/tutorial/outputs/ima2d-7.txt rename to milena/doc/outputs/ima2d-7.txt diff --git a/milena/doc/tutorial/outputs/ima2d-decl-2.txt b/milena/doc/outputs/ima2d-decl-2.txt similarity index 100% rename from milena/doc/tutorial/outputs/ima2d-decl-2.txt rename to milena/doc/outputs/ima2d-decl-2.txt diff --git a/milena/doc/tutorial/outputs/ima2d-display-1.txt b/milena/doc/outputs/ima2d-display-1.txt similarity index 100% rename from milena/doc/tutorial/outputs/ima2d-display-1.txt rename to milena/doc/outputs/ima2d-display-1.txt diff --git a/milena/doc/tutorial/outputs/ima2d-display-2.txt b/milena/doc/outputs/ima2d-display-2.txt similarity index 100% rename from milena/doc/tutorial/outputs/ima2d-display-2.txt rename to milena/doc/outputs/ima2d-display-2.txt diff --git a/milena/doc/tutorial/outputs/ima2d-display-output-1.txt b/milena/doc/outputs/ima2d-display-output-1.txt similarity index 100% rename from milena/doc/tutorial/outputs/ima2d-display-output-1.txt rename to milena/doc/outputs/ima2d-display-output-1.txt diff --git a/milena/doc/tutorial/outputs/ima2d-display-output-2.txt b/milena/doc/outputs/ima2d-display-output-2.txt similarity index 100% rename from milena/doc/tutorial/outputs/ima2d-display-output-2.txt rename to milena/doc/outputs/ima2d-display-output-2.txt diff --git a/milena/doc/tutorial/outputs/ima2d-rot.txt b/milena/doc/outputs/ima2d-rot.txt similarity index 100% rename from milena/doc/tutorial/outputs/ima2d-rot.txt rename to milena/doc/outputs/ima2d-rot.txt diff --git a/milena/doc/tutorial/outputs/labeling-compute.txt b/milena/doc/outputs/labeling-compute.txt similarity index 100% rename from milena/doc/tutorial/outputs/labeling-compute.txt rename to milena/doc/outputs/labeling-compute.txt diff --git a/milena/doc/tutorial/outputs/logical-not.txt b/milena/doc/outputs/logical-not.txt similarity index 100% rename from milena/doc/tutorial/outputs/logical-not.txt rename to milena/doc/outputs/logical-not.txt diff --git a/milena/doc/tutorial/outputs/mln_var.txt b/milena/doc/outputs/mln_var.txt similarity index 100% rename from milena/doc/tutorial/outputs/mln_var.txt rename to milena/doc/outputs/mln_var.txt diff --git a/milena/doc/tutorial/outputs/outputs.mk b/milena/doc/outputs/outputs.mk similarity index 100% rename from milena/doc/tutorial/outputs/outputs.mk rename to milena/doc/outputs/outputs.mk diff --git a/milena/doc/tutorial/outputs/parray-append.txt b/milena/doc/outputs/parray-append.txt similarity index 100% rename from milena/doc/tutorial/outputs/parray-append.txt rename to milena/doc/outputs/parray-append.txt diff --git a/milena/doc/tutorial/outputs/parray-bbox.txt b/milena/doc/outputs/parray-bbox.txt similarity index 100% rename from milena/doc/tutorial/outputs/parray-bbox.txt rename to milena/doc/outputs/parray-bbox.txt diff --git a/milena/doc/tutorial/outputs/parray-display-1.txt b/milena/doc/outputs/parray-display-1.txt similarity index 100% rename from milena/doc/tutorial/outputs/parray-display-1.txt rename to milena/doc/outputs/parray-display-1.txt diff --git a/milena/doc/tutorial/outputs/paste-call-1.txt b/milena/doc/outputs/paste-call-1.txt similarity index 100% rename from milena/doc/tutorial/outputs/paste-call-1.txt rename to milena/doc/outputs/paste-call-1.txt diff --git a/milena/doc/tutorial/outputs/paste.txt b/milena/doc/outputs/paste.txt similarity index 100% rename from milena/doc/tutorial/outputs/paste.txt rename to milena/doc/outputs/paste.txt diff --git a/milena/doc/tutorial/outputs/point-1.txt b/milena/doc/outputs/point-1.txt similarity index 100% rename from milena/doc/tutorial/outputs/point-1.txt rename to milena/doc/outputs/point-1.txt diff --git a/milena/doc/tutorial/outputs/predicate-1.txt b/milena/doc/outputs/predicate-1.txt similarity index 100% rename from milena/doc/tutorial/outputs/predicate-1.txt rename to milena/doc/outputs/predicate-1.txt diff --git a/milena/doc/tutorial/outputs/tuto2_first_image.txt b/milena/doc/outputs/tuto2_first_image.txt similarity index 100% rename from milena/doc/tutorial/outputs/tuto2_first_image.txt rename to milena/doc/outputs/tuto2_first_image.txt diff --git a/milena/doc/tutorial/outputs/tuto3_rw_image.txt b/milena/doc/outputs/tuto3_rw_image.txt similarity index 100% rename from milena/doc/tutorial/outputs/tuto3_rw_image.txt rename to milena/doc/outputs/tuto3_rw_image.txt diff --git a/milena/doc/tutorial/outputs/tuto4_genericity_and_algorithms.txt b/milena/doc/outputs/tuto4_genericity_and_algorithms.txt similarity index 100% rename from milena/doc/tutorial/outputs/tuto4_genericity_and_algorithms.txt rename to milena/doc/outputs/tuto4_genericity_and_algorithms.txt diff --git a/milena/doc/tutorial/outputs/win-create-1-display.txt b/milena/doc/outputs/win-create-1-display.txt similarity index 100% rename from milena/doc/tutorial/outputs/win-create-1-display.txt rename to milena/doc/outputs/win-create-1-display.txt diff --git a/milena/doc/tutorial/outputs/win-create-1.txt b/milena/doc/outputs/win-create-1.txt similarity index 100% rename from milena/doc/tutorial/outputs/win-create-1.txt rename to milena/doc/outputs/win-create-1.txt diff --git a/milena/doc/tutorial/outputs/win-create-2.txt b/milena/doc/outputs/win-create-2.txt similarity index 100% rename from milena/doc/tutorial/outputs/win-create-2.txt rename to milena/doc/outputs/win-create-2.txt diff --git a/milena/doc/ref_guide/Makefile.am b/milena/doc/ref_guide/Makefile.am new file mode 100644 index 0000000..40cab40 --- /dev/null +++ b/milena/doc/ref_guide/Makefile.am @@ -0,0 +1,24 @@ +.PHONY: ref-guide ref-guide-html + +include $(top_srcdir)/milena/doc/doc.mk +TEXINPUTS = $(DOC_SRCDIR):$(DOC_BUILDDIR):$(OUTPUTS_SRCDIR):$(IMG_SRCDIR): + +ref-guide: + TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/ref_guide.tex + TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/ref_guide.tex + TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/ref_guide.tex + +ref-guide-html: + chmod u+x $(DOC_SRCDIR)/tools/todoxygen.sh + $(DOC_SRCDIR)/tools/todoxygen.sh $(srcdir)/ref_guide.tex $(DOC_BUILDDIR)/ref_guide + +clean-local: + rm -f ref_guide.aux ref_guide.toc ref_guide.log ref_guide.bbl ref_guide.out + rm -f *~ *blg *.lot + rm -f ref_guide.pdf + rm -f *.haux *.hh *.html *.htoc + +EXTRA_DIST = \ +ref_guide.tex \ +ref_guide.pdf + diff --git a/milena/doc/tutorial/tutorial.tex b/milena/doc/ref_guide/ref_guide.tex similarity index 81% copy from milena/doc/tutorial/tutorial.tex copy to milena/doc/ref_guide/ref_guide.tex index c4ccd5d..4df8efa 100644 --- a/milena/doc/tutorial/tutorial.tex +++ b/milena/doc/ref_guide/ref_guide.tex @@ -115,7 +115,7 @@ \backslash htmlonly % } -\newcommand{\doxyimg}[1]{ +\newcommand{\doxyimg}[2]{ \backslash endhtmlonly% \backslash image html #1.png% \backslash htmlonly % @@ -158,8 +158,8 @@ $$ \renewcommand{\doxysection}[2]{\section{#2}\label{#1}} \renewcommand{\doxysubsection}[2]{\subsection{#2}\label{#1}} \renewcommand{\doxysubsubsection}[2]{\subsubsection{#2}\label{#1}} -\renewcommand{\doxycode}[2][1]{\lstinputlisting[frame=single]{samples/#2-#1.cc}} -\renewcommand{\doxyrawcode}[1]{\lstinputlisting[frame=single]{samples/#1.cc.raw}} +\renewcommand{\doxycode}[2][1]{\lstinputlisting[frame=single]{examples/#2-#1.cc}} +\renewcommand{\doxyrawcode}[1]{\lstinputlisting[frame=single]{examples/#1.cc.raw}} \renewcommand{\doxyoutput}[1]{\lstinputlisting[frame=single]{outputs/#1.txt}} \renewcommand{\doxymoutput}[2][1]{\lstinputlisting[frame=single]{outputs/splitted/#2-#1.txt}} \renewcommand{\doxyfigure}[3][1]{% @@ -167,7 +167,7 @@ $$ \label{#1}% } \renewcommand{\doxyimg}[2]{% -\pgfimage[width=#2]{../../img/#1.png}% +\pgfimage[width=#2]{#1.png}% \label{#1}% } \renewcommand{\doxyref}[1]{\ref{#1}} @@ -312,16 +312,6 @@ $$ \begin{htmlonly} \backslash endhtmlonly -\backslash page tutorial Tutorial -- \backslash subpage tuto0 -- \backslash subpage tuto1 -- \backslash subpage tuto2 -- \backslash subpage tuto3 -- \backslash subpage tuto4 -- \backslash subpage tuto5 -- \backslash subpage tuto6 -- \backslash subpage tuto7 - \backslash page quickref Quick Reference Guide - \backslash subpage installation - \backslash subpage foreword @@ -347,7 +337,7 @@ $$ \maketitle \section*{Copying this document} -Copyright \copyright{} 2006 LRDE. +Copyright \copyright{} 2008, 2009 LRDE. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later @@ -360,391 +350,6 @@ A copy of the license is provided in the file COPYING.DOC. \tableofcontents \end{latexonly} -\begin{htmlonly} -%==================================== -\doxychapter{tuto0}{Step 0: Foreword} - -- image2d -- typical use case - -\begin{center}% - \hspace{1cm} Go to \doxyref{tuto1}~ \longrightarrow% -\end{center}% - - - -%==================================== -\doxychapter{tuto1}{Step 1: Load and save images} - -After this step you shoud know how to: -\begin{itemize} -\item load an image, -\item save an image. -\end{itemize} - -\vspace{2cm} -Currently, Olena supports the following input image formats: -\begin{itemize} - \item PBM - \item PFM - \item PGM - \item PNM - \item PPM -\end{itemize} - -This support is provided through two headers for each type, \header{save.hh} and -\header{load.hh}. -They are located in \hpath{mln/io/$<$image-format$>$/}. - -Once the right header is included, the image can be loaded: - -\doxycode{ima-load} - -If you wan to save an image, simply call the save routine in the proper namespace: -\doxycode{ima-save} - -According to the image value type, the proper file format must be chosen. -The supported file formats and their associated image value types are listed -in section \doxyref{imaio}. - -\vspace{2cm} -\tutotoc{tuto0}{tuto2} - - - -%==================================== -\doxychapter{tuto2}{Step 2: Create your first image} - -After this step you should know how to: - \begin{itemize} - \item create an image, - \item display an image in console mode. - \end{itemize} - -\doxysee{tuto2_first_image.cc} - - -\vspace{2cm} -First, declare an array of bool which will represent the image grid. Each each -cell in this grid is a site and each cell contains a value, \val{true} or -\val{false}. -\doxycode[1]{tuto2_first_image} - -From that grid, simply call make::image to get an image initialized with that -data. -\doxycode[2]{tuto2_first_image} -This way of initializing an image is the most common one. However, there are -several other ways described in section \doxyref{imacreate}. - - -To be sure that the data is correctly initialized, it is possible to display the -image in the standard output using debug::println. -\doxycode[3]{tuto2_first_image} -Output: -\doxyoutput{tuto2_first_image} - -Finally, you may want to save the image. Since we use bool as image value, the -PBM format is the best choice. Therefore, we use io::pbm::save. -\doxycode[4]{tuto2_first_image} - -The output image looks like the following: -\doxyfigure{tuto2_first_image}{3cm} - -In this first step we used a boolean image. Many other value types are available -though. A more detailed description can be found in section -\doxyref{imapossvalues}. - -\vspace{2cm} -\begin{center} - \tutotoc{tuto1}{tuto3} -\end{center} - - -%==================================== -\doxychapter{tuto3}{Step 3: Read and write images} - -After this step you should know how to: - \begin{itemize} - \item modify/initialize image values, - \item copy and paste data to an image. - \end{itemize} - - -\doxysee{tuto3_rw_image.cc} - -\vspace{2cm} -First create an empty color image with a \var{box2d} of 40x40 as domain. -\doxycode[1]{tuto3_rw_image} - -If you want to initialize the image with the color red, simply call data::fill as follows: -\doxycode[2]{tuto3_rw_image} - -Updating a site value is also possible using \code{operator()} or the -\code{opt::at()} routine. Here we create a blue square of 10x10 pixels from site -(20, 20) to (30, 30). -\doxycode[3]{tuto3_rw_image} -\doxycode[4]{tuto3_rw_image} - -The corresponding image: -\doxyfigure[1]{tuto3_rw_image} - -An image can also be initialized/modified thanks to another image. -Let's load a new image. -\doxycode[5]{tuto3_rw_image} -\var{lena} looks like: -\doxyimg{small-enlarged} - -If we want to initialize \var{ima} with \var{lena}, we can use \code{data::fill}: -\doxycode[6]{tuto3_rw_image} -Output: -\doxyfigure[2]{tuto3_rw_image} -Note that to fill an image with some data, the image domain \must be smaller -or equal to the data. - -Likewise, it is possible to paste data from an image to another: -\doxycode[7]{tuto3_rw_image} -Output: -\doxyfigure[3]{tuto3_rw_image} - -More details can be found in sections \doxyref{imaaccessmodval}, \doxyref{fillop} and \doxyref{pasteop} in -the reference guide. - -\vspace{2cm} -\begin{center} - \tutotoc{tuto2}{tuto4} -\end{center} - - -%==================================== -\doxychapter{tuto4}{Step 4: Regions of interest} - -After this step you should know how to: - \begin{itemize} - \item take benefit of Olena's genericity, - \item work only on a region of interest in an image. - \end{itemize} - -\doxysee{tuto4_genericity_and_algorithms.cc} -\vspace{2cm} - -In the previous step, we used the routine \code{data::fill} in order to change -the values of an image. It was convenient since we did not need to write any -loop by hand. The problem was that we could not specificy which region to fill -with data. This point leads us to talk about the genericity in Olena. -All along this example we will use the routine \code{data::fill} to illustrate -the possibilities in Olena but note that every image types passed to the -routine in this example could be passed to any algorithm in the library -expecting an image. - -One main feature of Olena is to be able to easily work on regions of interest in -images. According to the way a region of interest is defined, a specific image -type is associated. Therefore, each algorithm knows exactly what it is working -on and can behave differently in order to be the most efficient as possible. - - -All along this step, we will use the following image \var{lena} declared as -follow: - -\doxycode[1]{tuto4_genericity_and_algorithms} -\doxyimg{small-enlarged} - -\code{data::fill} has the following prototype: -\doxyrawcode{fill-proto} -So keep in mind that the first argument we will try to construct in each -example is an image. Note that this image \must be writable, e.g. non-const. - - -%************************** -\doxysection{tuto4imadomainsiteset}{Image domain restricted by a site set} - -Here, we would like to fill a small square with green in \var{lena}. We want -this square to be of size 20x20 and to be located at (20,20). -First, we just need to declare this square which is actually a site set, a -\type{box2d}. -\doxycode[2]{tuto4_genericity_and_algorithms} - -Then, we just need to tell \code{data::fill} that we would like to fill the -image \var{lena} but only in this restricted part of the image domain. -\doxycode[3]{tuto4_genericity_and_algorithms} -Operator '|' can be read 'restricted to'. So below, we wrote 'image \var{lena} -restricted to the region of interest \var{roi}'. Actually this is not directly -\var{lena} which is restricted but its domain. - -Note the use of \code{rw()} which is mandatory due to C++ limitations. In C++, -the image created by \code{lena | roi} is \code{const}, e.g. read-only, though -\code{data::fill} expect a \code{non-const} image, e.g. read-write. \code{rw()} -is a workaround to make it read-write. - -\begin{center} - \begin{tabular}{c c c} - \doxyimg{small-enlarged} & ~\huge{\rightarrow}~ & \doxyfigure[1]{tuto4_genericity_and_algorithms}{3cm} \\ - \multicolumn{3}{c}{Fill with green a region of interest defined by a - \type{box2d}.} \\ - \end{tabular} -\end{center} - - -%************************** -\doxysection{tuto4imadomainfun}{Image domain restricted by a function} - -Sometimes it may not be easy to construct a site set to restrict an image. For -instance, if we would like to fill with green one point out of two in the whole -image, we \textbf{do not want} to write anyloop or construct any site set by hand: -\doxycode[4]{tuto4_genericity_and_algorithms} -\doxycode[5]{tuto4_genericity_and_algorithms} - -A shorter way to get exactly the same result, is to define that behavior by a -function. In Milena, a function \code{fun::p2v::chess} is available and does -exactly what we want. Like if it was a site set, simply restrict the image with -the function. - -\doxycode[6]{tuto4_genericity_and_algorithms} -\begin{center} - \begin{tabular}{c c c} - \doxyimg{small-enlarged} & ~\huge{\rightarrow}~ & \doxyfigure[2]{tuto4_genericity_and_algorithms}{3cm} \\ - \multicolumn{3}{c}{Fill with green a region of interest defined by a - \type{Function}.} \\ - \end{tabular} -\end{center} - -Note that the functions provided by default in Olena are actually functors. -Thus, they must be constructed like any object which why it is written -\code{lena | fun::p2v::chess()} and not \code{lena | fun::p2v::chess}. - - -FIXME: Talk about C functions once it is possible in Milena. - - -%************************** -\doxysection{tuto4imadomainmask}{Image domain restricted by a mask} - -Sometimes instead of having a site site or a function defining the regions of -interest we want to work on, we may have a binary image, e.g. a mask. When a -site has its value set to true, it means it will be considered as part of the -masked image domain. Otherwise, it will not. - -We construct a mask, \var{mask}. It is initialized with the same geometry properties as -\var{lena} -(domain, extension...). -\doxycode[7]{tuto4_genericity_and_algorithms} - -Then, we cannot restrict directly \var{lena} with \var{mask}. These two images -have the same domain, so \code{lena | mask.domain()} would not do anything. -\var{mask} is a classical image, there is not specific type for mask images. -Therefore, we need to express that we want that binary image to be considered as -a mask. -\doxycode[8]{tuto4_genericity_and_algorithms} -\code{pw::value(mask)} makes explicit the fact that \var{mask} is actually a -mask. It means, that for each site of \var{mask}, if its value is set to -\val{true}, then the value associated to this site in \var{lena} must be set -to green. -In this example, we use two images for two different use case: \var{lena} store -the result and the modifications make by the algorithm and \var{mask} allows the -algorithm to know whether it must treat a site or not. - -\begin{center} - \begin{tabular}{c c c c} - \doxyimg{small-enlarged} & - \doxyfigure[3]{tuto4_genericity_and_algorithms}{3cm} & - ~\huge{\rightarrow}~ & - \doxyfigure[4]{tuto4_genericity_and_algorithms}{3cm} \\ - \multicolumn{4}{c}{Fill with green a region of interest defined by a mask - image.} \\ - \end{tabular} -\end{center} - - -%************************** -\doxysection{tuto4imadomainpredicate}{Image domain restricted by a predicate} - -Restricting by a predicate is exactly like restricting with a function. We want -to talk about that separately in order to present the small routines available. -They enable the user to write quick and efficient predicate/function. - -The two routines are : -\begin{itemize} - \item pw::value(Image), as seen in a previous section, it is a way to express - 'for each site value in Image'. - \item pw::cst(Value), it is a way to specify a value to which a site value can - be compared. -\end{itemize} - -Let's see a common use case. -First, we binarize lena according to specific criterions, only site values with -specific colors are set to true in \var{lena_bw}. Others are set to false. This -image will be used in order to label the components. -Let's consider a labeled image \var{label}. Each component of \var{lena} is labeled with a unique index. -Now, we consider that that our region of interest is a component with id 16. -Then we want to express 'for each site \var{fill} its value in \var{lena} if its -value in \var{label} is equal to 16'. -\doxycode[9]{tuto4_genericity_and_algorithms} - - -\doxycode[10]{tuto4_genericity_and_algorithms} - -\begin{center} - \begin{tabular}{c c c c} - \doxyimg{small-enlarged} & - \doxyfigure[5]{tuto4_genericity_and_algorithms}{3cm} & - ~\huge{\rightarrow}~ & - \doxyfigure[6]{tuto4_genericity_and_algorithms}{3cm} \\ - \multicolumn{4}{c}{Fill with green a region of interest defined by its - label.} \\ - \end{tabular} -\end{center} - - -%************************** -\doxysection{tuto4component}{Image component restricted to a domain} - -\doxycode[11]{tuto4_genericity_and_algorithms} - -\begin{center} - \begin{tabular}{c c c c} - \doxyimg{small-enlarged} & -% \doxyfigure[7]{tuto4_genericity_and_algorithms}{3cm} & - ~\huge{\rightarrow}~ & - \doxyfigure[8]{tuto4_genericity_and_algorithms}{3cm} \\ - \multicolumn{4}{c}{Fill with green a region of interest defined by its - label.} \\ - \end{tabular} -\end{center} - - - -\doxycode[12]{tuto4_genericity_and_algorithms} - -\begin{center} - \begin{tabular}{c c c c} - \doxyimg{small-enlarged} & - ~\huge{\rightarrow}~ & - \doxyfigure[9]{tuto4_genericity_and_algorithms}{3cm} \\ - \multicolumn{4}{c}{Fill with green a region of interest defined by its - label.} \\ - \end{tabular} -\end{center} - - -\vspace{2cm} -\begin{center} - \tutotoc{tuto3}{tuto5} -\end{center} - -%====================================% -%Ugly workaround to avoid missing chapter references in doxygen. -\doxychapter{1}{} -\doxychapter{tuto5}{Step 5: Conversion between image values} - - -%==================================== -\doxychapter{tuto6}{Step 6: Using structural elements with algorithms} - - -%==================================== -\doxychapter{tuto7}{Step 7: Handle graphes with an image} - -\end{htmlonly} - %==================================== \doxychapter{installation}{Installation} @@ -1147,42 +752,6 @@ types is actually ``type\_name.hh". For instance, for \type{rgb8} the header wil -%---------------- -\doxysubsection{imavalues}{About value, rvalue and lvalue} - -//FIXME: to be rewritten or removed. - -Since the values are of a specific type, it exists a set of all the possible -site values. This set is called "destination" set. It may be iterable and -printable if it is finite and not too huge. - -Image types provide a method to access values, namely "\code{operator() const}". -Yet, its signature is NOT "\code{value operator()(const site\& p) const}" -but "\code{rvalue operator()(const psite\& p) const}". - -For instance, with \type{I} being \type{image2d$<$int\_u8$>$}, we have : - -\begin{center} - \type{I::value} == i\type{nt\_u8} but \type{I::rvalue} ==\type{const - int\_u8\&} -\end{center} - -So copying the value when the call "\code{f(p)}" returns is avoided. -In that case, it is a low-level implementation issue that makes rvalue -be different from value. In some other cases, the difference can be -more fundamental. For instance, a proxy is returned so that some extra -code is performed if this value is eventually read. - -Likewise, lvalue is also used as return type for methods such as -"\code{operator()}". -The difference is that lvalue allows the data to be modified. - -With \type{I} being \type{image2d$<$int\_u8$>$}, we have : - -\begin{center} - \type{I::value} == \type{int\_u8} but \type{I::lvalue} == \type{int\_u8\&} -\end{center} - %************************** \doxysection{imadomain}{Domain} The site set contains the sites which compose the image. Sites are based on a @@ -1304,7 +873,7 @@ example, \var{ima\_roi} holds several small rectangles from the original image. \begin{center} \begin{tabular}{c c c} - \doxyimg{small-enlarged} & ~\huge{\rightarrow}~ & \doxyfigure[1]{extend}{3cm} \\ + \doxyimg{small-enlarged}{3cm} & ~\huge{$\rightarrow$}~ & \doxyfigure[1]{extend}{3cm} \\ \var{lena} & & \var{ima\_roi} (black color means the sites are not included in the domain) \\ \end{tabular} \end{center} diff --git a/milena/doc/tutorial/tools/sample_utils.hh b/milena/doc/tools/sample_utils.hh similarity index 100% rename from milena/doc/tutorial/tools/sample_utils.hh rename to milena/doc/tools/sample_utils.hh diff --git a/milena/doc/tutorial/tools/split_sample.sh b/milena/doc/tools/split_sample.sh similarity index 100% rename from milena/doc/tutorial/tools/split_sample.sh rename to milena/doc/tools/split_sample.sh diff --git a/milena/doc/tutorial/tools/todoxygen.sh b/milena/doc/tools/todoxygen.sh similarity index 100% rename from milena/doc/tutorial/tools/todoxygen.sh rename to milena/doc/tools/todoxygen.sh diff --git a/milena/doc/tutorial/Makefile.am b/milena/doc/tutorial/Makefile.am index 53c9521..885e8ae 100644 --- a/milena/doc/tutorial/Makefile.am +++ b/milena/doc/tutorial/Makefile.am @@ -1,34 +1,16 @@ -SUBDIRS = samples - -.PHONY: tutorial tuto_html +.PHONY: tutorial tuto-html include $(top_srcdir)/milena/doc/doc.mk -TEXINPUTS = $(TUTORIAL_SRCDIR):$(TUTORIAL_BUILDDIR):$(OUTPUTS_SRCDIR):$(IMG_SRCDIR): - -tutorial: data fig-convert - TEXINPUTS=$(TEXINPUTS) pdflatex $(TUTORIAL_SRCDIR)/tutorial.tex - TEXINPUTS=$(TEXINPUTS) pdflatex $(TUTORIAL_SRCDIR)/tutorial.tex - TEXINPUTS=$(TEXINPUTS) pdflatex $(TUTORIAL_SRCDIR)/tutorial.tex - -tuto_html: data fig-convert - chmod u+x $(TUTORIAL_SRCDIR)/tools/todoxygen.sh - $(TUTORIAL_SRCDIR)/tools/todoxygen.sh $(TUTORIAL_SRCDIR)/tutorial.tex $(TUTORIAL_BUILDDIR) +TEXINPUTS = $(DOC_SRCDIR):$(DOC_BUILDDIR):$(OUTPUTS_SRCDIR):$(IMG_SRCDIR): -data: - make -C samples data +tutorial: + TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/tutorial.tex + TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/tutorial.tex + TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/tutorial.tex -fix-refdata: - make -C samples fix-refdata - -fig-convert: - @failcom='exit 1'; \ - list="$(FIGURES_BUILDDIR)/*.p*m"; for img in $$list; do \ - echo "Converting $$img to png"; \ - name=`basename $$img` \ - ext=`echo $$name | cut -d '.' -f 2`; \ - convert -scale 250 $$img $(FIGURES_BUILDDIR)/`basename $$img $$ext`png\ - || eval $$failcom; \ - done; +tuto-html: + chmod u+x $(DOC_SRCDIR)/tools/todoxygen.sh + $(DOC_SRCDIR)/tools/todoxygen.sh $(srcdir)/tutorial.tex $(DOC_BUILDDIR)/tutorial clean-local: rm -f tutorial.aux tutorial.toc tutorial.log tutorial.bbl tutorial.out @@ -40,28 +22,3 @@ EXTRA_DIST = \ tutorial.tex \ tutorial.pdf -.PHONY: regen-dist -regen-dist: $(srcdir)/headers.stamp - -$(srcdir)/examples/examples.mk: $(srcdir)/headers.stamp -$(srcdir)/figures/figures.mk: $(srcdir)/headers.stamp -$(srcdir)/outputs/outputs.mk: $(srcdir)/headers.stamp -$(srcdir)/samples/samples.mk: $(srcdir)/headers.stamp - -EXTRA_DIST += $(srcdir)/headers.stamp -$(srcdir)/headers.stamp: $(srcdir)/generate_dist_files.sh - @rm -f $@.tmp - @touch $@.tmp - cd $(srcdir) && ./generate_dist_files.sh - @mv -f $@.tmp $@ - -include $(srcdir)/examples/examples.mk -include $(srcdir)/figures/figures.mk -include $(srcdir)/outputs/outputs.mk -include $(srcdir)/samples/samples.mk - -EXTRA_DIST += \ -tools/sample_utils.hh \ -tools/split_sample.sh \ -tools/todoxygen.sh - diff --git a/milena/doc/tutorial/examples/examples.mk b/milena/doc/tutorial/examples/examples.mk deleted file mode 100644 index 1ff49cc..0000000 --- a/milena/doc/tutorial/examples/examples.mk +++ /dev/null @@ -1,29 +0,0 @@ -## Generated by ../generate_dist_files, do not modify. - -EXTRA_DIST += \ -examples/cpp_issue.cc \ -examples/sub_image.cc \ -examples/sub_image_if.cc \ -examples/p_vaccess.cc \ -examples/win_multiple.cc \ -examples/image2d.cc \ -examples/image_plain.cc \ -examples/p_run.cc \ -examples/proxy.cc \ -examples/p_array.2.cc \ -examples/examples.mk \ -examples/for_Z.cc \ -examples/image_if.cc \ -examples/p_key.cc \ -examples/p_mutable_array_of.cc \ -examples/p_queue.cc \ -examples/image_flat.cc \ -examples/p_image.cc \ -examples/box.cc \ -examples/p_line2d.cc \ -examples/p_array.cc \ -examples/accu.cc \ -examples/p_key.2.cc \ -examples/window.cc \ -examples/image_safe.cc \ -examples/vec.cc diff --git a/milena/doc/tutorial/tutorial.tex b/milena/doc/tutorial/tutorial.tex index c4ccd5d..87949d9 100644 --- a/milena/doc/tutorial/tutorial.tex +++ b/milena/doc/tutorial/tutorial.tex @@ -20,7 +20,7 @@ \end{figure} } -\title{Olena -- Quick Reference Guide} +\title{Olena -- Tutorial} \author{LRDE} \date{} \makeindex @@ -115,7 +115,7 @@ \backslash htmlonly % } -\newcommand{\doxyimg}[1]{ +\newcommand{\doxyimg}[2]{ \backslash endhtmlonly% \backslash image html #1.png% \backslash htmlonly % @@ -158,8 +158,8 @@ $$ \renewcommand{\doxysection}[2]{\section{#2}\label{#1}} \renewcommand{\doxysubsection}[2]{\subsection{#2}\label{#1}} \renewcommand{\doxysubsubsection}[2]{\subsubsection{#2}\label{#1}} -\renewcommand{\doxycode}[2][1]{\lstinputlisting[frame=single]{samples/#2-#1.cc}} -\renewcommand{\doxyrawcode}[1]{\lstinputlisting[frame=single]{samples/#1.cc.raw}} +\renewcommand{\doxycode}[2][1]{\lstinputlisting[frame=single]{examples/#2-#1.cc}} +\renewcommand{\doxyrawcode}[1]{\lstinputlisting[frame=single]{examples/#1.cc.raw}} \renewcommand{\doxyoutput}[1]{\lstinputlisting[frame=single]{outputs/#1.txt}} \renewcommand{\doxymoutput}[2][1]{\lstinputlisting[frame=single]{outputs/splitted/#2-#1.txt}} \renewcommand{\doxyfigure}[3][1]{% @@ -167,7 +167,7 @@ $$ \label{#1}% } \renewcommand{\doxyimg}[2]{% -\pgfimage[width=#2]{../../img/#1.png}% +\pgfimage[width=#2]{#1.png}% \label{#1}% } \renewcommand{\doxyref}[1]{\ref{#1}} @@ -322,24 +322,6 @@ $$ - \backslash subpage tuto6 - \backslash subpage tuto7 -\backslash page quickref Quick Reference Guide -- \backslash subpage installation -- \backslash subpage foreword -- \backslash subpage site -- \backslash subpage siteset -- \backslash subpage image -- \backslash subpage winneigh -- \backslash subpage sitesandco -- \backslash subpage iterators -- \backslash subpage imamemmgmt -- \backslash subpage basicops -- \backslash subpage graphandima -- \backslash subpage funs -- \backslash subpage arithmops -- \backslash subpage mathtools -- \backslash subpage debugtools -- \backslash subpage globalvars -- \backslash subpage macros \backslash htmlonly \end{htmlonly} @@ -347,7 +329,7 @@ $$ \maketitle \section*{Copying this document} -Copyright \copyright{} 2006 LRDE. +Copyright \copyright{} 2008, 2009 LRDE. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later @@ -360,16 +342,18 @@ A copy of the license is provided in the file COPYING.DOC. \tableofcontents \end{latexonly} -\begin{htmlonly} +%\begin{htmlonly} %==================================== \doxychapter{tuto0}{Step 0: Foreword} - image2d - typical use case -\begin{center}% - \hspace{1cm} Go to \doxyref{tuto1}~ \longrightarrow% -\end{center}% +\begin{htmlonly} + \begin{center}% + \hspace{1cm} Go to \doxyref{tuto1}~ \longrightarrow% + \end{center}% +\end{htmlonly} @@ -486,25 +470,25 @@ Updating a site value is also possible using \code{operator()} or the \doxycode[4]{tuto3_rw_image} The corresponding image: -\doxyfigure[1]{tuto3_rw_image} +\doxyfigure[1]{tuto3_rw_image}{3cm} An image can also be initialized/modified thanks to another image. Let's load a new image. \doxycode[5]{tuto3_rw_image} \var{lena} looks like: -\doxyimg{small-enlarged} +\doxyimg{small-enlarged}{3cm} If we want to initialize \var{ima} with \var{lena}, we can use \code{data::fill}: \doxycode[6]{tuto3_rw_image} Output: -\doxyfigure[2]{tuto3_rw_image} +\doxyfigure[2]{tuto3_rw_image}{3cm} Note that to fill an image with some data, the image domain \must be smaller or equal to the data. Likewise, it is possible to paste data from an image to another: \doxycode[7]{tuto3_rw_image} Output: -\doxyfigure[3]{tuto3_rw_image} +\doxyfigure[3]{tuto3_rw_image}{3cm} More details can be found in sections \doxyref{imaaccessmodval}, \doxyref{fillop} and \doxyref{pasteop} in the reference guide. @@ -546,7 +530,7 @@ All along this step, we will use the following image \var{lena} declared as follow: \doxycode[1]{tuto4_genericity_and_algorithms} -\doxyimg{small-enlarged} +\doxyimg{small-enlarged}{3cm} \code{data::fill} has the following prototype: \doxyrawcode{fill-proto} @@ -577,8 +561,8 @@ is a workaround to make it read-write. \begin{center} \begin{tabular}{c c c} - \doxyimg{small-enlarged} & ~\huge{\rightarrow}~ & \doxyfigure[1]{tuto4_genericity_and_algorithms}{3cm} \\ - \multicolumn{3}{c}{Fill with green a region of interest defined by a + \doxyimg{small-enlarged}{3cm} & ~\huge{$\rightarrow$}~ & \doxyfigure[1]{tuto4_genericity_and_algorithms}{3cm} \\ + \multicolumn{3}{c}{Fill with blue a region of interest defined by a \type{box2d}.} \\ \end{tabular} \end{center} @@ -601,7 +585,7 @@ the function. \doxycode[6]{tuto4_genericity_and_algorithms} \begin{center} \begin{tabular}{c c c} - \doxyimg{small-enlarged} & ~\huge{\rightarrow}~ & \doxyfigure[2]{tuto4_genericity_and_algorithms}{3cm} \\ + \doxyimg{small-enlarged}{3cm} & ~\huge{$\rightarrow$}~ & \doxyfigure[2]{tuto4_genericity_and_algorithms}{3cm} \\ \multicolumn{3}{c}{Fill with green a region of interest defined by a \type{Function}.} \\ \end{tabular} @@ -644,9 +628,9 @@ algorithm to know whether it must treat a site or not. \begin{center} \begin{tabular}{c c c c} - \doxyimg{small-enlarged} & + \doxyimg{small-enlarged}{3cm} & \doxyfigure[3]{tuto4_genericity_and_algorithms}{3cm} & - ~\huge{\rightarrow}~ & + ~\huge{$\rightarrow$}~ & \doxyfigure[4]{tuto4_genericity_and_algorithms}{3cm} \\ \multicolumn{4}{c}{Fill with green a region of interest defined by a mask image.} \\ @@ -684,9 +668,9 @@ value in \var{label} is equal to 16'. \begin{center} \begin{tabular}{c c c c} - \doxyimg{small-enlarged} & + \doxyimg{small-enlarged}{3cm} & \doxyfigure[5]{tuto4_genericity_and_algorithms}{3cm} & - ~\huge{\rightarrow}~ & + ~\huge{$\rightarrow$}~ & \doxyfigure[6]{tuto4_genericity_and_algorithms}{3cm} \\ \multicolumn{4}{c}{Fill with green a region of interest defined by its label.} \\ @@ -701,9 +685,9 @@ value in \var{label} is equal to 16'. \begin{center} \begin{tabular}{c c c c} - \doxyimg{small-enlarged} & + \doxyimg{small-enlarged}{3cm} & % \doxyfigure[7]{tuto4_genericity_and_algorithms}{3cm} & - ~\huge{\rightarrow}~ & + ~\huge{$\rightarrow$}~ & \doxyfigure[8]{tuto4_genericity_and_algorithms}{3cm} \\ \multicolumn{4}{c}{Fill with green a region of interest defined by its label.} \\ @@ -716,8 +700,8 @@ value in \var{label} is equal to 16'. \begin{center} \begin{tabular}{c c c c} - \doxyimg{small-enlarged} & - ~\huge{\rightarrow}~ & + \doxyimg{small-enlarged}{3cm} & + ~\huge{$\rightarrow$}~ & \doxyfigure[9]{tuto4_genericity_and_algorithms}{3cm} \\ \multicolumn{4}{c}{Fill with green a region of interest defined by its label.} \\ @@ -731,9 +715,11 @@ value in \var{label} is equal to 16'. \end{center} %====================================% -%Ugly workaround to avoid missing chapter references in doxygen. -\doxychapter{1}{} -\doxychapter{tuto5}{Step 5: Conversion between image values} +%%Ugly workaround to avoid missing chapter references in doxygen. +%\begin{htmlonly} +% \doxychapter{1}{} +% \doxychapter{tuto5}{Step 5: Conversion between image values} +%\end{htmlonly} %==================================== @@ -743,1885 +729,7 @@ value in \var{label} is equal to 16'. %==================================== \doxychapter{tuto7}{Step 7: Handle graphes with an image} -\end{htmlonly} - - -%==================================== -\doxychapter{installation}{Installation} - -%************************** -\doxysection{requirements}{Requirements} - - -%---------------- -\doxysubsection{compexample}{To compile the user examples} - -\begin{itemize} - \item a POSIX shell, like Bash - \item a decent C++ compiler, like GNU C++ - \item a `make' utility, like GNU or BSD `make' -\end{itemize} - - - -%---------------- -\doxysubsection{compdoc}{To compile the documentation (Optional)} - -\begin{itemize} - \item a LaTeX distribution - \item the `listings' TeX package - \item the utility `convert' from ImageMagick - \item GNU Autogen - \item `hevea', a TeX to HTML conversion tool - \item the `texinfo' utilities from GNU -\end{itemize} - -%---------------- -\doxysubsection{devolena}{To develop in Olena} -\begin{itemize} - \item GNU Autotools (Autoconf 2.54, Automake 1.10) -\end{itemize} - -%************************** -\doxysection{getolena}{Getting Olena} - -The latest version of Olena is available at the following addresses: - -\begin{itemize} - \item http://www.lrde.epita.fr/dload/olena/olena.tar.gz - \item http://www.lrde.epita.fr/dload/olena/olena.tar.bz2 -\end{itemize} - - -%************************** -\doxysection{buildingolena}{Building Olena} - -First uncompress the archive. According to the downloaded archive, the options -are different. -\begin{verbatim} -$tar zxvf olena.tar.gz -\end{verbatim} -Or -\begin{verbatim} -$tar jxvf olena.tar.bz2 -\end{verbatim} - -Then follow these steps: -\begin{verbatim} -$mkdir olena-build -$cd olena-build -$../olena-1.0/configure && make -$sudo make install -\end{verbatim} - - - -%==================================== -\doxychapter{foreword}{Foreword} - -%************************** -\doxysection{generality}{Generality} -The following tutorial explains the basic concepts behind Olena and how to use -the most common objects and routines. -This tutorial includes many code examples and figures. In order to make this -tutorial easier to understand, we will mainly talk about 2D images. This is -not so restrictive since 1D, 3D, $n$D images behave the same way. - - -Since examples are based on 2D images pixels are actually "points" however we -will call them "sites" which is the most generic name.\newline - -Here is also a list of common variable name conventions: -\begin{figure}[ht!] - \begin{tabular}{|l|l|} - \hline - \textbf{Object} & \textbf{Variable name} \\ \hline - Site & p \\ \hline - Value & v \\ \hline - Neighboor & n \\ \hline - A site close to another site p & q \\ \hline - \end{tabular} -\end{figure} - -Olena is organized in a namespace hierarchy. Everything is declared by Olena -within the 'oln::' namespace, and possibly a sub-namespace such as -'\namespace{oln::arith::}' (arithmetic operations on images), '\namespace{oln::morpho::}' (morphological -operations), etc. Usually, the namespace hierarchy is mapped to the mln -directory tree. For the sake of simplicity, we will neglect the '\namespace{oln::}' -prefix in all the code examples. - -Methods provided by objects in the library are in constant time. If you need -a specific method but you cannot find it, you may find an algorithm which can -compute the information you need. - -%************************** -\doxysection{dirtree}{Directory hierarchy} -Olena's tarball is structured as follow: - -\begin{itemize} - \item milena - \begin{itemize} -% \item apps : - \item doc - \begin{itemize} - \item benchmark: set of benchmark. - \item examples: more examples. - \item oldies: partialy not updated documentation. Not recommended for new users. - \item technical: technical doc. - \item tutorial: code sample and tutorial. - \end{itemize} - \item img: a set of sample images. - \item mesh: a full example which uses Olena. - \item mln: the library. Contains only headers. - \item tests: test suite. -% \item tools : - \end{itemize} - \item swilena: Python bindings for Olena. -\end{itemize} - -\doxysection{compilehint}{Writing and compiling a program with Olena} - -Before writing your first program, please be ware of these hints: - -\begin{itemize} - \item By default, Olena enables a lot of internal pre and post conditions. - Usually, this is a useful feature and it \should be enabled. It can heavily - slow down a program though and these tests can be disabled by compiling - using \code{-DNDEBUG}. - \begin{verbatim} -g++ -DNDEBUG -Ipath/to/mln my_program.cc - \end{verbatim} - - \item If you decide to use optimization flags to compile for debugging, - prefer using \code{-O1}. It is much faster to compile and it gives good - performance results. - -\end{itemize} - -%==================================== -\clearpage -\newpage -\doxychapter{site}{Site} - -Usually, when talking about images, we think about common images composed of a -set of pixels. -Since Olena is generic, we want to support many kind of images, even images -which are not composed of a set of pixels, such as images having images as sites. - -In order to express this genericity, we have the ``site'' concept. -This concept allows us to divide a pixel into two information: -\begin{itemize} - \item The pixel location, e.g. its coordinates (the site itself). - \item The value. -\end{itemize} - -Let's say we have a 2D grid like this: - -//FIXME -[dessin de grille 2d, colonnes/lignes numerotees + repere x/y] -Intersection == point 2d == milieu d'un pixel \\ - -%FIXME: Find a way to get that figure in HTML output. -\begin{latexonly} -\begin{tikzpicture}[scale=1] - -\draw[blue!20, thick] (-2, -2) grid [right=0.5cm,above=0.5cm,step=1cm] (3, 3); -\draw[line width=1mm] (-1, -1) grid [step=1cm] (3, 3); -\draw[black,line width=2mm,<-] (0, -2) node {y} -- (0, 4); -\draw[black,line width=2mm,->] (-2, 3) node {x} -- (4, 3); - -\foreach \x in {-0.5, 0.5, 1.5, 2.5} - \foreach \y in {-0.5, 0.5, 1.5, 2.5} - \node at (\x, \y) [fill=blue!30] {}; - -\draw[black] (2.5, 1.5) -- (4, 2) node {Point2d(2, 2)}; -\end{tikzpicture} -\end{latexonly} - -On such a regular grid, in 2D, we usually use a 2D point as a site which -means we have the following equivalence: - -\begin{center} - Intersection $\equiv$ point2d (2D site) $\equiv$ center of a pixel -\end{center} - -The site does not store any value but refer to an area where we will be able -to read its value. - -Sites may have a different types, depending on the image type: - -\begin{tabular}{l|l} -Name & Description \\ -\hline -\type{point2d} & 2D point on a regular grid \\ -\type{point} & Generic point ($n-D$) on a regular grid \\ -\type{util::vec} & Algebraic vector \\ -\type{util::vertex} & Graph vertex \\ -\type{util::edge} & Graph edge \\ -\end{tabular} - -[Illustration : grille + intersection + pmin() + pmax() + distance entre 2 -points en x et en y = 1]\\ - - -%==================================== -\clearpage -\newpage -\doxychapter{siteset}{Site set} - -Site sets are used: -\begin{enumerate} - \item To define an image definition domain. - \item As Site container. -\end{enumerate} - -They do not actually store any image value. They only store site information. - -Here is a list of all the site set concepts which can be found in -core/site\_set: - -\begin{tabular}{|l|p{8cm}|} -\hline -Site set & Description \\ -\hline - -p\_array & site array. \\ -\hline -p\_box & compact domain defined on a regular grid (in 2D, a rectangle). \\ -\hline -p\_if & site set verifying a predicate. \\ -\hline -p\_queue & site queue. \\ -\hline -p\_run & site range. \\ -\hline -p\_runs & site range set. \\ -\hline -p\_set & mathematical site set. \\ -\hline -p\_vaccess & site set ordered by value. \\ -\hline -p\_edges & set of graph edges associated to sites. \\ -\hline -p\_vertices & set of graph vertices associated to sites.\\ -\hline -\end{tabular} - -All site sets are iterable. More detailed explanations are available in section \doxyref{iterators}. - -%************************** -\doxysection{sitesetinterface}{Basic interface} -Common basic interface:\\ - -\begin{tabular}{|l|l|l|l|p{4cm}|} -\hline -Return Type & Name & Arguments & Const & Comments \\ \hline - -bool & is\_valid & - & X & Returns true if it has been initialized. The -default constructor does not initialize it. \\ \hline - -bool & has & const P\& p & X & \\ \hline -\end{tabular} \\ - - -%************************** -\doxysection{sitesetopinterface}{Optional interface} -Site sets may have other methods depending on their type: \\ - -\begin{tabular}{|l|l|l|l|p{4cm}|} -\hline -Return Type & Name & Arguments & Const & Comments \\ \hline - -size\_t & nsites & - & - & Return the number of sites. \\ \hline -const Box\& & bbox & - & X & Bounding box. Available only on grid site sets. -\\ \hline -\end{tabular} \\ - -The previous methods are available depending on the site set. A box -will have the bbox() method since it can be retrived in constant time: a box -is it's own bounding box. - -\doxycode{box2d-bbox} -Output: -\doxyoutput{box2d-bbox} - -A \type{p\_array} does not have the bbox -method since its sites do not have to be adjacent. Maintaining such information, in -order to keep getting the bbox in constant time, would be time and memory -consuming. Instead of providing a method directly in \type{p\_array}, an algorithm is -available if this information is needed. -\type{p\_array} and \type{box} both have a nsites method since the internal structure allows a -constant time retrieval. - -\doxycode{parray-bbox} -Output: -\doxyoutput{parray-bbox} - - - -%==================================== -\clearpage -\newpage -\doxychapter{image}{Image} - - -%************************** -\doxysection{definition}{Definition} -An image is composed both of: -\begin{itemize} -\item A function -\begin{doxymath} -ima : \left\{ - \begin{array}{lll} - Site &\rightarrow & Value \\ - p & \mapsto & ima(p) - \end{array} -\right. -\end{doxymath} -\item A site set, also called the "domain". -\end{itemize} - -%************************** -\doxysection{imatypes}{Possible image types} - -Here is a short list of the main/usual image types you may want to use with -Olena: \\ -\bigskip - -\begin{tabular}{l|l} -Name & Description \\ -\hline -\type{image1d} & 1D image \\ -\type{image2d} & 2D image \\ -\type{image3d} & 3D image \\ -\type{flat\_image} & Constant value image \\ -\type{image\_if} & Image defined by a function \\ -FIXME & FIXME \\ -\end{tabular} - -%************************** -\doxysection{imapossvalues}{Possible value types} - -Every image type \must take its type of value as parameter. -The value type can be one of the builtins one: -\begin{itemize} - \item \type{bool} - \item \type{char} - \item \type{unsigned} - \item \type{int} - \item \type{short} - \item \type{long} - \item \type{float} - \item \type{double} -\end{itemize} - -Other data types are also available: - -\begin{tabular}{l|l} -Value type & underlying data type \\ -\hline -\type{float01\_8} & \type{unsigned long} \\ -\type{float01\_16} & \type{unsigned long} \\ -\type{float01\_f} & \type{float} \\ -\type{gl8} & \type{unsigned char} \\ -\type{gl16} & \type{unsigned short} \\ -\type{glf} & \type{float} \\ -\type{hsi\_d} & \type{double} \\ -\type{hsi\_f} & \type{float} \\ -\type{int\_s8} & \type{char} \\ -\type{int\_s16} & \type{short} \\ -\type{int\_s32} & \type{int} \\ -\type{int\_u8} & \type{unsigned char} \\ -\type{int\_u16} & \type{unsigned short} \\ -\type{int\_u32} & \type{unsigned int} \\ -\type{rgb16} & \type{mln::util::vec$<$unsigned short$>$} \\ -\type{rgb8} & \type{mln::util::vec$<$unsigned char$>$} \\ -\end{tabular} \\ - - -All these types are available in mln/value and accessible in the -\namespace{mln::value} namespace. -Most of the time, the name of the header which \must be included to use one of these data -types is actually ``type\_name.hh". For instance, for \type{rgb8} the header will be -\header{rgb8.hh}. - - - -%---------------- -\doxysubsection{imavalues}{About value, rvalue and lvalue} - -//FIXME: to be rewritten or removed. - -Since the values are of a specific type, it exists a set of all the possible -site values. This set is called "destination" set. It may be iterable and -printable if it is finite and not too huge. - -Image types provide a method to access values, namely "\code{operator() const}". -Yet, its signature is NOT "\code{value operator()(const site\& p) const}" -but "\code{rvalue operator()(const psite\& p) const}". - -For instance, with \type{I} being \type{image2d$<$int\_u8$>$}, we have : - -\begin{center} - \type{I::value} == i\type{nt\_u8} but \type{I::rvalue} ==\type{const - int\_u8\&} -\end{center} - -So copying the value when the call "\code{f(p)}" returns is avoided. -In that case, it is a low-level implementation issue that makes rvalue -be different from value. In some other cases, the difference can be -more fundamental. For instance, a proxy is returned so that some extra -code is performed if this value is eventually read. - -Likewise, lvalue is also used as return type for methods such as -"\code{operator()}". -The difference is that lvalue allows the data to be modified. - -With \type{I} being \type{image2d$<$int\_u8$>$}, we have : - -\begin{center} - \type{I::value} == \type{int\_u8} but \type{I::lvalue} == \type{int\_u8\&} -\end{center} - -%************************** -\doxysection{imadomain}{Domain} -The site set contains the sites which compose the image. Sites are based on a -grid so the image depends on that grid as well. -It means that a 2D images can only be defined by sites based on a 2D grid. -Likewise, an \type{image2d} will always have its bouding box defined by a \type{box2d}. - -Being defined on a grid means that the image can be defined anywhere. -For instance, defining a 2D image with a \type{box2d} starting from point (-20, -20) - to (-3, 5) is completely valid. - -The following example shows that the definition domain and the site set are -exactly equivalent. - -\doxycode{ima2d-1} -Output: -\doxyoutput{ima2d-1} - - -To know if a site belongs to an image domain or not, a method ``\code{has()}'' is -available. -\doxycode{point-1} -Output: -\doxyoutput{point-1} - -Since the notion of site is independent from the image it applies on, we can -form expressions where a site passed to several images: -\doxycode{ima2d-4} -Output: -\doxyoutput{ima2d-4} - - -%================================================ -\doxysection{imaborder}{Border and extension} -Olena provides extension mechanisms for the -image domain. In the library, both the concept of border and of extension can be encountered. -These concepts are useful in many algorithms and can avoid costly tests while -working with sites located on image edges. - -\doxysubsection{imabordersection}{Image border} - -A border is a finite extension provided to a basic image type, such as -\type{image2d}. By default, every image is created with a border. The default width is -defined through the global variable \var{border::thickness} defined in -\header{mln/border/thickness.hh}. Since this is a variable, it can be changed -as shown in the following example. - -\doxycode{borderthickness} - -Output: - -\doxyoutput{borderthickness} - -It is important to note that to display the border in the ouput, we use a -special debug function, \code{debug::println\_with\_border}. Indeed, the border and the -extension are considered as part of an image only in the algorithms. They are -ignored while saving or printing an image. - -Some operations can be performed on the border. The functions are located in -\hpath{mln/border}.\\ - -% -\bigskip -% -\begin{tabular}{l|p{8cm}} -Routine & Description \\ -\hline -adjust & Increase the border thickness if it is inferior to a minimum. \\ -duplicate & Assign the border with the duplicate of the edges of this image.\\ -equalize & Equalize the border of two images so that their size is equal and is -at least a minimum size.\\ -fill & Fill the border with a given value.\\ -find & Find the border thickness of an image.\\ -get & Get the border thickness of an image.\\ -mirror & Fills border using nearer pixels with a mirroring effect.\\ -resize & Set image border to a specific size.\\ -\end{tabular} \\ - - -\doxysubsection{imextgeneral}{Generality on image extension} - -On morphed images, described in section \doxyref{imamorphed}, the border concept -does not exist and is generalized to the extension concept. -A simple example of a morphed image is a sub-image. A sub image does not have -border nor extension by default. -Thanks to \header{mln/core/routine/extend.hh}, an extension can be defined through a -function. This means that the extension can be infinite. -Another point is that an image can be used as extension. For instance, in the -case of a sub-image, you may be interested in extending the sub-image with the -image itself. - -The extension supports the following operations. These functions are located in -\hpath{mln/extension}.\\ - -% -\bigskip -% -\begin{tabular}{l|p{10cm}} -Routine & Description \\ -\hline -adjust & Adjust the extension given a structural element.\\ -adjust\_duplicate & Adjust the size of the extension given a structural element and duplicate the image inner boundary.\\ -adjust\_fill & Adjust the size of the extension given a structural element and fill it with a value.\\ -duplicate & Duplicate the values of the image inner boundary in the extension.\\ -fill & Fill the extension with a given value.\\ -\end{tabular} \\ - - -In order to extend an image, a routine \code{extend} is available in -\hpath{mln/core/routine/extend.hh}. The routine \code{extended\_to} may -also help during debug. It allows to extend the image domain to a larger -one. The values associated to the new sites comes from the extension. - -\doxysubsection{extexample}{Different extensions} - -Let's say we have want to extract a sub domain from an image. In the following -example, \var{ima\_roi} holds several small rectangles from the original image. -\doxycode[2]{extend} - -\begin{center} - \begin{tabular}{c c c} - \doxyimg{small-enlarged} & ~\huge{\rightarrow}~ & \doxyfigure[1]{extend}{3cm} \\ - \var{lena} & & \var{ima\_roi} (black color means the sites are not included in the domain) \\ - \end{tabular} -\end{center} - - -Then, we may extend this sub image with one of the three following extension type. - -\doxysubsubsection{extval}{Extension with a value} - -Let's extend with the value \code{literal::blue}. -\doxycode[3]{extend} -\doxyfigure[2]{extend}{3cm} - -Note the use of the \code{extended\_to()} routine. We used a larger bbox to -extend the image domain. That is the reason why the image is surrounded by the -extension value, blue. - -\doxysubsubsection{extfun}{Extension with a function} - -Let's use the following function: -\doxycode[1]{extend} -\doxycode[4]{extend} -\doxyfigure[3]{extend}{3cm} - -\doxysubsubsection{extima}{Extension with an image} - -Let's extend with the original image, \var{lena}. -\doxycode[5]{extend} - -\begin{center} - \begin{tabular}{c c} - \doxyfigure[4]{extend}{3cm} & \doxyfigure[5]{extend}{3cm} \\ - \var{ext\_with\_ima}, the extended image. & The actual data in the domain (light) with its extension (dark) \\ - \end{tabular} -\end{center} - - -%---------------- -\subsection*{IMPORTANT NOTE} -Many times, you may want to check if a site is part of the image before applying -a treatment. All images provide a method ``\code{has(Site)}'' which can return this -information. -\textbf{Be careful though, calling \code{has()} on the image returns ``true'' if - the given site is part of the domain OR the the extension/border}. All - algorithms in Olena call that method which means that all the algorithms take - in consideration the extension/border if it exists. The default border - thickness is set to 3 as shown by the following example. - -\doxycode{ima-has} - -Output: - -\doxyoutput{ima-has} - -Most of the time, this is the good behavior. For instance, if a rotation -is applied to an image, sites which were not previously in the domain -will be part of it. Thanks to the extension/border, these sites will be -associated to the value of the extension/border. - -In the following example, the extension is set to a constant color \var{yellow}. -It means that whatever the new sites computed through the rotation, it will be -part of the image and a value will be available. Site which were previously in -the extension/border, will be associated to \var{yellow} in the output image. - -\doxycode{ima2d-rot} - -Output: - -\bigskip - -\begin{tabular}{c c} -\doxyfigure[1]{ima2d-rot}{3cm} & \doxyfigure[2]{ima2d-rot}{3cm} \\ -\multicolumn{2}{c}{\var{ima1} and its border before rotation (left) and \var{ima2} - and its border after rotation (right).} \\ -\end{tabular} - -\bigskip - -[Image+bord rotation 20degres, avant, apres] - - -Sometimes taking the domain in consideration may not be the expected behavior. -If you do not want to use the extension/border for a specific routine, simply -restrict the image to its domain. - - -\doxycode{extension-ignore} - -Note that: -\begin{center} -\code{ima.domain().has()} $\equiv$ \code{(ima | ima.domain()).has()} -\end{center} - - -%================================================ -\doxysection{imamorphed}{Morphed images} -//FIXME: Write it! -// Pas concrete, light, how to concrete -% - - -%================================================ -\doxysection{imainterface}{Interface} - -\begin{tabular}{|l|l|l|l|p{4cm}|} -\hline -Return Type & Name & Arguments & Const & Comments \\ \hline - -I::pvset & domain & - & X - & \\ \hline -const Value\& & operator() & const point\& p & X & Used for reading. \\ \hline -Value\& & operator() & const point\& p & - & Used for writing. \\ \hline -bool & has & const Point\& p & X & \\ \hline -bool & has\_data & - & X & Returns true if the domain is defined. \\ \hline -site\_id & id & - & X & Return the Id of the underlying shared data. \\ \hline -I::vset & destination & - & X & Value set of all the possible site values in this -Image. \\ \hline -site\_set & bbox & - & - & Returns the bounding box of the domain. \\ \hline -site\_set & bbox\_large & - & - & Returns the bouding box of the domain and the -extended domain. \\ \hline - -\end{tabular} - - -%================================================ -\doxysection{imaio}{Load and save images} - -Currently, Olena supports the following input image formats: -\begin{itemize} - \item PBM - \item PFM - \item PGM - \item PNM - \item PPM -\end{itemize} - -This support is provided through two headers for each type, \header{save.hh} and -\header{load.hh}. -They are located in \hpath{mln/io/$<$image-format$>$/}. - -Once the right header is included, the image can be loaded: - -\doxycode{ima-load} - -Note that each format is associated to specific image value types: -\begin{tabular}{|l|l|} -\\hline -Format & Value type \\ \hline -PBM & bool \\ -PFM & float, double, float01\_* \\ -PGM & unsigned, long, int, int\_u*, gl* \\ -PNM & See PGM, PBM and PPM \\ -PPM & rgb* \\ -\end{tabular} - -\doxycode{ima-save} -% - -%================================================ -\doxysection{imacreate}{Create an image} - -Loading an image is not mandatory, an image can be created from scratch. There -are two possibilites to do so: - -\doxycode{ima2d-2} - -Img1a has no data and its definition domain is still unset. We do -not know yet the number of sites it contains. However, it is really useful to -have such an "empty image" because it is a placeholder for the result of some -processing, or another image. Trying to access the site value from an empty -image leads to an error at run-time. -Img1b is defined on a domain but does not have data yet.\\ - -An image can also be created and initialized at the same time: -\doxycode[1]{labeling-compute} -It constructs the following image: \\ -\begin{center} -\doxyfigure[1]{labeling-compute}{3cm} -\end{center} - -Sometimes, you may want to initialize an image from another one: -\doxycode{ima2d-7} -\var{img2b} is declared without specifying a domain. Its border size is set to -the default one, e.g 0. By using \code{initialize} \var{img2b} is initialized - with the same domain and border/extension as \var{img2a}. The data is not - copied though. Other routines like \code{data::fill} can be called in order to - do so (See also \doxyref{fillop}). - - -%================================================ -\doxysection{imaaccessmodval}{Access and modify values} - -There are several ways to access/modify an image ``\var{ima}'': -\begin{itemize} -\item \code{opt::at(ima, x, y, \dots)} -\item \code{ima(Site)} -\end{itemize} - -Most of the time, images can be modified and these two methods can be used both -to read a value and modify it. Both methods are equivalent. -\doxycode{ima2d-3} -Output: -\doxyoutput{ima2d-3} - -Usually, you will want to use the functional way, ``\code{ima(Site)}'', more -particularly while iterating over all the sites through an iterator. This use -case will be detailed further in section \doxyref{iterators}. - - - -%================================================ -\doxysection{imasize}{Image size} -Most typical image types owns special methods to retrieve the image size. - -\begin{tabular}{l|l} -Image type & Methods \\ -\hline -image1d & length()\\ -image2d & ncols(), nrows()\\ -image3d & ncols(), nrows(), nslis() \\ -\end{tabular} - -If you need a more generic way to get the size, you can use the routines -provided in \hpath{mln/geom} in the following files: -\begin{itemize} - \item \header{ncols.hh} - \item \header{nrows.hh} - \item \header{nslis.hh} -\end{itemize} - -\doxycode{ima-size} -Output: -\doxyoutput{ima-size} - - -%================================================ -\doxysection{imaconvvals}{Conversion of image values} - -parler de level::compute/level::apply. -parler de i2v et v2v. -Voir les vset => attendre que ca soit ameliore? - -%==================================== -\clearpage -\newpage -%Ugly workaround to avoid missing chapter references in doxygen. -\begin{htmlonly} -\doxychapter{1}{} -\end{htmlonly} -\doxychapter{winneigh}{Structural elements: Window and neighborhood} - -In Olena, there are both the window and neighborhood concept. A window can be -defined on any sites around a central site which may also be included. -A neighborhood is more restrictive and \must not include the central site. -Therefore these two concepts are really similar and are detailed together in -this section. - -By default, structural elements are centered. The central site is located at the -origin of the grid: ``\var{literal::origin}''. With \type{image2d}, the central site is -(0,0). Centered structural elements \must have an odd size. - - - -\doxysection{sedef}{Define an element} - -\doxysubsection{winwin}{Window} - -\subsubsection*{Generic Predefined windows} - -\begin{tabular}{l|l|l} -Name & Description & Representation \\ -\hline -win\_c4p & 4-connectivity & \wincfour \\ -win\_c8p & 8-connectivity & \winceight \\ -\end{tabular} -% -\bigskip -% - -\subsubsection*{1D Predefined windows} - -\begin{tabular}{l|l|l} -Name & Description & Representation \\ -\hline -segment1d & 1D segment & - \\ -\end{tabular} -% -\bigskip -% - -\subsubsection*{2D Predefined windows} - -\begin{tabular}{l|l|l} -Name & Description & Representation \\ -\hline -backdiag2d & Back diagonal & - \\ -diag2d & 2D diagonal & - \\ -disk2d & 2D disk & - \\ -hline2d & 2D horizontal line & - \\ -octagon2d & 2D octogon & - \\ -rectangle2d & 2D rectangle & - \\ -vline2d & 2D vertical line & - \\ -\end{tabular} -% -\bigskip -% - -\subsubsection*{3D Predefined windows} - -\begin{tabular}{l|l|l} -Name & Description & Representation \\ -\hline -cube3d & 3D Cube & - \\ -cuboid3d & Cuboid & - \\ -\end{tabular} - -These predefined windows can be passed directly to a function. The headers are -located in \header{mln/core/alias/window*.hh}. - -\doxysubsection{wwindow}{Weighted window} -FIXME - -\doxysubsection{neighborhood}{Neighborhood} - -Predefined neighborhood:\\ - -\begin{tabular}{l|l|l} -Name & Description & Representation \\ -\hline -c4 & 4-connectivity & \neighcfour \\ -c8 & 8-connectivity & \neighceight \\ -\end{tabular} - -These predefined neighborhood can be passed directly to a function. The headers are -located in \header{mln/core/alias/neigh*.hh}. - -Use case example: -\doxycode[2]{labeling-compute} - -\doxysubsection{customse}{Custom structural elements} - -\subsubsection{Windows} - -There are several ways to define a new window. -The first and the most common way is to declare a window variable and insert -dpoints: -\doxycode{win-create-1} -This code creates the following window where ``X'' is the central point from -which the window is computed: -\doxyoutput{win-create-1-display} - -Another way to define the same window is to provide a bool array: -\doxycode{win-create-2} - -\textbf{Note that despite the different ways of defining these windows, - ``var{win}'' == ``\var{win2}''}. -The boolean array \must always have an odd size. -While creating a windows thanks to a bool array/matrix, the window's center is the -central site of the array/matrix. - -\textbf{This way of defining a window is very powerful since it enables the possibility -of having non-square windows such as:} - - - -\subsubsection{Neighborhood} - - -\doxysubsection{sitedepse}{Site dependent structural elements} - -\doxysubsection{convneighwin}{Conversion between Neighborhoods and Windows} - -Windows are not convertible to a Neighborhood. -Neighborhood are convertible to a window though. - -A neighborhood has a method ``\code{win()}'' which returns the definition window. -Be ware that this window is not centered, thus does not include the central -point. - - - -%==================================== -\clearpage -\newpage -\doxychapter{sitesandco}{Sites, psites and dpoints} - - -%************************** -\doxysection{sitessite}{Need for site} - -As we have seen before, an image is defined on a grid. It has associated -data and a site set which defines the domain of the image on that grid. -Usually, we need to access a value by its coordinates. With default images it -can be done easily, at no cost. - -Example with an \type{image2d}: -\doxyoutput{ima2d-display-1} - -The site \var{x} is the point (0, 1). The image values are stored in a -multi-dimensional array. The point coordinates can be used directly. The site -(0, 1) \textbf{is} the point (0, 1) and the data is stored at row 0 and column -1. - -Here we have: - - \type{I::site} == \type{I::psite} == \type{point2d} - -where, roughly, \type{point2d} = \{ row, column \}. - -%************************** -\doxysection{sitespsite}{Need for psite} - -Sometimes, accessing a value in constant-time complexity, O(1), is not -possible with a site object. - -Let's have a small example. Define a function returning a value for a given -point: -\clearpage -\doxycode{fun-p2v-1} - -So, for each point having (0, x) as coordinate, this function will return 8, -otherwise it will be 9. - -Then, define a \type{p\_array} with few \type{point2d}: -\doxycode{parray-append} - -Now, create a point-wise image from this function and this \type{p\_array}: -\doxycode[1]{mln_var} - -Ima is actually that image: -\doxyoutput{ima2d-display-2} - -However, in memory, since it is based on a \type{p\_array}, sites are stored in a -vector. - -The site x is the point (3, 7) which corresponds to the cell 1 in the -\type{p\_array}. -\doxyoutput{parray-display-1} - -Obviously, we cannot check in constant time whether the site \var{x}, - \type{point2d} here, -is part of that image or not: knowing the point coordinates is not enough. -That's why we need a different mechanism in order to access this information: -the psites. - -Here we have: - - \type{I::site} $==$ \type{point2d} but \type{I::psite} $==$ - \type{pseudo\_site$<$point2d$>$} - -where, roughly, \type{pseudo\_site$<$point2d$>$} $=$ \{ i\_in\_p\_array, p\_array\_ptr -\}. - -Psites contains all the needed information to access the values in -constant-time. - -%************************** -\doxysection{sitespsitensite}{From psite to site} - -In the last example there was an image of type \type{I} such as \type{I::site} -!= \type{I::psite}. -In that case, an object of type \type{I::psite} is actually convertible towards an -object of type \type{I::site}. Furthermore, a \type{psite} shall behave as if it was a -\type{site}. - -Design note: it seems impossible to offer through the interface of -some \type{psite} what is expected from its corresponding \type{site}. For instance, when a -site has a given feature, say a method "\code{m}", then this -method has to appear in the \type{psite} interface. However, thanks to -inheritance, we fetch an interface and an implementation that delegates -to the site. - -For instance, in the last example, \type{I::psite} has a method \code{row(}) because -\type{I::site}, \type{point2d}, provides such a method. - -How it works: a \type{psite} inherits from \type{internal::site\_impl$<$site$>$} which is -specialized for every site type; for instance, - \type{internal::site\_impl$<$point2d$>$} -owns the method ``\code{coord row() const}'' which is defined as -``\code{return exact(this)-$>$to\_site().row()}''. - -%************************** -\doxysection{sitesdpoint}{Dpoint} -Dpoints are relative sites. They are usually used in window and neighborhood -definitions. Since the central site is not constant, windows and neighborhoods -\must be recomputed and dpoints help in doing that. - -\doxycode{dpoint-1} -Output: -\doxyoutput{dpoint-1} - - - -%==================================== -\clearpage -\newpage -\doxychapter{iterators}{Iterators} - -Each container object in Olena like site sets or images have iterators. -The iteration mechanism for images is directly derived from the mechanism -for site sets. - -There are usually three kinds: -\begin{itemize} -\item \textbf{fwd\_iter}, depends on the container, -\item \textbf{bkd\_iter}, iterates like forward but to the opposite way, -\item \textbf{iter}, usually the same as fwd\_iter. It is guaranteed to -iterate all over the elements. -\end{itemize} -Every iterable object have these three kinds of iterator. There are all -bidirectional containers. -Whatever the iterator used, the basic iterator has the only property of -browsing every site once. - -The iterator type name depends on the data pointed by it: \\ - -\begin{tabular}{|l|l|l|l|p{4cm}|} -\hline -Data type & Iterator Names \\ \hline -Site & fwd\_piter, bkd\_piter, piter \\ \hline -Value & fwd\_viter, bkd\_viter, viter \\ \hline -Neighboors & fwd\_niter, bkd\_niter, niter \\ \hline -\end{tabular} \\ - -As you may have noticed, according to the data type, the word ``iter'' is prefixed -by the usual name variable used for that data type. Sites variables are usually -called ``p'' so the proper iterator is ``type{piter}''. (See the foreword)\\ - - -An iterator has the following interface: \\ - -\begin{tabular}{|l|l|l|l|p{4cm}|} -\hline -Return Type & Name & Arguments & Const & Comments \\ \hline - -void & start & - & - & \\ \hline -void & next & - & - & \\ \hline -bool & is\_valid & - & - & Return false if created with the default -constructor and not associated to a proper container.\\ \hline -\end{tabular} \\ - - -Example of different forward iterations: -\begin{itemize} - \item box2d: from top to bottom then from left to right. - \item p\_array$<$point2d$>$: from left to right. -\end{itemize} - -A \code{for\_all()} macro is available to iterate over all the sites: \\ - -\doxycode{forall-piter} -Output: -\doxyoutput{forall-piter} - -Note that when you declare an iterator, prefer using the ``\code{mln\_*iter}'' macros. -They resolve the iterator type automatically from the given container type -passed as parameter. These macros can be used with any container like images or -site sets. - -Here follow an example with the implemantions of the most basic routines which -use the \code{for\_all} loop: \code{data::fill()} and \code{data::paste()}. - -\doxycode{fill} - -\doxycode{paste} - -Important note: macros for iterators exist in two versions: -``\code{mln\_*iter}'' and ``\code{mln\_*iter\_}''. The difference is that the -first version \must be used in templated function whereas the second one \must be -used in non templated functions. - -If you want a list of all the macros available in Olena, please refert to -section \doxyref{macros}. - - -%================================================ -\clearpage -\doxychapter{imamemmgmt}{Memory management} - -In the Olena library, all image types behave like image2d: -\begin{itemize} -\item An "empty" image is actually a mathematical variable. - - $\rightarrow$ just think in a mathemetical way when dealing with images; - -\item No dynamic memory allocation/deallocation is required. - the user never has to use "new / delete" (the C++ equivalent for the C - "malloc / free") so she does not have to manipulate pointers or to directly - access memory. - - $\rightarrow$ Olena prevents the user from making mistakes; - -\item Image data/values can be shared between several variables and the memory - used for image data is handled by the library. - - $\rightarrow$ Memory management is automatic. -\end{itemize} - -%---------------- -\subsection*{Exemple with image2d} - -Images do not actually store the data in the class. Images store a pointer -to an allocated space which can be shared with other objects. Once an image is -assigned to another one, the two images share the same data so they have the -same ID and point to the same memory space. -Therefore, assigning an image to another one is NOT a costly operation. The new -variable behaves like some mathematical variable. Put differently it is just a -name to designate an image: -\doxycode{ima2d-5} - -If a deep copy of the image is needed, a clone() routine is available: -\doxycode{ima2d-6-clone} -Output: -\doxyoutput{ima2d-6-clone} - - - -%==================================== -\clearpage -\newpage -\doxychapter{basicops}{Basic routines} -//FIXME : illustrer - -\begin{tabular}{l|p{8cm}} -\hline -Routine name & Description \\ \hline -level::clone() & creates a deep copy of an object. Any shared data is -duplicated. \\ - -data::fill() & fill an object with a value. \\ - -data::paste() & paste object data to another object. \\ - -labeling::blobs() & find and label the different components of an image. \\ - -logical::not\_() -logical::not\_inplace() & Point-wise "logical not" \\ - -*::compute() & compute an accumulator on specific elements. \\ -\hline -\end{tabular} \\ - -%************************** -\doxysection{fillop}{Fill} -First, create an image: -\doxycode[1]{fill-call-1} - -Memory has been allocated so data can be stored but site values -have not been initialized yet. So we fill \var{imga} with the value 'a': - -\doxycode[2]{fill-call-1} - -The ``\code{fill}'' algorithm is located in the sub-namespace "\namespace{mln::data}" since this -algorithm deals with the site values. - -Note that the term "level" refers to the fact that an image can be considered as -a landscape where the elevation at a particular location/site is given by -the corresponding site value. - -The full name of this routine is ``\namespace{mln::data::fill}''. -To access to a particular algorithm, the proper file shall be included. -The file names of algorithms strictly map their C++ name; so -\namespace{mln::data::fill} is defined in the file \header{mln/data/fill.hh}. - -%---------------- -\subsection*{Note} -Most algorithms in Olena are constructed following the classical scheme: "output -algo(input)", where the input image is only read. However some few algorithms -take an input image in order to modify it. To enforce this particular feature, -the user shall explicitly state that the image is provided so that its data is -modified "read/write". The algorithm call shall be ``\code{data::fill(ima.rw(), -val)}''. When forgetting the ``\code{rw()}'' call it does not compile. - -\doxycode[3]{fill-call-1} - -%************************** -\doxysection{pasteop}{Paste} -We then define below a second image to play with. As you can see this image has -data for the sites (5, 5) to (14, 14) (so it has 100 sites). - -\doxycode{paste-call-1} -Output: -\doxyoutput{paste-call-1} - -Before pasting, the couple of images looked like: - -//FIXME : ajouter des zolies zimages. - -so after pasting we get: - -//FIXME : ajouter des zolies zimages again. - -%---------------- -\subsection*{Note} -With this simple example we can see that images defined on different domains (or -set of sites) can interoperate. The set of sites of an image is defined and -can be accessed and printed. The following code: - -\doxycode{domain-display} - -Gives: -\doxycode{domain-display} - -The notion of site sets plays an important role in Olena. Many tests are -performed at run-time to ensure that the program is correct. - -For instance, the algorithm data::paste tests that the set of sites of imgb -(whose values are to be pasted) is a subset of the destination image. - - - -%==================================== -\doxysection{blobs}{Blobs} - -\code{Labeling::blobs()} is used to label an image. It returns a new image with the -component id as value for each site. The background has 0 as id therefore the -component ids start from 1. - -Consider the following image: -\doxycode[1]{labeling-compute} - -Output: \\ -\begin{center} -\doxyfigure[1]{labeling-compute}{3cm} -\end{center} - -Then label this image thanks to \code{labeling::blobs()}: -\doxycode[2]{labeling-compute} - -Output: \\ - -\begin{center} -\doxyfigure[2]{labeling-compute}{3cm} -\end{center} - -Note that this routine returns the number of components in its third parameter. -This parameter \must be of the same type as the returned image value. - - -%************************** -\doxysection{logicalnot}{Logical not} -\begin{center} - \begin{tabular}{|l|l|} - \hline - \textbf{Header} & mln/logical/not.hh \\ - - \textbf{Full namespace} & mln::logical \\ - - \textbf{Routine(s)} & not\_(), - not\_inplace() \\ - \hline - \end{tabular} -\end{center} - -\bigskip - -This small routine only works on binary images. It performs a point-wise -"logical not" and therefore "negates" the image. There are two versions of that -algorithm a version which returns a new image and another which works in place. -Example: - -Make a binary image: -\doxycode[1]{logical-not} -\begin{center} -\doxyfigure[1]{logical-not}{3cm} -\end{center} - -Return the result in a new image: -\doxycode[2]{logical-not} -\begin{center} -\begin{tabular}{c c} -\doxyfigure[1]{logical-not}{3cm} & \doxyfigure[2]{logical-not}{3cm} \\ -\multicolumn{2}{c}{\var{ima} (left) and \var{ima_neg} (right) after having - called logical::not\_().} \\ -\end{tabular} -\end{center} - -Or, work in place: -\doxycode[3]{logical-not} -Then, \var{ima} looks like: -\begin{center} -\doxyfigure[3]{logical-not}{3cm} -\end{center} - - -%************************** -\doxysection{compute}{Compute} - -There are several flavour of the compute routine, depending on what the kind of -elements it computes. - -\begin{tabular}{l|p{8cm}} -\hline -labeling::compute() & compute an accumulator for each component in a labeled -image. \\ - -level::compute() & compute an accumulator on the values of an image. \\ -\end{tabular} - -\doxysubsection{accu}{Accumulators} -An accumulator is a special object accumulating data while iterating all over -the image values or sites. Hereby follows a list of accumulators available in -Olena. - -%---------------- -\subsubsection*{Accumulators on sites} -\begin{tabular}{l|p{8cm}} -Name & Description \\ -\hline -bbox & Bounding boxes\\ -count\_adjacent\_vertices & Count adjacent vertices\\ -count & Count the number of sites\\ -height & \\ -volume & \\ -\end{tabular} - -%---------------- -\subsubsection*{Accumulators on values} -\begin{tabular}{l|p{8cm}} -Name & Description \\ -\hline -histo & Histogram \\ -max & Max value \\ -max\_h & Max value (Hexa)\\ -mean & Mean value\\ -median\_alt & Median\\ -median\_h & Median (Hexa)\\ -min & Min value\\ -min\_h & Min value (Hexa)\\ -min\_max & Min and Max value\\ -rank\_bool & \\ -rank & \\ -rank\_high\_quant & \\ -sum & Sum the values\\ -\end{tabular} - -%---------------- -\subsubsection*{Special accumulators} -\begin{tabular}{l|p{8cm}} -Name & Description \\ -\hline -pair & Pair of accumulators\\ -tuple & $n$-uplets of accumulators\\ -\end{tabular} - -Each accumulator can be used in \code{*::compute()}. -It exists two versions of each accumulator. -\begin{itemize} - \item \namespace{mln::accu::*}, this version require the site or value type as parameter. - For instance, for the bbox accumulator, the type would be - \type{accu::bbox<mln\_psite(I)>}, where \type{I} is the type of the image on which it will be - computed. - \item \namespace{mln::accu::meta::*}, this is usually the easiest version to use. The type - of site or value do not need to be specified and will be deduced at compile - time. For the bbox accumulator, the accumulator type would be - \type{accu::meta::bbox}. -\end{itemize} - -Note that when an accumulator is passed to \code{*::compute()}, it \must be instanciated.You cannot write: -\doxyrawcode{accu-wrong-instanciation} -Instead, you \must write: -\doxycode{accu-right-instanciation} - -\doxysubsection{exlblcompute}{Example with labeling::compute()} - -In this example we will try to retrieve the bounding box of each component in an -image. - -Consider the following image: -\doxycode[1]{labeling-compute} - -Then label this image thanks to \code{labeling::blobs()}: -\doxycode[2]{labeling-compute} -Output: -\doxyfigure[2]{labeling-compute}{3cm} - -Then, use \code{labeling::compute()} with the bbox accumulator: -\doxycode[3]{labeling-compute} - -\code{Labeling::compute()} hold an accumulator for each component, which means it -returns an array of accumulator results. -In this case, it returns an array of \type{box2d}. - -\textbf{Important note:} since \code{labeling::blobs()} labels the component from 1 and -set the background to 0, we will want to iterate from 1 to nlabels included. -\doxycode[4]{labeling-compute} -Output: -\doxyoutput{labeling-compute} - - -\subsection{Routines based on accumulators and *::compute()} -In order to make the code cleaner, small routines are available for the -most used accumulators. - -Currently there are the following routines:\\ - -\begin{tabular}{l|p{8cm}} -Name & Description \\ -\hline -nsites & Return the number of sites of an image or a site set.\\ -mean & Return the mean of the values of an image.\\ -min\_max & Return the min and max values of the values of an image.\\ -sum & Return the sum of the values of an image. -\end{tabular} - -These routines can be found in \hpath{mln/geom} and in \hpath{mln/estim}. -For example, with \code{geom::nsites()} simply write: -\doxycode{estim-sites} - -%==================================== -\doxysection{partima}{Working with parts of an image} - -Sometime it may be interesting to work only on some parts of the image or to -extract only a sub set of that image. Olena enables that thoughout out the -operator '$|$'. - -Three kinds of that operator exist:\\ - -\begin{tabular}{|l|l|l|l|p{4cm}|} -\hline -Prototype & Comments \\ \hline - -Image $|$ Sub Domain & Create a new image.\\ \hline -Image $|$ Function\_p2b & Do not create a new image but create a morpher.\\ -\hline -Function\_p2v $|$ Sub Domain & Do not create a new image but create a morpher.\\ -\hline -\end{tabular} \\ - -A Sub Domain can be a site set, an image or any value returned by this -operator. -For a given site, \type{Function\_p2v} returns a value and \type{Function\_p2b} returns a -boolean. These functions. are actually a sort of predicate. A common -\type{Function\_p2v} is \code{pw::value(Image)}. It returns the -point to value function used in the given image. C functions can also be used as -predicate by passing the function pointer. - -You can easily get a \type{Function\_p2b} by comparing the value returned -by a \type{Function\_p2v} to another Value. -The following sample codes illustrate this feature. - -In order to use C functions as predicate, they \must have one of the following -prototype if you work on 2D images: -\doxycode{predicate-1} -Of course, you just need to change the point type if you use another image -type. For instance, you would use \type{point3d} with 3D images. -The returned value type \type{V} for \type{Function\_p2v} depends on the image value type. -With \type{image2d$<$int$>$}, \type{V} would be \type{int}. - -In this section, all along the examples, the image "\var{ima}" will refer to the -following declaration: -\doxycode[1]{fill-part-image} -Output: -\begin{center} -\doxyfigure[1]{fill-subdomain}{3cm} -\end{center} - -\doxysubsection{restrictsiteset}{Restrict an image with a site set} -A simple example is to fill only a part of an image with a specific value: -\doxycode[2]{fill-part-image} - -Output: -\doxyoutput{fill-part-image} - -\doxysubsection{restrictpred}{Restrict an image with a predicate} -In the following example, we aim at extracting a component from an image and -create a new image with it. - -First, find and label the components. -\doxycode[2]{fill-subdomain} -Output: -\begin{center} -\doxyfigure[2]{fill-subdomain}{3cm} -\end{center} - -Then, restrict the image to the sites being part of component 2. -\doxycode[3]{fill-subdomain} - -\var{lbl\_2} is a new image. \var{lbl\_2} looks like: -\begin{center} -\doxyfigure[3]{fill-subdomain}{3cm} -\end{center} - -Finally, create a new color image, fill it with black and fill the sites part of -component 2 with red. -\doxycode[4]{fill-subdomain} -Output: -\begin{center} -\doxyfigure[4]{fill-subdomain}{3cm} -\end{center} - -The previous example can be written more quickly: -\doxycode[2]{fill-subdomain-shorter} - -\doxysubsection{restrictcfun}{Restrict an image with a C function} -In this example, the image is restricted to its odd lines. A new image is -created in which odd lines are in red and others in black. - -Here is the simple C function used as predicate: -\doxycode[1]{fill-subimage-cfun} - -Restrict the image with it: -\doxycode[3]{fill-subimage-cfun} - -Output: -\begin{center} -\doxyfigure[1]{fill-subimage-cfun}{3cm} -\end{center} -% -\medskip -% -% -%---------------- -\subsection*{Important note} -When writing: - -\doxyrawcode{ima2d-restricted-1} - -\var{sub\_D} \must be included in \code{ima.domain()}. - -Let's have an image, \var{imab}, like this: -\doxyoutput{ima2d-display-output-1} - -Extract a sub image from \var{imab} with sites having their value set to 1. -\doxycode[2]{mln_var} -Then, \var{imab1} looks like: -\doxyoutput{ima2d-display-output-2} - -Now, if we want to extract a sub image it may fail, depending on the site set -used: -\doxyrawcode{ima2d-restricted-2} - -If you do not want this constraint, you may want to use an alternative -operator: -\doxyrawcode{ima2d-restricted-3} - -In that case there is no restriction on the domain at all and the following example will work. -\doxycode[3]{mln_var} -Output: -\doxyoutput{mln_var} - -With this operator, an intersection is applied on the image domain and the -site set. - - - -%==================================== -\newpage -\clearpage -%Ugly workaround to avoid missing chapter references in doxygen. -\begin{htmlonly} -\doxychapter{2}{} -\end{htmlonly} -\doxychapter{graphandima}{Graphes and images} - -FIXME: REWRITE - -%************************** -\doxysection{graphdesc}{Description} -Olena enables the possibility of using graphes with images. -Graphes can help you to handle directly parts of an image and represent their -relationship. -Specific data can be associated to each vertex and/or edges. - -//FIXME: Add more explanations? - -%************************** -\doxysection{graphexample}{Example} - -First, create a graph which looks like the following: - -\doxyoutput{graph-output-1} - -First we need to add vertices: - -\doxycode[2]{graph-data} - -Finally, populate the graph with edges: -\doxycode[3]{graph-data} - -Now there is a graph topology and we want to associate elements of this graph -to a site in the image. -The idea is to use specific site sets such as \type{p\_vertices} and -\type{p\_edges}. -Let's associate the vertices with sites. To do so we need a function which maps -a vertex id to a site, e.g. a \type{point2d} here. -\doxycode[4]{graph-data} - -Then declare a \type{p\_vertices}: -\doxycode[5]{graph-data} - -Thanks to the \type{p\_vertices} there is now a mapping between vertices and sites. -We may like to map data to it. The idea is to provide a function which returns -the associated data according to the site given as parameter. Combining this -function and the \type{p\_vertices}, we get an image which can be used with -algorithms and \code{for\_all} loops. - -\doxycode[1]{graph-data} -\doxycode[6]{graph-data} - -Output: -\doxyoutput{graph-data} - -Note that like any image in Olena, graph images share their data. Therefore, -while constructing a graph image from a graph and a function, the graph is not -copied and this is NOT a costly operation. - -Of course, creating a graph image is not necessary and you can work directly -with the graph and container/function mapping sites and data. - -\doxycode{graph-iter} -Output: -\doxymoutput[1]{graph-iter} - -Graphs have iterators like any other site sets and also provide -specific iterators in order to iterate over graphes in a more intuitive way. - -Iteration over the adjacent edges of all the vertices: -\doxycode[2]{graph-iter} -Output: -\doxymoutput[2]{graph-iter} - -Iteration over the adjacent edges of all the edges: -\doxycode[3]{graph-iter} -Output: -\doxymoutput[3]{graph-iter} - - -Iteration over the adjacent vertices of all the vertices: -\doxycode[4]{graph-iter} -Output: -\doxymoutput[4]{graph-iter} - -//FIXME talk about p\_vertices and p\_edges. - -%==================================== -\newpage -\clearpage -\doxychapter{funs}{Functions} - -FIXME write it - -%==================================== -\newpage -\clearpage -\doxychapter{arithmops}{Arithmetical operators} - -FIXME write it - -%==================================== -\newpage -\clearpage -\doxychapter{mathtools}{Mathematical tools} - -FIXME write it - -%==================================== -\newpage -\clearpage -\doxychapter{globalvars}{Useful global variables} - -\begin{tabular}{l|p{8cm}|l} -\hline -Name & Description & Possible values \\ -\hline -literal::zero & Generic zero value. Can be used with various types such as -util::vec, dpoint\dots & n.a.\\ -& & \\ -literal::one & Generic one value. Can be used with various types such as -util::vec, dpoint\dots & n.a.\\ -& & \\ -literal::origin & Generic value for the origin point on a grid.& n.a.\\ -& & \\ -border::thickness & Set the default border thickness of images & $[0-UINT_MAX]$\\ -& & \\ -trace::quiet & Enable trace printing & true/false \\ -\end{tabular} - -%==================================== -\newpage -\clearpage -\doxychapter{macros}{Useful macros} -\renewcommand{\arraystretch}{2} - -\doxysection{vardeclmacros}{Variable declaration macros} -\begin{tabular}{l|p{4cm}|p{6cm}} -Name & Arguments & Description \\ -\hline -mln\_VAR(N, V) & N : name of the variable. & \\ - & V : value to assign to N. & Declare a variable N of type N\_t and - assign the value V. \\ - -mln\_const\_VAR(N, V) & N : name of the variable. & \\ - & V : value to assign to N. & Declare a const variable N of type N\_t - and assign the value V. \\ -\end{tabular} - - -\doxysection{macrositerators}{Iterator type macros} - -\doxysubsection{macrosdefit}{Default iterator types} -\begin{tabular}{l|p{4cm}|p{6cm}} -Name & Arguments & Description \\ -\hline -mln\_eiter(T) & T : iterable container type & Type of the element - iterator of T \\ - -mln\_niter(T) & T : iterable container/Image type & Type of the neighborhood - iterator of T \\ - -mln\_piter(T) & T : iterable container/image type & Type of the site - iterator \\ - -mln\_qiter(T) & T : iterable container/image type & Type of the window - neighbors iterator of T \\ - -mln\_viter(T) & T : iterable value container type & Type of the value - iterator of T \\ - -mln\_pixter(I) & I : image & Type of the pixel - iterator of I \\ - -mln\_qixter(I, W) & I : image type, & \\ - & W : window Type & Type of the pixel iterator of a - window on an image of type I. \\ - -mln\_nixter(I, N) & I : image type, & \\ - & N : neighborhood type & Type of the pixel iterator of a - neighborhood on an image of type I. \\ -\end{tabular} - - - -\doxysubsection{macrosfwdit}{Forward iterator types} -\begin{tabular}{l|p{4cm}|p{6cm}} -Name & Arguments & Description \\ -\hline -mln\_fwd\_eiter(T) & T : iterable container type & Type of the - element forward iterator of T \\ - -mln\_fwd\_niter(T) & T : iterable container/Image type & Type of the - neighborhood forward iterator of T \\ - -mln\_fwd\_piter(T) & T : iterable container/image type & Type of the site - forward iterator \\ - -mln\_fwd\_qiter(T) & T : iterable container/image type & Type of the window - neighbors forward iterator of T \\ - -mln\_fwd\_viter(T) & T : iterable value container type & Type of the value - forward iterator of T \\ - -mln\_fwd\_pixter(I) & I : image & Type of the pixel - forward iterator of I \\ - -mln\_fwd\_qixter(I, W) & I : image type, & \\ - & W : window Type & Type of the pixel - forward iterator of a window on an image of type I. \\ - -mln\_fwd\_nixter(I, N) & I : image type, & \\ - & N : neighborhood type & Type of the pixel - forward iterator of a neighborhood on an image of type I. \\ -\end{tabular} - - -\doxysubsection{macrosbkdit}{Backward iterators} -\begin{tabular}{l|p{4cm}|p{6cm}} -Name & Arguments & Description \\ -\hline -mln\_bkd\_eiter(T) & T : iterable container type & Type of the - element backward iterator of T \\ - -mln\_bkd\_niter(T) & T : iterable container/Image type & Type of the - neighborhood backward iterator of T \\ - -mln\_bkd\_piter(T) & T : iterable container/image type & Type of the site - backward iterator \\ - -mln\_bkd\_qiter(T) & T : iterable container/image type & Type of the window - neighbors backward iterator of T \\ - -mln\_bkd\_viter(T) & T : iterable value container type & Type of the value - backward iterator of T \\ - -mln\_bkd\_pixter(I) & I : image & Type of the pixel - backward iterator of I \\ - -mln\_bkd\_qixter(I, W) & I : image type, & \\ - & W : window Type & Type of the pixel - backward iterator of a window on an image of type I. \\ - -mln\_bkd\_nixter(I, N) & I : image type, & \\ - & N : neighborhood type & Type of the pixel - backward iterator of a neighborhood on an image of type I. \\ -\end{tabular} - - -\doxysubsection{macrosgraphit}{Graph iterators} -\begin{tabular}{l|p{4cm}|p{6cm}} -Name & Arguments & Description \\ -\hline -mln\_vertex\_iter(G) & G : graph type & Iterator on vertices. \\ -mln\_edge\_iter(G) & G : graph type & Iterator on edges. \\ -mln\_vertex\_nbh\_edge\_iter(G) & G : graph type & Iterator on the edges adjacent to a vertex. \\ -mln\_vertex\_nbh\_vertex\_iter(G) & G : graph type & Iterator on the vertices adjacent to a vertex. \\ -mln\_edge\_nbh\_edge\_iter(G) & G : graph type & Iterator on the edges adjacent to an edge. \\ -\end{tabular} - - -%==================================== -\newpage -\clearpage -%Ugly workaround to avoid missing chapter references in doxygen. -\begin{htmlonly} -\doxychapter{2}{} -\end{htmlonly} -\doxychapter{debugtools}{Debugging tools} +%\end{htmlonly} -FIXME write it \end{document} diff --git a/milena/doc/white_paper/Makefile.am b/milena/doc/white_paper/Makefile.am new file mode 100644 index 0000000..a332b17 --- /dev/null +++ b/milena/doc/white_paper/Makefile.am @@ -0,0 +1,8 @@ +include $(top_srcdir)/milena/doc/doc.mk +TEXINPUTS = $(top_srcdir)/milena/doc/white_paper/figures: + +white-paper: + TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/white_paper.tex + TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/white_paper.tex + TEXINPUTS=$(TEXINPUTS) pdflatex $(srcdir)/white_paper.tex + diff --git a/milena/doc/white_paper/figures/house.png b/milena/doc/white_paper/figures/house.png new file mode 100644 index 0000000000000000000000000000000000000000..6a3ceaf2fd2fa35f917a7698c09322e93f8e6dd8 GIT binary patch literal 26653 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 literal 0 HcmV?d00001 diff --git a/milena/doc/white_paper/figures/house_rag.png b/milena/doc/white_paper/figures/house_rag.png new file mode 100644 index 0000000000000000000000000000000000000000..4085ba8c9ad186591a3dfccf73909ea05e042f61 GIT binary patch literal 9454 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 M&$X1wpP7gLAG+1F$N&HU literal 0 HcmV?d00001 diff --git a/milena/doc/white_paper/figures/house_wshed.png b/milena/doc/white_paper/figures/house_wshed.png new file mode 100644 index 0000000000000000000000000000000000000000..88c0618f26f260e35635ee6bc27c4e173d153ef2 GIT binary patch literal 27668 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 Y@(Qe&KT8Wt!H<Si6g1^)WGzDf2ljA43jhEB literal 0 HcmV?d00001 diff --git a/milena/doc/white_paper/figures/house_wshed_mean_colors.png b/milena/doc/white_paper/figures/house_wshed_mean_colors.png new file mode 100644 index 0000000000000000000000000000000000000000..33a005ae59519bbc43d9409d5777a89f23d6ed84 GIT binary patch literal 6618 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 YQba{53frflT>t<807*qoM6N<$f~zRgrvLx| literal 0 HcmV?d00001 diff --git a/milena/doc/white_paper/white_paper.tex b/milena/doc/white_paper/white_paper.tex new file mode 100644 index 0000000..9b2f03e --- /dev/null +++ b/milena/doc/white_paper/white_paper.tex @@ -0,0 +1,384 @@ +\documentclass{article} + +%\usepackage{hevea} + +\usepackage{hyperref} +\usepackage{graphicx} +\usepackage{listings} +\usepackage{makeidx} +\usepackage{xcolor} +\usepackage{color} +\usepackage{html} +\usepackage{tikz} +\usepackage{pgf} + +\newcommand{\img}[4]{ +\begin{figure}[ht!] + \begin{center} + \includegraphics[width=#2]{figures/#1} + \caption{#4\label{fig:#1}} + \end{center} + \end{figure} +} + +\title{Milena\\ + \large{Generic image processing library} } +\author{LRDE} +\date{} +\makeindex + +\definecolor{ccomment}{rgb}{0.5,0,0} +\definecolor{cstring}{rgb}{0,0.32,0.5} +\definecolor{cidentifier}{rgb}{0,0.5,0} +\definecolor{cbg}{rgb}{0.95,0.95,0.95} + +%%%LISTINGS SETTINGS +%\begin{latexonly} +\lstset{frameround=fttt} +\lstloadlanguages{[ISO]C++} +\lstset{language=[ISO]C++, + captionpos=b, + basicstyle={\small\sffamily}, % normal small footnotesize scriptsize tiny + commentstyle=\itshape, + showstringspaces=false, + numberstyle=\tiny, + morekeywords={where, auto, concept, concept_map, axiom, late_check, final, abstract}, + morecomment=[s]{/*}{*/}, + backgroundcolor=\color{cbg}, + identifierstyle=\color{black}, + stringstyle=\color{cstring} +} +%\end{latexonly} + +% #1 : sub page name +% #2 : sub page title +\newcommand{\doxychapter}[2]{% +\label{#1} +\backslash endhtmlonly% +\backslash page #1 #2% +\backslash htmlonly % +} + +% #1 : section name +% #2 : section title +\newcommand{\doxysection}[2]{% +\vspace{1cm} +\label{#1} +\backslash endhtmlonly% +\backslash section #1 #2% +\backslash htmlonly % +} +\newcommand{\doxysubsection}[2]{% +\label{#1} +\backslash endhtmlonly% +\backslash subsection #1 #2% +\backslash htmlonly % +} + +\newcommand{\doxysubsubsection}[2]{% +\label{#1} +\backslash endhtmlonly% +\backslash subsubsection #1 #2% +\backslash htmlonly % +} + +% #1 - part number (Optional) +% #2 - file name +\newcommand{\doxycode}[2][1]{ +\backslash endhtmlonly% +\backslash include #2-#1.cc% +\backslash htmlonly % +} + +\newcommand{\doxyrawcode}[1]{ +\backslash endhtmlonly% +\backslash include #1.cc.raw% +\backslash htmlonly % +} + +\newcommand{\doxyoutput}[1]{ +\backslash endhtmlonly% +\backslash include #1.txt% +\backslash htmlonly % +} + +% Include file '#1' from a split output. +% #1 - part number (Optional) +% #2 - file name +\newcommand{\doxymoutput}[2][1]{ +\backslash endhtmlonly% +\backslash include #2-#1.txt% +\backslash htmlonly % +} + +\newcommand{\doxyfigure}[3][1]{ +\backslash endhtmlonly% +\backslash image html #2-#1.png% +\backslash htmlonly % +} + +\newcommand{\doxyimg}[2]{ +\backslash endhtmlonly% +\backslash image html #1.png% +\backslash htmlonly % +} + +\newcommand{\doxyref}[1]{ +\backslash endhtmlonly% +\backslash ref #1% +\backslash htmlonly % +} + +\newcommand{\doxysee}[1]{ +\backslash endhtmlonly% +\backslash see #1% +\backslash htmlonly % +} + +\newcommand{\tutotoc}[2]{% +\begin{center}% + \longleftarrow ~Go to \doxyref{#1} \hspace{1cm} | \hspace{1cm} Go to \doxyref{#2}~ \longrightarrow% +\end{center}% +} + +\newenvironment{doxymath} +{ +%\backslash endhtmlonly% +%\backslash f\$ +%\begin{rawtext} +$$ +} +{ +$$ +%\end{rawtext} +%\backslash f\$ +%\backslash htmlonly% +} + +%\begin{latexonly} +\renewcommand{\doxychapter}[2]{\chapter{#2}\label{#1}} +\renewcommand{\doxysection}[2]{\section{#2}\label{#1}} +\renewcommand{\doxysubsection}[2]{\subsection{#2}\label{#1}} +\renewcommand{\doxysubsubsection}[2]{\subsubsection{#2}\label{#1}} +\renewcommand{\doxycode}[2][1]{\lstinputlisting[frame=single]{samples/#2-#1.cc}} +\renewcommand{\doxyrawcode}[1]{\lstinputlisting[frame=single]{samples/#1.cc.raw}} +\renewcommand{\doxyoutput}[1]{\lstinputlisting[frame=single]{outputs/#1.txt}} +\renewcommand{\doxymoutput}[2][1]{\lstinputlisting[frame=single]{outputs/splitted/#2-#1.txt}} +\renewcommand{\doxyfigure}[3][1]{% +\pgfimage[width=#3]{figures/#2-#1}% +\label{#1}% +} +\renewcommand{\doxyimg}[2]{% +\pgfimage[width=#2]{#1}% +\label{#1}% +} +\renewcommand{\doxyref}[1]{\ref{#1}} +\renewcommand{\doxysee}[1]{\ref{#1}} +\renewcommand{\tutotoc}[2]{} +\renewenvironment{doxymath} +{ + $$ +} +{ + $$ +} + +%\end{latexonly} + + +\newcommand{\code}[1]{% +\textit{#1}% +} +\newcommand{\var}[1]{% +\textit{$#1$}% +} +\newcommand{\val}[1]{% +\textit{#1}% +} +\newcommand{\type}[1]{% +\textit{#1}% +} +\newcommand{\namespace}[1]{% +\textit{#1}% +} +\newcommand{\header}[1]{% +\textit{#1}% +} +\newcommand{\hpath}[1]{% +\textit{#1}% +} + +\newcommand{\must}{% +\textbf{must} +} +\newcommand{\should}{% +\textbf{should} +} + + + +\begin{document} + +\maketitle + +%################################################################# +\section{Introduction} +Milena is a programming framework for discrete mathematical morphology written +in C++. It is part of the Olena project which aims at building a scientific +computation platform oriented towards image processing, image recognition and +artificial vision. + +Milena is designed with two major goals in mind: +\begin{itemize} + \item Be as simple as calling C routines for end users. + \item Be modular enough to be extended with respect to algorithms and data + structures. +\end{itemize} + + +%################################################################# +\section{Targeted audience} +This library targets several audiences: +\begin{itemize} + + \item \textit{End users} of morphological tools who want to apply and assemble + algorithms to solve image processing, pattern recognition or computer vision + problems. + \item \textit{Designers} of morphological operators who build new algorithms + by using constructs from their software framework (language, livraries, + toolboxes, programs, etc.). + \item \textit{Providers} of data structures who are interested in extending + their framework with new data types (images, values, structuring elements, + etc.). + +\end{itemize} + +%################################################################# +\section{Key features} +Olena is: +\begin{itemize} + \item \textbf{Generic}. If a morphological operator admis a general + definition whatever the context (topology of the image, structuring + element, etc.), then this algorithm should have a corresponding single + implementation. + + \item \textbf{Close to theory}. Reading (and writing) algorithms should + eventually become natural to scientists used to mathematical morphology + notations. + + \item \textbf{Efficient} (with respect to run time speed and memory + usage), when it is possible. Dedicated and efficient implementations of + morphological algorithms for certain cases are known and should be + selected whenever possible. + + \item \textbf{User-friendly}. Users should not have to address + memory-related issues or deal with a program silently failing because of + an arithmetic overflow. The tool should handle these situations, and + help the user diagnose any problem. + + \item \textbf{Reliable}. Programming by contract helps debbuging user's + programs. By default, a debug mode is enabled and check the data and + access validity at runtime. Since Olena tends to be as static as + possible, many static checks are also done at compile time. + + \item \textbf{Free}. Milena is \textit{free} and \textit{open-source}. It is + released under GNU GPL V2. +\end{itemize} + + +%################################################################# +\section{Library content} + +%================================================================= +\subsection{Generic basic image types} + +Common basic image types are provided: 1-D, 2-D, 3-D images. +A $N$-D image class is also available. +These class are provided with a border in order to make them fast in algorithms +using structural elements. + +%================================================================= +\subsection{Morphers} + +Morphers are generic, composable and lightweight objects built on one or several +images, that can be used as +\begin{itemize} + \item \textbf{mixins}: a morpher can add extra data (e.g. a neighborhood) or + operations (e.g., an ordering on the values) to an image; + \item \textbf{adapters}: e.g., a slice morpher can be used to view a slice of + a 3-D image (spacemap) as a 2-D image (bitmap); + \item \textbf{modifiers}: a morpher can add a mask to an image, to restrict its + (iterable) domain; + \item \textbf{lazy function applications}: a morpher can present an image seen + through a function, either bijective or not; + \item etc. +\end{itemize} + +\begin{center} + \doxyimg{house}{2.5cm} + \doxyimg{house_wshed}{2.5cm} + \doxyimg{house_wshed_mean_colors}{2.5cm} + \doxyimg{house_rag}{2.5cm} +\end{center} + +%================================================================= +\subsection{Generic image processing algorithms} + +\begin{itemize} + \item Morphological algorithms: dilation, erosion, watershed, leveling, etc; + \item Influence zone; + \item Labeling; + \item etc. +\end{itemize} + +%================================================================= +\subsection{Auxiliary tools} + +Since Olena is intended to \textit{designer} of algorithms and \textit{provider} +of new data structures, various generic auxiliary tools are available in the +library. + +\begin{itemize} + \item Topologies (grid, graph, etc.); + \item Points and delta-points; + \item neighborhoods and windows; + \item accumulators; + \item etc. +\end{itemize} + + + +%################################################################# +\section{Learn more} + +Olena's \textbf{official website}: \url{http://olena.lrde.epita.fr} + +Olena's \textbf{Trac}: \url{http://trac.lrde.org/olena} + +Milena's \textbf{documentation}: +\url{http://www.lrde.epita.fr/dload/doc/milena-1.0} + +% +\medskip +% + +\textbf{Mailing lists}: +\begin{itemize} + \item olena@lrde.epita.fr - Question and comments; + \item olena-bug@lrde.epita.fr - Bug reports; + \item olena-patches@lrde.epita.fr - Patches. +\end {itemize} + +% +\bigskip +% + +\textbf{Contacts}: +\begin{itemize} + \item Thierry Geraud - thierry.geraud@lrde.epita.fr + \item Roland Levillain - roland.levillain@lrde.epita.fr +\end{itemize} + +%Demo + tuto + doc + +\end{document} diff --git a/milena/mln/core/concept/image.hh b/milena/mln/core/concept/image.hh index 6bd26a6..e2bc4f8 100644 --- a/milena/mln/core/concept/image.hh +++ b/milena/mln/core/concept/image.hh @@ -1,4 +1,4 @@ -// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory +// Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory // (LRDE) // // This file is part of the Olena Library. This library is free @@ -49,12 +49,11 @@ # include <mln/tag/init.hh> - namespace mln { - // Fwd decl. + // Forward declaration. template <typename E> struct Image; // Image category flag type. @@ -65,11 +64,10 @@ namespace mln }; - /*! \brief Base class for implementation of image classes. - * - * \see mln::doc::Image for a complete documentation of this class - * contents. - */ + /// Base class for implementation of image classes. + /// + /// \see mln::doc::Image for a complete documentation of this class + /// contents. template <typename E> struct Image : public Object<E> { diff --git a/milena/mln/core/concept/object.hh b/milena/mln/core/concept/object.hh index 4a482cb..27ef2a4 100644 --- a/milena/mln/core/concept/object.hh +++ b/milena/mln/core/concept/object.hh @@ -84,7 +84,6 @@ * <LI> \ref mln::extension * <LI> \ref mln::fun * <LI> \ref mln::geom - * <LI> \ref mln::graph * <LI> \ref mln::histo * <LI> \ref mln::io * <LI> \ref mln::labeling @@ -112,7 +111,7 @@ * <LI> \ref mln::win * * \section copyright Copyright and License. - * Copyright (C) 2007, 2008 EPITA Research and Development Laboratory + * Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory * * This file is part of the Olena Library. This library is free * software; you can redistribute it and/or modify it under the terms diff --git a/milena/mln/core/image/cast_image.hh b/milena/mln/core/image/cast_image.hh index 91e5339..422327d 100644 --- a/milena/mln/core/image/cast_image.hh +++ b/milena/mln/core/image/cast_image.hh @@ -1,4 +1,5 @@ -// Copyright (C) 2007 EPITA Research and Development Laboratory +// Copyright (C) 2007, 2009 EPITA Research and Development Laboratory +// (LRDE) // // This file is part of the Olena Library. This library is free // software; you can redistribute it and/or modify it under the terms @@ -28,13 +29,12 @@ #ifndef MLN_CORE_IMAGE_CAST_IMAGE_HH # define MLN_CORE_IMAGE_CAST_IMAGE_HH -/*! \file mln/core/image/cast_image.hh - * - * \brief Definition of an image morpher that make the user see the - * same image but with another data type. - * - * \todo Rename as cast_image (without '_')! - */ +/// \file mln/core/image/cast_image.hh +/// +/// Definition of an image morpher that make the user see the +/// same image but with another data type. +/// +/// \todo Rename as cast_image (without '_')! # include <mln/core/internal/image_value_morpher.hh> # include <mln/value/set.hh> @@ -112,10 +112,10 @@ namespace mln - /*! \brief Class of image morpher which takes an image to change its - * data type. - * - */ + /// \brief Class of image morpher which takes an image to change its + /// data type. + /// + /// \ingroup modimagevaluemorpher template <typename T, typename I> struct cast_image_ : public internal::image_value_morpher< I, T, cast_image_<T,I> > diff --git a/milena/mln/core/image/image1d.hh b/milena/mln/core/image/image1d.hh index 87fe01d..b67feb0 100644 --- a/milena/mln/core/image/image1d.hh +++ b/milena/mln/core/image/image1d.hh @@ -51,7 +51,7 @@ namespace mln { - // Fwd decl. + // Forward declaration. template <typename T> struct image1d; @@ -139,12 +139,13 @@ namespace mln - /*! \brief Basic 1D image class. - * - * The parameter \c T is the type of pixel values. This image class - * stores data in memory and has a virtual border with constant - * thickness before and after data. - */ + /// \brief Basic 1D image class. + /// + /// The parameter \c T is the type of pixel values. This image class + /// stores data in memory and has a virtual border with constant + /// thickness before and after data. + /// + /// \ingroup modimageconcrete template <typename T> struct image1d : public internal::image_primary< T, box1d, image1d<T> > diff --git a/milena/mln/core/image/image2d.hh b/milena/mln/core/image/image2d.hh index 937b451..40a9eb0 100644 --- a/milena/mln/core/image/image2d.hh +++ b/milena/mln/core/image/image2d.hh @@ -1,4 +1,4 @@ -// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory +// Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory // (LRDE) // // This file is part of the Olena Library. This library is free @@ -126,12 +126,13 @@ namespace mln - /// Basic 2D image class. + /// \brief Basic 2D image class. /// /// The parameter \c T is the type of pixel values. This image class /// stores data in memory and has a virtual border with constant /// thickness around data. /// + /// \ingroup modimageconcrete template <typename T> class image2d : public internal::image_primary< T, mln::box2d, image2d<T> > { diff --git a/milena/mln/core/image/image2d_h.hh b/milena/mln/core/image/image2d_h.hh index f2ba145..c76b32b 100644 --- a/milena/mln/core/image/image2d_h.hh +++ b/milena/mln/core/image/image2d_h.hh @@ -44,6 +44,10 @@ namespace mln { + + /// \brief 2d image based on an hexagonal mesh. + /// + /// \ingroup modimageconcrete template <typename V> struct image2d_h : public hexa< image2d<V> > diff --git a/milena/mln/core/image/image3d.hh b/milena/mln/core/image/image3d.hh index dcf266f..a0bdb5d 100644 --- a/milena/mln/core/image/image3d.hh +++ b/milena/mln/core/image/image3d.hh @@ -120,12 +120,13 @@ namespace mln - /*! \brief Basic 3D image class. - * - * The parameter \c T is the type of pixel values. This image class - * stores data in memory and has a virtual border with constant - * thickness around data. - */ + /// \brief Basic 3D image class. + /// + /// The parameter \c T is the type of pixel values. This image class + /// stores data in memory and has a virtual border with constant + /// thickness around data. + /// + /// \ingroup modimageconcrete template <typename T> struct image3d : public internal::image_primary< T, box3d, image3d<T> > { diff --git a/milena/mln/core/image/image_if.hh b/milena/mln/core/image/image_if.hh index 0102e7c..893de51 100644 --- a/milena/mln/core/image/image_if.hh +++ b/milena/mln/core/image/image_if.hh @@ -1,4 +1,5 @@ -// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory +// Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory +// (LRDE) // // This file is part of the Olena Library. This library is free // software; you can redistribute it and/or modify it under the terms @@ -28,13 +29,12 @@ #ifndef MLN_CORE_IMAGE_IMAGE_IF_HH # define MLN_CORE_IMAGE_IMAGE_IF_HH -/*! \file mln/core/image/image_if.hh - * - * \brief Definition of a image which domain is restricted by a - * function. - * - * \todo Relax Function_p2b into Function_v2b. - */ +/// \file mln/core/image/image_if.hh +/// +/// Definition of a image which domain is restricted by a +/// function. +/// +/// \todo Relax Function_p2b into Function_v2b. # include <mln/core/internal/image_domain_morpher.hh> # include <mln/core/site_set/p_if.hh> @@ -45,7 +45,7 @@ namespace mln { - // Fwd decl. + // Forward declaration. template <typename I, typename F> struct image_if; @@ -89,9 +89,9 @@ namespace mln - /*! \brief Image which domain is restricted by a function. - * - */ + /// \brief Image which domain is restricted by a function. + /// + /// \ingroup modimagedomainmorpher template <typename I, typename F> struct image_if : public internal::image_domain_morpher< I, p_if<mln_pset(I), F>, diff --git a/milena/mln/opt/all.hh b/milena/mln/opt/all.hh index ac80cd4..7d4d40a 100644 --- a/milena/mln/opt/all.hh +++ b/milena/mln/opt/all.hh @@ -32,6 +32,20 @@ /// /// File that includes the most useful optional routines. +namespace mln +{ + + /// Namespace of optional routines. + namespace opt + { + + /// Implementation namespace of opt namespace. + namespace impl {} + + } // end of namespace mln::opt + +} // end of name + # include <mln/opt/at.hh> # include <mln/opt/element.hh> # include <mln/opt/value.hh> diff --git a/milena/tests/util/soft_heap.cc b/milena/tests/util/soft_heap.cc index 9ab1d8b..86ce8eb 100644 --- a/milena/tests/util/soft_heap.cc +++ b/milena/tests/util/soft_heap.cc @@ -25,7 +25,7 @@ // reasons why the executable file might be covered by the GNU General // Public License. -/// \file mln/core/site_set/p_soft_heap.hh +/// \file mln/util/soft_heap.cc /// /// Test for the soft heap (approximate priority queue). -- 1.5.6.5
participants (1)
-
Guillaume Lazzara