Commit af17b31f authored by Roland Levillain's avatar Roland Levillain
Browse files

Fix many tests.

	* mln/core/decorated_image.hh
	(mln::decorated_image<I, D>::rvalue): New typedef.
	(mln::decorated_image<I, D>::lvalue): Set to impl_::lvalue.
	(mln::decorated_image<I, D>::read_): Have it return a rvalue, not
	a value.
	(mln::decorated_image<I, D>::operator()(const psite&) const)
	(mln::decorated_image<I, D>::operator()(const psite&)):
	New operators
	(mln::internal::decorated_image_impl_<I, E>::write_): Fix access
	to delegatee's data.
	* mln/math/abs.hh (mln::level::abs(const value::int_u<n>&)):
	Declare this overload.
	(mln::math::abs(int))
	(mln::math::abs(long))
	(mln::math::abs(float))
	(mln::math::abs(double))
	(mln::math::abs(long double)):
	New overloads.
	* mln/border/fill.hh,
	* mln/level/memset_.hh:
	Include header cstring for std::memset.
	* mln/make/w_window.hh: Wrap long lines.
	* mln/convert/to_image.hh: Likewise.
	(mln::convert::to_image(const Weighted_Window<W>&)): Fill the
	image with zeros before copying weights.
	* mln/convert/to_p_array.hh: Include missing header
	mln/core/concept/image.hh for mln::Image.
	* mln/win/line.hh (mln::win::line<M,i,C>::line): Replace a dynamic
	assertion by a static one.
	* mln/value/float01_.hh
	(mln::trait::value< mln::value::float01_<n> >::min)
	(mln::trait::value< mln::value::float01_<n> >::max)
	(mln::trait::value< mln::value::float01_<n> >::epsilon)
	* mln/value/float01_f.hh
	(mln::trait::value< mln::value::float01_f >::min)
	(mln::trait::value< mln::value::float01_f >::max)
	(mln::trait::value< mln::value::float01_f >::epsilon)
	* mln/value/internal/gray_.hh
	(mln::trait::value< mln::value::internal::gray_<n> >::min)
	(mln::trait::value< mln::value::internal::gray_<n> >::max)
	(mln::trait::value< mln::value::internal::gray_<n> >::epsilon)
	* mln/value/internal/gray_f.hh
	(mln::trait::value< mln::value::internal::gray_f >::min)
	(mln::trait::value< mln::value::internal::gray_f >::max)
	(mln::trait::value< mln::value::internal::gray_f >::epsilon):
	Remove useless `const' qualifier on return type.
	* mln/value/proxy.hh
	(mln::value::proxy<I>::~proxy)
	(mln::value::proxy<const I>::~proxy):
	Change the return type of checked `read_' routine to
	mln_rvalue(I).
	* mln/value/stack.hh
	(mln::value::stack_image<n, I>::read_)
	(mln::value::stack_image<n, I>::operator()(const psite&)):
	Set return type to rvalue.
	* mln/fun/v2v/rgb_to_hsi.hh: Add missing copyright header.
	Add missing header guards.
	Wrap long lines.
	(mln::fun::v2v::f_rgb_to_hsi_<T_hsi>): Remove useless variable.
	* mln/geom/seeds2tiling.hh (mln::geom::impl::seeds2tiling): Add
	braces around inner `if' to avoid (visual) ambiguity w.r.t. a 
	dangling `else'.
	* mln/core/fi_adaptor.hh (mln::fi_adaptor<I>::load): Ensure the
	image is correctly loaded.

	* tests/core/decorated_image.cc: Exercise
	mln::decorated_image< const I, D >.
	* tests/core/fi_adaptor.cc: Use a smaller kernel for the median
	filter.
	Use tests/data.hh and MLN_IMG_DIR to find the img/ dir.
	Don't call display::show.
	* tests/core/w_window1d_int.cc: Use meaninful input.
	Update documentation.
	* tests/linear/log.cc: Update expected values.


git-svn-id: https://svn.lrde.epita.fr/svn/oln/trunk@2151 4aad255d-cdde-0310-9447-f3009e2ae8c0
parent de5a82ad
2008-08-14 Roland Levillain <roland@lrde.epita.fr>
Fix many tests.
* mln/core/decorated_image.hh
(mln::decorated_image<I, D>::rvalue): New typedef.
(mln::decorated_image<I, D>::lvalue): Set to impl_::lvalue.
(mln::decorated_image<I, D>::read_): Have it return a rvalue, not
a value.
(mln::decorated_image<I, D>::operator()(const psite&) const)
(mln::decorated_image<I, D>::operator()(const psite&)):
New operators
(mln::internal::decorated_image_impl_<I, E>::write_): Fix access
to delegatee's data.
* mln/math/abs.hh (mln::level::abs(const value::int_u<n>&)):
Declare this overload.
(mln::math::abs(int))
(mln::math::abs(long))
(mln::math::abs(float))
(mln::math::abs(double))
(mln::math::abs(long double)):
New overloads.
* mln/border/fill.hh,
* mln/level/memset_.hh:
Include header cstring for std::memset.
* mln/make/w_window.hh: Wrap long lines.
* mln/convert/to_image.hh: Likewise.
(mln::convert::to_image(const Weighted_Window<W>&)): Fill the
image with zeros before copying weights.
* mln/convert/to_p_array.hh: Include missing header
mln/core/concept/image.hh for mln::Image.
* mln/win/line.hh (mln::win::line<M,i,C>::line): Replace a dynamic
assertion by a static one.
* mln/value/float01_.hh
(mln::trait::value< mln::value::float01_<n> >::min)
(mln::trait::value< mln::value::float01_<n> >::max)
(mln::trait::value< mln::value::float01_<n> >::epsilon)
* mln/value/float01_f.hh
(mln::trait::value< mln::value::float01_f >::min)
(mln::trait::value< mln::value::float01_f >::max)
(mln::trait::value< mln::value::float01_f >::epsilon)
* mln/value/internal/gray_.hh
(mln::trait::value< mln::value::internal::gray_<n> >::min)
(mln::trait::value< mln::value::internal::gray_<n> >::max)
(mln::trait::value< mln::value::internal::gray_<n> >::epsilon)
* mln/value/internal/gray_f.hh
(mln::trait::value< mln::value::internal::gray_f >::min)
(mln::trait::value< mln::value::internal::gray_f >::max)
(mln::trait::value< mln::value::internal::gray_f >::epsilon):
Remove useless `const' qualifier on return type.
* mln/value/proxy.hh
(mln::value::proxy<I>::~proxy)
(mln::value::proxy<const I>::~proxy):
Change the return type of checked `read_' routine to
mln_rvalue(I).
* mln/value/stack.hh
(mln::value::stack_image<n, I>::read_)
(mln::value::stack_image<n, I>::operator()(const psite&)):
Set return type to rvalue.
* mln/fun/v2v/rgb_to_hsi.hh: Add missing copyright header.
Add missing header guards.
Wrap long lines.
(mln::fun::v2v::f_rgb_to_hsi_<T_hsi>): Remove useless variable.
* mln/geom/seeds2tiling.hh (mln::geom::impl::seeds2tiling): Add
braces around inner `if' to avoid (visual) ambiguity w.r.t. a
dangling `else'.
* mln/core/fi_adaptor.hh (mln::fi_adaptor<I>::load): Ensure the
image is correctly loaded.
* tests/core/decorated_image.cc: Exercise
mln::decorated_image< const I, D >.
* tests/core/fi_adaptor.cc: Use a smaller kernel for the median
filter.
Use tests/data.hh and MLN_IMG_DIR to find the img/ dir.
Don't call display::show.
* tests/core/w_window1d_int.cc: Use meaninful input.
Update documentation.
* tests/linear/log.cc: Update expected values.
2008-08-12 Roland Levillain <roland@lrde.epita.fr>
Add a backward iterator on complex-based images.
......
// Copyright (C) 2007 EPITA Research and Development Laboratory
// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
......@@ -33,6 +33,8 @@
* \brief Define function that fills border using a given value.
*/
# include <cstring>
# include <mln/core/concept/image.hh>
......
// Copyright (C) 2007 EPITA Research and Development Laboratory
// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
......@@ -42,6 +42,8 @@
# include <mln/core/concept/weighted_window.hh>
# include <mln/core/concept/neighborhood.hh>
# include <mln/literal/zero.hh>
# include <mln/convert/to_window.hh>
# include <mln/geom/bbox.hh>
# include <mln/level/fill.hh>
......@@ -106,7 +108,8 @@ namespace mln
/// Convert a point set \p pset into a binary image. Width of the
/// converted image will be pset.bbox + 2 * \p border.
template <typename S>
mln_image_from(S, bool) to_image(const Point_Set<S>& pset, unsigned border = 1);
mln_image_from(S, bool) to_image(const Point_Set<S>& pset,
unsigned border = 1);
/// Convert a window \p win into a binary image.
template <typename W>
......@@ -175,6 +178,10 @@ namespace mln
typedef mln_point(W) P;
box_<P> b = geom::bbox(w_win);
mln_image_from(W, mln_weight(W)) ima(b);
// Fill the image with zeros, as (weighted) windows are not
// necessarily box-shaped (there might be holes corresponding to
// null weights).
level::fill(ima, literal::zero);
mln_qiter(W) q(w_win, P::origin);
for_all(q)
ima(q) = q.w();
......
// Copyright (C) 2007 EPITA Research and Development Laboratory
// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
......@@ -32,6 +32,7 @@
/// \brief Conversions to mln::p_array.
# include <mln/core/p_array.hh>
# include <mln/core/concept/image.hh>
# include <mln/core/concept/window.hh>
......
// Copyright (C) 2007 EPITA Research and Development Laboratory
// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
......@@ -52,6 +52,7 @@ namespace mln
struct decorated_image_impl_
{
typedef mln::value::proxy<E> lvalue;
/// Actual write routine.
void write_(const mln_psite(I)& p, const mln_value(I)& v);
};
......@@ -89,8 +90,13 @@ namespace mln
typedef decorated_image<I, D> self_;
typedef internal::decorated_image_impl_< I, self_ > impl_;
/// Type of the psite.
typedef mln_psite(I) psite;
/// Return type of read-only access.
typedef mln_rvalue(I) rvalue;
/// Return type of read-write access.
typedef typename internal::morpher_lvalue_<I>::ret lvalue;
typedef typename impl_::lvalue lvalue;
/// Ctors
decorated_image();
......@@ -105,7 +111,14 @@ namespace mln
/// Skeleton.
typedef decorated_image< tag::image_<I>, tag::data_<D> > skeleton;
mln_value(I) read_(const mln_psite(I)& p) const;
/// Read-only access of pixel value at point site \p p.
rvalue operator()(const psite& p) const;
/// Read-write access of pixel value at point site \p p.
lvalue operator()(const psite& p);
/// Actual read routine.
rvalue read_(const mln_psite(I)& p) const;
/// Const promotion via convertion.
operator decorated_image<const I, D>() const;
......@@ -115,7 +128,6 @@ namespace mln
/// Give the decoration.
D& decoration();
};
......@@ -168,34 +180,54 @@ namespace mln
void (D::*mr)(const I&, const mln_psite(I)&) const = & D::reading;
mr = 0;
typedef mlc_unconst(I) I_;
void (D::*mw)(I_&, const mln_psite(I_)&, const mln_value(I_)&) = & D::writing;
void (D::*mw)(I_&, const mln_psite(I_)&, const mln_value(I_)&) =
& D::writing;
mw = 0;
}
template <typename I, typename D>
inline
typename decorated_image<I,D>::rvalue
decorated_image<I,D>::operator()(const mln_psite(I)& p) const
{
mln_precondition(this->delegatee_() != 0);
return read_(p);
}
template <typename I, typename D>
inline
typename decorated_image<I,D>::lvalue
decorated_image<I,D>::operator()(const mln_psite(I)& p)
{
mln_precondition(this->delegatee_() != 0);
// Return a proxy.
return lvalue(*this, p);
}
template <typename I, typename D>
inline
mln_rvalue(I)
decorated_image<I,D>::read_(const mln_psite(I)& p) const
{
this->data_->deco_.reading(this->data_->ima_, p);
return this->data_->ima_(p);
}
namespace internal
{
/// \internal
template <typename I, typename E>
inline
void
decorated_image_impl_<I,E>::write_(const mln_psite(I)& p, const mln_value(I)& v)
decorated_image_impl_<I,E>::write_(const mln_psite(I)& p,
const mln_value(I)& v)
{
E& ima = internal::force_exact<E>(*this);
ima.decoration().writing(ima.data_->ima_, p, v);
ima.data_->ima_(p) = v;
ima.decoration().writing(*ima.delegatee_(), p, v);
(*ima.delegatee_())(p) = v;
}
} // end of namespace mln::internal
template <typename I, typename D>
inline
mln_value(I)
decorated_image<I,D>::read_(const mln_psite(I)& p) const
{
this->data_->deco_.reading(this->data_->ima_, p);
return this->data_->ima_(p);
}
template <typename I, typename D>
inline
decorated_image<I,D>::operator decorated_image<const I, D>() const
......
// Copyright (C) 2007 EPITA Research and Development Laboratory
// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
......@@ -37,7 +37,8 @@
* FreeImagePlus's ones.
*
* For compatibility reasons, images from FreeImage library which
* doesn't take more than 7bits per pixel are converted to fill 8 bits per pixel.
* doesn't take more than 7bits per pixel are converted to fill 8 bits
* per pixel.
*
*
* COMPILATION:
......@@ -47,13 +48,13 @@
*/
# include <FreeImagePlus.h>
# include <mln/core/internal/image_primary.hh>
# include <mln/core/box2d.hh>
# include <mln/core/line_piter.hh>
# include <mln/value/set.hh>
# include <FreeImagePlus.h>
namespace mln
{
// Fwd decl.
......@@ -101,7 +102,8 @@ namespace mln
{
template <typename I>
struct image_< fi_adaptor<I> > : default_image_< mln_value(I), fi_adaptor<I> >
struct image_< fi_adaptor<I> >
: default_image_< mln_value(I), fi_adaptor<I> >
{
typedef trait::image::category::primary category;
......@@ -244,7 +246,9 @@ namespace mln
data_< fi_adaptor<I> >::sync_with_adaptee_()
{
mln_precondition(fi_ima_.isValid());
//FIXME: doesnt work for rgb: mln_precondition(fi_ima_.getBitsPerPixel() == 8 * sizeof(mln_value(I)));
// FIXME: doesnt work for rgb:
// mln_precondition(fi_ima_.getBitsPerPixel() ==
// 8 * sizeof(mln_value(I)));
deallocate_();
b_ = make::box2d(fi_ima_.getHeight(),
......@@ -437,6 +441,7 @@ namespace mln
{
init_();
BOOL r = this->data_->fi_ima_.load(lpszPathName, flag);
mln_assertion(this->data_->fi_ima_.isValid());
if (this->data_->fi_ima_.getBitsPerPixel() < 8)
this->data_->fi_ima_.convertTo8Bits();
this->data_->sync_with_adaptee_();
......
// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
// of the GNU General Public License version 2 as published by the
// Free Software Foundation.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this library; see the file COPYING. If not, write to
// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
// Boston, MA 02111-1307, USA.
//
// As a special exception, you may use this file as part of a free
// software library without restriction. Specifically, if other files
// instantiate templates or use macros or inline functions from this
// file, or you compile this file and link it with other files to
// produce an executable, this file does not by itself cause the
// resulting executable to be covered by the GNU General Public
// License.
// reasons why the executable file might be covered by the GNU General
// Public License.
#ifndef MLN_FUN_V2V_RGB_TO_HSI_HH
# define MLN_FUN_V2V_RGB_TO_HSI_HH
#include <cmath>
......@@ -7,6 +36,7 @@
#include <mln/value/hsi.hh>
// FIXME: Split interface and implementation.
namespace mln
{
......@@ -34,17 +64,21 @@ namespace mln
T_hsi hsi;
double alpha = inv_sqrt2 * rgb.green() - inv_sqrt2 * rgb.blue();
double beta = 2 * inv_sqrt6 * rgb.red() - inv_sqrt6 * rgb.green() - inv_sqrt6 * rgb.blue();
double beta =
2 * inv_sqrt6 * rgb.red() -
inv_sqrt6 * rgb.green() -
inv_sqrt6 * rgb.blue();
float tmp = atan2(beta, alpha) / 3.1415 * 180.0;
hsi.hue() = atan2(beta, alpha) / 3.1415 * 180.0;
if (hsi.hue() < 0)
hsi.hue() = hsi.hue() + 360.0;
mln_invariant(hsi.hue() >= 0);
hsi.sat() = std::sqrt(alpha * alpha + beta * beta);
hsi.inty() = sqrt3_3 * rgb.red() + sqrt3_3 * rgb.green() + sqrt3_3 * rgb.blue();
hsi.inty() =
sqrt3_3 * rgb.red() +
sqrt3_3 * rgb.green() +
sqrt3_3 * rgb.blue();
return hsi;
}
......@@ -52,6 +86,7 @@ namespace mln
typedef f_rgb_to_hsi_<value::hsi_f> f_rgb_to_hsi_f_t;
// FIXME: Warning: global object.
f_rgb_to_hsi_f_t f_rgb_to_hsi_f;
......@@ -83,8 +118,10 @@ namespace mln
red_t r = to_r(sqrt3_3 * hsi.inty() + 2 * inv_sqrt6 * beta);
green_t g = to_g(sqrt3_3 * hsi.inty() + inv_sqrt2 * alpha - inv_sqrt6 * beta);
blue_t b = to_b(sqrt3_3 * hsi.inty() - inv_sqrt2 * alpha - inv_sqrt6 * beta);
green_t g =
to_g(sqrt3_3 * hsi.inty() + inv_sqrt2 * alpha - inv_sqrt6 * beta);
blue_t b =
to_b(sqrt3_3 * hsi.inty() - inv_sqrt2 * alpha - inv_sqrt6 * beta);
T_rgb rgb(r, g, b);
......@@ -94,6 +131,7 @@ namespace mln
typedef f_hsi_to_rgb_<value::rgb8> f_hsi_to_rgb_3x8_t;
// FIXME: Warning: global object.
f_hsi_to_rgb_3x8_t f_hsi_to_rgb_3x8;
} // end of namespace fun::v2v
......@@ -101,3 +139,5 @@ namespace mln
} // end of namespace fun
} // end of namespace mln
#endif // ! MLN_FUN_V2V_RGB_TO_HSI_HH
// Copyright (C) 2007 EPITA Research and Development Laboratory
// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
......@@ -101,11 +101,13 @@ namespace mln
mln_niter(N) n(nbh, p);
for_all(n) if (ima.has(n))
if (out(n) != 0)
out(p) = out(n);
else
q.push_force(n); // n may already be in the queue,
// yet we then queue again this psite
{
if (out(n) != 0)
out(p) = out(n);
else
q.push_force(n); // n may already be in the queue,
// yet we then queue again this psite
}
}
}
......
......@@ -68,6 +68,7 @@ namespace mln
namespace impl
{
// FIXME: Argument FILENAME is not used; remove?
template <typename I>
inline
void save_header_(const I& ima, const std::string& filename,
......
// Copyright (C) 2007 EPITA Research and Development Laboratory
// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
......@@ -33,6 +33,8 @@
* \brief Same as std::memset but for fastest images.
*/
# include <cstring>
# include <mln/core/concept/image.hh>
# include <mln/core/pixel.hh>
# include <mln/metal/is_not_const.hh>
......
......@@ -53,16 +53,16 @@ namespace mln
* \return A weighted window.
*/
template <typename W, typename F>
mln::w_window<mln_dpoint(W), mln_result(F)> w_window(const Window<W>& win,
const Function_p2v<F>& wei);
mln::w_window<mln_dpoint(W), mln_result(F)>
w_window(const Window<W>& win, const Function_p2v<F>& wei);
# ifndef MLN_INCLUDE_ONLY
template <typename W, typename F>
inline
mln::w_window<mln_dpoint(W), mln_result(F)> w_window(const Window<W>& win_,
const Function_p2v<F>& wei_)
mln::w_window<mln_dpoint(W), mln_result(F)>
w_window(const Window<W>& win_, const Function_p2v<F>& wei_)
{
const W& win = exact(win_);
const F& wei = exact(wei_);
......
// Copyright (C) 2007 EPITA Research and Development Laboratory
// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
......@@ -34,6 +34,7 @@
*/
# include <cmath>
# include <cstdlib>
# include <mln/value/all.hh>
......@@ -44,9 +45,30 @@ namespace mln
namespace math
{
/// Generic version.
template <typename T>
T abs(const T& v);
/// Specializations for existing overloads of std::abs.
///
/// Reference:
/// ISO/IEC 14882:2003 C++ standard, section 26.5
/// (C Library, [lib.c.math]).
///
/// \{
int abs(int v);
long abs(long v);
float abs(float v);
double abs(double v);
long double abs(long double v);
/// \}
/// Specialization for mln::value::int_u.
template <unsigned n>
value::int_u<n> abs(const value::int_u<n>& v);
# ifndef MLN_INCLUDE_ONLY
......@@ -54,9 +76,16 @@ namespace mln
inline
T abs(const T& v)
{
return std::abs(v);
return v >= 0 ? v : -v;
}
inline int abs(int v) { return std::abs(v); }
inline long abs(long v) { return std::abs(v); }
inline float abs(float v) { return std::abs(v); }
inline double abs(double v) { return std::abs(v); }
inline long double abs(long double v) { return std::abs(v); }
template <unsigned n>
inline
value::int_u<n> abs(const value::int_u<n>& v)
......
// Copyright (C) 2006, 2007 EPITA Research and Development Laboratory
// Copyright (C) 2006, 2007, 2008 EPITA Research and Development
// Laboratory (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
......@@ -71,9 +72,9 @@ namespace mln
typedef trait::value::kind::data kind;
typedef mln_value_quant_from_(card) quant;
static const float min() { return 0.f; }
static const float max() { return 1.f; }
static const float epsilon() { return 0.f; }
static float min() { return 0.f; }
static float max() { return 1.f; }
static float epsilon() { return 0.f; }
typedef float sum;
};
......
// Copyright (C) 2006, 2007 EPITA Research and Development Laboratory
// Copyright (C) 2006, 2007, 2008 EPITA Research and Development
// Laboratory (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
......@@ -65,9 +66,9 @@ namespace mln
card = 0
};
static const float min() { return 0; }
static const float max() { return 1; }
static const float epsilon() { return mln_epsilon(float); }
static float min() { return 0; }
static float max() { return 1; }
static float epsilon() { return mln_epsilon(float); }
typedef float sum;
};
......
// Copyright (C) 2006, 2007 EPITA Research and Development Laboratory
// Copyright (C) 2006, 2007, 2008 EPITA Research and Development
// Laboratory (LRDE)
//
// This file is part of the Olena Library. This library is free
// software; you can redistribute it and/or modify it under the terms
......@@ -107,9 +108,9 @@ namespace mln
typedef trait::value::kind::gray kind;
typedef trait::value::quant::high quant;
static const self_ min();
static const self_ max();
static const self_ epsilon();
static self_ min();
static self_ max();
static self_ epsilon();
typedef self_ sum; // FIXME: OK?.
};
......@@ -688,7 +689,7 @@ namespace trait
template <unsigned n>
inline
const mln::value::internal::gray_<n>