/*! ========================================================================
** Extended Template and Library Test Suite
** Surface Class Test
** $Id$
**
** Copyright (c) 2002 Robert B. Quattlebaum Jr.
**
** This package is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License as
** published by the Free Software Foundation; either version 2 of
** the License, or (at your option) any later version.
**
** This package 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.
**
** === N O T E S ===========================================================
**
** ========================================================================= */
/* === H E A D E R S ======================================================= */
#include <iostream>
#include <ETL/surface>
#include <ETL/gaussian>
#include <cstdio>
/* === M A C R O S ========================================================= */
using namespace etl;
using namespace std;
/* === C L A S S E S ======================================================= */
/* === P R O C E D U R E S ================================================= */
int display_pen(generic_pen<float> pen, int w, int h)
{
int ret=0;
int x, y;
// print out the after pic
for(y=0;y<h;y++,pen.inc_y())
{
printf("|");
for(x=0;x<w;x++,pen.inc_x())
{
if(pen.get_value()>=2.0f)
printf("#");
else if(pen.get_value()>=1.0f)
printf("@");
else if(pen.get_value()>=0.8f)
printf("%%");
else if(pen.get_value()>=0.6f)
printf("O");
else if(pen.get_value()>=0.4f)
printf(":");
else if(pen.get_value()>=0.2f)
printf(".");
else if(pen.get_value()>=-0.1f)
printf(" ");
else
printf("X"),ret++;
}
pen.dec_x(x);
printf("|\n");
}
pen.dec_y(y);
return ret;
}
void make_pattern(generic_pen<float> pen, int w, int h)
{
int x,y;
for(y=0;y<h;y++,pen.inc_y())
{
for(x=0;x<w;x++,pen.inc_x())
{
if( (x-y<=1 && y-x<=1) || y==h/2 || x==w/2)
pen.put_value(2);
else
pen.put_value(0);
}
pen.dec_x(x);
}
pen.dec_y(y);
}
int basic_test()
{
printf("Surface:basic_test(): Running...\n");
int ret=0;
surface<float> my_surface(100,100);
gaussian_blur(my_surface.begin(),my_surface.end(),10,10);
surface<float> my_surface2(my_surface);
my_surface2.fill(0.5);
my_surface2.clear();
my_surface2=my_surface;
my_surface2.fill(0.5);
my_surface2.clear();
my_surface.fill(0.5);
my_surface.clear();
surface<float> my_surface3;
my_surface3.mirror(my_surface2);
my_surface3.fill(0.5);
my_surface3.clear();
my_surface3=my_surface;
my_surface3.mirror(my_surface);
printf("Surface:basic_test(): %d errors.\n",ret);
return ret;
}
int linear_sample_test()
{
printf("Surface:linear_sample_test(): Running...\n");
int ret=0;
surface<float> my_surface(16,16);
my_surface.fill(0.0f);
make_pattern(my_surface.begin(),my_surface.get_w(),my_surface.get_h());
int extra(5);
surface<float> dest(18+extra*2,18+extra*2);
int x,y;
for(x=-extra;x<dest.get_w()-extra;x++)
for(y=-extra;y<dest.get_h()-extra;y++)
{
dest[y+extra][x+extra]=my_surface.linear_sample(
float(x)/float(dest.get_w()-1-extra*2)*float(my_surface.get_w()-1),
float(y)/float(dest.get_h()-1-extra*2)*float(my_surface.get_h()-1)
);
}
display_pen(dest.begin(),dest.get_w(),dest.get_h());
printf("Surface:linear_sample_test(): %d errors.\n",ret);
return ret;
}
int cubic_sample_test()
{
printf("Surface:cubic_sample_test(): Running...\n");
int ret=0;
surface<float> my_surface(16,16);
my_surface.fill(0.0f);
make_pattern(my_surface.begin(),my_surface.get_w(),my_surface.get_h());
{
surface<float> dest(24,24);
int x,y;
for(x=0;x<dest.get_w();x++)
for(y=0;y<dest.get_h();y++)
{
dest[y][x]=my_surface.cubic_sample(
float(x)/float(dest.get_w()-1)*float(my_surface.get_w()-1),
float(y)/float(dest.get_h()-1)*float(my_surface.get_h()-1)
);
}
display_pen(dest.begin(),dest.get_w(),dest.get_h());
}
display_pen(my_surface.begin(),my_surface.get_w(),my_surface.get_h());
{
surface<float> dest(16,16);
int x,y;
for(x=0;x<dest.get_w();x++)
for(y=0;y<dest.get_h();y++)
{
dest[y][x]=my_surface.cubic_sample(
float(x)/float(dest.get_w()-1)*float(my_surface.get_w()-1),
float(y)/float(dest.get_h()-1)*float(my_surface.get_h()-1)
);
}
display_pen(dest.begin(),dest.get_w(),dest.get_h());
}
printf("Surface:cubic_sample_test(): %d errors.\n",ret);
return ret;
}
/* === E N T R Y P O I N T ================================================= */
int main()
{
int error=0;
error+=basic_test();
error+=linear_sample_test();
error+=cubic_sample_test();
return error;
}