Olena-patches
  Threads by month 
                
            - ----- 2025 -----
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2024 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2023 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2022 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2021 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2020 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2019 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2018 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2017 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2016 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2015 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2014 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2013 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2012 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2011 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2010 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2009 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2008 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2007 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2006 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2005 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 - February
 - January
 - ----- 2004 -----
 - December
 - November
 - October
 - September
 - August
 - July
 - June
 - May
 - April
 - March
 
- 9625 discussions
 
                    
                        Index: olena/ChangeLog
from  Giovanni Palma  <giovanni(a)lrde.epita.fr>
	* tests/topo/tests/tarjan: Correct test.
	* tests/topo/tests/md5_topo_tarjan_flat-zone_hh0: Correct test.
	* oln/topo/tarjan/tarjan_with_attr.hh: Correct code.
Index: olena/tests/topo/tests/tarjan
--- olena/tests/topo/tests/tarjan Thu, 31 Jul 2003 11:12:56 +0200 sylvain (oln/u/30_test-tarja 1.1 600)
+++ olena/tests/topo/tests/tarjan Fri, 02 Apr 2004 18:23:33 +0200 palma_g (oln/u/30_test-tarja 1.1 600)
@@ -29,8 +29,8 @@
   input_t src = load(rdata("object"));
 
   flat_zone<input_t> cc(src);
-
-  if (cc.nlabels() == 79)
+  cc.get_compute(oln::neighb_c4());
+  if (cc.ncomps() == 78)
     OK_OR_FAIL;
 
   return fail;
Index: olena/tests/topo/tests/md5_topo_tarjan_flat-zone_hh0
--- olena/tests/topo/tests/md5_topo_tarjan_flat-zone_hh0 Tue, 23 Mar 2004 15:48:17 +0100 palma_g (oln/m/12_md5_topo_t 1.1 644)
+++ olena/tests/topo/tests/md5_topo_tarjan_flat-zone_hh0 Fri, 02 Apr 2004 18:31:24 +0200 palma_g (oln/m/12_md5_topo_t 1.1 644)
@@ -9,16 +9,18 @@
  
 int main() 
 {
-oln::utils::key::value_type   data_key[16] = {0x23, 0x57, 0x37, 0xc5, 0xf5, 0xd1, 0x56, 0x6b, 0x6a, 0x2b, 0x6b, 0xe6, 0x59, 0x5b, 0xbb, 0x57};
+  oln::utils::key::value_type   data_key[16] = {0xd2, 0x7, 0xe9, 0x82, 0xdc,
+						0x89, 0x54, 0x89, 0x14, 0xc,
+						0xa5, 0xaa, 0x45, 0x2, 0x79,
+						0xdc};
 
 oln::utils::key		   key(data_key);
 
-   typedef oln::image2d<ntg::
-int_u8> img_type;
+  typedef oln::image2d<ntg::int_u8> img_type;
    img_type in = oln::load(rdata("test-cmap.pgm"));
    oln::topo::tarjan::flat_zone<img_type> z(in);
-   if (oln::utils::md5(oln::convert::stretch_balance<ntg::
-int_u8>(z.label, 0, 255)) == key)
+
+  if (oln::utils::md5(oln::convert::stretch_balance<ntg::int_u8>(z.get_compute(oln::neighb_c4()), 0, 255)) == key)
   std::cout << "OK" << std::endl;
 else
   {
Index: olena/oln/topo/tarjan/tarjan_with_attr.hh
--- olena/oln/topo/tarjan/tarjan_with_attr.hh Fri, 02 Apr 2004 16:53:54 +0200 palma_g (oln/m/46_tarjan_wit 1.2 644)
+++ olena/oln/topo/tarjan/tarjan_with_attr.hh Fri, 02 Apr 2004 18:06:54 +0200 palma_g (oln/m/46_tarjan_wit 1.2 644)
@@ -179,22 +179,17 @@
 
 	    // Resolving phase
 	    std::map<comp_type, comp_type>		cmps;
-	    comp_type				nc = 0;
 	    ncomps_ = 0;
-	    //	unsigned i = 0;
 	    for (int p = I.size() - 1; p >= 0; --p)
 	      {
 		point_type p_p = I[p];
-		if (cmps.find(comp_value_[find_root(to_comp_[p_p])]) == cmps.end())
+		if (cmps.find(find_root(to_comp_[p_p])) == cmps.end())
 		  {
-		    ++ncomps_;
-		    //		++i;
-		    //		std::cout << "new component\n";
-		    cmps[comp_value_[find_root(to_comp_[p_p])]] = nc;
-		    comp_value_[find_root(to_comp_[p_p])] = nc++;
+		    cmps[comp_value_[find_root(to_comp_[p_p])]] = ncomps_;
+		    comp_value_[find_root(to_comp_[p_p])] = ncomps_++;
 		  }
 	      }
-	    //	std::cout << i << " components\n";
+
 	    image_out_type output(input_.size());
 	    for (int p = I.size() - 1; p >= 0; --p)
 	      {
-- 
Giovanni Palma
EPITA - promo 2005 - membre d'EpX - LRDE
Mob. : +33 (0)6 60 97 31 74
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            1
                            
                          
                          
                            
    
                          
                        
                    
                    
                        Index: olena/ChangeLog
from  Giovanni Palma  <giovanni(a)lrde.epita.fr>
	* oln/topo/tarjan/tarjan.hh: Add comments.
	* oln/topo/tarjan/tarjan_with_attr.hh: Add comments. Correct the code.
	* oln/topo/combinatorial-map/cmap.hh: Make cmap use the good flat_zone.
	* oln/topo/tarjan/flat-zone.hh: Add new version of flat_zone.
	* oln/topo/tarjan/union.hh: Correct comments.
	* tests/topo/tests/cmap: Make the test use the good flat_zone.
Index: olena/tests/topo/tests/cmap
--- olena/tests/topo/tests/cmap Sun, 03 Aug 2003 21:08:04 +0200 burrus_n (oln/r/28_test-cmap. 1.8 640)
+++ olena/tests/topo/tests/cmap Fri, 02 Apr 2004 16:36:54 +0200 palma_g (oln/r/28_test-cmap. 1.8 640)
@@ -34,7 +34,7 @@
 
   interpixel<input_t> ip(src);
 
-  flat_zone<input_t> cc(src);
+  obsolete::flat_zone<input_t> cc(src);
 
   cmap<input_t> cm(src, ip, cc);
 
Index: olena/oln/topo/tarjan/union.hh
--- olena/oln/topo/tarjan/union.hh Mon, 15 Mar 2004 17:40:54 +0100 van-vl_n (oln/r/33_union.hh 1.11 640)
+++ olena/oln/topo/tarjan/union.hh Fri, 02 Apr 2004 16:48:26 +0200 palma_g (oln/r/33_union.hh 1.11 640)
@@ -43,10 +43,7 @@
 
       /*! Tarjan set.
       **
-      ** \todo FIXME: a similar class is defined in
-      ** oln/morpho/attribute_union_find.hh (oln::morpho::tarjan::tarjan_set).
-      ** The one in morpho is more general. I think that this class should
-      ** be removed.
+      ** \todo FIXME: Obsolete since only obsolete::flat_zone use it.
       */
       template< class I, class aux_data_type>
       struct tarjan_set
Index: olena/oln/topo/tarjan/flat-zone.hh
--- olena/oln/topo/tarjan/flat-zone.hh Mon, 15 Mar 2004 15:32:27 +0100 van-vl_n (oln/r/35_flat-zone. 1.12 640)
+++ olena/oln/topo/tarjan/flat-zone.hh Fri, 02 Apr 2004 16:47:01 +0200 palma_g (oln/r/35_flat-zone. 1.12 640)
@@ -1,12 +1,13 @@
-// Copyright (C) 2001, 2002, 2003, 2004  EPITA Research and Development Laboratory
+// Copyright (C) 2001, 2002, 2003, 2004 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
 // 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
+// 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.
 //
@@ -28,9 +29,10 @@
 #ifndef OLENA_TOPO_TARJAN_FLAT_ZONE_HH
 # define OLENA_TOPO_TARJAN_FLAT_ZONE_HH
 
-# include <oln/basics2d.hh>
+# include <oln/basics.hh>
+# include <oln/topo/tarjan/tarjan_with_attr.hh>
 # include <oln/topo/tarjan/union.hh>
-
+# include <oln/morpho/attributes.hh>
 # include <map>
 
 namespace oln {
@@ -41,7 +43,10 @@
 
       /*! Create an image of label of the flat zones.
       **
-      ** \todo FIXME: many assertions are missing.
+      ** \param T Type of he input image.
+      ** \param DestType Data type of the output image (label type).
+      ** \param A Attribute you want to compute.
+      ** \param Exact Exact type of the class.
       **
       ** \code
       ** #include <oln/basics2d.hh>
@@ -53,6 +58,153 @@
       **   typedef oln::image2d<ntg::int_u8> img_type;
       **   img_type in = oln::load(IMG_IN "test-cmap.pgm");
       **   oln::topo::tarjan::flat_zone<img_type> z(in);
+      **   save(oln::convert::stretch_balance<ntg::int_u8>(z.get_compute(oln::neighb_c4()), 0, 255),
+      **        IMG_OUT "oln_topo_flat_zone.pgm");
+      **  }
+      ** \endcode
+      ** \image html test-cmap_pgm.png "input image"
+      ** \image latex test-cmap_pgm.png "input image"
+      ** =>
+      ** \image html oln_topo_flat_zone.png "output image"
+      ** \image latex oln_topo_flat_zone.png "output image"
+      */
+      template<class T,
+	       class DestType = unsigned,
+	       class A = oln::morpho::attr::card_type<>,
+	       class Exact = mlc::final>
+      struct flat_zone:
+	public abstract::tarjan_with_attr<typename mlc::exact_vt<flat_zone<T, DestType, A, Exact>,
+								 Exact>::ret>
+      {
+
+	typedef oln_point_type(T)			point_type; ///< Type of input image.
+	typedef oln_value_type(T)			data_type; ///< Data type of the input image.
+	typedef oln_concrete_type(T)			image_type; ///< Concrete type of the input image.
+
+	typedef DestType				comp_type; ///< Type of components.
+
+	typedef flat_zone<T, DestType, A, Exact>	self_type; ///< Self type of the class.
+	typedef mlc_exact_vt_type(self_type, Exact)	exact_type; ///< Exact type of the class.
+	typedef abstract::tarjan_with_attr<exact_type>	super_type; ///< Type of parent class.
+
+	friend class super_type;
+	friend class super_type::super_type;
+	/*!
+	** \brief Constructor.
+	**
+	** \arg ima Input image.
+	** \arg env Environment to use to compute the attributes.
+	*/
+	flat_zone(const image_type &ima,
+	   const attr_env_type(A) &env = attr_env_type(A)()): super_type(ima, env)
+	{
+	}
+
+	std::vector<point_type>
+	get_processing_order_impl()
+	{
+	  std::vector<point_type>	res;
+	  oln_iter_type(image_type)	it(input_);
+
+	  res.reserve(input_.npoints());
+	  for_all(it)
+	    res.push_back(it);
+	  return res;
+	}
+
+      protected:
+
+	/*!
+	** \brief Implementation of mark_set().
+	**
+	** \arg x Root of the new component.
+	**
+	** \warning Do not call this method, use mark_set() instead.
+	*/
+	void
+	mark_set_impl(const point_type &x)
+	{
+	  if (parent_.size() == parent_.capacity())
+	    {
+	      capacity = parent_.capacity() + capacity_chunk;
+	      parent_.reserve(capacity);
+	      comp_value_.reserve(capacity);
+	    }
+	  to_comp_[x] = ncomps_ + 1;
+	  data_.push_back(A(input_, x, env_));
+	  parent_.push_back(ncomps_ + 1);
+	  comp_value_.push_back(ncomps_ + 1);
+	}
+
+	/*!
+	** \brief Implementation of uni().
+	**
+	** \arg n A point of the first component.
+	** \arg p A point of the second component.
+	**
+	** \warning Do not call this method, use uni() instead.
+	*/
+	void
+	uni_impl(const point_type& n, const point_type& p)
+	{
+	  comp_type		r = find_root(to_comp_[n]);
+	  precondition(to_comp_[n] <= ncomps_);
+	  precondition(to_comp_[p] <= (ncomps_ + 1));
+	  if (r != to_comp_[p])
+	    if (input_[n] == input_[p])
+	      {
+		if (to_comp_[p] == (ncomps_ + 1)) // first merge of p component
+		  {
+		    precondition(r < comp_value_.capacity());
+		    data_[r] += data_[to_comp_[p]];
+		    precondition(r <= ncomps_);
+		    to_comp_[p] = r;
+		  }
+		else
+		  {
+		    precondition(r < parent_.capacity());
+		    data_[parent_[to_comp_[p]]] += data_[parent_[r]];
+		    parent_[r] = parent_[to_comp_[p]];
+
+		  }
+	      }
+	}
+      };
+
+      /*!
+      ** \brief Traits specialization for flat_zone.
+      **
+      ** \param T Type of he input image.
+      ** \param DestType Data type of the output image (label type).
+      ** \param A Attribute you want to compute.
+      ** \param Exact Exact type of the flat_zone class.
+      */
+      template <typename T, typename DestType, typename A, typename Exact>
+      struct tarjan_traits<flat_zone<T, DestType, A, Exact> >
+      {
+	typedef T					input_type; ///< Type of the input image.
+	typedef typename  mute<T, DestType>::ret	output_type; ///< Type of the output image.
+	typedef A					attr_type; ///< Type of attribute to use.
+      };
+
+      /*!
+      ** \brief Namespace containing obsolete implementation of flat zone.
+      */
+      namespace obsolete {
+	/*! Create an image of label of the flat zones.
+	**
+	** \todo FIXME: many assertions are missing.
+	**
+	** \code
+	** #include <oln/basics2d.hh>
+	** #include <oln/topo/tarjan/flat-zone.hh>
+	** #include <oln/convert/stretch.hh>
+	**
+	** int main()
+	** {
+	**   typedef oln::image2d<ntg::int_u8> img_type;
+	**   img_type in = oln::load(IMG_IN "test-cmap.pgm");
+	**   oln::topo::tarjan::obsolete::flat_zone<img_type> z(in);
       **   save(oln::convert::stretch_balance<ntg::int_u8>(z.label, 0, 255),
       **        IMG_OUT "oln_topo_flat_zone.pgm");
       **  }
@@ -230,6 +382,8 @@
 
       };
 
+      } // end of namespace obsolete
+
     } // end of namespace tarjan
 
   } // end of namespace topo
Index: olena/oln/topo/combinatorial-map/cmap.hh
--- olena/oln/topo/combinatorial-map/cmap.hh Mon, 15 Mar 2004 15:32:27 +0100 van-vl_n (oln/r/36_cmap.hh 1.13 640)
+++ olena/oln/topo/combinatorial-map/cmap.hh Fri, 02 Apr 2004 16:46:39 +0200 palma_g (oln/r/36_cmap.hh 1.13 640)
@@ -44,6 +44,7 @@
 ** FIXME: The documentation is not good enough.\n
 ** FIXME: Real test are missing.
 ** FIXME: Some part of this file are inside "#if 0" comments.
+** FIXME: This file force to keep an obsolete version of flat-zone.
 */
 
 namespace oln {
@@ -72,7 +73,7 @@
       public:
 	cmap(const I& input,
 	     const inter_pixel::interpixel<I>& ip,
-	     tarjan::flat_zone<I>& cc) :
+	     tarjan::obsolete::flat_zone<I>& cc) :
 	  ndarts_(0),
 	  zeta_(input.nrows() + 1, input.ncols() + 1),
 	  cc_(cc),
@@ -358,7 +359,7 @@
       private:
 	unsigned			ndarts_;
 	zeta_type			zeta_;
-	tarjan::flat_zone<I> &		cc_;
+	tarjan::obsolete::flat_zone<I> &cc_;
 	internal::level<unsigned>	level_;
 
 	internal::beta<unsigned>	beta_;
Index: olena/oln/topo/tarjan/tarjan_with_attr.hh
--- olena/oln/topo/tarjan/tarjan_with_attr.hh Wed, 31 Mar 2004 19:11:41 +0200 palma_g (oln/m/46_tarjan_wit 1.1 644)
+++ olena/oln/topo/tarjan/tarjan_with_attr.hh Fri, 02 Apr 2004 15:57:02 +0200 palma_g (oln/m/46_tarjan_wit 1.1 644)
@@ -1,12 +1,12 @@
-// Copyright (C) 2001, 2002, 2003, 2004  EPITA Research and Development Laboratory
+// Copyright (C) 2004  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
 // 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
+// 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.
 //
@@ -42,22 +42,57 @@
   namespace topo {
     /// \brief Implementation of tarjan set.
     namespace tarjan {
+
       /// Abstract classes for tarjan based algorithms.
       namespace abstract {
 
+	/*!
+	** \brief Abstract  class to perform a tarjan  algorithm on an
+	** image with attribute computing .
+	**
+	** \param Exact Exact type of the class.
+	*/
 	template<class Exact>
 	struct tarjan_with_attr: public tarjan<mlc_exact_vt_type(tarjan_with_attr<Exact>, Exact) >
 	{
-	  typedef oln_tarjan_input_type(Exact)		input_type;
-	  typedef oln_point_type(input_type)		point_type;
-	  typedef oln_value_type(input_type)		data_type;
-
-	  typedef oln_concrete_type(input_type)		image_type;
-	  typedef oln_tarjan_output_type(Exact)		image_out_type;
-	  typedef oln_tarjan_attr_type(Exact)		attr_type;
-	  typedef attr_env_type(attr_type)		env_type;
-	  typedef oln_value_type(image_out_type)	comp_type;
+	  typedef oln_tarjan_input_type(Exact)		input_type; ///< Type of input image.
+	  typedef oln_point_type(input_type)		point_type; ///< Point type of image to process.
+	  typedef oln_value_type(input_type)		data_type; ///< Data type of the input image.
+
+	  typedef oln_concrete_type(input_type)		image_type; ///< Concrete type of the input image.
+	  typedef oln_tarjan_output_type(Exact)		image_out_type; ///< Type of output image.
+	  typedef oln_tarjan_attr_type(Exact)		attr_type; ///< Type of attribute to use.
+	  typedef attr_env_type(attr_type)		env_type; ///< Environment associated to attribute type.
+	  typedef oln_value_type(image_out_type)	comp_type; ///< Type of components.
+
+	  typedef mlc_exact_vt_type(tarjan_with_attr<Exact>,
+				    Exact)		exact_type; ///< Exact type of the class.
+	  typedef tarjan<exact_type>			super_type; ///< Type of parent class.
+
+	  // Make parent class able to call implementations.
+	  friend class super_type;
+
+	  /*!
+	  ** \brief Return the attribute value associated to a
+	  ** component \a i.
+	  */
+	  const attr_type &get_attr(const comp_type &i) const
+	    {
+	      return data_[find_root(i)];
+	    }
+
+	protected:
 
+	  /*! \brief Constructor.
+	  **
+	  ** Initialization of data structures.
+	  **
+	  ** \arg ima Image to process.
+	  ** \arg env Environment to use.
+	  **
+	  ** \warning  This  constructor  is protected,  because  this
+	  ** class is abstract.
+	  */
 	  tarjan_with_attr(const image_type &ima,
 			   const env_type &env):
 	    capacity_chunk((ima.npoints() < 100) ? ima.npoints() : (ima.npoints() / 100)),
@@ -73,30 +108,26 @@
 	    data_.reserve(capacity);
 	  }
 
-	  // abstract methods
-	  std::vector<point_type> get_processing_order()
-	  {
-	    mlc_dispatch(get_processing_order)();
-	  }
-
-	  void
-	  mark_set(const point_type &x)
-	  {
-	    mlc_dispatch(mark_set)(x);
-	  }
-
-	  void
-	  uni(const point_type& n, const point_type& p)
-	  {
-	    mlc_dispatch(uni)(n, p);
-	  }
-
-	  // tells if a point has been proceded
-	  bool is_proc(const point_type &p) const
+	  /*!
+	  ** \brief Implementation of is_proc().
+	  **
+	  ** \arg p Point you want to check.
+	  **
+	  ** \warning Do not call this method, use is_proc() instead.
+	  */
+	  bool is_proc_impl(const point_type &p) const
 	  {
 	    return to_comp_[p] != ntg_sup_val(comp_type);
 	  };
 
+	  /*!
+	  ** \brief Implementation of find_root().
+	  **
+	  ** \arg x The component you want to find the root.
+	  **
+	  ** \warning  Do  not   call  this  method,  use  find_root()
+	  ** instead.
+	  */
 	  comp_type
 	  find_root(const comp_type& x) const
 	  {
@@ -105,11 +136,17 @@
 	    return x;
 	  }
 
-	  // bool closing = true -> a closing is performed,
-	  // an opening otherwise.
+	  /*!
+	  ** \brief Implementation of get_compute().
+	  **
+	  ** \arg Ng Neighborhood to use.
+	  **
+	  ** \warning  Do  not  call  this method,  use  get_compute()
+	  ** instead.
+	  */
 	  template<class N>
 	  image_out_type
-	  get_compute(const oln::abstract::neighborhood<N> &Ng)
+	  get_compute_impl(const oln::abstract::neighborhood<N> &Ng)
 	  {
 	    std::vector<point_type>	I(get_processing_order());
 
@@ -167,20 +204,16 @@
 	    return output;
 	  }
 
-	  // access to attributes
-	  // i index of component
-	  const attr_type &get_attr(const comp_type &i) const
-	  {
-	    return data_[find_root(i)];
-	  }
-
-	  comp_type ncomps() const
+	  /*!
+	  ** \brief Implementation of ncomps_impl().
+	  **
+	  ** \warning Do not call this method, use ncomps() instead.
+	  */
+	  comp_type ncomps_impl() const
 	  {
 	    return ncomps_;
 	  }
 
-	protected:
-
 	  unsigned					capacity_chunk;
 	  unsigned					capacity;
 	  const image_type				&input_;
@@ -193,99 +226,6 @@
 	};
       } // !abstract
 
-
-
-      template<class T, class DestType, class A, class Exact = mlc::final>
-      struct cc:
-	public abstract::tarjan_with_attr<typename mlc::exact_vt<cc<T, DestType, A, Exact>,
-								 Exact>::ret>
-      {
-
-	typedef oln_point_type(T)			point_type;
-	typedef oln_value_type(T)			data_type;
-	//    typedef abstract::image<T>		image_type;
-	typedef oln_concrete_type(T) image_type;
-
-	typedef unsigned			comp_type;
-
-	typedef cc<T, DestType, A, Exact>			self_type; /*< Self type of the class.*/
-	typedef mlc_exact_vt_type(self_type, Exact)		exact_type;
-	typedef abstract::tarjan_with_attr<exact_type>		super_type;
-
-	cc(const image_type &ima,
-	   const attr_env_type(A) &env): super_type(ima, env)
-	{
-	}
-
-	std::vector<point_type> get_processing_order_impl()
-	{
-	  std::vector<point_type>	res;
-	  oln_iter_type(image_type)	it(input_);
-
-	  res.reserve(input_.npoints());
-	  for_all(it)
-	    res.push_back(it);
-	  return res;
-	}
-
-	void
-	mark_set_impl(const point_type &x)
-	{
-	  if (parent_.size() == parent_.capacity())
-	    {
-	      capacity = parent_.capacity() + capacity_chunk;
-	      parent_.reserve(capacity);
-	      comp_value_.reserve(capacity);
-	    }
-	  to_comp_[x] = ncomps_ + 1;
-	  data_.push_back(A(input_, x, env_));
-	  parent_.push_back(ncomps_ + 1);
-	  //comp_value_.push_back(input_[x]);
-	  comp_value_.push_back(ncomps_ + 1);
-	}
-
-	void
-	uni_impl(const point_type& n, const point_type& p)
-	{
-	  comp_type		r = find_root(to_comp_[n]);
-	  precondition(to_comp_[n] <= ncomps_);
-	  precondition(to_comp_[p] <= (ncomps_ + 1));
-	  if (r != to_comp_[p])
-	    if (input_[n] == input_[p])
-	      {
-		if (to_comp_[p] == (ncomps_ + 1)) // first merge of p component
-		  {
-		    precondition(r < comp_value_.capacity());
-		    //comp_value_[r] = input_[p];
-		    //		comp_value_[to_comp_[p]] = comp_value_[r];
-		    data_[r] += data_[to_comp_[p]];
-		    precondition(r <= ncomps_);
-		    to_comp_[p] = r;
-		  }
-		else
-		  {
-		    precondition(r < parent_.capacity());
-		    data_[parent_[to_comp_[p]]] += data_[parent_[r]];
-		    // 		comp_value_[parent_[to_comp_[p]]] = ntg::min(comp_value_[parent_[r]],
-		    // 							     comp_value_[parent_[to_comp_[p]]]);
-		    parent_[r] = parent_[to_comp_[p]];
-
-		  }
-	      }
-	  //      precondition(comp_value_[parent_[r]] <= 255);
-	}
-      };
-
-      // traits specialization
-      template <typename T, typename DestType, typename A, typename Exact>
-      struct tarjan_traits<cc<T, DestType, A, Exact> >
-      {
-	typedef T					input_type;
-	typedef typename  mute<T, DestType>::ret	output_type;
-	typedef A					attr_type;
-      };
-
-
     } // end of namespace tarjan
 
   } // end of namespace topo
Index: olena/oln/topo/tarjan/tarjan.hh
--- olena/oln/topo/tarjan/tarjan.hh Wed, 31 Mar 2004 19:11:41 +0200 palma_g (oln/m/47_tarjan.hh 1.1 644)
+++ olena/oln/topo/tarjan/tarjan.hh Thu, 01 Apr 2004 13:49:48 +0200 palma_g (oln/m/47_tarjan.hh 1.1 644)
@@ -1,12 +1,12 @@
-// Copyright (C) 2001, 2002, 2003, 2004  EPITA Research and Development Laboratory
+// Copyright (C) 2004  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
 // 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
+// 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.
 //
@@ -45,6 +45,7 @@
   namespace topo {
     /// \brief Implementation of tarjan set.
     namespace tarjan {
+
       /// Forward declaration for tarjan traits.
       template <typename Exact>
       struct tarjan_traits;
@@ -61,10 +62,10 @@
 	template <typename Exact>
 	struct tarjan: public mlc_hierarchy::any<Exact>
 	{
-	  typedef oln_tarjan_input_type(Exact)		input_type;
-	  typedef oln_tarjan_output_type(Exact)		image_out_type;
-	  typedef oln_value_type(image_out_type)	comp_type;
-	  typedef oln_point_type(input_type)		point_type;
+	  typedef oln_tarjan_input_type(Exact)		input_type; ///< Type of input image.
+	  typedef oln_tarjan_output_type(Exact)		image_out_type; ///< Type of output image.
+	  typedef oln_value_type(image_out_type)	comp_type; ///< Type of components.
+	  typedef oln_point_type(input_type)		point_type; ///< Point type of image to process.
 
 	  /*!
 	  ** \brief Run the algorithm.
-- 
Giovanni Palma
EPITA - promo 2005 - membre d'EpX - LRDE
Mob. : +33 (0)6 60 97 31 74
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            2
                            
                          
                          
                            
    
                          
                        
                    
                    
                        Index: olena/ChangeLog
from  Niels Van Vliet  <niels(a)lrde.epita.fr>
	* olena/oln/io/gz_stream.hh: Fix doc.
	* olena/oln/morpho/extrema.hxx: Likewise.
	* olena/oln/convol/nagao.hh: Likewise.
	* olena/oln/transforms/dwt.hh: Likewise.
+2004-04-02  Niels Van Vliet  <niels(a)lrde.epita.fr>
  	* olena/oln/morpho/laplacian.inc (laplacian): Remove slarger_t.
  	Add the parameter DestValue. Fix doc.
  	* olena/tests/morpho/tests/md5_morpho_laplacian_inc1: Change the
Index: olena/oln/io/gz_stream.hh
--- olena/oln/io/gz_stream.hh Mon, 15 Mar 2004 19:59:55 +0100 thivol_d 
(oln/f/17_gz_stream. 1.10 640)
+++ olena/oln/io/gz_stream.hh Fri, 02 Apr 2004 18:11:23 +0200 van-vl_n 
(oln/f/17_gz_stream. 1.10 640)
@@ -39,16 +39,11 @@
    namespace io {
-    /*! \namespace gz
-    ** \brief gz namespace
-    */
+    /// Functions for gz files
      namespace gz {
-      /*! \class zfilebuf
-      **
-      ** Performs operation on compressed files.
-      */
+      ///Performs operation on compressed files.
        class zfilebuf : public std::streambuf
        {
        public:
@@ -301,11 +296,7 @@
        };
-      /*! \class zfilestream_common
-      **
-      ** Define an interface for compressed file stream manipulation.
-      */
-
+      ///Define an interface for compressed file stream manipulation.
        class zfilestream_common : virtual public std::ios
        {
  	friend class zifstream;
@@ -365,10 +356,7 @@
        };
-      /*! \class zifstream
-      **
-      ** Read only zstream.
-      */
+      /// Read only zstream.
        class zifstream : public zfilestream_common, public std::istream
        {
        public:
@@ -434,10 +422,7 @@
        }
-      /*! \class zomanip
-      **
-      ** Define a pair func / val to perform manipulation on zofstream.
-      */
+      /// Define a pair func / val to perform manipulation on zofstream.
        template<class T> class zomanip
        {		
  	friend zofstream &operator<< <T>(zofstream &, const zomanip<T> &);
Index: olena/oln/morpho/extrema.hxx
--- olena/oln/morpho/extrema.hxx Thu, 18 Mar 2004 18:24:14 +0100 
van-vl_n (oln/j/4_extrema.hx 1.17 640)
+++ olena/oln/morpho/extrema.hxx Fri, 02 Apr 2004 18:08:44 +0200 
van-vl_n (oln/j/4_extrema.hx 1.17 640)
@@ -25,9 +25,7 @@
  // reasons why the executable file might be covered by the GNU General
  // Public License.
-/*!
-** \brief Internal purpose only.
-*/
+
  namespace internal {
    /*!
Index: olena/oln/transforms/dwt.hh
--- olena/oln/transforms/dwt.hh Fri, 19 Mar 2004 14:01:37 +0100 palma_g 
(oln/i/35_dwt.hh 1.2.1.4.1.12 640)
+++ olena/oln/transforms/dwt.hh Fri, 02 Apr 2004 18:24:42 +0200 van-vl_n 
(oln/i/35_dwt.hh 1.2.1.4.1.12 640)
@@ -71,9 +71,6 @@
    } // end of namespace transforms
-  /*!
-  ** \brief internal stuff.
-  */
    namespace internal
    {
      /// \brief Value of ln(2).
@@ -89,8 +86,8 @@
      template <class T, unsigned N, class Self>
      struct wavelet_coeffs_
      {
-      typedef T		value_t; ///< \brType of data used.
-      typedef Self	self_t; ///< \brief Self type.
+      typedef T		value_t; ///< Type of data used.
+      typedef Self	self_t; ///< Self type.
      public:
Index: olena/oln/convol/nagao.hh
--- olena/oln/convol/nagao.hh Sat, 27 Mar 2004 15:56:32 +0100 van-vl_n 
(oln/m/22_nagao.hh 1.2 600)
+++ olena/oln/convol/nagao.hh Fri, 02 Apr 2004 18:23:56 +0200 van-vl_n 
(oln/m/22_nagao.hh 1.2 600)
@@ -130,7 +130,7 @@
      ** Each point in the input corresponds to the mean of the
      ** window in which has the smallest variance.
      **
-    ** \paran in Input image.
+    ** \param in Input image.
      ** \param sa array of structuring elements.
      **
      ** \see oln::convol::nagao
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                    
                        Index: olena/ChangeLog
from  Niels Van Vliet  <niels(a)lrde.epita.fr>
	* olena/oln/morpho/laplacian.inc (laplacian): Remove slarger_t.
	Add the parameter DestValue. Fix doc.
	* olena/tests/morpho/tests/md5_morpho_laplacian_inc1: Change the
	test.
	* olena/oln/morpho/watershed.hh: Change the two examples.
Index: olena/oln/morpho/laplacian.inc
--- olena/oln/morpho/laplacian.inc Sun, 14 Mar 2004 18:21:09 +0100 
palma_g (oln/41_laplacian. 1.15 640)
+++ olena/oln/morpho/laplacian.inc Fri, 02 Apr 2004 17:08:37 +0200 
van-vl_n (oln/41_laplacian. 1.15 640)
@@ -38,7 +38,7 @@
  ** \code
  ** #include <oln/basics2d.hh>
  ** #include <oln/morpho/laplacian.hh>
-** #include <oln/level/compare.hh>
+** #include <oln/convert/stretch.hh>
  ** #include <ntg/all.hh>
  ** int main()
  ** {
@@ -46,11 +46,13 @@
  **
  **   im_type	im1(oln::load(IMG_IN "lena256.pgm"));
  **
-** 
oln::save(oln::morpho::fast::laplacian(oln::convert::bound<ntg::int_u8>(),
+**   oln::image2d<ntg::int_s<10> > i10 =
+**     oln::morpho::fast::laplacian(oln::convert::bound<ntg::int_s<10> >(),
  **                                          im1,
-**                                          oln::win_c8p()),
-**                                          IMG_OUT 
"oln_morpho_fast_laplacian.pbm");
-**   return  0;
+** 				 oln::win_c8p());
+**
+**   oln::save(apply(oln::convert::stretch<ntg::int_u8>(), i10),
+** 	    IMG_OUT "oln_morpho_fast_laplacian.pgm");
  ** }
  ** \endcode
  **
@@ -82,7 +84,7 @@
  ** \code
  ** #include <oln/basics2d.hh>
  ** #include <oln/morpho/laplacian.hh>
-** #include <oln/level/compare.hh>
+** #include <oln/convert/stretch.hh>
  ** #include <ntg/all.hh>
  ** int main()
  ** {
@@ -90,9 +92,17 @@
  **
  **   im_type	im1(oln::load(IMG_IN "lena256.pgm"));
  **
-** 
oln::save(oln::morpho::fast::laplacian(oln::convert::bound<ntg::int_u8>(), 
im1, oln::win_c8p()),
-**                                          IMG_OUT 
"oln_morpho_fast_laplacian_overload.pbm");
-**   return  0;
+**   oln::image2d<ntg::int_s<10> > i10 =
+**     oln::morpho::fast::laplacian(oln::convert::bound<ntg::int_s<10> >(),
+** 				 im1,
+** 				 oln::win_c8p());
+**
+**   oln::image2d<ntg::int_s<10> > f10 =
+**     oln::morpho::fast::laplacian<ntg::int_s<10> >(im1,
+** 						  oln::win_c8p());
+**
+**   oln::save(apply(oln::convert::stretch<ntg::int_u8>(),(f10)),
+** 	    IMG_OUT "oln_morpho_fast_laplacian_overload.pgm");
  ** }
  ** \endcode
  **
@@ -101,13 +111,13 @@
  ** =>
  ** \image html oln_morpho_fast_laplacian_overload.png
  ** \image latex oln_morpho_fast_laplacian_overload.png
-**
-** \todo FIXME: Call the good laplacian, and correct slarger_t type.
  */
-template<class I, class E>
-typename mute<I,oln_value_type(I)::slarger_t>::ret
+template<class DestValue, class I, class E>
+typename mute<I, DestValue>::ret
  laplacian(const abstract::non_vectorial_image<I>& input,
  	  const abstract::struct_elt<E>& se)
  {
-  return laplacian(convert::force<oln_value_type(I)::slarger_t>(), 
input, se);
+  return
+    laplacian(convert::force<DestValue>(),
+	      input, se);
  }
Index: olena/oln/morpho/watershed.hh
--- olena/oln/morpho/watershed.hh Sun, 14 Mar 2004 18:21:09 +0100 
palma_g (oln/48_watershed. 1.13 640)
+++ olena/oln/morpho/watershed.hh Fri, 02 Apr 2004 16:18:49 +0200 
van-vl_n (oln/48_watershed. 1.13 640)
@@ -65,28 +65,44 @@
      ** \code
      ** #include <oln/basics2d.hh>
      ** #include <oln/morpho/watershed.hh>
-    ** #include <oln/level/compare.hh>
      ** #include <ntg/all.hh>
+    **
+    ** #include <oln/morpho/attribute_closing_opening.hh>
+    ** #include <oln/morpho/gradient.hh>
+    ** #include <oln/convert/stretch.hh>
      ** int main()
      ** {
      **   typedef oln::image2d<ntg::int_u8>	im_type;
      **
      **   im_type	im1(oln::load(IMG_IN "lena256.pgm"));
      **
-    **   oln::save(oln::morpho::watershed_seg<ntg::int_u16>(im1,
-    ** 
oln::neighb_c4()),
-    **             IMG_OUT "oln_morpho_watershed_seg.pbm");
-    **   return  0;
+    **   // Gradient of the image
+    **   im1 = oln::morpho::beucher_gradient(im1, oln::win_c8p());
+    **
+    **   // Remove local minima smaller than 200 pixels
+    **   im1 = oln::morpho::fast::card_closing(im1, oln::neighb_c8(),
+    ** 					200);
+    **
+    **   oln::save(im1, IMG_OUT "oln_morpho_watershed_seg_tmp.pgm");
+    **
+    **   // Use the watershed to segment the image
+    **   im_type w = oln::morpho::watershed_seg<ntg::int_u8>(im1,
+    ** 						      oln::neighb_c8());
+    **
+    **   oln::save(oln::convert::stretch_balance<ntg::int_u8>(w),
+    ** 	    IMG_OUT "oln_morpho_watershed_seg.pgm");
      ** }
      ** \endcode
      **
      ** \image html lena256_pgm.png
      ** \image latex lena256_pgm.png
      ** =>
+    ** \image html oln_morpho_watershed_seg_tmp.png
+    ** \image latex oln_morpho_watershed_seg_tmp.png
+    ** =>
      ** \image html oln_morpho_watershed_seg.png
      ** \image latex oln_morpho_watershed_seg.png
      **
-    ** \todo Find a more pertinent example.
      */
      template<class DestValue, class I, class N>
      typename mute<I, DestValue>::ret
@@ -127,28 +143,43 @@
      ** \code
      ** #include <oln/basics2d.hh>
      ** #include <oln/morpho/watershed.hh>
-    ** #include <oln/level/compare.hh>
      ** #include <ntg/all.hh>
+    **
+    ** #include <oln/morpho/attribute_closing_opening.hh>
+    ** #include <oln/morpho/gradient.hh>
+    ** #include <oln/convert/stretch.hh>
      ** int main()
      ** {
      **   typedef oln::image2d<ntg::int_u8>	im_type;
      **
      **   im_type	im1(oln::load(IMG_IN "lena256.pgm"));
      **
-    **   oln::save(oln::morpho::watershed_con<ntg::int_u16>(im1,
-    ** 
oln::neighb_c4()),
-    **             IMG_OUT "oln_morpho_watershed_con.pbm");
-    **   return  0;
+    **   // Gradient of the image
+    **   im1 = oln::morpho::beucher_gradient(im1, oln::win_c8p());
+    **
+    **   // Remove local minima smaller than 200 pixels
+    **   im1 = oln::morpho::fast::card_closing(im1, oln::neighb_c8(),
+    ** 					200);
+    **
+    **   oln::save(im1, IMG_OUT "oln_morpho_watershed_con_tmp.pgm");
+    **
+    **   // Use the watershed to conment the image
+    **   im_type w = oln::morpho::watershed_con<ntg::int_u8>(im1,
+    ** 						      oln::neighb_c8());
+    **
+    **   oln::save(oln::convert::stretch_balance<ntg::int_u8>(w),
+    ** 	    IMG_OUT "oln_morpho_watershed_con.pgm");
      ** }
      ** \endcode
      **
      ** \image html lena256_pgm.png
      ** \image latex lena256_pgm.png
      ** =>
+    ** \image html oln_morpho_watershed_con_tmp.png
+    ** \image latex oln_morpho_watershed_con_tmp.png
+    ** =>
      ** \image html oln_morpho_watershed_con.png
      ** \image latex oln_morpho_watershed_con.png
-    **
-    ** \todo Find a more pertinent example.
      */
      template<class DestValue, class I, class N>
      typename mute<I, DestValue>::ret
Index: olena/tests/morpho/tests/md5_morpho_laplacian_inc1
--- olena/tests/morpho/tests/md5_morpho_laplacian_inc1 Tue, 23 Mar 2004 
14:36:33 +0100 palma_g (oln/k/48_md5_morpho 1.1 644)
+++ olena/tests/morpho/tests/md5_morpho_laplacian_inc1 Fri, 02 Apr 2004 
17:20:19 +0200 van-vl_n (oln/k/48_md5_morpho 1.1 644)
@@ -10,20 +10,21 @@
  int main()
  {
-oln::utils::key::value_type   data_key[16] = {0x1b, 0x83, 0x53, 0x90, 
0xbf, 0xb6, 0x68, 0xad, 0xb3, 0xae, 0xfa, 0xfc, 0xfc, 0x6a, 0x1e, 0x27};
+  oln::utils::key::value_type data_key[16] = {0xbd, 0x5a, 0x43, 0x38, 0x1b,
+					      0xd3, 0xc1, 0x76, 0x52, 0x8b,
+					      0x43, 0xcc, 0xf4, 0x12, 0x6c,
+					      0xa3};
  oln::utils::key		   key(data_key);
-   typedef oln::image2d<ntg::
-int_u8>	im_type;
+  typedef oln::image2d<ntg::int_u8>	im_type;
     im_type	im1(oln::load(rdata("lena256.pgm")));
-   if 
(oln::utils::md5(oln::morpho::fast::laplacian(oln::convert::bound<ntg::
-int_u8>(), im1, oln::win_c8p())) == key)
+   if (oln::utils::md5(oln::morpho::fast::laplacian<ntg::int_s<10> >
+		       (im1, oln::win_c8p())) == key)
    std::cout << "OK" << std::endl;
  else
    {
      std::cout << "FAIL" << std::endl;
      return true;
    }
-   return  0;
   }
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                    
                        Index: olena/ChangeLog
from  Niels Van Vliet  <niels(a)lrde.epita.fr>
	* olena/oln/core/image1d.hh: Return exact_type in clone_.
	* olena/oln/core/image2d.hh: Likewise.
	* olena/oln/core/image3d.hh: Likewise.
	* olena/oln/core/neighborhood2d.hh: Remove a FIXME. Remove operator=.
	* olena/oln/core/window2d.hh: Likewise.
	* olena/oln/core/w_window2d.hh: Add comments.
	* olena/oln/level/cc.hh: Remove headers.
	* olena/oln/morpho/top_hat.inc: Remove a FIXME.
	* olena/tests/morpher/tests/sq_morph: New file, contains sub
	quantifying morpher tests.
	* olena/tests/morpher/tests/color_morph: New file, contains color
Index: olena/oln/core/image1d.hh
--- olena/oln/core/image1d.hh Fri, 12 Mar 2004 20:17:58 +0100 thivol_d 
(oln/c/47_image1d.hh 1.28.1.2 640)
+++ olena/oln/core/image1d.hh Fri, 02 Apr 2004 12:27:27 +0200 van-vl_n 
(oln/c/47_image1d.hh 1.28.1.2 640)
@@ -208,19 +208,11 @@
    protected:
-    /*! \brief Return a deep copy of the current image.
-    **
-    ** \warning It may be really dangerous to instantiate a self_type
-    ** and not an exact_type if Exact != mlc::final.
-    **
-    ** \todo FIXME: It may be really dangerous to instantiate a self_type
-    ** and not an exact_type if Exact != mlc::final.
-    */
-
-    self_type
-    clone_() const // deep copy
+    /// Return a deep copy of the current image.
+    exact_type
+    clone_() const
      {
-      self_type output(this->ncols(), this->border());
+      exact_type output(this->ncols(), this->border());
        clone_to(output.impl());
        return output;
      }
Index: olena/oln/core/image2d.hh
--- olena/oln/core/image2d.hh Fri, 12 Mar 2004 20:17:58 +0100 thivol_d 
(oln/c/45_image2d.hh 1.30.1.2 640)
+++ olena/oln/core/image2d.hh Fri, 02 Apr 2004 12:28:23 +0200 van-vl_n 
(oln/c/45_image2d.hh 1.30.1.2 640)
@@ -210,19 +210,11 @@
    protected:
-    /*! \brief Return a deep copy of the current image.
-    **
-    ** \warning It may be really dangerous to instantiate a self_type
-    ** and not an exact_type if Exact != mlc::final.
-    **
-    ** \todo FIXME: It may be really dangerous to instantiate a self_type
-    ** and not an exact_type is Exact != mlc::final.
-    */
-
-    self_type
-    clone_() const // deep copy
+    /// Return a deep copy of the current image.
+    exact_type
+    clone_() const
      {
-      self_type output(this->nrows(), this->ncols(), this->border());
+      exact_type output(this->nrows(), this->ncols(), this->border());
        clone_to(output.impl());
        return output;
      }
Index: olena/oln/core/image3d.hh
--- olena/oln/core/image3d.hh Fri, 12 Mar 2004 20:17:58 +0100 thivol_d 
(oln/c/43_image3d.hh 1.27.1.2 640)
+++ olena/oln/core/image3d.hh Fri, 02 Apr 2004 12:28:17 +0200 van-vl_n 
(oln/c/43_image3d.hh 1.27.1.2 640)
@@ -208,19 +208,12 @@
    protected:
-    /*! \brief Return a deep copy of the current image.
-    **
-    ** \warning It may be really dangerous to instantiate a self_type
-    ** and not an exact_type if Exact != mlc::final.
-    **
-    ** \todo FIXME: It may be really dangerous to instantiate a self_type
-    ** and not an exact_type is Exact != mlc::final.
-    */
-
-    self_type
-    clone_() const // deep copy
+    /// Return a deep copy of the current image.
+    exact_type
+    clone_() const
      {
-      self_type output(this->nslices(), this->nrows(), this->ncols(), 
this->border());
+      exact_type output(this->nslices(), this->nrows(),
+			this->ncols(), this->border());
        clone_to(output.impl());
        return output;
      }
Index: olena/oln/core/neighborhood2d.hh
--- olena/oln/core/neighborhood2d.hh Mon, 29 Mar 2004 09:53:11 +0200 
odou_s (oln/c/36_neighborho 1.20 640)
+++ olena/oln/core/neighborhood2d.hh Fri, 02 Apr 2004 13:28:46 +0200 
van-vl_n (oln/c/36_neighborho 1.20 640)
@@ -141,24 +141,12 @@
  	add(dpoint_type(crd[i], crd[i+1]));
      }
-    // io
-    /*!
-    ** \todo FIXME: it doesn't seem useful. We may remove it
-    */
+    // Constructor used in io functions.
      neighborhood2d(const io::internal::anything& r) : super_type()
      {
        r.assign(*this);
      }
-    /*!
-    ** \todo FIXME: it doesn't seem useful. We may remove it
-    */
-    neighborhood2d&
-    operator=(const io::internal::anything& r)
-    {
-      return r.assign(*this);
-    }
-
      /// Return the name of the type.
      static std::string
      name()
Index: olena/oln/core/window2d.hh
--- olena/oln/core/window2d.hh Mon, 29 Mar 2004 09:53:11 +0200 odou_s 
(oln/c/14_window2d.h 1.21 640)
+++ olena/oln/core/window2d.hh Fri, 02 Apr 2004 15:47:03 +0200 van-vl_n 
(oln/c/14_window2d.h 1.21 640)
@@ -142,24 +142,12 @@
  	add(dpoint_type(crd[i], crd[i+1]));
      }
-    // io
-    /*!
-    ** \todo FIXME: it doesn't seem useful. We may remove it
-    */
+    // This constructor is used by functions of io
      window2d(const io::internal::anything& r) : super_type()
      {
        r.assign(*this);
      }
-    /*!
-    ** \todo FIXME: it doesn't seem useful. We may remove it
-    */
-    window2d&
-    operator=(const io::internal::anything& r)
-    {
-      return r.assign(*this);
-    }
-
      /// Return the name of the type.
      static std::string
      name()
Index: olena/oln/core/w_window2d.hh
--- olena/oln/core/w_window2d.hh Mon, 29 Mar 2004 09:53:11 +0200 odou_s 
(oln/c/18_w_window2d 1.6.1.15 640)
+++ olena/oln/core/w_window2d.hh Fri, 02 Apr 2004 15:47:40 +0200 
van-vl_n (oln/c/18_w_window2d 1.6.1.15 640)
@@ -115,6 +115,7 @@
      ** \arg arr The array of elements.
      ** \todo FIXME: this constructor is not in w_window1d.hh nor 
w_window3d.hh.
      ** Is it really useful ?
+    ** This constructor is used to build a chamfer distance.
      */
      template<class I, class T2>
      w_window2d(const mlc::array2d<I, T2 >& arr) :
Index: olena/oln/level/cc.hh
--- olena/oln/level/cc.hh Tue, 23 Mar 2004 13:37:46 +0100 van-vl_n 
(oln/e/20_cc.hh 1.11.1.15 640)
+++ olena/oln/level/cc.hh Fri, 02 Apr 2004 11:58:33 +0200 van-vl_n 
(oln/e/20_cc.hh 1.11.1.15 640)
@@ -32,19 +32,12 @@
    Connected components.
  */
-# include <oln/basics.hh>
-// FIXME: really need all ?
  # include <oln/arith/ops.hh>
-# include <mlc/optional.hh>
-# include <ntg/all.hh>
+# include <oln/core/image.hh>
  # include <oln/level/fill.hh>
-# include <oln/level/invert.hh>
-# include <oln/level/compare.hh>
  # include <set>
-# include <ntg/core/macros.hh>
-# include <mlc/is_a.hh>
  namespace oln {
    /*! \brief Level algorithm implementation.
Index: olena/oln/morpho/top_hat.inc
--- olena/oln/morpho/top_hat.inc Thu, 18 Mar 2004 18:24:14 +0100 
van-vl_n (oln/39_top_hat.in 1.16 640)
+++ olena/oln/morpho/top_hat.inc Fri, 02 Apr 2004 15:15:20 +0200 
van-vl_n (oln/39_top_hat.in 1.16 640)
@@ -375,7 +375,6 @@
  ** \image html oln_morpho_fast_top_hat_contrast_op_overload.png
  ** \image latex oln_morpho_fast_top_hat_contrast_op_overload.png
  **
-** \todo FIXME: Seems not to work with convert::force converter.
  */
  template<class I, class E>
  oln_concrete_type(I)
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                    
                        Index: metalic/ChangeLog
from  Giovanni Palma  <giovanni(a)lrde.epita.fr>
	* mlc/type.hh: Remove static cast.
Index: metalic/mlc/type.hh
--- metalic/mlc/type.hh Mon, 09 Feb 2004 18:57:03 +0100 palma_g (oln/c/21_type.hh 1.28 640)
+++ metalic/mlc/type.hh Thu, 01 Apr 2004 11:33:02 +0200 palma_g (oln/c/21_type.hh 1.28 640)
@@ -1,4 +1,4 @@
-// Copyright (C) 2001, 2002, 2003  EPITA Research and Development Laboratory
+// Copyright (C) 2001, 2002, 2003, 2004  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
@@ -70,7 +70,7 @@
   private:
     // This stores the actual value of the offset between the this
     // pointer and the address of the exact type. This enables diamond
-    // shaped hierarchies (static_cast can't and reinterpret_cast or
+    // shaped hierarchies (static_cas can't and reinterpret_cast or
     // (Exact*)(void*) cast are unsafe and compiler dependent).
     static const int exact_offset;
 
@@ -105,8 +105,8 @@
   public:
     typedef E exact_type;
 
-    E& exact()             { return static_cast<E&>(*this); }
-    const E& exact() const { return static_cast<const E&>(*this); }
+    E& exact()             { return dynamic_cast<E&>(*this); }
+    const E& exact() const { return dynamic_cast<const E&>(*this); }
 
     static std::string name()
     {
@@ -169,7 +169,7 @@
 	{
 	  mlc_hierarchy::any_with_diamond<E>::exact_offset =
 	    (const char*)
-	    static_cast<const mlc_hierarchy::any_with_diamond<E>*>(t)
+	    dynamic_cast<const mlc_hierarchy::any_with_diamond<E>*>(t)
 	    - (const char*) t;
 	  mlc_hierarchy::any_with_diamond<E>::offset_assigned = true;
 	}
-- 
Giovanni Palma
EPITA - promo 2005 - membre d'EpX - LRDE
Mob. : +33 (0)6 60 97 31 74
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            1
                            
                          
                          
                            
    
                          
                        
                    
                    
                        Index: olena/ChangeLog
from  Giovanni Palma  <giovanni(a)lrde.epita.fr>
	* oln/convert/stretch.hh: Add header inclusion.
	* oln/topo/tarjan/tarjan.hh: Add file.
	* oln/topo/tarjan/tarjan_with_attr.hh: Add file.
	* oln/morpho/attributes.hh: Add new attribute.
Index: olena/oln/convert/stretch.hh
--- olena/oln/convert/stretch.hh Sun, 14 Mar 2004 19:03:34 +0100 van-vl_n (oln/f/51_stretch.hh 1.17 600)
+++ olena/oln/convert/stretch.hh Tue, 30 Mar 2004 12:00:36 +0200 palma_g (oln/f/51_stretch.hh 1.17 640)
@@ -30,6 +30,8 @@
 
 # include <mlc/type.hh>
 
+# include <oln/basics.hh>
+
 # include <ntg/basics.hh>
 
 # include <oln/convert/abstract/conversion.hh>
Index: olena/oln/morpho/attributes.hh
--- olena/oln/morpho/attributes.hh Sat, 27 Mar 2004 15:56:32 +0100 van-vl_n (oln/j/45_attributes 1.11 600)
+++ olena/oln/morpho/attributes.hh Tue, 30 Mar 2004 13:55:31 +0200 palma_g (oln/j/45_attributes 1.11 644)
@@ -138,6 +138,17 @@
 	};
 
 	/*!
+	** \brief "<" operator
+	**
+	** This is a static dispatcher for the "<" operator.
+	** This method is abstract.
+	*/
+	bool operator<(const exact_type &x) const
+	{
+	  mlc_dispatch(less2)(x);
+	};
+
+	/*!
 	** \brief != operator
 	**
 	** This is a static dispatcher for the != operator.
@@ -149,6 +160,16 @@
 	};
 
 	/*!
+	** \brief conversion to lambda type.
+	**
+	** \warning Virtual method.
+	*/
+	const lambda_type &toLambda() const
+	{
+	  mlc_dispatch(toLambda)();
+	};
+
+	/*!
 	** \brief >= operator implementation.
 	**
 	** This is an implementation  of the >= operator.  Override this
@@ -160,6 +181,20 @@
 	  return !(*this < lambda);
 	};
 
+	/*!
+	** \brief "<" operator implementation.
+	**
+	** This is an implementation  of the < operator.  Override this
+	** method to provide a new implementation of this operator.
+	** \warning This method SHOULDN'T be called.
+	*/
+	bool less2_impl(const exact_type &x) const
+	{
+	  return *this < x.toLambda();
+	};
+
+
+
       protected:
 	attribute() {};
 
@@ -249,14 +284,70 @@
 	    return lambda != value_;
 	  };
 
+	/*!
+	** \brief conversion to lambda type implementation.
+	**
+	** This  is  an   implementation  of  the  toLambda()  method.
+	** Override  this method  to provide  a new  implementation.
+	** \warning This method SHOULDN'T be called .
+	*/
+	const lambda_type &toLambda_impl() const
+	{
+	  return value_;
+	};
+
       protected:
 	value_type value_; /*!< Value used inside the class. */
       };
 
+      /*-------------------------------*
+	| card with info on other image |
+	*------------------------------*/
+      template <class I, class T = unsigned, class Exact = mlc::final>
+      class card_full_type: public card_type<T,
+					     typename mlc::exact_vt<card_full_type<I,
+										   T,
+										   Exact>,
+								    Exact>::ret>
+      {
+      public:
+	typedef card_full_type<I, T, Exact>			self_type; /*!< Self type of the class. */
+	attr_type_decl(self_type);
+	typedef card_type<T, exact_type>			super_type; ///< Parent class type.
+
+	/*!
+	** \brief Basic Ctor.
+	**
+	** \warning  After this  call, the  object is  only instantiated
+	** (not initialized).
+	*/
+	card_full_type(): super_type()
+	  {
+	  };
+
+	/*!
+	** \brief Ctor from a lambda_type value.
+	*/
+	card_full_type(const lambda_type &lambda): super_type(lambda)
+	  {
+	  };
 
-      /*-----------*
+	/*!
+	** \brief Ctor from a point and an image.
+	**
+	** Every parameters are useless.
+	*/
+	template <class I2>
+	  card_full_type(const abstract::image<I2> &im,
+		    const oln_point_type(I2) &p,
+		    const env_type &env): super_type(im, p, env)
+	  {
+	  };
+      };
+
+      /*--------------*
 	|  integral   |
-	*-----------*/
+	*------------*/
 
       /*!
       ** \brief Integral attribute.
@@ -1701,6 +1792,17 @@
       };
 
       /*!
+      ** \brief Trait specialization for card_full attribute.
+      */
+      template <class I, class T, class Exact>
+      struct attr_traits<card_full_type<I, T, Exact> >
+      {
+	typedef T			value_type; ///< Type of data.
+	typedef value_type		lambda_type; ///< Type of lambda.
+	typedef env::OtherImageEnv<I>	env_type; ///< Type of environment.
+      };
+
+      /*!
       ** \brief Trait specialization for the maxvalue attribute.
       */
       template <class T, class Exact>
Index: olena/oln/topo/tarjan/tarjan_with_attr.hh
--- olena/oln/topo/tarjan/tarjan_with_attr.hh Wed, 31 Mar 2004 19:11:06 +0200 palma_g ()
+++ olena/oln/topo/tarjan/tarjan_with_attr.hh Wed, 31 Mar 2004 18:50:19 +0200 palma_g (oln/m/46_tarjan_wit  644)
@@ -0,0 +1,295 @@
+// Copyright (C) 2001, 2002, 2003, 2004  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
+// 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, 59 Temple Place - Suite 330, 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.  This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef OLENA_TOPO_TARJAN_TARJAN_WITH_ATTR_HH
+# define OLENA_TOPO_TARJAN_TARJAN_WITH_ATTR_HH
+
+# include <oln/topo/tarjan/tarjan.hh>
+# include <oln/morpho/attributes.hh>
+# include <ntg/basics.hh>
+# include <oln/level/fill.hh>
+# include <oln/utils/histogram.hh>
+
+# include <vector>
+# include <map>
+
+namespace oln {
+
+  namespace topo {
+    /// \brief Implementation of tarjan set.
+    namespace tarjan {
+      /// Abstract classes for tarjan based algorithms.
+      namespace abstract {
+
+	template<class Exact>
+	struct tarjan_with_attr: public tarjan<mlc_exact_vt_type(tarjan_with_attr<Exact>, Exact) >
+	{
+	  typedef oln_tarjan_input_type(Exact)		input_type;
+	  typedef oln_point_type(input_type)		point_type;
+	  typedef oln_value_type(input_type)		data_type;
+
+	  typedef oln_concrete_type(input_type)		image_type;
+	  typedef oln_tarjan_output_type(Exact)		image_out_type;
+	  typedef oln_tarjan_attr_type(Exact)		attr_type;
+	  typedef attr_env_type(attr_type)		env_type;
+	  typedef oln_value_type(image_out_type)	comp_type;
+
+	  tarjan_with_attr(const image_type &ima,
+			   const env_type &env):
+	    capacity_chunk((ima.npoints() < 100) ? ima.npoints() : (ima.npoints() / 100)),
+	    capacity(capacity_chunk),
+	    input_(ima),
+	    parent_(),
+	    to_comp_(ima.size()),
+	    comp_value_(),
+	    env_(env)
+	  {
+	    parent_.reserve(capacity);
+	    comp_value_.reserve(capacity);
+	    data_.reserve(capacity);
+	  }
+
+	  // abstract methods
+	  std::vector<point_type> get_processing_order()
+	  {
+	    mlc_dispatch(get_processing_order)();
+	  }
+
+	  void
+	  mark_set(const point_type &x)
+	  {
+	    mlc_dispatch(mark_set)(x);
+	  }
+
+	  void
+	  uni(const point_type& n, const point_type& p)
+	  {
+	    mlc_dispatch(uni)(n, p);
+	  }
+
+	  // tells if a point has been proceded
+	  bool is_proc(const point_type &p) const
+	  {
+	    return to_comp_[p] != ntg_sup_val(comp_type);
+	  };
+
+	  comp_type
+	  find_root(const comp_type& x) const
+	  {
+	    if (parent_[x] != x)
+	      return parent_[x] = find_root(parent_[x]);
+	    return x;
+	  }
+
+	  // bool closing = true -> a closing is performed,
+	  // an opening otherwise.
+	  template<class N>
+	  image_out_type
+	  get_compute(const oln::abstract::neighborhood<N> &Ng)
+	  {
+	    std::vector<point_type>	I(get_processing_order());
+
+	    level::fill(to_comp_, ntg_sup_val(comp_type));
+	    to_comp_.border_adapt_assign(Ng.delta(), ntg_sup_val(comp_type));
+	    ncomps_ = 0;
+	    parent_.push_back(0);
+	    comp_value_.push_back(0);
+	    data_.push_back(attr_type());
+
+	    // We are ready to perform stuff
+	    for (unsigned int p = 0; p < I.size(); ++p)
+	      {
+		point_type p_p = I[p];
+		mark_set(p_p);
+
+		oln_neighb_type(N) Q_prime(Ng, p_p);
+		for_all (Q_prime)
+		  if (is_proc(Q_prime))
+		    uni(Q_prime.cur(), p_p);
+		if (to_comp_[p_p] == (ncomps_ + 1)) // new component
+		  ++ncomps_;
+		else
+		  {
+		    comp_value_.pop_back();
+		    parent_.pop_back();
+		    data_.pop_back();
+		  }
+	      }
+
+	    // Resolving phase
+	    std::map<comp_type, comp_type>		cmps;
+	    comp_type				nc = 0;
+	    ncomps_ = 0;
+	    //	unsigned i = 0;
+	    for (int p = I.size() - 1; p >= 0; --p)
+	      {
+		point_type p_p = I[p];
+		if (cmps.find(comp_value_[find_root(to_comp_[p_p])]) == cmps.end())
+		  {
+		    ++ncomps_;
+		    //		++i;
+		    //		std::cout << "new component\n";
+		    cmps[comp_value_[find_root(to_comp_[p_p])]] = nc;
+		    comp_value_[find_root(to_comp_[p_p])] = nc++;
+		  }
+	      }
+	    //	std::cout << i << " components\n";
+	    image_out_type output(input_.size());
+	    for (int p = I.size() - 1; p >= 0; --p)
+	      {
+		point_type p_p = I[p];
+		output[p_p] = comp_value_[find_root(to_comp_[p_p])];
+	      }
+	    return output;
+	  }
+
+	  // access to attributes
+	  // i index of component
+	  const attr_type &get_attr(const comp_type &i) const
+	  {
+	    return data_[find_root(i)];
+	  }
+
+	  comp_type ncomps() const
+	  {
+	    return ncomps_;
+	  }
+
+	protected:
+
+	  unsigned					capacity_chunk;
+	  unsigned					capacity;
+	  const image_type				&input_;
+	  mutable std::vector<comp_type>			parent_;
+	  typename oln::mute<input_type, comp_type>::ret		to_comp_;// comp number from a point
+	  comp_type					ncomps_;
+	  std::vector<oln_value_type(image_out_type)>	comp_value_;
+	  std::vector<attr_type>			data_;
+	  env_type					env_;
+	};
+      } // !abstract
+
+
+
+      template<class T, class DestType, class A, class Exact = mlc::final>
+      struct cc:
+	public abstract::tarjan_with_attr<typename mlc::exact_vt<cc<T, DestType, A, Exact>,
+								 Exact>::ret>
+      {
+
+	typedef oln_point_type(T)			point_type;
+	typedef oln_value_type(T)			data_type;
+	//    typedef abstract::image<T>		image_type;
+	typedef oln_concrete_type(T) image_type;
+
+	typedef unsigned			comp_type;
+
+	typedef cc<T, DestType, A, Exact>			self_type; /*< Self type of the class.*/
+	typedef mlc_exact_vt_type(self_type, Exact)		exact_type;
+	typedef abstract::tarjan_with_attr<exact_type>		super_type;
+
+	cc(const image_type &ima,
+	   const attr_env_type(A) &env): super_type(ima, env)
+	{
+	}
+
+	std::vector<point_type> get_processing_order_impl()
+	{
+	  std::vector<point_type>	res;
+	  oln_iter_type(image_type)	it(input_);
+
+	  res.reserve(input_.npoints());
+	  for_all(it)
+	    res.push_back(it);
+	  return res;
+	}
+
+	void
+	mark_set_impl(const point_type &x)
+	{
+	  if (parent_.size() == parent_.capacity())
+	    {
+	      capacity = parent_.capacity() + capacity_chunk;
+	      parent_.reserve(capacity);
+	      comp_value_.reserve(capacity);
+	    }
+	  to_comp_[x] = ncomps_ + 1;
+	  data_.push_back(A(input_, x, env_));
+	  parent_.push_back(ncomps_ + 1);
+	  //comp_value_.push_back(input_[x]);
+	  comp_value_.push_back(ncomps_ + 1);
+	}
+
+	void
+	uni_impl(const point_type& n, const point_type& p)
+	{
+	  comp_type		r = find_root(to_comp_[n]);
+	  precondition(to_comp_[n] <= ncomps_);
+	  precondition(to_comp_[p] <= (ncomps_ + 1));
+	  if (r != to_comp_[p])
+	    if (input_[n] == input_[p])
+	      {
+		if (to_comp_[p] == (ncomps_ + 1)) // first merge of p component
+		  {
+		    precondition(r < comp_value_.capacity());
+		    //comp_value_[r] = input_[p];
+		    //		comp_value_[to_comp_[p]] = comp_value_[r];
+		    data_[r] += data_[to_comp_[p]];
+		    precondition(r <= ncomps_);
+		    to_comp_[p] = r;
+		  }
+		else
+		  {
+		    precondition(r < parent_.capacity());
+		    data_[parent_[to_comp_[p]]] += data_[parent_[r]];
+		    // 		comp_value_[parent_[to_comp_[p]]] = ntg::min(comp_value_[parent_[r]],
+		    // 							     comp_value_[parent_[to_comp_[p]]]);
+		    parent_[r] = parent_[to_comp_[p]];
+
+		  }
+	      }
+	  //      precondition(comp_value_[parent_[r]] <= 255);
+	}
+      };
+
+      // traits specialization
+      template <typename T, typename DestType, typename A, typename Exact>
+      struct tarjan_traits<cc<T, DestType, A, Exact> >
+      {
+	typedef T					input_type;
+	typedef typename  mute<T, DestType>::ret	output_type;
+	typedef A					attr_type;
+      };
+
+
+    } // end of namespace tarjan
+
+  } // end of namespace topo
+
+} // end of namespace oln
+
+#endif // ! OLENA_TOPO_TARJAN_TARJAN_WITH_ATTR_HH
Index: olena/oln/topo/tarjan/tarjan.hh
--- olena/oln/topo/tarjan/tarjan.hh Wed, 31 Mar 2004 19:11:06 +0200 palma_g ()
+++ olena/oln/topo/tarjan/tarjan.hh Wed, 31 Mar 2004 18:42:56 +0200 palma_g (oln/m/47_tarjan.hh  644)
@@ -0,0 +1,153 @@
+// Copyright (C) 2001, 2002, 2003, 2004  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
+// 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, 59 Temple Place - Suite 330, 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.  This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef OLENA_TOPO_TARJAN_TARJAN_HH
+# define OLENA_TOPO_TARJAN_TARJAN_HH
+# include <oln/basics.hh>
+
+// Macros for extract information on tarjan algorithms.
+# define oln_tarjan_input_type(T) typename oln::topo::tarjan::tarjan_traits<T>::input_type
+# define oln_tarjan_output_type(T) typename oln::topo::tarjan::tarjan_traits<T>::output_type
+# define oln_tarjan_attr_type(T) typename oln::topo::tarjan::tarjan_traits<T>::attr_type
+
+
+// # define oln_tarjan_input_type(T) typename oln::topo::tarjan::tarjan_traits<mlc_exact_type(T)>::input_type
+// # define oln_tarjan_output_type(T) typename oln::topo::tarjan::tarjan_traits<mlc_exact_type(T)>::output_type
+// # define oln_tarjan_attr_type(T) typename oln::topo::tarjan::tarjan_traits<mlc_exact_type(T)>::attr_type
+
+
+namespace oln {
+
+  namespace topo {
+    /// \brief Implementation of tarjan set.
+    namespace tarjan {
+      /// Forward declaration for tarjan traits.
+      template <typename Exact>
+      struct tarjan_traits;
+
+      /// Abstract classes for tarjan based algorithms.
+      namespace abstract {
+	/*!
+	** \brief Top of tarjan hierarchy.
+	**
+	** \param I Type of image to process.
+	** \param D Type of data of the wanted image.
+	** \param Exact Exact type of the class.
+	*/
+	template <typename Exact>
+	struct tarjan: public mlc_hierarchy::any<Exact>
+	{
+	  typedef oln_tarjan_input_type(Exact)		input_type;
+	  typedef oln_tarjan_output_type(Exact)		image_out_type;
+	  typedef oln_value_type(image_out_type)	comp_type;
+	  typedef oln_point_type(input_type)		point_type;
+
+	  /*!
+	  ** \brief Run the algorithm.
+	  **
+	  **
+	  ** \warning Implement get_compute_impl to be able to use
+	  ** this method.
+	  */
+	  template<class N>
+	  image_out_type
+	  get_compute(const oln::abstract::neighborhood<N> &Ng)
+	  {
+	    mlc_dispatch(get_compute)(Ng);
+	  }
+
+	  /*!
+	  ** \brief Give the number of component found.
+	  **
+	  ** \warning Implement ncomps_impl to be able to use
+	  ** this method.
+	  */
+	  comp_type ncomps() const
+	  {
+	    mlc_dispatch(ncomps)();
+	  }
+
+	protected:
+	  /*!
+	  ** \brief Abstract method to get the processing order.
+	  **
+	  ** \warning Implement get_processing_order_impl to be able
+	  ** to use this method.
+	  */
+	  std::vector<point_type>
+	  get_processing_order()
+	  {
+	    mlc_dispatch(get_processing_order)();
+	  }
+
+	  /*!
+	  ** \brief Mark a point as a new component.
+	  **
+	  ** \warning Implement mark_set_impl to be able to use this
+	  ** method.
+	  */
+	  void
+	  mark_set(const point_type &x)
+	  {
+	    mlc_dispatch(mark_set)(x);
+	  }
+
+	  /*!
+	  ** \brief Perform an union between two components.
+	  **
+	  ** \warning Implement uni_impl to be able to use this
+	  ** method.
+	  */
+	  void
+	  uni(const point_type& n, const point_type& p)
+	  {
+	    mlc_dispatch(uni)(n, p);
+	  }
+
+	  /*!
+	  ** \brief tell if a point has already been processed.
+	  **
+	  **
+	  ** \warning Implement is_proc_impl to be able to use this
+	  ** method.
+	  */
+	  bool is_proc(const point_type &p) const
+	  {
+	    mlc_dispatch(is_proc)(p);
+	  };
+
+	  /*!
+	  ** \brief Make the class abstract.
+	  */
+	  tarjan() {}
+	};
+      } // end of namespace abstract
+    } // end of namespace tarjan
+  } // end of namespace topo
+} // end of namespace oln
+
+#endif // ! OLENA_TOPO_TARJAN_TARJAN_HH
-- 
Giovanni Palma
EPITA - promo 2005 - membre d'EpX - LRDE
Mob. : +33 (0)6 60 97 31 74
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            3
                            
                          
                          
                            
    
                          
                        
                    
                    
                        
Index: olena/ChangeLog
from  Damien Thivolle  <damien(a)lrde.epita.fr>
	* olena/oln/Makefile.am: Add files from oln/morpher/
	* olena/oln/morpher/generic_morpher.hh: Correct comments and code.
	* olena/oln/morpher/subq_morpher.hh: Likewise.
	* olena/oln/morpher/color_morpher.hh: Likewise.
	* olena/tests/morpher/tests/compose_morph: New file, contains
	morpher composition tests.
	* olena/tests/morpher/tests/sq_morph: New file, contains sub quantifying
	morpher tests.
	* olena/tests/morpher/tests/color_morph: New file, contains color morpher
	tests.
	* olena/tests/morpher/tests/sq_morph_8: Remove file.
	* olena/tests/morpher/tests/sq_morph_7: Likewise.
	* olena/tests/morpher/tests/sq_morph_6: Likewise.
	* olena/tests/morpher/tests/sq_morph_5: Likewise.
	* olena/tests/morpher/tests/sq_morph_4: Likewise.
	* olena/tests/morpher/tests/sq_morph_3: Likewise.
	* olena/tests/morpher/tests/sq_morph_2: Likewise.
	* olena/tests/morpher/tests/sq_morph_1: Likewise.
	* olena/tests/morpher/tests/rmorph: Likewise.
	* olena/tests/morpher/tests/gmorph: Likewise.
	* olena/tests/morpher/tests/color_sq_morph: Likewise.
	* olena/tests/morpher/tests/bmorph: Likewise.
Index: olena/oln/Makefile.am
--- olena/oln/Makefile.am Fri, 19 Mar 2004 17:28:35 +0100 palma_g (oln/q/47_Makefile.a 1.3.1.1.1.6.1.7.1.3 640)
+++ olena/oln/Makefile.am Tue, 30 Mar 2004 19:28:29 +0200 thivol_d (oln/q/47_Makefile.a 1.3.1.1.1.6.1.7.1.3 640)
@@ -146,6 +146,9 @@
   level/set_level.hh				\
   level/threshold.hh				\
   math/macros.hh				\
+  morpher/color_morpher.hh			\
+  morpher/generic_morpher.hh			\
+  morpher/subq_morpher.hh			\
   morpho/attribute_closing_opening.hh		\
   morpho/attribute_closing_opening_map.hxx	\
   morpho/attribute_closing_opening_map.hh	\
Index: olena/oln/morpher/generic_morpher.hh
--- olena/oln/morpher/generic_morpher.hh Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/18_generic_mo 1.3 600)
+++ olena/oln/morpher/generic_morpher.hh Tue, 30 Mar 2004 19:21:21 +0200 thivol_d (oln/m/18_generic_mo 1.3 600)
@@ -27,8 +27,8 @@
 
 
 
-#ifndef GENERIC_MORPHER_HH
-# define GENERIC_MORPHER_HH
+#ifndef OLENA_MORPHER_GENERIC_MORPHER_HH
+# define OLENA_MORPHER_GENERIC_MORPHER_HH
 
 # include <string>
 
@@ -38,17 +38,11 @@
 
 namespace oln {
 
-  /*! \namespace oln::morpher
-  **
-  ** Contain all the morpher relative declarations and functions.
-  */
+  /// Contain all the morpher relative declarations and functions.
 
   namespace morpher {
 
-    /*! \namespace oln::morpher::abstract
-    **
-    ** Implementation of oln::abstract::generic_morpher.
-    */
+    /// Implementation of oln::abstract::generic_morpher.
 
     namespace abstract {
 
@@ -115,33 +109,52 @@
 
       public:
 
+	/// The self type.
 	typedef generic_morpher<DestType, SrcType, Exact> self_type;
+
+	/// The exact type of the morpher.
 	typedef Exact exact_type;
+	/// The morpher point type.
 	typedef oln_point_type(DestType) point_type;
+	/// The morpher dpoint type.
 	typedef oln_dpoint_type(DestType) dpoint_type;
+	/// The morpher iterator type.
 	typedef oln_iter_type(DestType) iter_type;
+	/// The morpher forward iterator type.
 	typedef oln_fwd_iter_type(DestType) fwd_iter_type;
+	/// The morpher backward iterator type.
 	typedef oln_bkd_iter_type(DestType) bkd_iter_type;
+	/// The morpher value type.
 	typedef oln_value_type(DestType) value_type;
+	/// The morpher size type.
 	typedef oln_size_type(DestType) size_type;
+	/// The morpher underlying implementation.
 	typedef oln_impl_type(DestType) impl_type;
 
 
 	/// Type of the decorated image.
 	typedef SrcType src_self_type;
+	/// The decorated image point type.
 	typedef oln_point_type(SrcType) src_point_type;
+	/// The decorated image dpoint type.
 	typedef oln_dpoint_type(SrcType) src_dpoint_type;
+	/// The decorated image iterator type.
 	typedef oln_iter_type(SrcType) src_iter_type;
+	/// The decorated image forward iterator type.
 	typedef oln_fwd_iter_type(SrcType) src_fwd_iter_type;
+	/// The decorated image backward iterator type.
 	typedef oln_bkd_iter_type(SrcType) src_bkd_iter_type;
+	/// The decorated image value type.
 	typedef oln_value_type(SrcType) src_value_type;
+	/// The decorated image size type.
 	typedef oln_size_type(SrcType) src_size_type;
-	/// Underlying implementation of the decorated image.
+	/// The decorated image underlying implementation.
 	typedef oln_impl_type(SrcType) src_impl_type;
 
 	/// Exact type of the decorated image.
 	typedef oln_exact_type(SrcType) src_exact_type;
 
+	/// The upper class.
 	typedef typename gm_inherit<DestType, Exact>::ret super_type;
 
 	/// Return the decorated image.
@@ -151,9 +164,24 @@
 	  return ima_;
 	}
 
+	/// Instantiate and return the image that the morpher simulates.
+	DestType*
+	unmorph() const
+	{
+	  DestType*			im = new DestType(to_exact(*this).size());
+	  oln_iter_type(DestType)	it(*im);
+
+	  for_all(it)
+	    (*im)[it] = to_exact(*this).operator[](it);
+	  return im;
+	}
+
 	/*! Default implementation of at.
 	**
 	** Return the value stored at \a p in the decorated image.
+	**
+	** \warning This method should not be called directly.
+	** Prefer operator[].
 	*/
 	const src_value_type
 	at(const src_point_type& p) const
@@ -164,6 +192,9 @@
 	/*! Default implementation of at.
 	**
 	** Return a reference to the value stored at \a p in the decorated image.
+	**
+	** \warning This method should not be called directly.
+	** Prefer operator[].
 	*/
 	src_value_type&
 	at(const src_point_type& p)
@@ -209,8 +240,8 @@
 	**
 	** Assign \a rhs to the decorated image.
 	*/
-	src_self_type&
-	assign(src_self_type& rhs)
+	src_exact_type&
+	assign(src_exact_type& rhs)
 	{
 	  return to_exact(ima_).assign(rhs);
 	}
@@ -227,7 +258,12 @@
 	  return to_exact(ima_).border_set_width(min_border, copy_border);
 	}
 
-	self_type& operator=(self_type& rhs)
+	/*! Default implementation of the = operator.
+	**
+	** Assign the decorated image to 'a r.
+	*/
+	self_type&
+	operator=(self_type& rhs)
 	{
 	  return to_exact(*this).assign(rhs.exact());
 	}
@@ -247,4 +283,4 @@
 } // end of namespace oln
 
 
-#endif // !GENERIC_MORPHER_HH
+#endif // !OLENA_MORPHER_GENERIC_MORPHER_HH
Index: olena/oln/morpher/subq_morpher.hh
--- olena/oln/morpher/subq_morpher.hh Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/25_subq_morph 1.1 600)
+++ olena/oln/morpher/subq_morpher.hh Tue, 30 Mar 2004 17:36:55 +0200 thivol_d (oln/m/25_subq_morph 1.1 600)
@@ -27,8 +27,8 @@
 
 
 
-#ifndef SUBQ_MORPHER_HH
-# define SUBQ_MORPHER_HH
+#ifndef OLENA_MORPHER_SUBQ_MORPHER_HH
+# define OLENA_MORPHER_SUBQ_MORPHER_HH
 
 # include "generic_morpher.hh"
 
@@ -40,18 +40,35 @@
     struct subq_morpher;
   } // end of namespace morpher
 
-  /// Retrieve types and dimension of the subq_morpher.
+  /*! Retrieve types and dimension of the subq_morpher.
+  **
+  ** \param SrcType Input type decorated.
+  **
+  ** \param N The new number of bits by component.
+  **
+  ** \param Exact The exact type of the morpher.
+  */
   template <class SrcType, unsigned N, class Exact>
   struct image_id<oln::morpher::subq_morpher<SrcType, N, Exact> >
   {
     enum {dim = SrcType::dim};
+    /*! <The image dimension. */
     typedef oln_impl_type(SrcType) impl_type;
+    /*! <The underlying implementation.*/
     typedef typename ntg::color<3, N, ntg::rgb_traits> value_type;
+    /*! <The modified value type.*/
      typedef typename mlc::exact_vt<oln::morpher::subq_morpher<SrcType, N, Exact>,
 				    Exact>::ret exact_type;
   };
 
-  /// Specialized version for subq_morpher.
+  /*! Specialized version for subq_morpher.
+  **
+  ** \param SrcType Input type decorated.
+  **
+  ** \param N The new number of bits by components.
+  **
+  ** \param Exact The exact type of the morpher.
+  */
   template <class SrcType, unsigned N, class Exact>
   struct image_traits <oln::morpher::subq_morpher<SrcType, N, Exact> > :
     public image_traits<abstract::image_with_impl<oln_impl_type(SrcType),
@@ -67,6 +84,11 @@
     ** For Example, calling color_mute with
     ** color<3, 8, rgb_traits>, 5 will give
     ** the type : color<3, 5, rgb_traits>.
+    **
+    ** \param T The data type of the image.
+    **
+    ** \param N The new number of bits by component.
+    **
     */
 
     template <class T, unsigned N>
@@ -82,8 +104,9 @@
     struct color_mute<ntg::color<nbcomps_, nbits_, color_system>, N>
     {
       typedef ntg::color<nbcomps_, N, color_system> ret;
+      /*! <The new value type.*/
       enum { nbcomps = nbcomps_ };
-      enum { nbits = nbits_ };
+      /*! <The number of components */
     };
 
 
@@ -94,6 +117,12 @@
     ** as an image with a lower color depth.
     ** subq_morpher<image2d<rgb_8>, 5> is
     ** the same as image2d<rgb_5>.
+    **
+    ** \param SrcType The input type decorated.
+    **
+    ** \param N The new numbers of bits by component.
+    **
+    ** \param Exact The exact type of the morpher.
     */
     template <class SrcType, unsigned N, class Exact>
     struct subq_morpher:
@@ -102,16 +131,16 @@
 			 typename color_mute<oln_value_type(SrcType),
 					     N>::ret>::ret ,
       SrcType,
-      subq_morpher<SrcType, N, Exact> >
+      typename oln::image_id<subq_morpher<SrcType, N, Exact> >::exact_type>
     {
 
-      // super_type
+      /// The upper class.
       typedef abstract::generic_morpher<
 	typename oln::mute<SrcType,
 	typename color_mute<oln_value_type(SrcType),
 	N>::ret>::ret,
 	SrcType,
-	subq_morpher<SrcType, N, Exact> > super_type;
+	typename oln::image_id<subq_morpher<SrcType, N, Exact> >::exact_type> super_type;
 
       /// The exact type of \a this. This class can be derived.
       typedef typename oln::image_id<subq_morpher<SrcType, N, Exact> >::exact_type exact_type;
@@ -126,20 +155,18 @@
       /// The value point of the resulting image.
       typedef typename color_mute<oln_value_type(SrcType), N>::ret value_type;
       typedef oln_point_type(SrcType) point_type;
-      typedef oln_fwd_iter_type(SrcType) fwd_iter_type;
-      typedef oln_bkd_iter_type(SrcType) bkd_iter_type;
-      typedef oln_iter_type(SrcType) iter_type;
-      typedef oln_size_type(SrcType) size_type;
       typedef oln_impl_type(SrcType) impl_type;
       enum { nbcomps = color_mute<oln_value_type(SrcType), N>::nbcomps };
 
       /// Construct the morpher with an image.
       subq_morpher(const SrcType &ima)
-	: super_type(ima) {}
+	: super_type(ima)
+      {}
 
       /// Construct the morpher with another morpher.
       subq_morpher(const subq_morpher<SrcType, N>& r)
-	: super_type(r.get_ima()) {}
+	: super_type(r.get_ima())
+      {}
 
       /*! Empty constructor.
       **
@@ -148,7 +175,8 @@
       subq_morpher() {}
 
       /// Return the value stored at \a p in the resulting image.
-      const value_type at(const point_type& p) const
+      const value_type
+      at(const point_type& p) const
       {
         value_type	tmp;
         unsigned int i;
@@ -168,7 +196,8 @@
         return ima_.impl();
       }
 
-      static std::string name()
+      static std::string
+      name()
       {
         return "subq_morpher<" + SrcType::name() + ">";
       }
@@ -197,6 +226,7 @@
     ** \image html oln_morpher_subq_morpher.png
     ** \image latex oln_morpher_subq_morpher.png
     */
+
     template <unsigned S, class I>
     const subq_morpher<I, S> sqmorph(I &ima)
     {
@@ -210,5 +240,5 @@
 
 
 
-#endif // !SUBQ_MORPHER_HH
+#endif // !OLENA_MORPHER_SUBQ_MORPHER_HH
 
Index: olena/oln/morpher/color_morpher.hh
--- olena/oln/morpher/color_morpher.hh Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/26_color_morp 1.1 600)
+++ olena/oln/morpher/color_morpher.hh Tue, 30 Mar 2004 19:08:32 +0200 thivol_d (oln/m/26_color_morp 1.1 600)
@@ -26,8 +26,8 @@
 // Public License.
 
 
-#ifndef COLOR_MORPHER_HH
-# define COLOR_MORPHER_HH
+#ifndef OLENA_MORPHER_COLOR_MORPHER_HH
+# define OLENA_MORPHER_COLOR_MORPHER_HH
 
 # include <oln/morpher/generic_morpher.hh>
 
@@ -41,28 +41,55 @@
   } // end of namespace morpher
 
 
-  /// Retrieve types and dimension of the color_morpher.
+  /*! \brief Retrieve types and dimension of the color_morpher.
+  **
+  ** \param I The type of the decorated image.
+  **
+  ** \param Exact The exact type of the object.
+  */
   template <class I, class Exact>
   struct image_id<morpher::color_morpher<I, Exact> >
   {
     enum {dim = I::dim};
+    /*! <The Image dimension.*/
     typedef oln_impl_type(I) impl_type;
+    /*! <Underlying implementation.*/
     typedef ntg_comp_type(oln_value_type(I)) value_type;
+    /*! <The value type of the decorated image. Here the
+    ** component type of the source image value_type is
+    ** retrieved.
+    */
     typedef typename mlc::exact_vt<morpher::color_morpher<I, Exact>,
 				   Exact>::ret exact_type;
+    /*! <Retrieve the exact type of the image. It depends on
+    ** the value of Exact.
+    */
   };
 
-  /// Specialized version for color_morpher.
-  template <class I>
-  struct image_traits <morpher::color_morpher<I> > :
+  /*! \brief Specialized version for color_morpher.
+  **
+  ** \param I The type of the decorated image.
+  **
+  ** \param Exact The exact type of the object.
+  */
+  template <class I, class Exact>
+  struct image_traits <morpher::color_morpher<I, Exact> > :
     public image_traits<abstract::image_with_impl<oln_impl_type(I),
-						  morpher::color_morpher<I> > >
+						  morpher::color_morpher<I, Exact> > >
   {
   };
 
   namespace morpher {
 
-    /// Abstract color_morpher class used for code factorization.
+    /*! \brief Abstract color_morpher class used for
+    ** code factorization.
+    **
+    ** \param DestType Output type of the morpher.
+    **
+    ** \param SrcType Input type decorated.
+    **
+    ** \param Exact Exact type
+    */
     template <class DestType, class SrcType, class Exact>
     class super_color_morpher : public abstract::generic_morpher<DestType, SrcType, Exact>
     {
@@ -134,6 +161,10 @@
     ** Using this class, an rgb image can be viewed
     ** according to one of its component.
     **
+    ** \param SrcType Input Type decorated.
+    **
+    ** \param Exact Exact type.
+    **
     ** \see oln::morpher::abstract::generic_morpher
     */
     template <class SrcType, class Exact>
@@ -141,7 +172,7 @@
       public super_color_morpher<typename oln::mute<oln_exact_type(SrcType),
 						    ntg_comp_type(oln_value_type(SrcType))>::ret,
 				 SrcType,
-				 color_morpher<SrcType, Exact> >
+				 typename image_id<color_morpher<SrcType, Exact> >::exact_type >
     {
       /// The type of the object instantiated. color_morpher can be derived.
       typedef typename image_id<color_morpher<SrcType, Exact> >::exact_type exact_type;
@@ -152,15 +183,16 @@
 
       typedef color_morpher<SrcType, Exact> self_type;
       typedef oln_iter_type(SrcType) iter_type;
+      /*! <Type of the class iterator.*/
       typedef oln_point_type(SrcType) point_type;
-      typedef oln_fwd_iter_type(SrcType) fwd_iter_type;
-      typedef oln_size_type(SrcType) size_type;
+      /*! <Type of the class point.*/
       typedef ntg_comp_type(oln_value_type(SrcType)) value_type;
-      typedef oln_impl_type(SrcType) impl_type;
+      /*! <The value type of the decorated image.*/
       typedef super_color_morpher<typename oln::mute<oln_exact_type(SrcType),
 	ntg_comp_type(oln_value_type(SrcType))>::ret,
 	SrcType,
-	color_morpher<SrcType, Exact> > super_type;
+	typename image_id<color_morpher<SrcType, Exact> >::exact_type > super_type;
+      /*! <The upper class. */
 
       /// Construct the color_morpher with an image \a ima and a component \a n.
       color_morpher(const SrcType &ima, unsigned n) : super_type(ima, n)
@@ -179,6 +211,9 @@
 
       /*! Return a reference to the \a n_th component of the
       ** rgb value stored at \a p.
+      **
+      ** \warning This method should not be used directly.
+      ** Prefer operator[].
       */
       value_type&
       at(const point_type& p)
@@ -186,7 +221,11 @@
         return const_cast<SrcType &>(this->ima_)[p][this->n_];
       }
 
-      /// Return the \a n_th component of the rgb value stored at \a p.
+      /*! Return the \a n_th component of the rgb value stored at \a p.
+      **
+      ** \warning This method should not be used directly.
+      ** Prefer operator[].
+      */
       const value_type
       at(const point_type& p) const
       {
@@ -207,59 +246,44 @@
         return this->exact();
       }
 
-      /*! Perform a shallow from \a rhs to the current decorated
-      ** image. The points will be shared by the two images.
-      */
-      self_type&
-      assign(DestType& rhs)
-      {
-        oln_iter_type(SrcType)	it(rhs);
-
-	for_all(it)
-	  this->at(it) = rhs[it];
-	return this->exact();
-      }
-
-      /*! This operator= assigns rhs to the current image.
-      **
-      ** \todo FIXME: This operator= doesn't work if declared in
-      ** the generic_morpher.
-      */
-      self_type&
-      operator=(DestType& rhs)
-      {
-	return this->exact().assign(rhs);
-      }
-
       static std::string
       name()
       {
-	return "color_morpher<" + SrcType::name() + ">";
+	return "color_morpher<" + SrcType::name() + "," + Exact::name() + ">";
       }
 
     };
 
-    /// The specialized version for `const' declared images.
+    /*! \brief The specialized version for `const' declared images.
+    **
+    ** \param SrcType Input type decorated.
+    **
+    ** \param Exact Exact Type.
+    **
+    ** \see oln::morpher::abstract::generic_morpher
+    */
     template <class SrcType, class Exact>
     struct color_morpher<const SrcType, Exact> :
       public super_color_morpher<typename oln::mute<oln_exact_type(SrcType),
 						    ntg_comp_type(oln_value_type(SrcType))>::ret,
 				 SrcType,
-				 color_morpher<const SrcType, Exact> >
+				 typename image_id<color_morpher<const SrcType, Exact> >::exact_type>
     {
       /// The type of the object instantiated. color_morpher can be derived.
       typedef typename image_id<color_morpher<SrcType, Exact> >::exact_type exact_type;
 
       typedef oln_point_type(SrcType) point_type;
-      typedef oln_fwd_iter_type(SrcType) fwd_iter_type;
-      typedef oln_size_type(SrcType) size_type;
+      /*! <The type of the class point.*/
+      typedef oln_iter_type(SrcType) iter_type;
+      /*! <The type of the class iterator.*/
       typedef ntg_comp_type(oln_value_type(SrcType)) value_type;
-      typedef oln_impl_type(SrcType) impl_type;
+      /*! <The value of the decorated image.*/
 
       typedef super_color_morpher<typename oln::mute<oln_exact_type(SrcType),
 	ntg_comp_type(oln_value_type(SrcType))>::ret,
 	SrcType,
-	color_morpher<const SrcType, Exact> > super_type;
+	typename image_id<color_morpher<const SrcType, Exact> >::exact_type> super_type;
+      /*! <The upper class.*/
 
       /// Construct the color_morpher with an image \a ima and a component \a n.
       color_morpher(const SrcType &ima, unsigned n) : super_type(ima, n)
@@ -277,7 +301,11 @@
       color_morpher()
       {}
 
-      /// Return the \a n_th component of the rgb value stored at \a p.
+      /*! Return the \a n_th component of the rgb value stored at \a p.
+      **
+      ** \warning This method should not be used directly.
+      ** Prefer operator[].
+      */
       const value_type
       at(const point_type& p) const
       {
@@ -381,4 +409,4 @@
 
 } // end of namespace oln
 
-#endif // !COLOR_MORPHER_HH
+#endif // !OLENA_MORPHER_COLOR_MORPHER_HH
Index: olena/tests/morpher/tests/compose_morph
--- olena/tests/morpher/tests/compose_morph Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
+++ olena/tests/morpher/tests/compose_morph Sun, 28 Mar 2004 20:57:30 +0200 thivol_d (oln/m/43_compose_mo  644)
@@ -0,0 +1,30 @@
+//                                                                  -*- c++ -*-
+#include <oln/morpher/color_morpher.hh>
+#include <oln/morpher/subq_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+  bool fail (false);
+  oln::utils::key::value_type data_key_c[16]
+    = {0x18, 0x25, 0x3a, 0xc8, 0x64, 0xbd, 0x38, 0xa8,
+       0x57, 0x24, 0x7d, 0x0, 0x62, 0xa9, 0xd1, 0x8d};
+
+  oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+
+  fail = fail | (oln::utils::md5(oln::morpher::rmorph(oln::morpher::sqmorph<7>(imc))) != oln::utils::key(data_key_c));
+
+  if (!fail)
+    std::cout << "OK" << std::endl;
+  else
+    {
+      std::cout << "FAIL" << std::endl;
+      return true;
+    }
+}
+
Index: olena/tests/morpher/tests/sq_morph
--- olena/tests/morpher/tests/sq_morph Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
+++ olena/tests/morpher/tests/sq_morph Tue, 30 Mar 2004 19:14:40 +0200 thivol_d (oln/m/44_sq_morph  644)
@@ -0,0 +1,67 @@
+//                                                                  -*- c++ -*-
+#include <oln/morpher/subq_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+  bool fail (false);
+  oln::utils::key::value_type data_key_c_1[16]
+    = {0xae, 0xb0, 0x65, 0x65, 0xdd, 0x28, 0x5a, 0xc6,
+       0x8a, 0x17, 0x7e, 0xd, 0xe5, 0xe6, 0x4f, 0x1d};
+
+  oln::utils::key::value_type data_key_c_2[16]
+    = {0x4, 0x58, 0x8b, 0x60, 0x31, 0x5b, 0x33, 0x4e,
+       0xac, 0xad, 0x85, 0x18, 0x6, 0x25, 0xb6, 0x36};
+
+  oln::utils::key::value_type data_key_c_3[16]
+    = {0xd1, 0xcc, 0xe6, 0x1f, 0xec, 0x26, 0x2b, 0xfd,
+       0x2b, 0x9c, 0xea, 0x59, 0x35, 0x76, 0x64, 0x8};
+
+  oln::utils::key::value_type data_key_c_4[16]
+    = {0xcf, 0x42, 0xc, 0x2f, 0xcb, 0x8e, 0x2a, 0x36,
+       0xb9, 0x53, 0xcc, 0x42, 0xfc, 0x54, 0x27, 0x82};
+
+  oln::utils::key::value_type data_key_c_5[16]
+    = {0x90, 0xe5, 0x71, 0x6b, 0x7e, 0x15, 0x51, 0x16,
+       0x43, 0x43, 0xa6, 0x81, 0x9e, 0x48, 0x88, 0xea};
+
+  oln::utils::key::value_type data_key_c_6[16]
+    = {0xc3, 0x7e, 0x14, 0xc7, 0x5d, 0xfc, 0xa7, 0xd9,
+       0xc, 0xd7, 0x29, 0xa5, 0x84, 0x41, 0xfd, 0x12};
+
+  oln::utils::key::value_type data_key_c_7[16]
+    = {0x62, 0xa7, 0x2a, 0x3e, 0xe, 0x39, 0xda, 0x93,
+       0x62, 0x59, 0x15, 0xe6, 0x60, 0x12, 0x8a, 0xc2};
+
+  oln::utils::key::value_type data_key_c_8[16]
+    = {0x47, 0xa5, 0xb6, 0xa2, 0xc8, 0xf1, 0x4d, 0xb8,
+       0x90, 0x67, 0xaa, 0x19, 0x3d, 0x43, 0xb6, 0xe0};
+
+  oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+  const oln::image2d<ntg::rgb_8> imc_const = oln::load(rdata("lena.ppm"));
+
+  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<1>(imc)) != oln::utils::key(data_key_c_1));
+  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<2>(imc)) != oln::utils::key(data_key_c_2));
+  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<3>(imc)) != oln::utils::key(data_key_c_3));
+  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<4>(imc)) != oln::utils::key(data_key_c_4));
+  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<5>(imc)) != oln::utils::key(data_key_c_5));
+  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<6>(imc)) != oln::utils::key(data_key_c_6));
+  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<7>(imc)) != oln::utils::key(data_key_c_7));
+  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<8>(imc)) != oln::utils::key(data_key_c_8));
+  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<1>(imc_const)) != oln::utils::key(data_key_c_1));
+  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<3>(oln::morpher::sqmorph<5>(imc))) !=
+		 oln::utils::md5(oln::morpher::sqmorph<3>(imc)));
+
+  if (!fail)
+    std::cout << "OK" << std::endl;
+  else
+    {
+      std::cout << "FAIL" << std::endl;
+      return true;
+    }
+}
Index: olena/tests/morpher/tests/color_morph
--- olena/tests/morpher/tests/color_morph Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
+++ olena/tests/morpher/tests/color_morph Tue, 30 Mar 2004 19:54:21 +0200 thivol_d (oln/m/45_color_morp  644)
@@ -0,0 +1,50 @@
+//                                                                  -*- c++ -*-
+#include <oln/morpher/color_morpher.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+
+int main()
+{
+  bool fail (false);
+  oln::utils::key::value_type data_key_c_r[16]
+    = {0xe1, 0x5, 0x51, 0x40, 0xea, 0xa, 0x13, 0x96,
+       0xc7, 0xa6, 0x62, 0x2c, 0xfa, 0xe4, 0x53, 0x8e};
+
+  oln::utils::key::value_type data_key_c_b[16]
+    = {0x7, 0x8e, 0x3, 0xaa, 0x45, 0xce, 0x38, 0x62,
+       0xf9, 0x1d, 0xb7, 0x9f, 0x56, 0x1c, 0x52, 0x2d};
+
+  oln::utils::key::value_type data_key_c_g[16]
+    = {0x50, 0x36, 0xf3, 0xb3, 0x56, 0x66, 0x18, 0xbc,
+       0x7a, 0x12, 0x36, 0x75, 0xc, 0x7f, 0xc6, 0xf4};
+
+
+  oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+  const oln::image2d<ntg::rgb_8> imc_const = oln::load(rdata("lena.ppm"));
+  oln::image2d<ntg::rgb_8> imd(imc.size());
+  oln::morpher::color_morpher<oln::image2d<ntg::rgb_8> > mimc(imc, 0);
+  oln::morpher::color_morpher<oln::image2d<ntg::rgb_8> > mimd(imd, 0);
+
+  mimd = mimc;
+
+  fail = fail | (oln::utils::md5(oln::morpher::rmorph(imc)) != oln::utils::md5(mimd));
+  fail = fail | (oln::utils::md5(oln::morpher::rmorph(imc)) != oln::utils::key(data_key_c_r));
+  fail = fail | (oln::utils::md5(oln::morpher::gmorph(imc)) != oln::utils::key(data_key_c_g));
+  fail = fail | (oln::utils::md5(oln::morpher::bmorph(imc)) != oln::utils::key(data_key_c_b));
+  fail = fail | (oln::utils::md5(oln::morpher::rmorph(imc_const)) != oln::utils::key(data_key_c_r));
+  fail = fail | (oln::utils::md5(*(oln::morpher::rmorph(imc).unmorph())) != oln::utils::key(data_key_c_r));
+
+
+  if (!fail)
+    std::cout << "OK" << std::endl;
+  else
+    {
+      std::cout << "FAIL" << std::endl;
+      return true;
+    }
+}
+
Index: olena/tests/morpher/tests/sq_morph_8
--- olena/tests/morpher/tests/sq_morph_8 Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/28_sq_morph_8 1.1 600)
+++ olena/tests/morpher/tests/sq_morph_8 Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-//                                                                  -*- c++ -*-
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
-  bool fail (false);
-  oln::utils::key::value_type data_key_c[16]
-    = {0x47, 0xa5, 0xb6, 0xa2, 0xc8, 0xf1, 0x4d, 0xb8,
-       0x90, 0x67, 0xaa, 0x19, 0x3d, 0x43, 0xb6, 0xe0};
-
-  oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
-  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<8>(imc)) != oln::utils::key(data_key_c));
-
-  if (!fail)
-    std::cout << "OK" << std::endl;
-  else
-    {
-      std::cout << "FAIL" << std::endl;
-      return true;
-    }
-}
-
Index: olena/tests/morpher/tests/sq_morph_7
--- olena/tests/morpher/tests/sq_morph_7 Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/29_sq_morph_7 1.1 600)
+++ olena/tests/morpher/tests/sq_morph_7 Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-//                                                                  -*- c++ -*-
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
-  bool fail (false);
-  oln::utils::key::value_type data_key_c[16]
-    = {0x62, 0xa7, 0x2a, 0x3e, 0xe, 0x39, 0xda, 0x93,
-       0x62, 0x59, 0x15, 0xe6, 0x60, 0x12, 0x8a, 0xc2};
-
-  oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
-  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<7>(imc)) != oln::utils::key(data_key_c));
-
-  if (!fail)
-    std::cout << "OK" << std::endl;
-  else
-    {
-      std::cout << "FAIL" << std::endl;
-      return true;
-    }
-}
-
Index: olena/tests/morpher/tests/sq_morph_6
--- olena/tests/morpher/tests/sq_morph_6 Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/30_sq_morph_6 1.1 600)
+++ olena/tests/morpher/tests/sq_morph_6 Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-//                                                                  -*- c++ -*-
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
-  bool fail (false);
-  oln::utils::key::value_type data_key_c[16]
-    = {0xc3, 0x7e, 0x14, 0xc7, 0x5d, 0xfc, 0xa7, 0xd9,
-       0xc, 0xd7, 0x29, 0xa5, 0x84, 0x41, 0xfd, 0x12};
-
-  oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
-  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<6>(imc)) != oln::utils::key(data_key_c));
-
-  if (!fail)
-    std::cout << "OK" << std::endl;
-  else
-    {
-      std::cout << "FAIL" << std::endl;
-      return true;
-    }
-}
-
Index: olena/tests/morpher/tests/sq_morph_5
--- olena/tests/morpher/tests/sq_morph_5 Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/31_sq_morph_5 1.1 600)
+++ olena/tests/morpher/tests/sq_morph_5 Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-//                                                                  -*- c++ -*-
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
-  bool fail (false);
-  oln::utils::key::value_type data_key_c[16]
-    = {0x90, 0xe5, 0x71, 0x6b, 0x7e, 0x15, 0x51, 0x16,
-       0x43, 0x43, 0xa6, 0x81, 0x9e, 0x48, 0x88, 0xea};
-
-  oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
-  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<5>(imc)) != oln::utils::key(data_key_c));
-
-  if (!fail)
-    std::cout << "OK" << std::endl;
-  else
-    {
-      std::cout << "FAIL" << std::endl;
-      return true;
-    }
-}
-
Index: olena/tests/morpher/tests/sq_morph_4
--- olena/tests/morpher/tests/sq_morph_4 Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/32_sq_morph_4 1.1 600)
+++ olena/tests/morpher/tests/sq_morph_4 Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-//                                                                  -*- c++ -*-
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
-  bool fail (false);
-  oln::utils::key::value_type data_key_c[16]
-    = {0xcf, 0x42, 0xc, 0x2f, 0xcb, 0x8e, 0x2a, 0x36,
-       0xb9, 0x53, 0xcc, 0x42, 0xfc, 0x54, 0x27, 0x82};
-
-  oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
-  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<4>(imc)) != oln::utils::key(data_key_c));
-
-  if (!fail)
-    std::cout << "OK" << std::endl;
-  else
-    {
-      std::cout << "FAIL" << std::endl;
-      return true;
-    }
-}
-
Index: olena/tests/morpher/tests/sq_morph_3
--- olena/tests/morpher/tests/sq_morph_3 Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/33_sq_morph_3 1.1 600)
+++ olena/tests/morpher/tests/sq_morph_3 Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-//                                                                  -*- c++ -*-
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
-  bool fail (false);
-  oln::utils::key::value_type data_key_c[16]
-    = {0xd1, 0xcc, 0xe6, 0x1f, 0xec, 0x26, 0x2b, 0xfd,
-       0x2b, 0x9c, 0xea, 0x59, 0x35, 0x76, 0x64, 0x8};
-
-  oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
-  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<3>(imc)) != oln::utils::key(data_key_c));
-
-  if (!fail)
-    std::cout << "OK" << std::endl;
-  else
-    {
-      std::cout << "FAIL" << std::endl;
-      return true;
-    }
-}
-
Index: olena/tests/morpher/tests/sq_morph_2
--- olena/tests/morpher/tests/sq_morph_2 Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/34_sq_morph_2 1.1 600)
+++ olena/tests/morpher/tests/sq_morph_2 Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-//                                                                  -*- c++ -*-
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
-  bool fail (false);
-  oln::utils::key::value_type data_key_c[16]
-    = {0x4, 0x58, 0x8b, 0x60, 0x31, 0x5b, 0x33, 0x4e,
-       0xac, 0xad, 0x85, 0x18, 0x6, 0x25, 0xb6, 0x36};
-
-  oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
-  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<2>(imc)) != oln::utils::key(data_key_c));
-
-  if (!fail)
-    std::cout << "OK" << std::endl;
-  else
-    {
-      std::cout << "FAIL" << std::endl;
-      return true;
-    }
-}
-
Index: olena/tests/morpher/tests/sq_morph_1
--- olena/tests/morpher/tests/sq_morph_1 Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/35_sq_morph_1 1.1 600)
+++ olena/tests/morpher/tests/sq_morph_1 Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-//                                                                  -*- c++ -*-
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
-  bool fail (false);
-  oln::utils::key::value_type data_key_c[16]
-    = {0xae, 0xb0, 0x65, 0x65, 0xdd, 0x28, 0x5a, 0xc6,
-       0x8a, 0x17, 0x7e, 0xd, 0xe5, 0xe6, 0x4f, 0x1d};
-
-  oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
-  fail = fail | (oln::utils::md5(oln::morpher::sqmorph<1>(imc)) != oln::utils::key(data_key_c));
-
-  if (!fail)
-    std::cout << "OK" << std::endl;
-  else
-    {
-      std::cout << "FAIL" << std::endl;
-      return true;
-    }
-}
-
Index: olena/tests/morpher/tests/rmorph
--- olena/tests/morpher/tests/rmorph Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/36_rmorph 1.1 600)
+++ olena/tests/morpher/tests/rmorph Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,28 +0,0 @@
-//                                                                  -*- c++ -*-
-#include <oln/morpher/color_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
-  bool fail (false);
-  oln::utils::key::value_type data_key_c[16]
-    = {0xe1, 0x5, 0x51, 0x40, 0xea, 0xa, 0x13, 0x96,
-       0xc7, 0xa6, 0x62, 0x2c, 0xfa, 0xe4, 0x53, 0x8e};
-  oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
-  fail = fail | (oln::utils::md5(oln::morpher::rmorph(imc)) != oln::utils::key(data_key_c));
-
-  if (!fail)
-    std::cout << "OK" << std::endl;
-  else
-    {
-      std::cout << "FAIL" << std::endl;
-      return true;
-    }
-}
-
Index: olena/tests/morpher/tests/gmorph
--- olena/tests/morpher/tests/gmorph Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/37_gmorph 1.1 600)
+++ olena/tests/morpher/tests/gmorph Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-//                                                                  -*- c++ -*-
-#include <oln/morpher/color_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
-  bool fail (false);
-  oln::utils::key::value_type data_key_c[16]
-    = {0x50, 0x36, 0xf3, 0xb3, 0x56, 0x66, 0x18, 0xbc,
-       0x7a, 0x12, 0x36, 0x75, 0xc, 0x7f, 0xc6, 0xf4};
-
-  oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
-  fail = fail | (oln::utils::md5(oln::morpher::gmorph(imc)) != oln::utils::key(data_key_c));
-
-  if (!fail)
-    std::cout << "OK" << std::endl;
-  else
-    {
-      std::cout << "FAIL" << std::endl;
-      return true;
-    }
-}
-
Index: olena/tests/morpher/tests/color_sq_morph
--- olena/tests/morpher/tests/color_sq_morph Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/38_color_sq_m 1.1 600)
+++ olena/tests/morpher/tests/color_sq_morph Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,30 +0,0 @@
-//                                                                  -*- c++ -*-
-#include <oln/morpher/color_morpher.hh>
-#include <oln/morpher/subq_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
-  bool fail (false);
-  oln::utils::key::value_type data_key_c[16]
-    = {0x18, 0x25, 0x3a, 0xc8, 0x64, 0xbd, 0x38, 0xa8,
-       0x57, 0x24, 0x7d, 0x0, 0x62, 0xa9, 0xd1, 0x8d};
-
-  oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
-  fail = fail | (oln::utils::md5(oln::morpher::rmorph(oln::morpher::sqmorph<7>(imc))) != oln::utils::key(data_key_c));
-
-  if (!fail)
-    std::cout << "OK" << std::endl;
-  else
-    {
-      std::cout << "FAIL" << std::endl;
-      return true;
-    }
-}
-
Index: olena/tests/morpher/tests/bmorph
--- olena/tests/morpher/tests/bmorph Mon, 29 Mar 2004 00:39:14 +0200 thivol_d (oln/m/39_bmorph 1.1 600)
+++ olena/tests/morpher/tests/bmorph Tue, 30 Mar 2004 22:08:16 +0200 thivol_d ()
@@ -1,29 +0,0 @@
-//                                                                  -*- c++ -*-
-#include <oln/morpher/color_morpher.hh>
-#include <oln/basics2d.hh>
-#include <ntg/all.hh>
-
-#include <oln/utils/md5.hh>
-#include "data.hh"
-#include "check.hh"
-
-int main()
-{
-  bool fail (false);
-  oln::utils::key::value_type data_key_c[16]
-    = {0x7, 0x8e, 0x3, 0xaa, 0x45, 0xce, 0x38, 0x62,
-       0xf9, 0x1d, 0xb7, 0x9f, 0x56, 0x1c, 0x52, 0x2d};
-
-  oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
-
-  fail = fail | (oln::utils::md5(oln::morpher::bmorph(imc)) != oln::utils::key(data_key_c));
-
-  if (!fail)
-    std::cout << "OK" << std::endl;
-  else
-    {
-      std::cout << "FAIL" << std::endl;
-      return true;
-    }
-}
-
-- 
Damien Thivolle
damien.thivolle(a)lrde.epita.fr
                    
                  
                  
                          
                            
                            2
                            
                          
                          
                            
                            1
                            
                          
                          
                            
    
                          
                        
                    
                    
                        Index: integre/ChangeLog
from  Niels Van Vliet  <niels(a)lrde.epita.fr>
	* integre/ntg/core/pred_succ.hh: Add default_less.
	* integre/ntg/color/color.hh: Add default_less specialization.
Index: integre/ntg/color/color.hh
--- integre/ntg/color/color.hh Thu, 22 Jan 2004 21:46:17 +0100 palma_g 
(oln/t/20_color.hh 1.6 640)
+++ integre/ntg/color/color.hh Tue, 30 Mar 2004 12:38:04 +0200 van-vl_n 
(oln/t/20_color.hh 1.6 640)
@@ -1,4 +1,4 @@
-// Copyright (C) 2001, 2002, 2003  EPITA Research and Development 
Laboratory
+// Copyright (C) 2001, 2002, 2003, 2004  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
@@ -35,6 +35,7 @@
  # include <ntg/basics.hh>
  # include <ntg/int.hh>
  # include <ntg/vect/vec.hh>
+# include <ntg/core/pred_succ.hh>
  # include <mlc/cmp.hh>
@@ -268,6 +269,38 @@
        }
      };
+
+    template <typename T> struct default_less;
+
+    /*! The specialized version of default_less for colors.
+    **
+    ** \warning This class is only provided to build classes
+    ** that need a less class, it does not correspond to
+    ** the reality. \n
+    ** Example of a std::set of RGB colors:
+    ** \verbatim
+    ** std::set<ntg:rgb_8,
+    **          ntg::internal::default_less<ntg::rgb8> > s;
+    ** s.insert(ntg::rgb_8(10, 16, 64));
+    ** \endverbatim
+    */
+    template <unsigned ncomps,
+	      unsigned qbits,
+	      template <unsigned> class color_system>
+    struct default_less< ntg::color<ncomps, qbits, color_system> >
+    {
+      typedef ntg::color<ncomps, qbits, color_system> arg_type;
+      bool operator()(const arg_type& l,
+		      const arg_type& r) const
+      {
+	for (unsigned i = 0; i < ntg_nb_comp(arg_type); ++i)
+	  if (l[i] < r[i])
+	    return true;
+	  else if (l[i] > r[i])
+	    return false;
+	return false;
+      }
+    };
    } // end of internal.
  } // end of ntg.
Index: integre/ntg/core/pred_succ.hh
--- integre/ntg/core/pred_succ.hh Fri, 19 Mar 2004 11:53:50 +0100 
van-vl_n (oln/k/8_pred_succ. 1.1 644)
+++ integre/ntg/core/pred_succ.hh Tue, 30 Mar 2004 12:24:42 +0200 
van-vl_n (oln/k/8_pred_succ. 1.1 644)
@@ -28,8 +28,10 @@
  #ifndef NTG_CORE_PRED_SUCC_HH
  # define NTG_CORE_PRED_SUCC_HH
-#include <ntg/all.hh>
+
  #include <mlc/is_a.hh>
+#include <ntg/real/int_u.hh>
+#include <ntg/core/macros.hh>
  namespace ntg {
@@ -70,6 +72,24 @@
    {
      return T(internal::with_arith<T>::ret(t) - 1);
    }
+
+  namespace internal {
+    /*! Default less.
+    **
+    ** Specialization of this class provides a less functor even for
+    ** types that do not support the operator "<".
+    */
+    template <typename T>
+    struct default_less
+    {
+      typedef T arg_type;
+      bool operator()(const T& l,
+		      const T& r) const
+      {
+	return l < r;
+      }
+    };
+  }
  }
  #endif
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                    
                        Index: integre/ChangeLog
from  Niels Van Vliet  <niels(a)lrde.epita.fr>
	* integre/ntg/core/macros.hh: Add macros ntg_if_vectorial_nb_comp and
	ntg_compare_nb_comp.
	* integre/tests/types/tests/ntg_compare_nb_comp: Add file.
Index: olena/ChangeLog
from  Niels Van Vliet  <niels(a)lrde.epita.fr>
	* olena/oln/math/macros.hh: Add dot_product.
	* olena/oln/utils/se_stat.hh: Add file. Mean and variance using a
	structuring element.
	* olena/oln/utils/se_stat.hxx: Add file.
	* olena/oln/convol/nagao.hh: Add file. Nagao filter.
	* olena/oln/convol/nagao.hxx: Add file.
	* olena/tests/convol/tests/nagao : Add file.
Index: olena/oln/math/macros.hh
--- olena/oln/math/macros.hh Mon, 15 Mar 2004 17:40:54 +0100 van-vl_n 
(oln/b/21_macros.hh 1.6.1.14 600)
+++ olena/oln/math/macros.hh Fri, 26 Mar 2004 19:15:36 +0100 van-vl_n 
(oln/b/21_macros.hh 1.6.1.14 600)
@@ -85,6 +85,68 @@
        return f(val);
      }
+    ///  Internal purpose only.
+    namespace internal {
+      /// Dot product for non-vectorial types.
+      template<typename DestValue, typename I, typename J>
+      struct f_dot_product_nv
+      {
+	typedef typename ntg_is_a(I, ntg::non_vectorial)::ensure_type t;
+
+	static DestValue
+	product(const I &i, const J &j)
+	{
+	  return i * j;
+	}
+      };
+
+      /// Dot product for vectorial types.
+      template<typename DestValue, typename I, typename J>
+      struct f_dot_product_v
+      {
+	typedef typename ntg_is_a(I, ntg::vectorial)::ensure_type t;
+	//typedef typename mlc::eq<ntg_nb_comp(I), ntg_nb_comp(J)>::ensure_type t;
+
+	static DestValue
+	product(const I &i, const J &j)
+	{
+	  DestValue d(ntg_zero_val(DestValue));
+
+	  for (unsigned k = 0; k < ntg_nb_comp(I); ++k)
+	    d += i[k] * j[k];
+	  return d;
+	}
+      };
+    }
+
+    /*! \brief Dot product.
+    **
+    ** \code
+    ** #include <oln/math/macros.hh>
+    ** #include <ntg/all.hh>
+    ** int main()
+    ** {
+    **   ntg::int_u8 i(3), j(4);
+    **   // Print "12"
+    **   std::cout << oln::math::dot_product<ntg::float_s>(i, j) << 
std::endl;
+    **
+    **   ntg::rgb_8 blue(0, 0, 200), yellow(0, 30, 10);
+    **   // Print "2000"
+    **   std::cout << oln::math::dot_product<ntg::float_s>(blue, yellow)
+    **             << std::endl;
+    ** }
+    ** \endcode
+    */
+    template<typename DestValue, typename I, typename J>
+    DestValue
+    dot_product(const I &i, const J &j)
+    {
+      typedef typename mlc::if_<ntg_is_a(I, ntg::vectorial)::ret,
+	internal::f_dot_product_v<DestValue, I, J>,
+	internal::f_dot_product_nv<DestValue, I, J> >::ret fctor;
+      return fctor::product(i, j);
+    }
+
    } // end of math
  } // end of oln
Index: integre/ntg/core/macros.hh
--- integre/ntg/core/macros.hh Fri, 19 Mar 2004 15:52:57 +0100 palma_g 
(oln/s/19_macros.hh 1.10 600)
+++ integre/ntg/core/macros.hh Fri, 26 Mar 2004 20:01:55 +0100 van-vl_n 
(oln/s/19_macros.hh 1.10 600)
@@ -160,4 +160,49 @@
  `-----*/
  #define ntg_nbits(T)		ntg::internal::typetraits<T>::size
+
+/*! Return the number of components of T if T is vectorial.
+**
+** If T is non vectorial, the value returned should not be considered.
+*/
+#define ntg_if_vectorial_nb_comp(T)					\
+   ntg::type_traits<typename mlc::if_<ntg_is_a(T, ntg::vectorial)::ret,	\
+		            	      T,				\
+				      ntg::vec<42, bool> >::ret>::nb_comp
+
+/*! Same as \a ntg_if_vectorial_nb_comp but without 'typename'
+**
+** \see ntg_if_vectorial_nb_comp
+*/
+#define ntg_if_vectorial_nb_comp_(T)					\
+   ntg::type_traits<mlc::if_<ntg_is_a_(T, ntg::vectorial)::ret,		\
+		            	      T,				\
+				      ntg::vec<42, bool> >::ret>::nb_comp
+
+/*! Compare the number of components.
+**
+**   - If \a A and \a B are non_vectorial, then
+**     \a {ntg_compare_nb_comp(A, B)::ret = true}
+**   - If \a A and \a B are vectorial, then
+**     \a {ntg_compare_nb_comp(A, B)::ret = (ntg_nb_comp(A) = 
ntg_nb_comp(B))}
+**   - Otherwise, it returns false
+*/
+#define ntg_compare_nb_comp(A, B)					\
+	mlc::if_<							\
+	  ntg_is_a(A, ntg::non_vectorial)::ret,				\
+	  ntg_is_a(B, ntg::non_vectorial),				\
+	  mlc::eq<ntg_if_vectorial_nb_comp(A),				\
+	  ntg_if_vectorial_nb_comp(B)> >::ret
+
+/*! Same as \a ntg_compare_nb_comp but without 'typename'
+**
+** \see ntg_compare_nb_comp
+*/
+#define ntg_compare_nb_comp_(A, B)					\
+	mlc::if_<							\
+	  ntg_is_a_(A, ntg::non_vectorial)::ret,			\
+	  ntg_is_a_(B, ntg::non_vectorial),				\
+	  mlc::eq<ntg_if_vectorial_nb_comp_(A),				\
+	  ntg_if_vectorial_nb_comp_(B)> >::ret
+
  #endif // !NTG_CORE_MACROS_HH
Index: olena/tests/convol/tests/nagao
--- olena/tests/convol/tests/nagao Fri, 26 Mar 2004 20:54:04 +0100 
van-vl_n ()
+++ olena/tests/convol/tests/nagao Fri, 26 Mar 2004 20:26:49 +0100 
van-vl_n (oln/m/19_nagao  644)
@@ -0,0 +1,37 @@
+//                                                                  -*- 
c++ -*-
+#include <oln/convol/nagao.hh>
+#include <oln/basics2d.hh>
+#include <ntg/all.hh>
+
+#include <oln/utils/md5.hh>
+#include "data.hh"
+#include "check.hh"
+int main()
+{
+  bool fail (false);
+  oln::utils::key::value_type data_key_c[16]
+    = {0x69, 0xa7, 0xce, 0xf0, 0x4b, 0x88, 0x9e, 0xd4, 0x77, 0x63, 0x40,
+       0xd6, 0x79, 0x42, 0x6a, 0x48};
+  oln::image2d<ntg::rgb_8> imc = oln::load(rdata("lena.ppm"));
+  oln::image2d<ntg::rgb_8> nc = oln::convol::nagao(imc);
+
+  std::cout << oln::utils::md5(nc) << std::endl;
+  fail = fail | (oln::utils::md5(nc) != oln::utils::key(data_key_c));
+
+  oln::utils::key::value_type data_key_g[16]
+    = {0x27, 0xbc, 0xab, 0x48, 0x45, 0x2f, 0xe9, 0xc5, 0x6e, 0x2e, 0x57,
+       0x27, 0xf, 0x80, 0xfe, 0xaa};
+
+   oln::image2d<ntg::int_u8> im = oln::load(rdata("lena256.pgm"));
+   oln::image2d<ntg::int_u8> ng = oln::convol::nagao(im);
+
+   fail = fail | (oln::utils::md5(ng) != oln::utils::key(data_key_g));
+   if (!fail)
+     std::cout << "OK" << std::endl;
+   else
+    {
+      std::cout << "FAIL" << std::endl;
+      return true;
+    }
+}
+
Index: integre/tests/types/tests/ntg_compare_nb_comp
--- integre/tests/types/tests/ntg_compare_nb_comp Fri, 26 Mar 2004 
20:54:04 +0100 van-vl_n ()
+++ integre/tests/types/tests/ntg_compare_nb_comp Fri, 26 Mar 2004 
20:49:31 +0100 van-vl_n (oln/m/20_ntg_compar  644)
@@ -0,0 +1,14 @@
+bool should_just_compile;
+should_just_compile = ntg_if_vectorial_nb_comp_(int);
+
+bool fail = false;
+fail = fail || ntg_if_vectorial_nb_comp_(ntg::rgb_8) != 3;
+typedef ntg::vec<3, bool> vec3;
+typedef ntg::vec<4, bool> vec4;
+fail = fail || ntg_if_vectorial_nb_comp_(vec3) != 3;
+fail = fail || ntg_if_vectorial_nb_comp_(vec4) != 4;
+fail = fail || ntg_compare_nb_comp_(int, ntg::rgb_8)::ret != 0;
+fail = fail || ntg_compare_nb_comp_(int, float)::ret != 1;
+fail = fail || ntg_compare_nb_comp_(vec3, ntg::rgb_8)::ret != 1;
+fail = fail || ntg_compare_nb_comp_(vec4, ntg::rgb_8)::ret != 0;
+return fail;
Index: olena/oln/convol/nagao.hxx
--- olena/oln/convol/nagao.hxx Fri, 26 Mar 2004 20:54:04 +0100 van-vl_n ()
+++ olena/oln/convol/nagao.hxx Fri, 26 Mar 2004 20:29:16 +0100 van-vl_n 
(oln/m/21_nagao.hxx  644)
@@ -0,0 +1,205 @@
+// Copyright (C) 2004  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
+// 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, 59 Temple Place - Suite 330, 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.  This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+#ifndef OLN_CONVOL_NAGAO_HXX
+# define OLN_CONVOL_NAGAO_HXX
+# include <oln/core/window2d.hh>
+
+namespace oln {
+  namespace convol {
+    namespace internal {
+
+      template<class I, class SE, unsigned Size, typename Sum>
+      inline Sum
+      mean_of_smaller_variance(const oln::abstract::image<I> &im,
+			       const oln_point_type(I) &p,
+			       const internal::se_array<Size, SE> &w)
+      {
+	ntg_compare_nb_comp(Sum, oln_value_type(I))::ensure();
+
+	precondition(Size > 0);
+	precondition(im.border() >= w.delta());
+
+	typedef typename oln::utils::se_stat<Sum, ntg::float_s> se_stat_type;
+	typedef typename se_stat_type::sum_type sum_type;
+	typedef typename se_stat_type::variance_type variance_type;
+
+	se_stat_type s(im, p, w[0]);
+	variance_type min_variance = s.variance();
+	sum_type mean = s.mean();
+	for (unsigned i = 1; i < Size; ++i)
+	  {
+	    variance_type tmp = s.compute(im, p, w[i]).variance();
+	    if (tmp < min_variance)
+	      {
+		min_variance = tmp;
+		mean = s.mean();
+	      }
+	  }
+	return mean;
+      }
+
+      /*! \brief build 9 windows corresponding to the standard
+      ** 5x5 Nagao filter.
+      */
+      static
+      se_array<9, window2d>
+      mk_nagao_windows_5x5()
+      {
+	se_array<9, window2d> out;
+	//center				//.....
+	out[0].add(-1, -1).add(-1, 0).add(-1, 1)//.XXX.
+	  .add(0, -1).add(0, 0).add(0, 1)	//.XCX.
+	  .add(1, -1).add(1, 0).add(1, 1);	//.XXX.
+						//.....
+
+	// upper				//.XXX.
+	out[1].add(-2, -1).add(-2, 0).add(-2, 1)//.XXX.
+	  .add(-1, -1).add(-1, 0).add(-1, 1)	//..C..
+	  .add(0, 0);				//.....
+						//.....
+
+	// right				//.....
+	out[2].add(-1, 1).add(-1, 2)		//...XX
+	  .add(0, 0).add(0, 1).add(0, 2)	//..CXX
+	  .add(1, 1).add(1, 2);			//...XX
+						//.....
+	// bottom				//.....
+	out[3].add(2, -1).add(2, 0).add(2, 1)	//.....
+	  .add(1, -1).add(1, 0).add(1, 1)	//..C..
+	  .add(0, 0);				//.XXX.
+						//.XXX.
+
+	// left					//.....
+	out[4].add(-1, -1).add(-1, -2)		//XX...
+	  .add(0, 0).add(0, -1).add(0, -2)	//XXC..
+	  .add(1, -1).add(1, -2);		//XX...
+						//.....
+
+	// upper-left				//XX...
+	out[5].add(-2, -2).add(-2, -1)		//XXX..
+	  .add(-1, -2).add(-1, -1).add(-1, 0)	//.XC..
+	  .add(0, -1).add(0, 0);		//.....
+						//.....
+
+	// upper-right				//...XX
+	out[6].add(-2, 2).add(-2, 1)		//..XXX
+	  .add(-1, 2).add(-1, 1).add(-1, 0)	//..CX.
+	  .add(0, 1).add(0, 0);			//.....
+						//.....
+
+	// bottom-right				//.....
+	out[7].add(2, 2).add(2, 1)		//.....
+	  .add(1, 2).add(1, 1).add(1, 0)	//..CX.
+	  .add(0, 1).add(0, 0);			//..XXX
+						//...XX
+
+	// bottom-left				//.....
+	out[8].add(2, -2).add(2, -1)		//.....
+	  .add(1, -2).add(1, -1).add(1, 0)	//.XC..
+	  .add(0, -1).add(0, 0);		//XXX..
+      						//XX...
+	return out;
+      }
+    } // ! end namespace internal
+
+
+    template <class I, unsigned Size, typename SE, typename Sum>
+    inline oln_concrete_type(I)
+    nagao_generalized(const oln::abstract::image<I>& in,
+		      const internal::se_array<Size, SE> &sa)
+    {
+      ntg_compare_nb_comp(Sum, oln_value_type(I))::ensure();
+      in.border_adapt_width(sa.delta());
+      oln_concrete_type(I) out(in.size());
+      oln_iter_type(I) it(out);
+      for_all(it)
+      out[it] = internal::mean_of_smaller_variance<I, SE, Size, Sum>
+	(in, it, sa);
+      return out;
+    }
+
+    /*! Standard Nagao filter 5x5.
+    **
+    ** Apply the 5*5 nagao filter on a non vectorial image.
+    ** \code
+    ** #include <oln/convol/nagao.hh>
+    ** #include <oln/basics2d.hh>
+    ** #include <ntg/all.hh>
+    ** int main()
+    ** {
+    **   oln::image2d<ntg::int_u8> imc = oln::load(IMG_IN  "lena256.pgm");
+    **   oln::save(oln::convol::nagao(imc),
+    ** 	    IMG_OUT "oln_convol_nagao_256.pgm");
+    ** }
+    ** \endcode
+    ** \image html lena256_pgm.png
+    ** \image latex lena256_pgm.png
+    ** =>
+    ** \image html oln_convol_nagao_256.png
+    ** \image latex oln_convol_nagao_256.png
+    */
+    template <class I>
+    inline oln_concrete_type(I)
+    nagao(const oln::abstract::non_vectorial_image_with_dim<2, I>& in)
+    {
+      return nagao_generalized<I, 9, window2d, ntg::float_s>
+	(in, internal::mk_nagao_windows_5x5());
+    }
+
+    /*! Standard Nagao filter 5x5.
+    **
+    ** Apply the 5*5 nagao filter on a vectorial image.
+    **
+    ** \code
+    ** #include <oln/convol/nagao.hh>
+    ** #include <oln/basics2d.hh>
+    ** #include <ntg/all.hh>
+    ** int main()
+    ** {
+    **    oln::image2d<ntg::rgb_8> imc = oln::load(IMG_IN  "lena.ppm");
+    **    oln::save(oln::convol::nagao(imc), IMG_OUT 
"oln_convol_nagao.ppm");
+    ** }
+    ** \endcode
+    ** \image html lena_ppm.png
+    ** \image latex lena_ppm.png
+    ** =>
+    ** \image html oln_convol_nagao.png
+    ** \image latex oln_convol_nagao.png
+    */
+    template <class I>
+    inline oln_concrete_type(I)
+    nagao(const oln::abstract::vectorial_image_with_dim<2, I>& in)
+    {
+      typedef ntg::rgb_8::float_vec_type float_vec_type;
+      return nagao_generalized<I, 9, window2d, float_vec_type>
+	(in, internal::mk_nagao_windows_5x5());
+    }
+  } //! namespace convol
+} //! namespace oln
+
+#endif
Index: olena/oln/convol/nagao.hh
--- olena/oln/convol/nagao.hh Fri, 26 Mar 2004 20:54:04 +0100 van-vl_n ()
+++ olena/oln/convol/nagao.hh Fri, 26 Mar 2004 19:54:47 +0100 van-vl_n 
(oln/m/22_nagao.hh  644)
@@ -0,0 +1,157 @@
+// Copyright (C) 2004  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
+// 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, 59 Temple Place - Suite 330, 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.  This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+
+#ifndef OLN_CONVOL_NAGAO_HH
+# define OLN_CONVOL_NAGAO_HH
+
+# include <oln/utils/se_stat.hh>
+# include <oln/core/abstract/struct_elt.hh>
+# include <oln/core/abstract/image.hh>
+# include <oln/core/image.hh>
+# include <oln/core/abstract/image_with_type_with_dim.hh>
+# include <mlc/array/1d.hh>
+# include <mlc/cmp.hh>
+
+
+namespace oln {
+  namespace convol{
+    namespace internal {
+      /*! array of structuring elements.
+      **
+      ** \param Size Number of structuring elements.
+      ** \param S structuring element type.
+      */
+      template <unsigned Size, class S>
+      struct se_array
+      {
+	/// Type of the struturing elements.
+	typedef mlc_exact_type(oln::abstract::struct_elt<S>) struct_elt_type;
+
+	/// Type of the array.
+	typedef typename mlc::array1d<typename mlc::array1d_info<Size>,
+				      struct_elt_type > array_type;
+
+	/// Number of structuring elements.
+	enum {size = Size};
+
+	se_array():delta_(0){}
+
+	/// nth struturing element.
+	struct_elt_type&
+	operator[](int i)
+	{
+	  delta_ = -1;
+	  precondition(0 <= i < Size);
+	  return tab[i];
+	}
+
+	/// nth struturing element.
+	struct_elt_type
+	operator[](int i) const
+	{
+	  precondition(0 <= i < Size);
+	  return tab[i];
+	}
+
+	/// Maximum of the delta of the structuring elements.
+	coord
+	delta() const
+	{
+	  // if not updated, compute the maximum.
+	  if (delta_ <= 0)
+	    {
+	      for (unsigned i = 0; i < Size; ++i)
+		if (tab[i].delta() > delta_)
+		  delta_ = tab[i].delta();
+	    }
+	  postcondition (delta_ >= 0);
+	  return delta_;
+	}
+      protected:
+	/// Array of structuring elements.
+	array_type tab;
+	/*! \brief Maximum delta.
+	**
+	** \note delta_ < 0 means that it must be updated before
+	** a read access.
+	*/
+	mutable coord delta_;
+      };
+
+      /*! Return the mean of the windows that has the smallest variance.
+      **
+      ** \arg im Input image.
+      ** \arg p Origin of the structuring elements.
+      ** \arg w array of structuring elements.
+      **
+      ** \param I Input image type.
+      ** \param SE Structuring element type.
+      ** \param Size Number of windows in the array.
+      ** \param Sum Type use to add values of the input image.
+      **
+      ** \note \a Sum might be a float_s if the image is an image
+      ** of integer, and might be an rgb_8::float_vec_type if I is
+      ** an image of rgb_8.
+      */
+      template<class I, class SE, unsigned Size, typename Sum>
+      inline Sum
+      mean_of_smaller_variance(const oln::abstract::image<I> &im,
+			       const oln_point_type(I) &p,
+			       const internal::se_array<Size, SE> &w);
+    } // end namespace internal
+
+    /*! A Nagao filter generalized.
+    **
+    ** Each point in the input correspond to the mean of the
+    ** window in which has the smallest variance.
+    **
+    ** \paran in Input image.
+    ** \param sa array of structuring elements.
+    **
+    ** \see oln::convol::nagao
+    */
+    template <class I, unsigned Size, typename SE, typename Sum>
+    inline oln_concrete_type(I)
+    nagao_generalized(const oln::abstract::image<I>& in,
+         	      const internal::se_array<Size, SE> &sa);
+
+    template <class I>
+    inline oln_concrete_type(I)
+    nagao(const oln::abstract::non_vectorial_image_with_dim<2, I>& in);
+
+
+    template <class I>
+    inline oln_concrete_type(I)
+    nagao(const oln::abstract::vectorial_image_with_dim<2, I>& in);
+  } // end namespace convol
+
+} // end namespace oln
+
+#include "nagao.hxx"
+
+#endif // OLENA_CONVOL_NAGAO_HH
Index: olena/oln/utils/se_stat.hh
--- olena/oln/utils/se_stat.hh Fri, 26 Mar 2004 20:54:04 +0100 van-vl_n ()
+++ olena/oln/utils/se_stat.hh Fri, 26 Mar 2004 19:33:56 +0100 van-vl_n 
(oln/m/23_se_stat.hh  644)
@@ -0,0 +1,172 @@
+// Copyright (C) 2004  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
+// 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, 59 Temple Place - Suite 330, 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.  This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+
+#ifndef OLN_UTILS_SE_STAT_HH
+# define OLN_UTILS_SE_STAT_HH
+
+# include <oln/core/abstract/point.hh>
+# include <oln/core/abstract/image.hh>
+# include <oln/core/abstract/struct_elt.hh>
+
+# include <ntg/core/abstract_hierarchy.hh>
+# include <ntg/all.hh>
+# include <ntg/core/macros.hh>
+# include <oln/math/macros.hh>
+
+namespace oln {
+  namespace utils {
+    namespace internal {
+      /*! This class is used to transform a type to a floating type 
equivalent.
+      **
+      ** \todo FIXME: There should be a way to use the standard conversion,
+      ** but I failed to find a good one. The problem is that a color<...>
+      ** derived of vec<..> but the conversion between color and vec 
should be
+      ** done through c.to_float(). \n
+      ** Example:
+      ** \verbatim
+      ** rgb_u8::float_vec_type v = rgb_u8(127, 0, 255);
+      ** // v contains 127., 0., 255  but should contain 0.5, 0,1.
+      ** rgb_u8 c = v;
+      ** // c = (255., 255., 255). Error.
+      **
+      ** rgb_u8::float_vec_type v2 = f_to_float_<rgb_u8::float_vec_type>
+      **	 				rgb_u8(127, 0, 255);
+      ** rgb_u8 c2 = v2;
+      ** // c2 = (127, 0, 255). Ok.
+      ** \endverbatim
+      */
+      template <typename DestT,
+		typename SrcT>
+      struct f_to_float_
+      {
+	static
+	DestT
+	doit(const SrcT& s)
+	{
+	  return s;
+	}
+      };
+
+      /// Specialization of the \a f_to_float struct for the colors.
+      template <unsigned ncomps,
+		unsigned qbits,
+		template <unsigned> class color_system>
+      struct f_to_float_<typename ntg::color<ncomps,
+					     qbits,
+					     color_system>::float_vec_type,
+			 ntg::color<ncomps, qbits, color_system> >
+      {
+	static
+	typename ntg::color<ncomps, qbits, color_system>::float_vec_type
+	doit(const ntg::color<ncomps, qbits, color_system>& s)
+	{
+	  return s.to_float();
+	}
+      };
+    } // end namespace internal
+
+
+    /*! \brief Compute the variance and the mean within a window.
+    **
+    ** \param Sum type used to compute the sum and the average.
+    ** \param Var type used to compute the variance.
+    **
+    ** \note There is two parameters because for vectorial types the sum
+    ** is usually a vector, and the variance a non vectorial type.
+    */
+    template <typename Sum = ntg::float_s, typename Var = ntg::float_s>
+    class se_stat
+    {
+    public:
+      /// type of used to sum the value (usually floating point values)
+      typedef Sum sum_type;
+      /// type of used for the variance (usually floating point values)
+      typedef Var variance_type;
+
+      /*! Build a se stat.
+      ** \arg im Input image.
+      ** \arg p Origin of the structuring element.
+      ** \arg s Window.
+      */
+      template <class I, class S>
+      se_stat(const oln::abstract::image<I> &im,
+	      const oln_point_type(I) &p,
+	      const oln::abstract::struct_elt<S> &s)
+      {
+	compute(im, p, s);
+      }
+
+      /// Computes the mean and the variance.
+      template <class I, class S>
+      se_stat &
+      compute(const oln::abstract::image<I> &im,
+	      const oln_point_type(I) &p,
+	      const oln::abstract::struct_elt<S> &s);
+
+      /// Mean.
+      inline Sum
+      mean() const
+      {
+	return mean_;
+      }
+
+      /// Variance.
+      inline Var
+      variance() const
+      {
+	return variance_;
+      }
+
+      /// Sum.
+      inline Sum
+      sum() const
+      {
+	return sum_;
+      }
+
+      /// Cardinal of the structuring element.
+      inline unsigned
+      card() const
+      {
+	return card_;
+      }
+
+    protected:
+      Var variance_;	///< Variance.
+      Sum mean_;	///< Mean.
+      Sum sum_;		///< Sum.
+      int card_;	///< Card of the input structuring element.
+    };
+
+  } // end namespace utils
+
+} // end namespace oln
+
+#include "se_stat.hxx"
+
+#endif //! OLN_UTILS_SE_STAT_HH
Index: olena/oln/utils/se_stat.hxx
--- olena/oln/utils/se_stat.hxx Fri, 26 Mar 2004 20:54:04 +0100 van-vl_n ()
+++ olena/oln/utils/se_stat.hxx Fri, 26 Mar 2004 19:59:59 +0100 van-vl_n 
(oln/m/24_se_stat.hx  644)
@@ -0,0 +1,70 @@
+// Copyright (C) 2004  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
+// 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, 59 Temple Place - Suite 330, 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.  This exception does not however invalidate any other
+// reasons why the executable file might be covered by the GNU General
+// Public License.
+
+
+#ifndef OLN_UTILS_SE_STAT_HXX
+# define OLN_UTILS_SE_STAT_HXX
+
+namespace oln {
+  namespace utils {
+
+    /// Computes the mean and the variance.
+    template <typename Sum, typename Var>
+    template <class I, class S>
+    inline se_stat<Sum, Var> &
+    se_stat<Sum, Var>::compute(const oln::abstract::image<I> &im,
+			       const oln_point_type(I) &p,
+			       const oln::abstract::struct_elt<S> &s)
+    {
+      sum_ = ntg_zero_val(Sum);
+      card_ = s.card();
+      // Compute the mean
+      oln_iter_type(S) it(s);
+      {
+	for_all(it)
+	  sum_ += internal::f_to_float_<Sum,
+	  oln_value_type(I)>::doit(im[p + it]);
+	mean_ = sum_ / card_;
+      }
+      // Compute the variance
+      {
+	Var sum_2(ntg_zero_val(Var));
+	for_all(it)
+	  {
+	    Sum tmp = mean_;
+	    tmp -= im[p + it];
+	    sum_2 += oln::math::dot_product<Var>(tmp, tmp);
+	  }
+	variance_ = sum_2 / card_;
+      }
+      return *this;
+    }
+  } // end namespace utils
+
+} // end namespace oln
+
+#endif //! OLN_UTILS_SE_STAT_HXX
                    
                  
                  
                          
                            
                            4
                            
                          
                          
                            
                            6