--- /dev/null
+/*! ========================================================================
+** 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;
+}