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(a)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