Blame ETL/test/pen.cpp

darco b3016b
/*! ========================================================================
darco b3016b
** Extended Template and Library Test Suite
darco b3016b
** Handle Template Class Test
dooglus 36d01e
** $Id$
darco b3016b
**
darco b3016b
** Copyright (c) 2002 Robert B. Quattlebaum Jr.
darco b3016b
**
darco b3016b
** This package is free software; you can redistribute it and/or
darco b3016b
** modify it under the terms of the GNU General Public License as
darco b3016b
** published by the Free Software Foundation; either version 2 of
darco b3016b
** the License, or (at your option) any later version.
darco b3016b
**
darco b3016b
** This package is distributed in the hope that it will be useful,
darco b3016b
** but WITHOUT ANY WARRANTY; without even the implied warranty of
darco b3016b
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
darco b3016b
** General Public License for more details.
darco b3016b
**
darco b3016b
** === N O T E S ===========================================================
darco b3016b
**
darco b3016b
** ========================================================================= */
darco b3016b
darco b3016b
/* === H E A D E R S ======================================================= */
darco b3016b
darco b3016b
#include <list></list>
darco b3016b
#include <cstdio></cstdio>
darco b3016b
#include <cstdlib></cstdlib>
darco b3016b
#include <string></string>
darco b3016b
#include <utility></utility>
darco b3016b
#include <memory></memory>
darco b3016b
#include <map></map>
darco b3016b
#include <etl pen=""></etl>
darco b3016b
#include <etl boxblur=""></etl>
darco b3016b
//#include <etl gaussian=""></etl>
caryoscelus 77c779
#include <cmath></cmath>
darco b3016b
darco b3016b
/* === M A C R O S ========================================================= */
darco b3016b
darco b3016b
using namespace std;
darco b3016b
using namespace etl;
darco b3016b
darco b3016b
/* === C L A S S E S ======================================================= */
darco b3016b
darco b3016b
int generic_pen_test(int w, int h)
darco b3016b
{
darco b3016b
	printf("generic_pen(w:%d,h:%d): ",w,h);
darco b3016b
c0fcc1
	auto_ptr<float> data(new float[w*h]);</float>
c0fcc1
	//unique_ptr<float> data(new float[w*h]);</float>
darco b3016b
	if(!data.get())
darco b3016b
	{
= cd1e3b
		printf("Um..... malloc failure on line %d of " __FILE__ "...\n", __LINE__);
darco b3016b
		abort();
darco b3016b
	}
darco b3016b
darco b3016b
	generic_pen<float> pen(data.get(),w,h);</float>
darco b3016b
	generic_pen<float> pen2;</float>
darco b3016b
darco b3016b
	if(!pen)
darco b3016b
	{
= cd1e3b
		printf("FAILURE! " __FILE__ "@%d: On pen bool test\n", __LINE__);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	if(&pen.x()[2]!=&pen[0][2])
darco b3016b
	{
= cd1e3b
		printf("FAILURE! " __FILE__ "@%d: On request for horizontal iterator\n", __LINE__);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	if(&pen.y()[2]!=&pen[2][0])
darco b3016b
	{
= cd1e3b
		printf("FAILURE! " __FILE__ "@%d: On request for vertical iterator\n", __LINE__);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	pen.move(1,1);
darco b3016b
	pen2=pen;
darco b3016b
darco b3016b
	if(pen!=pen2)
darco b3016b
	{
= cd1e3b
		printf("FAILURE! " __FILE__ "@%d: On pen assignment or pen comparison\n", __LINE__);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	pen2.move(w,h);
darco b3016b
	generic_pen<float>::difference_type diff(pen2-pen);</float>
darco b3016b
darco b3016b
	if(diff.x!=w || diff.y!=h)
darco b3016b
	{
= cd1e3b
		printf("FAILURE! " __FILE__ "@%d: pen difference inconsistency ([%d,%d]!=[%d,%d])\n", __LINE__, diff.x, diff.y, w, h);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	if(pen.end_x()-pen.x()!=w-1)
darco b3016b
	{
= cd1e3b
		printf("FAILURE! " __FILE__ "@%d: iterator_x inconsistency (%ld!=%d)\n", __LINE__, pen.end_x()-pen.x(), w);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	if(pen.end_y()-pen.y()!=h-1)
darco b3016b
	{
= cd1e3b
		printf("FAILURE! " __FILE__ "@%d: iterator_y inconsistency (%d!=%d)\n", __LINE__, pen.end_y()-pen.y(), h);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	if(&pen.end_y()[-1]!=&pen.y()[(h-2)])
darco b3016b
	{
= cd1e3b
		printf("FAILURE! " __FILE__ "@%d: iterator_y inconsistency\n", __LINE__);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
darco b3016b
	if(&pen.end_x()[-1]!=&pen.x()[(w-2)])
darco b3016b
	{
= cd1e3b
		printf("FAILURE! " __FILE__ "@%d: iterator_x inconsistency\n", __LINE__);
darco b3016b
		return 1;
darco b3016b
	}
dooglus cee594
darco b3016b
	printf("PASSED\n");
darco b3016b
darco b3016b
	return 0;
darco b3016b
}
darco b3016b
darco b3016b
int alpha_pen_test(void)
darco b3016b
{
darco b3016b
	printf("alpha_pen: ");
darco b3016b
	printf("SKIPPED\n");
darco b3016b
darco b3016b
	return 0;
darco b3016b
}
darco b3016b
darco b3016b
int bbox_pen_test(void)
darco b3016b
{
darco b3016b
	printf("bbox_pen: ");
darco b3016b
darco b3016b
darco b3016b
darco b3016b
	printf("SKIPPED\n");
darco b3016b
darco b3016b
	return 0;
darco b3016b
}
darco b3016b
darco b3016b
int display_pen(generic_pen<float> pen, int w, int h)</float>
darco b3016b
{
darco b3016b
	int ret=0;
darco b3016b
	int x, y;
darco b3016b
	// print out the after pic
darco b3016b
	for(y=0;y
darco b3016b
	{
darco b3016b
		printf("|");
darco b3016b
		for(x=0;x
darco b3016b
		{
darco b3016b
			if(pen.get_value()>=2.0f)
darco b3016b
				printf("#");
darco b3016b
			else if(pen.get_value()>=1.0f)
darco b3016b
				printf("@");
darco b3016b
			else if(pen.get_value()>=0.8f)
darco b3016b
				printf("%%");
darco b3016b
			else if(pen.get_value()>=0.6f)
darco b3016b
				printf("O");
darco b3016b
			else if(pen.get_value()>=0.4f)
darco b3016b
				printf(":");
darco b3016b
			else if(pen.get_value()>=0.2f)
darco b3016b
				printf(".");
darco b3016b
			else if(pen.get_value()>=-0.0001f)
darco b3016b
				printf(" ");
darco b3016b
			else
darco b3016b
				printf("X"),ret++;
darco b3016b
		}
darco b3016b
		pen.dec_x(x);
darco b3016b
		printf("|\n");
darco b3016b
	}
darco b3016b
	pen.dec_y(y);
darco b3016b
	return ret;
darco b3016b
}
darco b3016b
darco b3016b
int display_pen(generic_pen<double> pen, int w, int h)</double>
darco b3016b
{
darco b3016b
	int ret=0;
darco b3016b
	int x, y;
darco b3016b
	// print out the after pic
darco b3016b
	for(y=0;y
darco b3016b
	{
darco b3016b
		printf("|");
darco b3016b
		for(x=0;x
darco b3016b
		{
darco b3016b
			if(pen.get_value()>=2.0f)
darco b3016b
				printf("#");
darco b3016b
			else if(pen.get_value()>=1.0f)
darco b3016b
				printf("@");
darco b3016b
			else if(pen.get_value()>=0.8f)
darco b3016b
				printf("%%");
darco b3016b
			else if(pen.get_value()>=0.6f)
darco b3016b
				printf("O");
darco b3016b
			else if(pen.get_value()>=0.4f)
darco b3016b
				printf(":");
darco b3016b
			else if(pen.get_value()>=0.2f)
darco b3016b
				printf(".");
darco b3016b
			else if(pen.get_value()>=-0.0001f)
darco b3016b
				printf(" ");
darco b3016b
			else
darco b3016b
				printf("X"),ret++;
darco b3016b
		}
darco b3016b
		pen.dec_x(x);
darco b3016b
		printf("|\n");
darco b3016b
	}
darco b3016b
	pen.dec_y(y);
darco b3016b
	return ret;
darco b3016b
}
darco b3016b
darco b3016b
void emptyfunction(int v)
darco b3016b
{
darco b3016b
	static int stupid = 0;
darco b3016b
	stupid = v;
fce3e7
	if (stupid == 0) return; // disable unused warning
darco b3016b
	//printf("Called... %d\n",v);
darco b3016b
}
darco b3016b
darco b3016b
int box_blur_test(void)
darco b3016b
{
darco b3016b
	typedef float boxblur_float;
darco b3016b
darco b3016b
	printf("box_blur: ");
darco b3016b
darco b3016b
	int w=25,h=25;
darco b3016b
c0fcc1
	//unique_ptr<boxblur_float> data(new boxblur_float[w*h]);</boxblur_float>
c0fcc1
	//unique_ptr<boxblur_float> data2(new boxblur_float[w*h]);</boxblur_float>
c0fcc1
	auto_ptr<boxblur_float> data(new boxblur_float[w*h]);</boxblur_float>
c0fcc1
	auto_ptr<boxblur_float> data2(new boxblur_float[w*h]);</boxblur_float>
darco b3016b
	if(!data.get())
darco b3016b
	{
= cd1e3b
		printf("Um..... malloc failure on line %d of " __FILE__ "...\n", __LINE__);
darco b3016b
		abort();
darco b3016b
	}
darco b3016b
darco b3016b
	generic_pen<boxblur_float> pen(data.get(),w,h);</boxblur_float>
darco b3016b
	generic_pen<boxblur_float> pen2;</boxblur_float>
darco b3016b
darco b3016b
	generic_pen<boxblur_float> pen3(data2.get(),w,h);</boxblur_float>
darco b3016b
	int x,y;
darco b3016b
darco b3016b
	for(y=0;y
darco b3016b
	{
darco b3016b
		for(x=0;x
darco b3016b
		{
pabs3 6d6033
			if( (x-y<=1 && y-x<=1) || y==h/2 || x==w/2)
darco b3016b
				pen.put_value(2);
darco b3016b
			else
darco b3016b
				pen.put_value(0);
darco b3016b
		}
darco b3016b
		pen.dec_x(x);
darco b3016b
	}
darco b3016b
	pen.dec_y(y);
darco b3016b
darco b3016b
	int bad_values=0;
darco b3016b
darco b3016b
	printf("\nBEFORE BOX BLUR:\n");
darco b3016b
darco b3016b
	// print out the before pic
darco b3016b
	display_pen(pen,w,h);
darco b3016b
darco b3016b
	// Pen 2 will be the end
darco b3016b
	pen2=pen;
darco b3016b
	pen2.move(w,h);
dooglus cee594
darco b3016b
	//temporary
darco b3016b
	vbox_blur(pen,pen2,2,pen3);
darco b3016b
	printf("\n VBLUR ONLY:\n");
darco b3016b
	display_pen(pen3,w,h);
dooglus cee594
darco b3016b
//	box_blur(pen,w,h,4);
darco b3016b
	hbox_blur(pen,pen2,2,pen3);
dooglus cee594
darco b3016b
	printf("\n HBLUR ONLY:\n");
darco b3016b
	display_pen(pen3,w,h);
dooglus cee594
darco b3016b
	pen2=pen3;
darco b3016b
	pen2.move(w,h);
darco b3016b
	vbox_blur(pen3,pen2,2,pen);
darco b3016b
darco b3016b
	printf("\nAFTER BOX BLUR:\n");
darco b3016b
darco b3016b
	// print out the after pic
darco b3016b
	bad_values=display_pen(pen,w,h);
darco b3016b
darco b3016b
	if(bad_values)
darco b3016b
	{
= cd1e3b
		printf("FAILURE! " __FILE__ "@%d: blur result contained %d bad values\n", __LINE__, bad_values);
darco b3016b
		return 1;
darco b3016b
	}
dooglus cee594
darco b3016b
	boxblur_float max=0;
darco b3016b
	printf("CHECK BOXBLUR RESULTS %d,%d:\n",pen.diff_begin().x, pen.diff_begin().y);
darco b3016b
	for(y=0;y
darco b3016b
	{
darco b3016b
		for(x=0;x
darco b3016b
		{
darco b3016b
			boxblur_float f = 0;
dooglus cee594
darco b3016b
			for(int oy=-2; oy <= 2; ++oy)
darco b3016b
			{
darco b3016b
				int iy = y+oy;
darco b3016b
				if(iy < 0) iy = 0;
darco b3016b
				if(iy >= h) iy = h-1;
dooglus cee594
darco b3016b
				for(int ox=-2; ox <= 2; ++ox)
darco b3016b
				{
darco b3016b
					int ix = x+ox;
darco b3016b
					if(ix < 0) ix = 0;
darco b3016b
					if(ix >= w) ix = w-1;
dooglus cee594
pabs3 6d6033
					if( (ix-iy<=1 && iy-ix<=1) || iy==h/2 || ix==w/2)
darco b3016b
						f += 2;
darco b3016b
				}
darco b3016b
			}
dooglus cee594
darco b3016b
			//print out if the relative error is high
darco b3016b
			/*f /= 25;
darco b3016b
			float rf = pen.get_value() - f/25;
darco b3016b
			if(f && rf > 0.3)
darco b3016b
			{
darco b3016b
				printf("pixel (%d,%d) off by %f\n",x,y,rf);
darco b3016b
			}*/
darco b3016b
			boxblur_float diff = fabs(pen.get_value() - f/25);
darco b3016b
			if(diff > max) max = diff;
darco b3016b
			pen.put_value(f/25); //if length = 2 then dim = 5.. area = 25
darco b3016b
		}
darco b3016b
		pen.dec_x(x);
darco b3016b
	}
darco b3016b
	pen.dec_y(y);
dooglus cee594
darco b3016b
	/*if(max)
darco b3016b
	{
darco b3016b
		for(y=0;y
darco b3016b
		{
darco b3016b
			for(x=0;x
darco b3016b
			{
darco b3016b
				pen.put_value(pen.get_value()/max);
darco b3016b
			}
darco b3016b
			pen.dec_x(x);
darco b3016b
		}
darco b3016b
		pen.dec_y(y);
darco b3016b
	}*/
darco b3016b
darco b3016b
	//printf("\nHBOXBLUR ERROR (max = %e):\n",max);
darco b3016b
	printf("\nCorrect results:\n");
darco b3016b
	display_pen(pen,w,h);
darco b3016b
darco b3016b
	printf("PASSED\n");
darco b3016b
darco b3016b
	return 0;
darco b3016b
}
darco b3016b
darco b3016b
/*
darco b3016b
float:
darco b3016b
|@@%O.     :::::          |
darco b3016b
|@@@%:.    :::::          |
darco b3016b
|%@@%O:.   :::::          |
darco b3016b
|O%%@%O:.  :::::          |
darco b3016b
|.:O%@%O:. :::::          |
darco b3016b
| .:O%@%O:.:::::          |
darco b3016b
|  .:O%@%O:O::::          |
darco b3016b
|   .:O%@%O%O:::          |
darco b3016b
|    .:O%@%@%O::          |
darco b3016b
|     .:O%@@@%::          |
darco b3016b
|::.:::O%@@@@@%O::::::::::|
darco b3016b
|::.::::O%@@@@@%::::::::::|
darco b3016b
|::.:::::OO@@@@@%O::::::::|
darco b3016b
|::.:::::::%@@@@@%O:::::::|
darco b3016b
|::.::::::.O%@@@@@%O::::::|
darco b3016b
|          ::%@@@%O:.     |
darco b3016b
|          ::O%@%@%O:.    |
darco b3016b
|          :.:O%O%@%O:.   |
darco b3016b
|          :.::O:O%@%O:.  |
darco b3016b
|          :.:.:.:O%@%O:. |
darco b3016b
|          :.:.: .:O%@%O:.|
darco b3016b
|          :.:.:  .:O%@%%O|
darco b3016b
|          :.:.:   .:O%@@%|
darco b3016b
|          :.:.:    .:%@@@|
darco b3016b
|          :.:.:     .O%@@|
darco b3016b
darco b3016b
double:
darco b3016b
|@@%O.     .....          |
darco b3016b
|@@@O:.    .....          |
darco b3016b
|%@@%O:.   .....          |
darco b3016b
|OO%@%O:.  .....          |
darco b3016b
|.:O%@%O:. .....          |
darco b3016b
| .:O%@%O:.:....          |
darco b3016b
|  .:O%@%O:O:...          |
darco b3016b
|   .:O%@%O%O:..          |
darco b3016b
|    .:O%@%@%O:.          |
darco b3016b
|     .:O%@@@O:.          |
darco b3016b
|.....:O%@@@@@%O..........|
darco b3016b
|......:O%@@@@@%::........|
darco b3016b
|.......:OO@@@@@OO:.......|
darco b3016b
|........::%@@@@@%O:......|
darco b3016b
|..........O%@@@@@%O:.....|
darco b3016b
|          .:O@@@%O:.     |
darco b3016b
|          .:O%@%@%O:.    |
darco b3016b
|          ..:O%O%@%O:.   |
darco b3016b
|          ...:O:O%@%O:.  |
darco b3016b
|          ....:.:O%@%O:. |
darco b3016b
|          ..... .:O%@%O:.|
darco b3016b
|          .....  .:O%@%OO|
darco b3016b
|          .....   .:O%@@%|
darco b3016b
|          .....    .:O@@@|
darco b3016b
|          .....     .O%@@|
darco b3016b
darco b3016b
darco b3016b
*/
darco b3016b
darco b3016b
int gaussian_blur_test(void)
darco b3016b
{
darco b3016b
	printf("gaussian_blur: ");
darco b3016b
#if 0
darco b3016b
	int w=25,h=25;
darco b3016b
	int bad_values=0;
darco b3016b
darco b3016b
	auto_ptr<float> data(new float[w*h]);</float>
darco b3016b
	if(!data.get())
darco b3016b
	{
= cd1e3b
		printf("Um..... malloc failure on line %d of " __FILE__ "...\n",__LINE__);
darco b3016b
		abort();
darco b3016b
	}
darco b3016b
darco b3016b
	generic_pen<float> pen(data.get(),w,h);</float>
darco b3016b
	generic_pen<float> pen2;</float>
darco b3016b
	int x,y;
darco b3016b
darco b3016b
	for(y=0;y
darco b3016b
	{
darco b3016b
		for(x=0;x
darco b3016b
		{
darco b3016b
			if((x-y<=1 && y-x<=1) || y==h/2)
darco b3016b
				pen.put_value(2);
darco b3016b
			else
darco b3016b
				pen.put_value(0);
darco b3016b
		}
darco b3016b
		pen.dec_x(x);
darco b3016b
	}
darco b3016b
	pen.dec_y(y);
darco b3016b
darco b3016b
	printf("\nBEFORE GAUSSIAN BLUR:\n");
darco b3016b
darco b3016b
	// print out the before pic
darco b3016b
	for(y=0;y
darco b3016b
	{
darco b3016b
		printf("|");
darco b3016b
		for(x=0;x
darco b3016b
		{
darco b3016b
			if(pen.get_value()>=2.0f)
darco b3016b
				printf("#");
darco b3016b
			else if(pen.get_value()>=1.0f)
darco b3016b
				printf("@");
darco b3016b
			else if(pen.get_value()>=0.8f)
darco b3016b
				printf("%%");
darco b3016b
			else if(pen.get_value()>=0.6f)
darco b3016b
				printf("O");
darco b3016b
			else if(pen.get_value()>=0.4f)
darco b3016b
				printf(":");
darco b3016b
			else if(pen.get_value()>=0.2f)
darco b3016b
				printf(".");
darco b3016b
			else if(pen.get_value()>=0.0f)
darco b3016b
				printf(" ");
darco b3016b
			else
darco b3016b
				printf("X"),bad_values++;
darco b3016b
		}
darco b3016b
		pen.dec_x(x);
darco b3016b
		printf("|\n");
darco b3016b
	}
darco b3016b
	pen.dec_y(y);
darco b3016b
darco b3016b
	// Pen 2 will be the end
darco b3016b
	pen2=pen;
darco b3016b
	pen2.move(w,h);
darco b3016b
darco b3016b
#if 0
darco b3016b
	gaussian_blur_5x5(pen,pen2);
darco b3016b
	gaussian_blur_5x5(pen,pen2);
darco b3016b
	gaussian_blur_5x5(pen,pen2);
darco b3016b
#endif
darco b3016b
darco b3016b
#if 0
darco b3016b
	gaussian_blur_3x3(pen,pen2);
darco b3016b
	gaussian_blur_3x3(pen,pen2);
darco b3016b
	gaussian_blur_3x3(pen,pen2);
darco b3016b
	gaussian_blur_3x3(pen,pen2);
darco b3016b
	gaussian_blur_3x3(pen,pen2);
darco b3016b
#endif
dooglus cee594
darco b3016b
//	gaussian_blur(pen,pen2,15);
darco b3016b
	gaussian_blur(pen,pen2,10,10);
darco b3016b
darco b3016b
	printf("\nAFTER GAUSSIAN BLUR:\n");
darco b3016b
darco b3016b
	// print out the after pic
darco b3016b
	for(y=0;y
darco b3016b
	{
darco b3016b
		printf("|");
darco b3016b
		for(x=0;x
darco b3016b
		{
darco b3016b
			if(pen.get_value()>=2.0f)
darco b3016b
				printf("#");
darco b3016b
			else if(pen.get_value()>=1.0f)
darco b3016b
				printf("@");
darco b3016b
			else if(pen.get_value()>=0.8f)
darco b3016b
				printf("%%");
darco b3016b
			else if(pen.get_value()>=0.6f)
darco b3016b
				printf("O");
darco b3016b
			else if(pen.get_value()>=0.4f)
darco b3016b
				printf(":");
darco b3016b
			else if(pen.get_value()>=0.2f)
darco b3016b
				printf(".");
darco b3016b
			else if(pen.get_value()>=0.0f)
darco b3016b
				printf(" ");
darco b3016b
			else
darco b3016b
				printf("X"),bad_values++;
darco b3016b
		}
darco b3016b
		pen.dec_x(x);
darco b3016b
		printf("|\n");
darco b3016b
	}
darco b3016b
	pen.dec_y(y);
darco b3016b
darco b3016b
	if(bad_values)
darco b3016b
	{
= cd1e3b
		printf("FAILURE! " __FILE__ "@%d: blur result contained bad values\n",__LINE__);
darco b3016b
		return 1;
darco b3016b
	}
darco b3016b
#endif
darco b3016b
	printf("PASSED\n");
darco b3016b
darco b3016b
	return 0;
darco b3016b
}
darco b3016b
darco b3016b
/* === E N T R Y P O I N T ================================================= */
darco b3016b
darco b3016b
int main()
darco b3016b
{
darco b3016b
	int error=0;
darco b3016b
darco b3016b
	error+=generic_pen_test(40,40);
darco b3016b
	error+=generic_pen_test(10,40);
darco b3016b
	error+=generic_pen_test(40,10);
darco b3016b
    if(error)return error;
darco b3016b
	error+=alpha_pen_test();
darco b3016b
	error+=bbox_pen_test();
darco b3016b
	error+=box_blur_test();
darco b3016b
    if(error)return error;
darco b3016b
	error+=gaussian_blur_test();
dooglus cee594
darco b3016b
	return error;
darco b3016b
}