2104: Add preliminary support for windows and morpho in Swilena.

https://svn.lrde.epita.fr/svn/oln/trunk/swilena Getting this work was not easy. I had to figure out that dpoint2d had to be wrapped for window2d to work, but error messages gave no hint about this. :( Index: ChangeLog from Roland Levillain <roland@lrde.epita.fr> Add preliminary support for windows and morpho in Swilena. * dpoint2d.i, window2d.i, morpho.ixx: New wrappers. * image2d.ixx, point2d.i, fill.ixx: Aesthetic changes. * image2d_int.i: Likewise. Use window2d and morpho::erosion. * python/swilena.py: Inject the contents of modules dpoint2d and window2d. * python/test.py: Exercise window2d and morpho::erosion. * python/Makefile.am: Handle modules dpoint2d and window2d. * Makefile.am (EXTRA_DIST): Remove image2d.i Add fill.ixx, image2d.ixx, intp.ixx, morpho.ixx, println.ixx, dpoint2d.i, image2d_int.i, point2d.i and window2d.i. Makefile.am | 5 +- dpoint2d.i | 64 ++++++++++++++++++++++++++++++ fill.ixx | 2 image2d.ixx | 10 +--- image2d_int.i | 17 ++++++-- morpho.ixx | 54 ++++++++++++++++++++++++++ point2d.i | 2 python/Makefile.am | 20 +++++++++ python/swilena.py | 2 python/test.py | 22 ++++++++++ window2d.i | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 11 files changed, 296 insertions(+), 12 deletions(-) Index: image2d.ixx --- image2d.ixx (revision 2103) +++ image2d.ixx (working copy) @@ -37,10 +37,10 @@ #include "mln/core/image2d.hh" %} -%include "mln/core/box2d.hh"; -%include "mln/core/dpoint2d.hh"; +%include "mln/core/box2d.hh" +%include "mln/core/dpoint2d.hh" -%include "mln/core/concept/image.hh"; +%include "mln/core/concept/image.hh" // FIXME: Wrap mln::image2d by hand, for Milena macros disturb swig. // Annotate the original source code instead? @@ -48,10 +48,8 @@ { template <typename T> struct image2d - /* FIXME: This is a simple wrapping; ignore the base class (for the - moment). */ - // : public internal::image_primary_< box2d, image2d<T> > /* FIXME: Cheat, so that generic algorithms can use mln::image2d. */ + // : public internal::image_primary_< box2d, image2d<T> > : public Image< image2d<T> > { // Warning: just to make effective types appear in Doxygen: Index: python/test.py --- python/test.py (revision 2103) +++ python/test.py (working copy) @@ -53,5 +53,27 @@ v = image2d_int.intp_value(ima(p)) print "ima(" + str(i) + ", " + str(j) + ") = " + str(v) +# FIXME: This is too complicated. We should be able to write +# +# ima(1,1) = 51 +# +# or at least +# +# ima.set(1, 1, 51) +# +image2d_int.intp_assign(ima(point2d(1,1)), 10) + print image2d_int.println(ima) + +# Elementary erosion in 4-connectivity using win_c4p. +eroded = image2d_int.erosion (ima, win_c4p()) +image2d_int.println(eroded) + +# Erosion using a custom window. +w = window2d() +w.insert(-1, 0) +w.insert( 0, 0) +w.insert(+1, 0) +eroded = image2d_int.erosion (ima, w) +image2d_int.println(eroded) Index: python/Makefile.am --- python/Makefile.am (revision 2103) +++ python/Makefile.am (working copy) @@ -50,6 +50,26 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/_point2d-wrap.Pcc@am__quote@ nodist_python_PYTHON += point2d.py +## dpoint2d. +pyexec_LTLIBRARIES += _dpoint2d.la +nodist__dpoint2d_la_SOURCES = dpoint2d-wrap.cc +_dpoint2d_la_LIBADD = $(AM_LIBADD) +CLEANFILES += $(nodist__dpoint2d_la_SOURCES) dpoint2d.py dpoint2d.py[co] +## Include the dependency files. Copied from Automake's generated +## case for C++. +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/_dpoint2d-wrap.Pcc@am__quote@ +nodist_python_PYTHON += dpoint2d.py + +## window2d. +pyexec_LTLIBRARIES += _window2d.la +nodist__window2d_la_SOURCES = window2d-wrap.cc +_window2d_la_LIBADD = $(AM_LIBADD) +CLEANFILES += $(nodist__window2d_la_SOURCES) window2d.py window2d.py[co] +## Include the dependency files. Copied from Automake's generated +## case for C++. +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/_window2d-wrap.Pcc@am__quote@ +nodist_python_PYTHON += window2d.py + ## image2d_int. pyexec_LTLIBRARIES += _image2d_int.la nodist__image2d_int_la_SOURCES = image2d_int-wrap.cc Index: python/swilena.py --- python/swilena.py (revision 2103) +++ python/swilena.py (working copy) @@ -30,4 +30,6 @@ import ltihooks from point2d import * +from dpoint2d import * +from window2d import * import image2d_int Index: window2d.i --- window2d.i (revision 0) +++ window2d.i (revision 0) @@ -0,0 +1,110 @@ +// -*- C++ -*- +// Copyright (C) 2008 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 +// of the GNU General Public License version 2 as published by the +// Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING. If not, write to +// the Free Software Foundation, 51 Franklin Street, Fifth Floor, +// Boston, MA 02111-1307, USA. +// +// As a special exception, you may use this file as part of a free +// software library without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to +// produce an executable, this file does not by itself cause the +// resulting executable to be covered by the GNU General Public +// License. +// reasons why the executable file might be covered by the GNU General +// Public License. + +/// \file window2d.i +/// \brief A wrapper of mln::window2d. + +%module window2d + +%import "dpoint2d.i" + +%{ +#include "mln/core/window2d.hh" +%} + +%include "mln/core/concept/window.hh" + +// FIXME: Wrap mln::image2d by hand, for Milena macros disturb swig. +// Annotate the original source code instead? +namespace mln +{ + template <typename D> + class window + /* FIXME: Simplify, so as to minimize the work. */ + : public Window< window<D> > + , public internal::dpoints_base_<D, window<D> > + { + typedef internal::dpoints_base_<D, window<D> > super_; + public: + + /*! \brief Point_Iterator type to browse the points of a generic window + * w.r.t. the ordering of delta-points. + */ + typedef dpoints_fwd_piter<D> fwd_qiter; + + /*! \brief Point_Iterator type to browse the points of a generic window + * w.r.t. the reverse ordering of delta-points. + */ + typedef dpoints_bkd_piter<D> bkd_qiter; + + + /*! \brief Constructor without argument. + * + * The constructed window is empty. + */ + window(); + + + /*! \brief Test if the window is symmetric. + */ + bool is_symmetric() const; + + /// Insert a delta-point \p dp. + window<D>& insert(const D& dp); + +// FIXME: Swig tries to wrap everything by default; prevent it from wrapping +// invalid methods (1D and 3D ctors for a point2d). + /// \{ Insertion of a delta-point with different numbers of + /// arguments (coordinates) w.r.t. the dimension. +// window<D>& insert(const mln_coord(D)& dind); // For 1D. + +// FIXME: The macro mln_coord disturbs swig. +// window<D>& insert(const mln_coord(D)& drow, +// const mln_coord(D)& dcol); // For 2D. + window<D>& insert(const typename D::coord& drow, + const typename D::coord& dcol); // For 2D. + +// window<D>& insert(const mln_coord(D)& dsli, +// const mln_coord(D)& drow, +// const mln_coord(D)& dcol); // For 3D. +// /// \} + + /// Apply a central symmetry to the target window. + window<D>& sym(); + + protected: + +// FIXME: The macro used here disturbs swig. +// box_<mln_point(D)> b_; + box_<typename D::point> b_; + }; +} // end of namespace mln + +%include "mln/core/window2d.hh" + +%template(window2d) mln::window< mln::dpoint_<mln::grid::square, int > >; Index: point2d.i --- point2d.i (revision 2103) +++ point2d.i (working copy) @@ -51,7 +51,7 @@ Check whether this bug has been fixed in a recent release of SWIG or if it has been reported. */ %ignore mln::point_<mln::grid::square,int>::origin; -// Ignoring to_h_vec saves us the wrapping of +// Ignoring to_h_vec saves us the wrapping of h_vec. %ignore mln::point_<mln::grid::square,int>::to_h_vec; // Swig tries to wrap everything by default; prevent it from wrapping // invalid methods (1D and 3D ctors for a point2d). Index: Makefile.am --- Makefile.am (revision 2103) +++ Makefile.am (working copy) @@ -2,6 +2,9 @@ SUBDIRS = python -EXTRA_DIST = image2d.i +# Meta-wrappers (templates). +EXTRA_DIST = fill.ixx image2d.ixx intp.ixx morpho.ixx println.ixx +# Wrappers. +EXTRA_DIST += dpoint2d.i image2d_int.i point2d.i window2d.i check_SCRIPTS = run Index: image2d_int.i --- image2d_int.i (revision 2103) +++ image2d_int.i (working copy) @@ -32,12 +32,21 @@ %module image2d_int -%include intp.ixx -%include image2d.ixx +%include "intp.ixx" +%include "image2d.ixx" %template(image2d_int) mln::image2d<int>; -%include fill.ixx +%include "fill.ixx" %template(fill) mln::level::fill< mln::image2d<int> >; -%include println.ixx +%include "println.ixx" %template(println) mln::debug::println< mln::image2d<int> >; + +%import "window2d.i" +// FIXME: The import directive does not import the `%{ ... %}' clauses. +%{ +#include "mln/core/window2d.hh" +%} + +%include "morpho.ixx" +%template(erosion) mln::morpho::erosion< mln::image2d<int>, mln::window2d >; Index: dpoint2d.i --- dpoint2d.i (revision 0) +++ dpoint2d.i (revision 0) @@ -0,0 +1,64 @@ +// -*- C++ -*- +// Copyright (C) 2008 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 +// of the GNU General Public License version 2 as published by the +// Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING. If not, write to +// the Free Software Foundation, 51 Franklin Street, Fifth Floor, +// Boston, MA 02111-1307, USA. +// +// As a special exception, you may use this file as part of a free +// software library without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to +// produce an executable, this file does not by itself cause the +// resulting executable to be covered by the GNU General Public +// License. +// reasons why the executable file might be covered by the GNU General +// Public License. + +/// \file dpoint2d.i +/// \brief A wrapper of mln::dpoint2d. + +%module dpoint2d + +%{ +#include "mln/core/dpoint.hh" +#include "mln/core/dpoint2d.hh" +%} + +%include "mln/core/dpoint.hh"; +%include "mln/core/dpoint2d.hh"; +/* FIXME: Ignore `mln::dpoint_<M,C>::origin' to circumvent a swig bug. + Without this ignore clause, the generated code would trigger this + error : + + image2d-wrap.cc:3115:144: error: macro "SWIG_as_voidptr" passed 2 + arguments, but takes just 1 + image2d-wrap.cc: In function 'PyObject* dpoint2d_origin_get()': + image2d-wrap.cc:3115: error: 'SWIG_as_voidptr' was not declared in this + scope + + Check whether this bug has been fixed in a recent release of SWIG + or if it has been reported. */ +// %ignore mln::dpoint_<mln::grid::square,int>::origin; +// Ignoring to_h_vec saves us the wrapping of h_vec. +// %ignore mln::dpoint_<mln::grid::square,int>::to_h_vec; +// Swig tries to wrap everything by default; prevent it from wrapping +// invalid methods (1D and 3D ctors for a dpoint2d). +// %ignore mln::dpoint_<mln::grid::square,int>::dpoint_(const literal::zero_t&); +%ignore mln::dpoint_<mln::grid::square,int>::dpoint_(const literal::one_t&); +%ignore mln::dpoint_<mln::grid::square,int>::operator=(const literal::one_t&); +%ignore mln::dpoint_<mln::grid::square,int>::dpoint_(int); +%ignore mln::dpoint_<mln::grid::square,int>::dpoint_(int, int, int); + +%template(dpoint2d) mln::dpoint_<mln::grid::square, int>; Index: morpho.ixx --- morpho.ixx (revision 0) +++ morpho.ixx (revision 0) @@ -0,0 +1,54 @@ +// -*- C++ -*- +// Copyright (C) 2008 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 +// of the GNU General Public License version 2 as published by the +// Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING. If not, write to +// the Free Software Foundation, 51 Franklin Street, Fifth Floor, +// Boston, MA 02111-1307, USA. +// +// As a special exception, you may use this file as part of a free +// software library without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to +// produce an executable, this file does not by itself cause the +// resulting executable to be covered by the GNU General Public +// License. +// reasons why the executable file might be covered by the GNU General +// Public License. + +/// \file fill.i +/// \brief Wrappers of morphological algorithms from mln::morpho. + +%module morpho + +%{ +#include "mln/morpho/erosion.hh" +%} + +// FIXME: Wrap mln::morpho::erosion by hand, for mln_concrete(I) +// disturbs swig. Annotate the original source code instead? +namespace mln +{ + namespace morpho + { + + template <typename I, typename W> + /* FIXME: How can we handle concrete in Swilena? Simplify this + for the moment, and use I directly. */ +// typename mln::trait::concrete< I >::ret + I + erosion(const Image<I>& input, const Window<W>& win); + + } // end of namespace mln::morpho + +} // end of namespace mln Index: fill.ixx --- fill.ixx (revision 2103) +++ fill.ixx (working copy) @@ -41,8 +41,10 @@ { namespace level { + template <typename I> void fill(mln::Image<I>& ima, const typename I::value& v); + } // end of namespace mln::level } // end of namespace mln
participants (1)
-
Roland Levillain