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

Add tests for duplicate border and debug print with border for 3d.

	Tests for duplicate.
	* test_border_duplicate_image1d_1.cc,
	* test_border_duplicate_image1d_2.cc,
	* test_border_duplicate_image1d_3.cc,
	* test_border_duplicate_image1d_4.cc,
	* test_border_duplicate_image1d_5.cc,
	* test_border_duplicate_image2d_1.cc,
	* test_border_duplicate_image2d_2.cc,
	* test_border_duplicate_image2d_3.cc,
	* test_border_duplicate_image2d_4.cc,
	* test_border_duplicate_image3d_1.cc,
	* test_border_duplicate_image3d_2.cc,
	* test_border_duplicate_image3d_3.cc,
	* test_border_duplicate_image3d_4.cc: New tests.

	New print for 3d with border.
	* debug_print_3d_with_border.hh: New.

	Update.
	* test_border_fill_image3d_2.cc,
	* test_border_fill_image3d_3.cc,
	* test_border_fill_image3d_4.cc,
	* test_border_fill_image3d_1.cc,
	* border_duplicate.hh: Update.

	New iota
	* test_debug_iota_3d.cc: New iota debug for 3d.

git-svn-id: https://svn.lrde.epita.fr/svn/oln/trunk@1147 4aad255d-cdde-0310-9447-f3009e2ae8c0
parent ec3576b0
2007-09-20 Guillaume Duhamel <guillaume.duhamel@lrde.epita.fr>
Add tests for duplicate border and debug print with border for 3d.
Tests for duplicate.
* test_border_duplicate_image1d_1.cc,
* test_border_duplicate_image1d_2.cc,
* test_border_duplicate_image1d_3.cc,
* test_border_duplicate_image1d_4.cc,
* test_border_duplicate_image1d_5.cc,
* test_border_duplicate_image2d_1.cc,
* test_border_duplicate_image2d_2.cc,
* test_border_duplicate_image2d_3.cc,
* test_border_duplicate_image2d_4.cc,
* test_border_duplicate_image3d_1.cc,
* test_border_duplicate_image3d_2.cc,
* test_border_duplicate_image3d_3.cc,
* test_border_duplicate_image3d_4.cc: New tests.
New print for 3d with border.
* debug_print_3d_with_border.hh: New.
Update.
* test_border_fill_image3d_2.cc,
* test_border_fill_image3d_3.cc,
* test_border_fill_image3d_4.cc,
* test_border_fill_image3d_1.cc,
* border_duplicate.hh: Update.
New iota
* test_debug_iota_3d.cc: New iota debug for 3d.
2007-09-20 Thierry Geraud <thierry.geraud@lrde.epita.fr>
Change image base impl classes.
......
......@@ -34,7 +34,6 @@
*/
# include <mln/core/concept/image.hh>
# include <mln/core/internal/fixme.hh>
# include <mln/level/memset_.hh>
//# include <mln/core/line_piter.hh>
#include <mln/geom/nrows.hh>
......@@ -68,71 +67,6 @@ namespace mln
namespace impl
{
template <typename I>
void duplicate_(const Fast_Image<I>& ima_)
{
const I& ima = exact(ima_);
mln_precondition(ima.has_data());
// internal::fixme();
// FIX
std::size_t border = ima.border ();
std::size_t nbrows = geom::max_row(ima) - geom::min_row(ima);
std::size_t nbcols = geom::max_col(ima) - geom::min_col(ima);
std::size_t real_nbcols = (nbcols + 1) + 2 * border;
std::size_t start = real_nbcols * border + border;
std::size_t s = start;
// duplicate top left corner
for (std::size_t i = 0; i < border + 1; ++i)
for (std::size_t j = 0; j < border + 1; ++j)
const_cast<I&>(ima)[i * ((nbcols + 1) + 2 * border) + j] = ima[s];
// duplicate top border
s = start;
for (std::size_t i = 1; i <= nbcols - 1; ++i)
for (std::size_t j = 0; j <= border; ++j)
const_cast<I&>(ima)[s + i - (j * real_nbcols)] = ima[s + i];
// duplicate top left corner
s = start + nbcols;
for (std::size_t i = 0; i <= border; ++i)
for (std::size_t j = 0; j <= border; ++j)
const_cast<I&>(ima)[i * ((nbcols + 1) + 2 * border) + (nbcols + border + j)] = ima[s];
// duplicate left border
s = start;
for (std::size_t i = 1; i <= nbrows - 1; ++i)
for (std::size_t j = 1; j <= border; ++j)
const_cast<I&>(ima)[s - j + (i * real_nbcols)] = ima[s + (i * real_nbcols)];
// duplicate right border
s = start;
for (std::size_t i = 1; i <= nbrows - 1; ++i)
for (std::size_t j = 1; j <= border; ++j)
const_cast<I&>(ima)[s + (i * real_nbcols + nbcols) + j] = ima[s + (i * real_nbcols + nbcols)];
// duplicate bottom left corner
s = start + (nbrows * real_nbcols);
for (std::size_t i = 0; i <= border; ++i)
for (std::size_t j = 0; j <= border; ++j)
const_cast<I&>(ima)[s - i + (j * (real_nbcols))] = ima[s];
// duplicate bottom border
s = start + (nbrows * real_nbcols);
for (std::size_t i = 1; i <= nbcols - 1; ++i)
for (std::size_t j = 0; j <= border; ++j)
const_cast<I&>(ima)[s + i + (j * real_nbcols)] = ima[s + i];
// duplicate bottom right corner
s = start + (nbrows * real_nbcols) + nbcols;
for (std::size_t i = 0; i <= border; ++i)
for (std::size_t j = 0; j <= border; ++j)
const_cast<I&>(ima)[s + i + (j * real_nbcols)] = ima[s];
//END FIX
}
template <typename I>
void duplicate_1d_(const Fast_Image<I>& ima_)
{
......@@ -162,30 +96,10 @@ namespace mln
typename I::line_piter pl(ima.domain());
std::size_t border = ima.border ();
std::size_t border_2x = 2 * ima.border ();
std::size_t len_c = exact(ima).bbox().len(P::dim - 1);
std::size_t len_r = exact(ima).bbox().len(P::dim - 2);
std::size_t len_c = exact(ima).bbox().len(1);
std::size_t len_r = exact(ima).bbox().len(0);
std::size_t real_len_c = len_c + border_2x;
pl.start ();
// Duplicate first line
std::size_t st = ima.offset_at (pl);
for (std::size_t i = 0; i < border; ++i)
const_cast<I&>(ima)[i] = ima[st];
std::size_t end = len_c + border;
for (std::size_t i = 0; i < len_c; ++i)
const_cast<I&>(ima)[border + i] = ima[st + i];
end = len_c + border * 2;
for (std::size_t i = len_c + border; i < end; ++i)
const_cast<I&>(ima)[i] = ima[len_c + border - 1];
// Duplicate n * border line
for (std::size_t k = 1; k < border; ++k)
for (std::size_t i = 0; i < real_len_c; ++i)
const_cast<I&>(ima)[k * real_len_c + i] = ima[i];
std::size_t st;
// Duplicate
for_all (pl)
......@@ -198,6 +112,12 @@ namespace mln
const_cast<I&>(ima)[st + i] = ima[st];
}
// Duplicate n first * border line
st = real_len_c * border;
for (std::size_t k = 0; k < border; ++k)
for (std::size_t i = 0; i < real_len_c; ++i)
const_cast<I&>(ima)[k * real_len_c + i] = ima[st + i];
// Duplicate n last * border line
st = real_len_c * (border + len_r - 1);
for (std::size_t k = 1; k <= border; ++k)
......@@ -216,8 +136,8 @@ namespace mln
std::size_t border = ima.border ();
std::size_t border_2x = 2 * ima.border ();
std::size_t len_c = exact(ima).bbox().len(P::dim - 1);
std::size_t len_r = exact(ima).bbox().len(P::dim - 2);
std::size_t len_s = exact(ima).bbox().len(P::dim - 3);
std::size_t len_r = exact(ima).bbox().len(1);
std::size_t len_s = exact(ima).bbox().len(0);
std::size_t real_len_c = len_c + border_2x;
std::size_t real_len_r = len_r + border_2x;
std::size_t face = real_len_c * real_len_r;
......@@ -277,6 +197,11 @@ namespace mln
void duplicate(const Fast_Image<I>& ima_)
{
typedef mln_point(I) P;
const I& ima = exact(ima_);
mln_precondition(ima.has_data());
if (!ima.border ())
return;
if (P::dim == 1)
impl::duplicate_1d_(ima_);
if (P::dim == 2)
......
// 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 debug_print_3d_with_boder.cc
*
*
*/
#include <mln/core/image3d_b.hh>
namespace mln
{
namespace debug
{
template <typename I>
void print_3d_with_border (const Fast_Image<I>& input_)
{
const I& ima = exact(input_);
mln_precondition(ima.has_data());
typedef mln_point(I) P;
std::size_t len_s = exact(ima).bbox().len(P::dim - 3);
std::size_t len_r = exact(ima).bbox().len(P::dim - 2);
std::size_t len_c = exact(ima).bbox().len(P::dim - 1);
std::size_t border = ima.border ();
std::size_t real_len_s = len_s + 2 * border;
std::size_t real_len_r = len_r + 2 * border;
std::size_t real_len_c = len_c + 2 * border;
for (std::size_t k = 0; k < real_len_s; ++k)
{
for (std::size_t j = 0; j < real_len_r; ++j)
{
for (std::size_t i = 0; i < real_len_c; ++i)
std::cout << ima[k * (real_len_r * real_len_c) + j * real_len_c + i]
<< " ";
std::cout << std::endl;
}
std::cout << std::endl;
}
std::cout << std::endl;
}
}
}
// 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/test_border_duplicate_image1d_1.cc
*
* \brief Tests on mln::border::duplicate.
*/
#include "border_duplicate.hh"
#include <mln/core/image1d_b.hh>
#include <mln/value/int_u8.hh>
#include <mln/debug/println_with_border.hh>
#include <mln/debug/iota.hh>
using namespace mln;
int
main (void)
{
std::cout << std::endl
<< "Test 1d size=5 with border=3 in value::int_u8"
<< std::endl
<< std::endl;
image1d_b<value::int_u8> ima(5);
debug::iota (ima);
border::duplicate (ima);
std::cout << std::endl;
debug::println_with_border(ima);
std::cout << std::endl;
}
// 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/border_fill.cc
*
* \brief Tests on mln::border::fill.
*/
#include "border_duplicate.hh"
#include <mln/core/image1d_b.hh>
#include <mln/value/int_u8.hh>
#include <mln/debug/println_with_border.hh>
#include <mln/debug/iota.hh>
using namespace mln;
int
main (void)
{
std::cout << std::endl
<< "Test 1d size=8 with border=3 in int"
<< std::endl
<< std::endl;
image1d_b<int> ima(8, 3);
debug::iota (ima);
border::duplicate (ima);
debug::println_with_border(ima);
std::cout << std::endl;
}
// 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/border_fill.cc
*
* \brief Tests on mln::border::fill.
*/
#include "border_duplicate.hh"
#include <mln/core/image1d_b.hh>
#include <mln/value/int_u8.hh>
#include <mln/debug/println_with_border.hh>
#include <mln/debug/iota.hh>
using namespace mln;
int
main (void)
{
std::cout << std::endl
<< "Test 1d size= box [2 .. 4] with border=6 in int"
<< std::endl
<< std::endl;
box1d b(make::point1d(2), make::point1d(4));
image1d_b<int> ima(b, 6);
debug::iota (ima);
border::duplicate (ima);
std::cout << std::endl;
debug::println_with_border(ima);
std::cout << std::endl;
}
// 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/border_fill.cc
*
* \brief Tests on mln::border::fill.
*/
#include "border_duplicate.hh"
#include <mln/core/image1d_b.hh>
#include <mln/value/int_u8.hh>
#include <mln/debug/println_with_border.hh>
#include <mln/debug/iota.hh>
using namespace mln;
int
main (void)
{
std::cout << std::endl
<< "Test 1d size= box [-6 .. -3] with border=6 in value::int_u8"
<< std::endl
<< std::endl;
box1d b(make::point1d(-6), make::point1d(-3));
image1d_b<value::int_u8> ima(b, 6);
debug::iota (ima);
border::duplicate (ima);
std::cout << std::endl;
debug::println_with_border(ima);
std::cout << std::endl;
}
// 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/border_fill.cc
*
* \brief Tests on mln::border::fill.
*/
#include "border_duplicate.hh"
#include <mln/core/image1d_b.hh>
#include <mln/value/int_u8.hh>
#include <mln/debug/println_with_border.hh>
#include <mln/debug/iota.hh>
using namespace mln;
int
main (void)
{
std::cout << std::endl
<< "Test 1d size= box [2 .. 4] with border=0 in int"
<< std::endl
<< std::endl;
box1d b(make::point1d(2), make::point1d(4));
image1d_b<int> ima(b, 0);
debug::iota (ima);
border::duplicate (ima);
std::cout << std::endl;
debug::println_with_border(ima);
std::cout << std::endl;
}
// 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/test_border_duplicate_image2d_1.cc
*
* \brief Tests on mln::border::duplicate.
*/
#include "border_duplicate.hh"
#include <mln/core/image2d_b.hh>
#include <mln/value/int_u8.hh>
#include <mln/debug/println_with_border.hh>
#include <mln/debug/iota.hh>
using namespace mln;
int
main (void)
{
std::cout << std::endl
<< "Test 2d size=5x2 with border=3 in value::int_u8"
<< std::endl
<< std::endl;
image2d_b<value::int_u8> ima(5, 2, 3);
debug::iota (ima);
border::duplicate (ima);
std::cout << std::endl;
debug::println_with_border(ima);
std::cout << std::endl;
}