Commit ccb6c8e0 authored by Nicolas Neri's avatar Nicolas Neri
Browse files

Add fill optimized.

	* sandbox/duhamel/compil.cmd: Compile fills_test.cc.
	* sandbox/duhamel/fills_test.cc: Here.

git-svn-id: https://svn.lrde.epita.fr/svn/oln/trunk@1072 4aad255d-cdde-0310-9447-f3009e2ae8c0
parent 19d46af7
2007-09-05 Guillaume Duhamel <guillaume.duhamel@lrde.epita.fr>
Add fill optimized.
* sandbox/duhamel/compil.cmd: Compile fills_test.cc.
* sandbox/duhamel/fills_test.cc: Here.
2007-09-05 Matthieu Garrigues <garrigues.matthieu@lrde.epita.fr>
Add 1d handling
......
g++-4.1 -ansi -pedantic -W -Wall -Wextra -Wconversion -I../.. fills_test.cc
// Copyright (C) 2007 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.
/*! \file tests/image2d_b.cc
*
* \brief Tests on mln::image2d_b.
*/
#include <mln/core/image2d_b.hh>
#include <mln/value/int_u8.hh>
#include <mln/debug/println.hh>
#include <mln/geom/nrows.hh>
#include <mln/geom/ncols.hh>
#include <mln/level/fill.hh>
namespace mln
{
// 1.08
template <typename I>
void fill_naive(I& ima, const mln_value(I)& value)
{
mln_piter(I) p(ima.domain());
for_all(p)
ima(p) = value;
}
// 0.08
template <typename I>
void fill_memset(I& ima, const mln_value(I)& value)
{
mln_precondition(sizeof(mln_value(I)) == 1);
std::memset((void*)(ima.buffer()),
*(const int*)(& value), // violent cast
sizeof(mln_value(I)) * ima.ncells());
}
// 0.26
template <typename I>
void fill_pixel(I& ima, const mln_value(I)& value)
{
int n = 0;
mln_pixter(I) pix(ima);
for_all(pix)
{
++n;
pix.val() = value;
}
std::cout << "n = "
<< n
<< std::endl;
}
// 0.10
template <typename I>
void fill_ptr(I& ima, const mln_value(I)& value)
{
mln_value(I)* ptr = & ima[0];
std::size_t n = ima.ncells();
for (std::size_t i = 0; i < n; ++i)
*ptr++ = value;
std::cout << "n = "
<< n
<< std::endl;
}
template <typename I>
void fill_opt1(I& ima, const mln_value(I)& value)
{
mln_pixter(I) pix(ima);
mln_pixter(I) s(ima);
pix.start();
s.start ();
mln_coord(I) min_row = geom::min_row(exact(ima));
mln_coord(I) min_col = geom::min_col(exact(ima));
mln_coord(I) max_row = geom::max_row(exact(ima));
mln_coord(I) max_col = geom::max_col(exact(ima));
mln_coord(I) nb_cols = max_col - min_col;
mln_coord(I) nb_rows = max_row - min_row;
std::cerr << "min_row : "
<< min_row
<< std::endl
<< "max_row : "
<< max_row
<< std::endl
<< "min_col : "
<< min_col
<< std::endl
<< "max_col : "
<< max_col
<< std::endl;
// fill row
for (std::size_t i = 0; i < nb_cols; ++i)
{
pix.val () = value;
pix.next ();
}
for (std::size_t i = 1; i < nb_rows; ++i)
{
// copy row into current row
std::memcpy (&(pix.val ()),
&(s.val ()),
sizeof(mln_value(I)) * nb_cols);
// Jump to next row
for (std::size_t j = 0; j < nb_cols; ++j)
pix.next ();
}
std::memcpy (&(pix.val ()),
&(s.val ()),
sizeof(mln_value(I)) * nb_cols);
}
template <typename I>
void fill_opt2(I& ima, const mln_value(I)& value)
{
mln_value(I)* ptr = & ima[0];
mln_pixter(I) pix(ima);
mln_pixter(I) s(ima);
point2d min = ima.bbox ().pmin ();
point2d u = min;
point2d v = min + down;
std::size_t k = ima.offset (down);
std::size_t max = ima.ncells() / k;
for (std::size_t i = 0; i < k; ++i)
*ptr++ = value;
ptr = & ima[0];
for (std::size_t i = 0;
i < max - 1;
++i)
{
u = u + down;
std::memcpy (&ima[ima.offset (u - min)],
ptr,
sizeof (mln_value(I)) * k);
}
}
}
int main()
{
using namespace mln;
image2d_b<value::int_u8> ima(3, 3);
fill_opt2(ima, 5);
debug::println(ima);
}
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