diff --git a/Makefile.am b/Makefile.am index a0dd383..0f42698 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,7 +2,7 @@ # Automake targets and declarations for libcaca ############################################################################### -SUBDIRS = src examples doc +SUBDIRS = src examples test doc DIST_SUBDIRS = $(SUBDIRS) autotools debian EXTRA_DIST = BUGS NOTES bootstrap caca-config.in diff --git a/configure.ac b/configure.ac index e2515c3..62b9365 100644 --- a/configure.ac +++ b/configure.ac @@ -157,6 +157,7 @@ AC_CONFIG_FILES([ Makefile src/Makefile examples/Makefile + test/Makefile doc/Makefile doc/doxygen.cfg autotools/Makefile diff --git a/examples/Makefile.am b/examples/Makefile.am index 52ad66b..40778bc 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -1,5 +1,5 @@ ############################################################################### -# Automake targets and declarations for libcaca tests +# Automake targets and declarations for libcaca example programs ############################################################################### pkgdata_DATA = caca.txt diff --git a/test/Makefile.am b/test/Makefile.am new file mode 100644 index 0000000..079c807 --- /dev/null +++ b/test/Makefile.am @@ -0,0 +1,10 @@ +############################################################################### +# Automake targets and declarations for libcaca test programs +############################################################################### + +noinst_PROGRAMS = dithering + +dithering_SOURCES = dithering.c +dithering_LDADD = ../src/libcaca.a @CACA_LIBS@ +dithering_CPPFLAGS = -I$(top_srcdir)/src + diff --git a/test/dithering.c b/test/dithering.c new file mode 100644 index 0000000..d7e0c66 --- /dev/null +++ b/test/dithering.c @@ -0,0 +1,137 @@ +/* + * dithering libcaca dithering test program + * Copyright (c) 2003 Sam Hocevar + * All Rights Reserved + * + * $Id$ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA + */ + +#include "config.h" + +#include "caca.h" + +#define XRATIO 100*100 +#define YRATIO 70*70 +#define FUZZY 5000000 + +enum caca_color points[] = +{ + CACA_COLOR_BLACK, + CACA_COLOR_DARKGRAY, + CACA_COLOR_LIGHTGRAY, + CACA_COLOR_WHITE, + CACA_COLOR_RED, + CACA_COLOR_LIGHTRED +}; + +char density[] = " -,+:;o&%w$W@#"; + +int main(void) +{ + int neara, dista, nearb, distb, dist; + int x, y; + + caca_init(); + + for(x = 0; x < 100; x++) + for(y = 0; y < 100; y++) + { + int color = CACA_COLOR_WHITE; + char ch = '?'; + + /* distance to black */ + dista = XRATIO * x * x; + neara = 0; + + /* distance to 40% */ + dist = XRATIO * (x - 40) * (x - 40) + YRATIO * y * y; + if(caca_rand(-FUZZY, FUZZY) + dist < dista) + { + nearb = neara; distb = dista; neara = 1; dista = dist; + } + else + { + nearb = 1; distb = dist; + } + + /* check dist to 70% */ + dist = XRATIO * (x - 70) * (x - 70) + YRATIO * y * y; + if(caca_rand(-FUZZY, FUZZY) + dist < dista) + { + nearb = neara; distb = dista; neara = 2; dista = dist; + } + else if(caca_rand(-FUZZY, FUZZY) + dist < distb) + { + nearb = 2; distb = dist; + } + + /* check dist to white */ + dist = XRATIO * (x - 100) * (x - 100) + YRATIO * y * y; + if(caca_rand(-FUZZY, FUZZY) + dist < dista) + { + nearb = neara; distb = dista; neara = 3; dista = dist; + } + else if(caca_rand(-FUZZY, FUZZY) + dist < distb) + { + nearb = 3; distb = dist; + } + +#if 1 + /* check dist to dark */ + dist = XRATIO * (x - 40) * (x - 40) + YRATIO * (y - 100) * (y - 100); + dist = dist * 12 / 16; + if(caca_rand(-FUZZY, FUZZY) + dist < dista) + { + nearb = neara; distb = dista; neara = 4; dista = dist; + } + else if(caca_rand(-FUZZY, FUZZY) + dist < distb) + { + nearb = 4; distb = dist; + } + + /* check dist to light */ + dist = XRATIO * (x - 100) * (x - 100) + YRATIO * (y - 100) * (y - 100); + dist = dist * 8 / 16; + if(caca_rand(-FUZZY, FUZZY) + dist < dista) + { + nearb = neara; distb = dista; neara = 5; dista = dist; + } + else if(caca_rand(-FUZZY, FUZZY) + dist < distb) + { + nearb = 5; distb = dist; + } +#endif + + /* dista can be > distb because of dithering fuzziness */ + if(dista > distb) + ch = density[distb * 2 * 13 / (dista + distb)]; + else + ch = density[dista * 2 * 13 / (dista + distb)]; + caca_set_color(points[nearb], points[neara]); + + caca_putchar(x * caca_get_width() / 100, (100 - y) * caca_get_height() / 100, ch); + } + + caca_refresh(); + + while((caca_get_event() & 0xff000000) != CACA_EVENT_KEY_PRESS); + + caca_end(); + return 0; +} +