
Damien Thivolle <damien@lrde.epita.fr> writes:
Le make check se vautre sur 2 tests dans convol/.
Index: ChangeLog from Damien Thivolle <damien@lrde.epita.fr>
* configure.ac: Add morphers test suite.
Index: olena/ChangeLog from Damien Thivolle <damien@lrde.epita.fr>
* olena/oln/morpher/generic_morpher.hh: Correct code and comments. * olena/oln/morpher/subq_morpher.hh: Add file. Sub quantify morpher implementation. * olena/oln/morpher/color_morpher.hh: Add file. Color morpher implementation. * olena/tests/morpher/Makefile.am: Add file. Morphers test suite. * olena/tests/morpher/tests/sq_morph_8: Add 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: configure.ac --- configure.ac Mon, 08 Mar 2004 08:12:15 +0100 palma_g (oln/3_configure. 1.47.1.1.1.1.1.4.1.15.1.15 640) +++ configure.ac Sun, 28 Mar 2004 21:28:53 +0200 thivol_d (oln/3_configure. 1.47.1.1.1.1.1.4.1.15.1.15 640) @@ -141,6 +141,7 @@ OLN_TESTS([topo]) OLN_TESTS([transforms]) OLN_TESTS([utils]) + OLN_TESTS([morpher])
AC_SUBST([OLN_TESTS_SUBDIRS])
Index: olena/oln/morpher/generic_morpher.hh --- olena/oln/morpher/generic_morpher.hh Fri, 26 Mar 2004 12:53:24 +0100 thivol_d (oln/m/18_generic_mo 1.2 600) +++ olena/oln/morpher/generic_morpher.hh Sun, 28 Mar 2004 23:11:19 +0200 thivol_d (oln/m/18_generic_mo 1.2 600) @@ -38,11 +38,17 @@
namespace oln {
- /// Contain all the morpher relative declarations and functions. + /*! \namespace oln::morpher \namespace ne sert a rien ! Il est implicite devant une declaration de namespace. + ** + ** Contain all the morpher relative declarations and functions. + */
namespace morpher {
- ///Implementation of oln::abstract::generic_morpher. + /*! \namespace oln::morpher::abstract cf precedent. + ** + ** Implementation of oln::abstract::generic_morpher. + */
namespace abstract {
@@ -109,21 +115,32 @@
public:
- /// Type of the decorated image. - typedef SrcType deco_type; - typedef oln_point_type(SrcType) point_type; - typedef oln_dpoint_type(SrcType) dpoint_type; - typedef oln_iter_type(SrcType) iter_type; - typedef oln_fwd_iter_type(SrcType) fwd_iter_type; - typedef oln_bkd_iter_type(SrcType) bkd_iter_type; - typedef oln_value_type(SrcType) value_type; - typedef oln_size_type(SrcType) size_type; + typedef generic_morpher<DestType, SrcType, Exact> self_type; + typedef Exact exact_type; + typedef oln_point_type(DestType) point_type; + typedef oln_dpoint_type(DestType) dpoint_type; + typedef oln_iter_type(DestType) iter_type; + typedef oln_fwd_iter_type(DestType) fwd_iter_type; + typedef oln_bkd_iter_type(DestType) bkd_iter_type; + typedef oln_value_type(DestType) value_type; + typedef oln_size_type(DestType) size_type; + typedef oln_impl_type(DestType) impl_type;
+ + /// Type of the decorated image. + typedef SrcType src_self_type; + typedef oln_point_type(SrcType) src_point_type; + typedef oln_dpoint_type(SrcType) src_dpoint_type; + typedef oln_iter_type(SrcType) src_iter_type; + typedef oln_fwd_iter_type(SrcType) src_fwd_iter_type; + typedef oln_bkd_iter_type(SrcType) src_bkd_iter_type; + typedef oln_value_type(SrcType) src_value_type; + typedef oln_size_type(SrcType) src_size_type; /// Underlying implementation of the decorated image. - typedef oln_impl_type(SrcType) impl_type; + typedef oln_impl_type(SrcType) src_impl_type;
/// Exact type of the decorated image. - typedef SrcType image_type; + typedef oln_exact_type(SrcType) src_exact_type;
typedef typename gm_inherit<DestType, Exact>::ret super_type;
Les commentaires, c'est Niels qui va les faire ? Il va etre content :-)
@@ -138,31 +155,31 @@ ** ** Return the value stored at \a p in the decorated image. */ - const value_type - at(const point_type& p) const + const src_value_type + at(const src_point_type& p) const { return to_exact(ima_).at(p); }
- /*! Defaults implementation of at. + /*! Default implementation of at. ** ** Return a reference to the value stored at \a p in the decorated image. */ - value_type& - at(const point_type& p) + src_value_type& + at(const src_point_type& p) { return to_exact(ima_).at(p); }
/// Default implementation of impl. - const impl_type* + const src_impl_type* impl() const { return to_exact(ima_).impl(); }
/// Default implementation of impl. - impl_type* + src_impl_type* impl() { return to_exact(ima_).impl(); @@ -172,7 +189,7 @@ ** ** Return a copy of the decorated image. */ - image_type + src_self_type clone_() const { return to_exact(ima_).clone_(); @@ -192,22 +209,12 @@ ** ** Assign \a rhs to the decorated image. */ - image_type& - assign(deco_type& rhs) + src_self_type& + assign(src_self_type& rhs) { return to_exact(ima_).assign(rhs); }
- /*! Default implementation of operator=. Le je suis pas sur, mais ca serait pas the "=" operator ? - ** - ** Assign the decorated image to \a r. - */ - deco_type& - operator=(const oln::io::internal::anything& r) - { - return r.assign(ima_); - } - /*! Default implementation of border_set_width. ** ** Set the border width of the decorated image to @@ -220,13 +227,17 @@ return to_exact(ima_).border_set_width(min_border, copy_border); }
+ self_type& operator=(self_type& rhs) + { + return to_exact(*this).assign(rhs.exact()); + } + static std::string name() { return "generic_morpher<" + super_type::name() + ">"; }
- };
} // end of namespace abstract Index: olena/oln/morpher/subq_morpher.hh --- olena/oln/morpher/subq_morpher.hh Mon, 29 Mar 2004 00:36:08 +0200 thivol_d () +++ olena/oln/morpher/subq_morpher.hh Sun, 28 Mar 2004 23:58:11 +0200 thivol_d (oln/m/25_subq_morph 644) @@ -0,0 +1,214 @@ +// 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 SUBQ_MORPHER_HH OLN_MORPHER_SUBQ_MORPHER_HH +# define SUBQ_MORPHER_HH + +# include "generic_morpher.hh" + +namespace oln { + + namespace morpher { + + template <class SrcType, unsigned N, class Exact = mlc::final> + struct subq_morpher; + } // end of namespace morpher + + /// Retrieve types and dimension of the subq_morpher. commentraires des parametres templates ! + template <class SrcType, unsigned N, class Exact> + struct image_id<oln::morpher::subq_morpher<SrcType, N, Exact> > + { + enum {dim = SrcType::dim}; + typedef oln_impl_type(SrcType) impl_type; + typedef typename ntg::color<3, N, ntg::rgb_traits> value_type; + typedef typename mlc::exact_vt<oln::morpher::subq_morpher<SrcType, N, Exact>, + Exact>::ret exact_type; + }; commentaires des types virtuels. + + /// Specialized version for subq_morpher.
+ template <class SrcType, unsigned N, class Exact> commentraires des parametres templates ! + struct image_traits <oln::morpher::subq_morpher<SrcType, N, Exact> > : + public image_traits<abstract::image_with_impl<oln_impl_type(SrcType), + oln::morpher::subq_morpher<SrcType, N, Exact> > > + { + }; + + namespace morpher { + + + /*! Change the color depth of \a T. + ** + ** For Example, calling color_mute with + ** color<3, 8, rgb_traits>, 5 will give + ** the type : color<3, 5, rgb_traits>. + */ + + template <class T, unsigned N> + struct color_mute + { + }; + + /// Specialized version for ntg::color. + template <unsigned nbcomps_, + unsigned nbits_, + template <unsigned> class color_system, + unsigned N> + struct color_mute<ntg::color<nbcomps_, nbits_, color_system>, N> + { + typedef ntg::color<nbcomps_, N, color_system> ret; + enum { nbcomps = nbcomps_ }; + enum { nbits = nbits_ }; + }; + + + + /*! \brief Sub quantify an image. + ** + ** By using this class, an image can be viewed + ** as an image with a lower color depth. + ** subq_morpher<image2d<rgb_8>, 5> is + ** the same as image2d<rgb_5>. commentraires des parametres templates ! Ca permet de resumer leur fonction, c'est plus rapide pour la comprehension. + */ + template <class SrcType, unsigned N, class Exact> + struct subq_morpher: + public 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 + 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; + + /// 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; + + /// The type of the resulting image. + typedef typename oln::mute<SrcType, + typename color_mute<oln_value_type(SrcType), + N>::ret>::ret DestType; + + typedef subq_morpher<SrcType, N, Exact> self_type; + + /// 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) {} + + /// Construct the morpher with another morpher. + subq_morpher(const subq_morpher<SrcType, N>& r) + : super_type(r.get_ima()) {} + + /*! Empty constructor. + ** + ** Needed by mlc_hierarchy::any_with_diamond. + */ + subq_morpher() {} + + /// Return the value stored at \a p in the resulting image. + const value_type at(const point_type& p) const + { + value_type tmp; + unsigned int i; + + for (i = 0; i < nbcomps; i++) + { + tmp[i] = this->ima_[p][i] / ((ntg_max_val(ntg_comp_type(oln_value_type(SrcType))) + 1) + / (ntg_max_val(ntg_comp_type(value_type)) + 1)); + } + return tmp; + } + + /// Return the implementation. + const impl_type* + impl() const + { + return ima_.impl(); + } + + static std::string name() + { + return "subq_morpher<" + SrcType::name() + ">"; + } + + }; + + /*! \brief Instantiate a temporary read-only subq_morpher. + ** + ** \param S Indicate the color depth of the resulting image. + ** It can't be higher than the color depth of \a ima. + ** + ** \code + ** #include <oln/morpher/subq_morpher.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::morpher::sqmorph<3>(imc), + ** IMG_OUT "oln_morpher_subq_morpher.ppm"); + ** } + ** \endcode + ** \image html lena_ppm.png + ** \image latex lena_ppm.png + ** => + ** \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) + { + return subq_morpher<I, S>(ima); + } + + } // end of namespace morpher + +} // end of namespace morpher + + + + +#endif // !SUBQ_MORPHER_HH + Index: olena/oln/morpher/color_morpher.hh --- olena/oln/morpher/color_morpher.hh Mon, 29 Mar 2004 00:36:08 +0200 thivol_d () +++ olena/oln/morpher/color_morpher.hh Sun, 28 Mar 2004 23:58:37 +0200 thivol_d (oln/m/26_color_morp 644) @@ -0,0 +1,384 @@ +// 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 COLOR_MORPHER_HH +# define COLOR_MORPHER_HH OLN_MORPHER_COLOR_MORPHER_HH + +# include <oln/morpher/generic_morpher.hh> + +namespace oln { + + namespace morpher { + + template <class I, class Exact = mlc::final> + class color_morpher; + + } // end of namespace morpher + + + /// Retrieve types and dimension of the color_morpher. \param ? + template <class I, class Exact> + struct image_id<morpher::color_morpher<I, Exact> > + { + enum {dim = I::dim}; + typedef oln_impl_type(I) impl_type; + typedef ntg_comp_type(oln_value_type(I)) value_type; + typedef typename mlc::exact_vt<morpher::color_morpher<I, Exact>, + Exact>::ret exact_type; + }; + + /// Specialized version for color_morpher. + template <class I> + struct image_traits <morpher::color_morpher<I> > : + public image_traits<abstract::image_with_impl<oln_impl_type(I), + morpher::color_morpher<I> > > + { + }; + + namespace morpher { + + /// Abstract color_morpher class used for code factorization. + template <class DestType, class SrcType, class Exact> + class super_color_morpher : public abstract::generic_morpher<DestType, SrcType, Exact> + { + protected: + + /*! The component to return. + ** + ** If \a n is equal to 0, the red component is returned. + ** If \a n is equal to 1, the green component is returned. + ** If \a n is equal to 2, the blue component is returned. + */ + unsigned n_; + + /*! Default constructor. + ** + ** \a ima will be the decorated image. + ** One can not use this constructor to instantiate this class + ** since it is protected. + */ + super_color_morpher(const SrcType &ima, unsigned n) : super_type(ima) + { + assert(n == ntg::rgb_R || n == ntg::rgb_G || n == ntg::rgb_B); + n_ = n; + } + + /*! Empty constructor. + ** + ** Needed by mlc_hierarchy::any_with_diamond. + */ + super_color_morpher() + {} + + public: + typedef abstract::generic_morpher<DestType, SrcType, Exact> super_type; + typedef oln_impl_type(SrcType) impl_type; + + /// Return the number of the image component to retrieve. + unsigned + get_comp() const + { + return n_; + } + + /// Return the image implementation. + impl_type* + impl() + { + return ima_.impl(); + } + + /// Return the image implementation. + const impl_type* + impl() const + { + return ima_.impl(); + } + + static std::string + name() + { + return "super_color_morpher<" + super_type::name() + ">"; + } + + + }; + + /*! The default color_morpher class. + ** + ** Using this class, an rgb image can be viewed + ** according to one of its component. + ** + ** \see oln::morpher::abstract::generic_morpher + */ + template <class SrcType, class Exact> + struct color_morpher : + public super_color_morpher<typename oln::mute<oln_exact_type(SrcType), + ntg_comp_type(oln_value_type(SrcType))>::ret, + SrcType, + color_morpher<SrcType, Exact> > + { + /// The type of the object instantiated. color_morpher can be derived. + typedef typename image_id<color_morpher<SrcType, Exact> >::exact_type exact_type; + + /// The image will be viewed as a Destype image. + typedef typename oln::mute<oln_exact_type(SrcType), + ntg_comp_type(oln_value_type(SrcType))>::ret DestType; + + typedef color_morpher<SrcType, Exact> self_type; + typedef oln_iter_type(SrcType) iter_type; + typedef oln_point_type(SrcType) point_type; + typedef oln_fwd_iter_type(SrcType) fwd_iter_type; + typedef oln_size_type(SrcType) size_type; + typedef ntg_comp_type(oln_value_type(SrcType)) value_type; + typedef oln_impl_type(SrcType) impl_type; + 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; + commentaires.
+ /// 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) + {} + + /// Construct the color_morpher with another color_morpher. + color_morpher(const color_morpher<SrcType, Exact>& r) : super_type(r.get_ima(), r.get_comp()) + {} + + /*! Empty constructor. + ** + ** Needed by mlc_hierarchy::any_with_diamond. + */ + color_morpher() + {} + + /*! Return a reference to the \a n_th component of the + ** rgb value stored at \a p. Un \warnining pour dire qu'il ne faut pas l'appeler directement, mais plutot passer par [] serait le bienvenu.
+ */ + value_type& + at(const point_type& p) + { + return const_cast<SrcType &>(this->ima_)[p][this->n_]; + } + + /// Return the \a n_th component of the rgb value stored at \a p. idem
+ const value_type + at(const point_type& p) const + { + return this->ima_[p][this->n_]; + } + + /*! Perform a shallow copy from the decorated image of \a rhs + ** to the current decorated image. The points will be shared + ** by the two images. + */ + self_type& + assign(self_type& rhs) + { + oln_iter_type(SrcType) it(rhs); + + for_all(it) + this->at(it) = rhs[it]; + 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() + ">"; + } + + }; + + /// The specialized version for `const' declared images. + 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> > + { + /// 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; + typedef ntg_comp_type(oln_value_type(SrcType)) value_type; + typedef oln_impl_type(SrcType) impl_type; + Commentaires.
+ 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; + + /// 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) + {} + + /// Construct the color_morpher with another color_morpher. + color_morpher(const color_morpher<const SrcType, Exact>& r) : + super_type(r.get_ima(), r.get_comp()) + {} + + /*! Empty constructor. + ** + ** Needed by mlc_hierarchy::any_with_diamond. + */ + color_morpher() + {} + + /// Return the \a n_th component of the rgb value stored at \a p. + const value_type + at(const point_type& p) const + { + return this->ima_[p][this->n_]; + } + + static std::string + name() + { + return "color_morpher<" + SrcType::name() + ">"; + } + + }; + + + /*! \brief Instantiate a temporary read-only + ** color_morpher. + ** + ** The image will be viewed according to its red layer. + ** + ** \code + ** #include <oln/morpher/color_morpher.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::morpher::rmorph(imc), + ** IMG_OUT "oln_morpher_red_morpher.pgm"); + ** } + ** \endcode + ** \image html lena_ppm.png + ** \image latex lena_ppm.png + ** => + ** \image html oln_morpher_red_morpher.png + ** \image latex oln_morpher_red_morpher.png + */ + template <class I> + const color_morpher<I> rmorph(I &ima) + { + return color_morpher<I>(ima, ntg::rgb_R); + } + + /*! \brief Instantiate a temporary read-only + ** color_morpher. + ** + ** The image will be viewed according to its green layer. + ** + ** \code + ** #include <oln/morpher/color_morpher.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::morpher::gmorph(imc), + ** IMG_OUT "oln_morpher_green_morpher.pgm"); + ** } + ** \endcode + ** \image html lena_ppm.png + ** \image latex lena_ppm.png + ** => + ** \image html oln_morpher_green_morpher.png + ** \image latex oln_morpher_green_morpher.png + */ + template <class I> + const color_morpher<I> gmorph(I &ima) + { + return color_morpher<I>(ima, ntg::rgb_G); + } + + /*! \brief Instantiate a temporary read-only + ** color_morpher. + ** + ** The image will be viewed according to its blue layer. + ** + ** \code + ** #include <oln/morpher/color_morpher.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::morpher::bmorph(imc), + ** IMG_OUT "oln_morpher_blue_morpher.pgm"); + ** } + ** \endcode + ** \image html lena_ppm.png + ** \image latex lena_ppm.png + ** => + ** \image html oln_morpher_blue_morpher.png + ** \image latex oln_morpher_blue_morpher.png + */ + template <class I> + const color_morpher<I> bmorph(I &ima) + { + return color_morpher<I>(ima, ntg::rgb_B); + } + + } // end of namespace morpher + +} // end of namespace oln + +#endif // !COLOR_MORPHER_HH Index: olena/tests/morpher/Makefile.am --- olena/tests/morpher/Makefile.am Mon, 29 Mar 2004 00:36:08 +0200 thivol_d () +++ olena/tests/morpher/Makefile.am Sun, 28 Mar 2004 19:31:40 +0200 thivol_d (oln/m/27_Makefile.a 644) @@ -0,0 +1 @@ +include ../check/Makefile.runtests Index: olena/tests/morpher/tests/sq_morph_8 --- olena/tests/morpher/tests/sq_morph_8 Mon, 29 Mar 2004 00:36:08 +0200 thivol_d () +++ olena/tests/morpher/tests/sq_morph_8 Sun, 28 Mar 2004 20:15:14 +0200 thivol_d (oln/m/28_sq_morph_8 644) @@ -0,0 +1,29 @@ +// -*- 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:36:08 +0200 thivol_d () +++ olena/tests/morpher/tests/sq_morph_7 Sun, 28 Mar 2004 20:20:08 +0200 thivol_d (oln/m/29_sq_morph_7 644) @@ -0,0 +1,29 @@ +// -*- 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:36:08 +0200 thivol_d () +++ olena/tests/morpher/tests/sq_morph_6 Sun, 28 Mar 2004 20:21:51 +0200 thivol_d (oln/m/30_sq_morph_6 644) @@ -0,0 +1,29 @@ +// -*- 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:36:08 +0200 thivol_d () +++ olena/tests/morpher/tests/sq_morph_5 Sun, 28 Mar 2004 20:23:01 +0200 thivol_d (oln/m/31_sq_morph_5 644) @@ -0,0 +1,29 @@ +// -*- 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:36:08 +0200 thivol_d () +++ olena/tests/morpher/tests/sq_morph_4 Sun, 28 Mar 2004 20:24:05 +0200 thivol_d (oln/m/32_sq_morph_4 644) @@ -0,0 +1,29 @@ +// -*- 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:36:08 +0200 thivol_d () +++ olena/tests/morpher/tests/sq_morph_3 Sun, 28 Mar 2004 20:46:05 +0200 thivol_d (oln/m/33_sq_morph_3 644) @@ -0,0 +1,29 @@ +// -*- 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:36:08 +0200 thivol_d () +++ olena/tests/morpher/tests/sq_morph_2 Sun, 28 Mar 2004 20:47:22 +0200 thivol_d (oln/m/34_sq_morph_2 644) @@ -0,0 +1,29 @@ +// -*- 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:36:08 +0200 thivol_d () +++ olena/tests/morpher/tests/sq_morph_1 Sun, 28 Mar 2004 20:49:46 +0200 thivol_d (oln/m/35_sq_morph_1 644) @@ -0,0 +1,29 @@ +// -*- 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:36:08 +0200 thivol_d () +++ olena/tests/morpher/tests/rmorph Sun, 28 Mar 2004 19:57:25 +0200 thivol_d (oln/m/36_rmorph 644) @@ -0,0 +1,28 @@ +// -*- 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:36:08 +0200 thivol_d () +++ olena/tests/morpher/tests/gmorph Sun, 28 Mar 2004 19:59:36 +0200 thivol_d (oln/m/37_gmorph 644) @@ -0,0 +1,29 @@ +// -*- 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:36:08 +0200 thivol_d () +++ olena/tests/morpher/tests/color_sq_morph Sun, 28 Mar 2004 20:57:30 +0200 thivol_d (oln/m/38_color_sq_m 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/bmorph --- olena/tests/morpher/tests/bmorph Mon, 29 Mar 2004 00:36:08 +0200 thivol_d () +++ olena/tests/morpher/tests/bmorph Sun, 28 Mar 2004 20:02:06 +0200 thivol_d (oln/m/39_bmorph 644) @@ -0,0 +1,29 @@ +// -*- 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; + } +} +
cool, mais des vrai tests sont aussi necessaires. Tu as ajoute des fichiers, mais tu ne les a pas references dans le makefile.am de /olena/oln. Etant Release manager, je te conseille de le faire car ca t'evitera des distchecks inutiles, et dieu sait que tu en aura. -- Giovanni Palma EPITA - promo 2005 - membre d'EpX - LRDE Mob. : +33 (0)6 60 97 31 74