Commit 6c471684 authored by Thierry Geraud's avatar Thierry Geraud
Browse files

2006-10-11 Thierry GERAUD <theo@tegucigalpa.lrde.epita.fr>

	New facilities related to windows and q-iterators.
	
	* tests/window2d.cc: New.
	* tests/Makefile.am (window2d_SOURCES): New.
	* oln/debug/print.hh (format): New.
	(print): Update; use format to correctly print 'unsigned char'.
	* oln/level/fill.hh: Separate header and implementation.
	(fill): Use shortcut.
	* oln/core/typedefs.hh: New shortcuts oln_something(T) for
	oln_type_of(T, something).
	* oln/core/fwd_piter.hh (fwd_qiter_type): New.
	* oln/core/abstract/window.hh: New.
	* oln/core/2d/aliases.hh (window2d, fwd_qiter2d): New.
	* oln/core/gen/fwd_qiter_win.hh (include): Add abstract::window.hh.
	(fwd_qiter_win_): Update ctor signature.
	* oln/core/gen/window.hh (grid_type): New.
	(window_): Add inheritance from abstract::window.
	(impl_is_valid): New.
	(include): Update.
	* oln/basics2d.hh (include): Add window.hh and fwd_qiter_win.hh.
	* oln/Makefile.am (nobase_oln_HEADERS): Update.



git-svn-id: https://svn.lrde.epita.fr/svn/oln/trunk@619 4aad255d-cdde-0310-9447-f3009e2ae8c0
parent 5a215e72
2006-10-11 Thierry GERAUD <theo@tegucigalpa.lrde.epita.fr>
New facilities related to windows and q-iterators.
* tests/window2d.cc: New.
* tests/Makefile.am (window2d_SOURCES): New.
* oln/debug/print.hh (format): New.
(print): Update; use format to correctly print 'unsigned char'.
* oln/level/fill.hh: Separate header and implementation.
(fill): Use shortcut.
* oln/core/typedefs.hh: New shortcuts oln_something(T) for
oln_type_of(T, something).
* oln/core/fwd_piter.hh (fwd_qiter_type): New.
* oln/core/abstract/window.hh: New.
* oln/core/2d/aliases.hh (window2d, fwd_qiter2d): New.
* oln/core/gen/fwd_qiter_win.hh (include): Add abstract::window.hh.
(fwd_qiter_win_): Update ctor signature.
* oln/core/gen/window.hh (grid_type): New.
(window_): Add inheritance from abstract::window.
(impl_is_valid): New.
(include): Update.
* oln/basics2d.hh (include): Add window.hh and fwd_qiter_win.hh.
* oln/Makefile.am (nobase_oln_HEADERS): Update.
2006-10-11 Thierry GERAUD <theo@tegucigalpa.lrde.epita.fr>
Add some tools related to morphers over image value.
......
......@@ -85,6 +85,7 @@ nobase_oln_HEADERS = \
core/abstract/point_set.hh \
core/abstract/topology.hh \
core/abstract/value.hh \
core/abstract/window.hh \
\
core/automatic/image.hh \
core/automatic/image_being_mutable.hh \
......
......@@ -44,6 +44,9 @@
# include <oln/core/gen/fwd_piter_bbox.hh>
# include <oln/core/gen/bkd_piter_bbox.hh>
# include <oln/core/gen/window.hh>
# include <oln/core/gen/fwd_qiter_win.hh>
# include <oln/core/gen/neighb.hh>
# include <oln/core/2d/neighb2d.hh>
......
......@@ -38,10 +38,12 @@ namespace oln
template <typename C> class point2d_;
template <typename C> class dpoint2d_;
template <typename D> class neighb_;
template <typename D> class window_;
template <typename P> class bbox_;
template <typename P> class topo_lbbox_;
template <typename P> class fwd_piter_bbox_;
template <typename P> class bkd_piter_bbox_;
template <typename P> class fwd_qiter_win_;
class grid2d;
/// \}
......@@ -52,12 +54,16 @@ namespace oln
typedef dpoint2d_<int> dpoint2d;
typedef neighb_<dpoint2d> neighb2d;
typedef window_<dpoint2d> window2d;
typedef bbox_<point2d> bbox2d;
typedef topo_lbbox_<point2d> topo2d;
typedef fwd_piter_bbox_<point2d> fwd_piter2d;
typedef bkd_piter_bbox_<point2d> bkd_piter2d;
typedef fwd_qiter_win_<point2d> fwd_qiter2d;
typedef point2d_<float> point2df;
typedef dpoint2d_<float> dpoint2df;
/// \}
......
// Copyright (C) 2006 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, 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. This exception does not however invalidate any other
// reasons why the executable file might be covered by the GNU General
// Public License.
#ifndef OLN_CORE_ABSTRACT_WINDOW_HH
# define OLN_CORE_ABSTRACT_WINDOW_HH
# include <oln/core/typedefs.hh>
namespace oln
{
namespace abstract
{
/// Abstract window class.
template <typename E>
class window : public virtual stc::any__simple<E>,
public virtual oln::type
{
public:
bool is_valid() const;
struct decl
{
oln_virtual_typedef(grid);
decl();
};
protected:
window();
~window();
}; // end of class oln::abstract::window<E>
# ifndef OLN_INCLUDE_ONLY
template <typename E>
bool window<E>::is_valid() const
{
return this->exact().impl_is_valid();
}
template <typename E>
window<E>::window()
{
}
template <typename E>
window<E>::~window()
{
decl();
}
template <typename E>
window<E>::decl::decl()
{
}
# endif
} // end of namespace oln::abstract
} // end of namespace oln
#endif // ! OLN_CORE_ABSTRACT_WINDOW_HH
......@@ -127,6 +127,12 @@ namespace oln
typedef bkd_piter2d ret;
};
template <typename T>
struct single_vtype< image2d<T>, typedef_::fwd_qiter_type >
{
typedef fwd_qiter2d ret;
};
} // end of namespace oln
......
......@@ -29,6 +29,7 @@
# define OLN_CORE_GEN_FWD_QITER_WIN_HH
# include <oln/core/abstract/iterator_on_points.hh>
# include <oln/core/abstract/window.hh>
# include <oln/core/gen/window.hh>
......@@ -70,12 +71,13 @@ namespace oln
public:
template <typename P, typename D>
template <typename P, typename W>
fwd_qiter_win_(const abstract::iterator_on_points<P>& it,
const window_<D>& win);
template <typename P, typename D>
const abstract::window<W>& win);
template <typename P, typename W>
fwd_qiter_win_(const abstract::point<P>& p,
const window_<D>& win);
const abstract::window<W>& win);
void impl_start();
......@@ -103,22 +105,22 @@ namespace oln
# ifndef OLN_INCLUDE_ONLY
template <typename point_t>
template <typename P, typename D>
template <typename P, typename W>
fwd_qiter_win_<point_t>::fwd_qiter_win_(const abstract::iterator_on_points<P>& it,
const window_<D>& win)
const abstract::window<W>& win)
: p_ref_(it.point_adr()),
win_(win)
win_(win.exact())
{
precondition(win_.card() > 0);
i_ = -1;
}
template <typename point_t>
template <typename P, typename D>
template <typename P, typename W>
fwd_qiter_win_<point_t>::fwd_qiter_win_(const abstract::point<P>& p,
const window_<D>& win)
const abstract::window<W>& win)
: p_ref_(&(p.exact())),
win_(win)
win_(win.exact())
{
precondition(win_.card() > 0);
i_ = -1;
......
......@@ -33,14 +33,27 @@
# include <vector>
# include <mlc/assert.hh>
# include <oln/core/abstract/dpoint.hh>
# include <oln/core/abstract/window.hh>
namespace oln
{
// Fwd decl.
template <typename dpoint> class window_;
template <typename dpoint>
struct vtypes< window_<dpoint> >
{
typedef oln_type_of(dpoint, grid) grid_type;
};
/// Abstract forward dpoint iterator class.
template <typename dpoint>
class window_ : private mlc::assert_< mlc_is_a(dpoint, abstract::dpoint) >
class window_ : public abstract::window< window_<dpoint> >,
private mlc::assert_< mlc_is_a(dpoint, abstract::dpoint) >
{
typedef window_<dpoint> self_t;
......@@ -51,11 +64,13 @@ namespace oln
window_<dpoint>& add(const dpoint& dp);
template <typename D>
window_<dpoint>& add(const abstract::dpoint<D>& dp);
window_<dpoint>& add(const abstract::dpoint<D>& dp);
dpoint dp(unsigned i) const;
unsigned card() const;
dpoint dp(unsigned i) const;
bool impl_is_valid() const;
protected:
......@@ -106,6 +121,13 @@ namespace oln
return v_[i];
}
template <typename dpoint>
bool
window_<dpoint>::impl_is_valid() const
{
return v_.size() != 0;
}
template <typename dpoint>
void
window_<dpoint>::update_()
......
......@@ -200,6 +200,63 @@ namespace oln
} // end of namespace oln
/// \{
/// Shortcuts formed such as "oln_something(T) means oln_type_of(T, something)".
# define oln_coord(T) oln_type_of(T, coord)
# define oln_coord_(T) oln_type_of_(T, coord)
# define oln_grid(T) oln_type_of(T, grid)
# define oln_grid_(T) oln_type_of_(T, grid)
# define oln_point(T) oln_type_of(T, point)
# define oln_point_(T) oln_type_of_(T, point)
# define oln_dpoint(T) oln_type_of(T, dpoint)
# define oln_dpoint_(T) oln_type_of_(T, dpoint)
# define oln_value(T) oln_type_of(T, value)
# define oln_value_(T) oln_type_of_(T, value)
# define oln_rvalue(T) oln_type_of(T, rvalue)
# define oln_rvalue_(T) oln_type_of_(T, rvalue)
# define oln_lvalue(T) oln_type_of(T, lvalue)
# define oln_lvalue_(T) oln_type_of_(T, lvalue)
# define oln_fwd_piter(T) oln_type_of(T, fwd_piter)
# define oln_fwd_piter_(T) oln_type_of_(T, fwd_piter)
# define oln_bkd_piter(T) oln_type_of(T, bkd_piter)
# define oln_bkd_piter_(T) oln_type_of_(T, bkd_piter)
# define oln_fwd_qiter(T) oln_type_of(T, fwd_qiter)
# define oln_fwd_qiter_(T) oln_type_of_(T, fwd_qiter)
# define oln_bkd_qiter(T) oln_type_of(T, bkd_qiter)
# define oln_bkd_qiter_(T) oln_type_of_(T, bkd_qiter)
# define oln_fwd_niter(T) oln_type_of(T, fwd_niter)
# define oln_fwd_niter_(T) oln_type_of_(T, fwd_niter)
# define oln_bkd_niter(T) oln_type_of(T, bkd_niter)
# define oln_bkd_niter_(T) oln_type_of_(T, bkd_niter)
# define oln_piter(T) oln_type_of(T, fwd_piter)
# define oln_piter_(T) oln_type_of_(T, fwd_piter)
# define oln_qiter(T) oln_type_of(T, fwd_qiter)
# define oln_qiter_(T) oln_type_of_(T, fwd_qiter)
# define oln_niter(T) oln_type_of(T, fwd_niter)
# define oln_niter_(T) oln_type_of_(T, fwd_niter)
/// \}
# include <oln/core/abstract/entry.hh>
......
......@@ -44,24 +44,36 @@ namespace oln
/// Fwd decl.
template <typename I>
void print(const abstract::image<I>& input, std::ostream& ostr);
void print(const abstract::image<I>& input, std::ostream& ostr = std::cout);
/// Fwd decl.
template <typename I>
void println(const abstract::image<I>& input, std::ostream& ostr);
void println(const abstract::image<I>& input, std::ostream& ostr = std::cout);
# ifndef OLN_INCLUDE_ONLY
namespace impl
{
template <typename T>
const T& format(const T& value)
{
return value;
}
unsigned format(const unsigned char& value)
{
return value;
}
/// Generic version.
template <typename I>
void print(const abstract::image<I>& input, std::ostream& ostr)
{
oln_type_of(I, fwd_piter) p(input.topo());
for_all(p)
ostr << p.to_point() << ':' << ima(p) << ' ';
ostr << p.to_point() << ':' << format(input(p)) << ' ';
}
......@@ -76,7 +88,7 @@ namespace oln
{
point2d p(row, col);
if (input.has(p))
ostr << input(p);
ostr << format(input(p));
else
ostr << '-';
ostr << ' ';
......
......@@ -53,6 +53,8 @@ namespace oln
void fill(abstract::image<I>& input, const oln_type_of(I, value)& val);
# ifndef OLN_INCLUDE_ONLY
namespace impl
{
......@@ -71,7 +73,7 @@ namespace oln
/// Facade.
template <typename I>
void fill(abstract::image<I>& input, const oln_type_of(I, value)& val)
void fill(abstract::image<I>& input, const oln_value(I)& val)
{
// Precondition.
mlc::assert_<
......@@ -82,6 +84,8 @@ namespace oln
impl::fill(input.exact(), val);
}
# endif
} // end of namespace oln::level
} // end of namespace oln
......
......@@ -26,6 +26,7 @@ check_PROGRAMS = \
image2d \
image3d \
npoints \
window2d \
\
identity_morpher \
add_neighborhood_morpher \
......@@ -43,6 +44,7 @@ image1d_SOURCES = image1d.cc
image2d_SOURCES = image2d.cc
image3d_SOURCES = image3d.cc
npoints_SOURCES = npoints.cc
window2d_SOURCES = window2d.cc
# Morphers.
identity_morpher_SOURCES = identity_morpher.cc
......
#include <oln/basics2d.hh>
#include <oln/debug/print.hh>
#include <oln/io/pnm.hh>
#include <oln/morpher/add_neighborhood.hh>
namespace test
{
template <typename I, typename W>
void run(const oln::abstract::image<I>& ima,
const oln::abstract::window<W>& win)
{
oln_piter(I) p(ima.topo());
oln_qiter(I) q(p, win);
for_all(p)
{
std::cout << unsigned(ima(p)) << ": ";
for_all(q)
std::cout << unsigned(ima(q)) << " ";
std::cout << std::endl;
}
}
}
int main()
{
using namespace oln;
image2d<unsigned char> ima = io::load_pgm("../img/lena32.pgm");
debug::println(ima);
window2d win;
win
.add(dpoint2d(-1, 0))
.add(dpoint2d(-2, 0));
test::run(ima, win);
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment