diff --git a/Makefile.am b/Makefile.am index 6934ebd..55ec599 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,7 +2,7 @@ # Automake targets and declarations for ttyvaders ############################################################################### -SUBDIRS = libcaca test src +SUBDIRS = src DIST_SUBDIRS = $(SUBDIRS) autotools data debian EXTRA_DIST = BUGS doc/shapes.txt bootstrap diff --git a/configure.ac b/configure.ac index 10c5451..d8c9f7d 100644 --- a/configure.ac +++ b/configure.ac @@ -60,8 +60,6 @@ CFLAGS="${CFLAGS} -Wall -Wpointer-arith -Wcast-align -Wcast-qual -Wstrict-protot AC_OUTPUT([ Makefile - libcaca/Makefile - test/Makefile src/Makefile autotools/Makefile data/Makefile diff --git a/debian/.cvsignore b/debian/.cvsignore deleted file mode 100644 index 40da85b..0000000 --- a/debian/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -.dirstamp -Makefile -Makefile.in -files -ttyvaders -ttyvaders.substvars diff --git a/debian/control b/debian/control index 0875061..1264105 100644 --- a/debian/control +++ b/debian/control @@ -1,15 +1,15 @@ Source: ttyvaders Section: games Priority: optional -Maintainer: Samuel Hocevar -Build-Depends: debhelper (>=2.2.0), slang1-dev -Standards-Version: 3.5.6 +Maintainer: Sam Hocevar (Debian packages) +Build-Depends: debhelper (>= 2.2.0), slang1-dev +Standards-Version: 3.6.1.0 Package: ttyvaders Section: games Architecture: any Depends: ${shlibs:Depends} -Description: A vertical shoot 'em up with text-mode graphics. +Description: vertical shoot 'em up with text-mode graphics TTYvaders is a vertical shoot 'em up for the console or the terminal. . It rules. diff --git a/libcaca/Makefile.am b/libcaca/Makefile.am deleted file mode 100644 index 988a03b..0000000 --- a/libcaca/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -############################################################################### -# Automake targets and declarations for libcaca -############################################################################### - -lib_LIBRARIES = libcaca.a -libcaca_a_SOURCES = \ - caca.c \ - caca.h \ - caca_internals.h \ - graphics.c \ - io.c \ - math.c \ - line.c \ - box.c \ - conic.c \ - triangle.c \ - sprite.c \ - blit.c \ - $(NULL) - diff --git a/libcaca/blit.c b/libcaca/blit.c deleted file mode 100644 index 23bcc89..0000000 --- a/libcaca/blit.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - * libcaca ASCII-Art library - * Copyright (c) 2002, 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 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "config.h" - -#ifdef HAVE_INTTYPES_H -# include -#else -typedef unsigned char uint8_t; -#endif - -#include - -#include "caca.h" -#include "caca_internals.h" - -#include -void caca_blit(int x1, int y1, int x2, int y2, void *pixels, int w, int h) -{ - char foo[] = { ' ', '.', ':', ';', '=', '$', '%', '@', '#', '8', 'W' }; - int x, y, pitch; - - if(x1 > x2) - { - int tmp = x2; x2 = x1; x1 = tmp; - } - - if(y1 > y2) - { - int tmp = y2; y2 = y1; y1 = tmp; - } - - pitch = (3 * w + 3) / 4 * 4; - - for(y = y1 > 0 ? y1 : 0; y <= y2 && y <= (int)caca_get_height(); y++) - for(x = x1 > 0 ? x1 : 0; x <= x2 && x <= (int)caca_get_width(); x++) - { - int fromx = w * (x - x1) / (x2 - x1 + 1); - int fromy = h * (y - y1) / (y2 - y1 + 1); - int r = ((unsigned char *)pixels)[3 * fromx + pitch * fromy]; - int g = ((unsigned char *)pixels)[3 * fromx + 1 + pitch * fromy]; - int b = ((unsigned char *)pixels)[3 * fromx + 2 + pitch * fromy]; - - if(r == g && g == b) - { - caca_set_color(EE_LIGHTGRAY); - } - else - { - static int foo_colors[6] = {EE_LIGHTRED, EE_YELLOW, EE_LIGHTGREEN, EE_LIGHTCYAN, EE_LIGHTBLUE, EE_LIGHTMAGENTA}; - float min = r, max = r, delta, hue, sat; - if(min > g) min = g; if(max < g) max = g; - if(min > b) min = b; if(max < b) max = b; - - delta = max - min; - - sat = max / delta; - - if(delta > 20) - { - if( r == max ) - hue = (g - b) / delta; // between yellow & magenta - else if( g == max ) - hue = 2 + (b - r) / delta; // between cyan & yellow - else - hue = 4 + (r - g) / delta; // between magenta & cyan - - hue *= 60; // degrees - if( hue < 0 ) - hue += 360; - - caca_set_color(foo_colors[(int)(hue + 30) / 60]); - } - else - { - caca_set_color(EE_LIGHTGRAY); - } - } - - caca_putchar(x, y, foo[(r + g + b) / 3 / 25]); - } -} - diff --git a/libcaca/box.c b/libcaca/box.c deleted file mode 100644 index ee7966f..0000000 --- a/libcaca/box.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - * libcaca ASCII-Art library - * Copyright (c) 2002, 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 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "config.h" - -#include - -#include "caca.h" -#include "caca_internals.h" - -void caca_draw_box(int x1, int y1, int x2, int y2, char c) -{ - caca_draw_line(x1, y1, x1, y2, c); - caca_draw_line(x1, y2, x2, y2, c); - caca_draw_line(x2, y2, x2, y1, c); - caca_draw_line(x2, y1, x1, y1, c); -} - -void caca_draw_thin_box(int x1, int y1, int x2, int y2) -{ - int x, y, xmax, ymax; - - if(x1 > x2) - { - int tmp = x1; - x1 = x2; x2 = tmp; - } - - if(y1 > y2) - { - int tmp = y1; - y1 = y2; y2 = tmp; - } - - xmax = caca_get_width() - 1; - ymax = caca_get_height() - 1; - - if(x2 < 0 || y2 < 0 || x1 > xmax || y1 > ymax) - return; - - /* Draw edges */ - if(y1 >= 0) - for(x = x1 < 0 ? 1 : x1 + 1; x < x2 && x < xmax; x++) - caca_putchar(x, y1, '-'); - - if(y2 <= ymax) - for(x = x1 < 0 ? 1 : x1 + 1; x < x2 && x < xmax; x++) - caca_putchar(x, y2, '-'); - - if(x1 >= 0) - for(y = y1 < 0 ? 1 : y1 + 1; y < y2 && y < ymax; y++) - caca_putchar(x1, y, '|'); - - if(x2 <= xmax) - for(y = y1 < 0 ? 1 : y1 + 1; y < y2 && y < ymax; y++) - caca_putchar(x2, y, '|'); - - /* Draw corners */ - if(x1 >= 0 && y1 >= 0) - caca_putchar(x1, y1, ','); - - if(x1 >= 0 && y2 <= ymax) - caca_putchar(x1, y2, '`'); - - if(x2 <= xmax && y1 >= 0) - caca_putchar(x2, y1, '.'); - - if(x2 <= xmax && y2 <= ymax) - caca_putchar(x2, y2, '\''); -} - -void caca_fill_box(int x1, int y1, int x2, int y2, char c) -{ - int x, y, xmax, ymax; - - if(x1 > x2) - { - int tmp = x1; - x1 = x2; x2 = tmp; - } - - if(y1 > y2) - { - int tmp = y1; - y1 = y2; y2 = tmp; - } - - xmax = caca_get_width() - 1; - ymax = caca_get_height() - 1; - - if(x2 < 0 || y2 < 0 || x1 > xmax || y1 > ymax) - return; - - if(x1 < 0) x1 = 0; - if(y1 < 0) y1 = 0; - if(x2 > xmax) x2 = xmax; - if(y2 > ymax) y2 = ymax; - - for(y = y1; y <= y2; y++) - for(x = x1; x <= x2; x++) - caca_putchar(x, y, c); -} - diff --git a/libcaca/caca.c b/libcaca/caca.c deleted file mode 100644 index 59948c0..0000000 --- a/libcaca/caca.c +++ /dev/null @@ -1,308 +0,0 @@ -/* - * libcaca ASCII-Art library - * Copyright (c) 2002, 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 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "config.h" - -#if defined(USE_SLANG) -# include -#elif defined(USE_NCURSES) -# include -#elif defined(USE_CONIO) -# include -# include -# if defined(SCREENUPDATE_IN_PC_H) -# include -# endif -#else -# error "no graphics library detected" -#endif - -#include -#include -#include -#include -#include - -#include "caca.h" -#include "caca_internals.h" - -static unsigned int _caca_delay; -static unsigned int _caca_rendertime; -char *_caca_empty_line; -char *_caca_scratch_line; - -#if defined(USE_NCURSES) -int _caca_attr[16]; -#endif - -#if defined(USE_CONIO) -static struct text_info ti; -char *_caca_screen; -#endif - -int caca_init(void) -{ -#if defined(USE_SLANG) - static char *slang_colors[16] = - { - "black", - "blue", - "green", - "cyan", - "red", - "magenta", - "brown", - "lightgray", - "gray", - "brightblue", - "brightgreen", - "brightcyan", - "brightred", - "brightmagenta", - "yellow", - "white", - }; - - int i; - - /* Initialize slang library */ - SLsig_block_signals(); - SLtt_get_terminfo(); - - if(SLkp_init() == -1) - { - SLsig_unblock_signals(); - return -1; - } - - SLang_init_tty(-1, 0, 1); - - if(SLsmg_init_smg() == -1) - { - SLsig_unblock_signals(); - return -1; - } - - SLsig_unblock_signals(); - - SLsmg_cls(); - SLtt_set_cursor_visibility(0); - SLsmg_refresh(); - - for(i = 0; i < 16; i++) - SLtt_set_color(i + 1, NULL, slang_colors[i], "black"); - -#elif defined(USE_NCURSES) - int i; - - initscr(); - keypad(stdscr, TRUE); - nonl(); - cbreak(); - noecho(); - nodelay(stdscr, TRUE); - curs_set(0); - - start_color(); - - init_pair(1 + EE_BLACK, COLOR_BLACK, COLOR_BLACK); - init_pair(1 + EE_BLUE, COLOR_BLUE, COLOR_BLACK); - init_pair(1 + EE_GREEN, COLOR_GREEN, COLOR_BLACK); - init_pair(1 + EE_CYAN, COLOR_CYAN, COLOR_BLACK); - init_pair(1 + EE_RED, COLOR_RED, COLOR_BLACK); - init_pair(1 + EE_MAGENTA, COLOR_MAGENTA, COLOR_BLACK); - init_pair(1 + EE_BROWN, COLOR_YELLOW, COLOR_BLACK); - init_pair(1 + EE_LIGHTGRAY, COLOR_WHITE, COLOR_BLACK); - init_pair(1 + EE_DARKGRAY, COLOR_BLACK, COLOR_BLACK); - init_pair(1 + EE_LIGHTBLUE, COLOR_BLUE, COLOR_BLACK); - init_pair(1 + EE_LIGHTGREEN, COLOR_GREEN, COLOR_BLACK); - init_pair(1 + EE_LIGHTCYAN, COLOR_CYAN, COLOR_BLACK); - init_pair(1 + EE_LIGHTRED, COLOR_RED, COLOR_BLACK); - init_pair(1 + EE_LIGHTMAGENTA, COLOR_MAGENTA, COLOR_BLACK); - init_pair(1 + EE_YELLOW, COLOR_YELLOW, COLOR_BLACK); - init_pair(1 + EE_WHITE, COLOR_WHITE, COLOR_BLACK); - - for(i = 0; i < 8; i++) - { - _caca_attr[i] = COLOR_PAIR(1 + i); - _caca_attr[i + 8] = A_BOLD | COLOR_PAIR(1 + i); - } - -#elif defined(USE_CONIO) - gettextinfo(&ti); - _caca_screen = malloc(2 * ti.screenwidth * ti.screenheight); - if(_caca_screen == NULL) - return -1; - _wscroll = 0; - _setcursortype(_NOCURSOR); - clrscr(); -# if defined(SCREENUPDATE_IN_PC_H) - ScreenRetrieve(_caca_screen); -# else - /* FIXME */ -# endif - -#endif - _caca_empty_line = malloc(caca_get_width() + 1); - memset(_caca_empty_line, ' ', caca_get_width()); - _caca_empty_line[caca_get_width()] = '\0'; - - _caca_scratch_line = malloc(caca_get_width() + 1); - - _caca_delay = 0; - _caca_rendertime = 0; - - return 0; -} - -unsigned int caca_get_width(void) -{ -#if defined(USE_SLANG) - return SLtt_Screen_Cols; -#elif defined(USE_NCURSES) - return COLS; -#elif defined(USE_CONIO) - return ti.screenwidth; -#endif -} - -unsigned int caca_get_height(void) -{ -#if defined(USE_SLANG) - return SLtt_Screen_Rows; -#elif defined(USE_NCURSES) - return LINES; -#else - return ti.screenheight; -#endif -} - -void caca_set_delay(unsigned int usec) -{ - _caca_delay = usec; -} - -unsigned int caca_get_rendertime(void) -{ - return _caca_rendertime; -} - -const char *caca_get_color_name(unsigned int color) -{ - static const char *color_names[16] = - { - "black", - "blue", - "green", - "cyan", - "red", - "magenta", - "brown", - "light gray", - "dark gray", - "light blue", - "light green", - "light cyan", - "light red", - "light magenta", - "yellow", - "white", - }; - - if(color < 0 || color > 15) - return "unknown color"; - - return color_names[color]; -} - -static unsigned int _caca_getticks(void) -{ - static unsigned int last_sec = 0, last_usec = 0; - - struct timeval tv; - unsigned int ticks = 0; - - gettimeofday(&tv, NULL); - - if(last_sec != 0) - { - ticks = (tv.tv_sec - last_sec) * 1000000 + (tv.tv_usec - last_usec); - } - - last_sec = tv.tv_sec; - last_usec = tv.tv_usec; - - return ticks; -} - -void caca_refresh(void) -{ -#define IDLE_USEC 10000 - static int lastticks = 0; - int ticks = lastticks + _caca_getticks(); - -#if defined(USE_SLANG) - SLsmg_refresh(); -#elif defined(USE_NCURSES) - refresh(); -#elif defined(USE_CONIO) -# if defined(SCREENUPDATE_IN_PC_H) - ScreenUpdate(_caca_screen); -# else - /* FIXME */ -# endif -#endif - - /* Wait until _caca_delay + time of last call */ - ticks += _caca_getticks(); - for(; ticks + IDLE_USEC < (int)_caca_delay; ticks += _caca_getticks()) - usleep(IDLE_USEC); - - /* Update the sliding mean of the render time */ - _caca_rendertime = (7 * _caca_rendertime + ticks) / 8; - - lastticks = ticks - _caca_delay; - - /* If we drifted too much, it's bad, bad, bad. */ - if(lastticks > (int)_caca_delay) - lastticks = 0; -} - -void caca_end(void) -{ -#if defined(USE_SLANG) - SLtt_set_cursor_visibility(1); - SLang_reset_tty(); - SLsmg_reset_smg(); -#elif defined(USE_NCURSES) - curs_set(1); - endwin(); -#elif defined(USE_CONIO) - _wscroll = 1; - textcolor((enum COLORS)WHITE); - textbackground((enum COLORS)BLACK); - gotoxy(caca_get_width(), caca_get_height()); - cputs("\r\n"); - _setcursortype(_NORMALCURSOR); -#endif -} - diff --git a/libcaca/caca.h b/libcaca/caca.h deleted file mode 100644 index cc0cee8..0000000 --- a/libcaca/caca.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * libcaca ASCII-Art library - * Copyright (c) 2002, 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 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __EE_H__ -#define __EE_H__ - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* - * Colors - */ -enum caca_colors -{ - EE_BLACK = 0, - EE_BLUE = 1, - EE_GREEN = 2, - EE_CYAN = 3, - EE_RED = 4, - EE_MAGENTA = 5, - EE_BROWN = 6, - EE_LIGHTGRAY = 7, - EE_DARKGRAY = 8, - EE_LIGHTBLUE = 9, - EE_LIGHTGREEN = 10, - EE_LIGHTCYAN = 11, - EE_LIGHTRED = 12, - EE_LIGHTMAGENTA = 13, - EE_YELLOW = 14, - EE_WHITE = 15 -}; - -/* - * Types - */ -struct caca_sprite; - -/* - * Prototypes - */ -int caca_init(void); -void caca_set_delay(unsigned int); -unsigned int caca_get_rendertime(void); -unsigned int caca_get_width(void); -unsigned int caca_get_height(void); -const char *caca_get_color_name(unsigned int); -void caca_refresh(void); -void caca_end(void); - -char caca_get_key(void); - -void caca_set_color(int); -int caca_get_color(void); -void caca_putchar(int, int, char); -void caca_putstr(int, int, const char *); -void caca_printf(int, int, const char *, ...); -void caca_clear(void); - -void caca_draw_line(int, int, int, int, char); -void caca_draw_polyline(const int[], const int[], int, char); -void caca_draw_thin_line(int, int, int, int); -void caca_draw_thin_polyline(const int[], const int[], int); - -void caca_draw_circle(int, int, int, char); -void caca_draw_ellipse(int, int, int, int, char); -void caca_draw_thin_ellipse(int, int, int, int); -void caca_fill_ellipse(int, int, int, int, char); - -void caca_draw_box(int, int, int, int, char); -void caca_draw_thin_box(int, int, int, int); -void caca_fill_box(int, int, int, int, char); - -void caca_draw_triangle(int, int, int, int, int, int, char); -void caca_draw_thin_triangle(int, int, int, int, int, int); -void caca_fill_triangle(int, int, int, int, int, int, char); - -int caca_rand(int, int); -unsigned int caca_sqrt(unsigned int); - -struct caca_sprite * caca_load_sprite(const char *); -int caca_get_sprite_frames(struct caca_sprite *); -int caca_get_sprite_width(struct caca_sprite *, int); -int caca_get_sprite_height(struct caca_sprite *, int); -int caca_get_sprite_dx(struct caca_sprite *, int); -int caca_get_sprite_dy(struct caca_sprite *, int); -void caca_draw_sprite(int, int, struct caca_sprite *, int); -void caca_free_sprite(struct caca_sprite *); - -void caca_blit(int, int, int, int, void *, int, int); - -#ifdef __cplusplus -} -#endif - -#endif /* __EE_H__ */ diff --git a/libcaca/caca_internals.h b/libcaca/caca_internals.h deleted file mode 100644 index 2a8dc02..0000000 --- a/libcaca/caca_internals.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * libcaca ASCII-Art library - * Copyright (c) 2002, 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 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __EE_INTERNALS_H__ -#define __EE_INTERNALS_H__ - -#if defined(USE_NCURSES) -extern int _caca_attr[]; -#endif - -#if defined(USE_CONIO) -extern char *_caca_screen; -#endif - -extern char *_caca_empty_line; -extern char *_caca_scratch_line; - -#endif /* __EE_INTERNALS_H__ */ diff --git a/libcaca/conic.c b/libcaca/conic.c deleted file mode 100644 index 774be6d..0000000 --- a/libcaca/conic.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - * libcaca ASCII-Art library - * Copyright (c) 2002, 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 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "config.h" - -#ifdef HAVE_INTTYPES_H -# include -#else -typedef unsigned char uint8_t; -#endif - -#include - -#include "caca.h" -#include "caca_internals.h" - -static void ellipsepoints(int, int, int, int, char); - -void caca_draw_circle(int x, int y, int r, char c) -{ - int test, dx, dy; - - /* Optimized Bresenham. Kick ass. */ - for(test = 0, dx = 0, dy = r ; dx <= dy ; dx++) - { - ellipsepoints(x, y, dx, dy, c); - ellipsepoints(x, y, dy, dx, c); - - test += test > 0 ? dx - dy-- : dx; - } -} - -void caca_fill_ellipse(int xo, int yo, int a, int b, char c) -{ - int d2; - int x = 0; - int y = b; - int d1 = b*b - (a*a*b) + (a*a/4); - - while(a*a*y - a*a/2 > b*b*(x+1)) - { - if(d1 < 0) - { - d1 += b*b*(2*x+1); /* XXX: "Computer Graphics" has + 3 here. */ - } - else - { - d1 += b*b*(2*x*1) + a*a*(-2*y+2); - caca_draw_line(xo - x, yo - y, xo + x, yo - y, c); - caca_draw_line(xo - x, yo + y, xo + x, yo + y, c); - y--; - } - x++; - } - - caca_draw_line(xo - x, yo - y, xo + x, yo - y, c); - caca_draw_line(xo - x, yo + y, xo + x, yo + y, c); - - d2 = b*b*(x+0.5)*(x+0.5) + a*a*(y-1)*(y-1) - a*a*b*b; - while(y > 0) - { - if(d2 < 0) - { - d2 += b*b*(2*x+2) + a*a*(-2*y+3); - x++; - } - else - { - d2 += a*a*(-2*y+3); - } - - y--; - caca_draw_line(xo - x, yo - y, xo + x, yo - y, c); - caca_draw_line(xo - x, yo + y, xo + x, yo + y, c); - } -} - -void caca_draw_ellipse(int xo, int yo, int a, int b, char c) -{ - int d2; - int x = 0; - int y = b; - int d1 = b*b - (a*a*b) + (a*a/4); - - ellipsepoints(xo, yo, x, y, c); - - while(a*a*y - a*a/2 > b*b*(x+1)) - { - if(d1 < 0) - { - d1 += b*b*(2*x+1); /* XXX: "Computer Graphics" has + 3 here. */ - } - else - { - d1 += b*b*(2*x*1) + a*a*(-2*y+2); - y--; - } - x++; - ellipsepoints(xo, yo, x, y, c); - } - - d2 = b*b*(x+0.5)*(x+0.5) + a*a*(y-1)*(y-1) - a*a*b*b; - while(y > 0) - { - if(d2 < 0) - { - d2 += b*b*(2*x+2) + a*a*(-2*y+3); - x++; - } - else - { - d2 += a*a*(-2*y+3); - } - - y--; - ellipsepoints(xo, yo, x, y, c); - } -} - -void caca_draw_thin_ellipse(int xo, int yo, int a, int b) -{ - /* FIXME: this is not correct */ - int d2; - int x = 0; - int y = b; - int d1 = b*b - (a*a*b) + (a*a/4); - - ellipsepoints(xo, yo, x, y, '-'); - - while(a*a*y - a*a/2 > b*b*(x+1)) - { - if(d1 < 0) - { - d1 += b*b*(2*x+1); /* XXX: "Computer Graphics" has + 3 here. */ - } - else - { - d1 += b*b*(2*x*1) + a*a*(-2*y+2); - y--; - } - x++; - ellipsepoints(xo, yo, x, y, '-'); - } - - d2 = b*b*(x+0.5)*(x+0.5) + a*a*(y-1)*(y-1) - a*a*b*b; - while(y > 0) - { - if(d2 < 0) - { - d2 += b*b*(2*x+2) + a*a*(-2*y+3); - x++; - } - else - { - d2 += a*a*(-2*y+3); - } - - y--; - ellipsepoints(xo, yo, x, y, '|'); - } -} - -static void ellipsepoints(int xo, int yo, int x, int y, char c) -{ - uint8_t b = 0; - - if(xo + x >= 0 && xo + x < (int)caca_get_width()) - b |= 0x1; - if(xo - x >= 0 && xo - x < (int)caca_get_width()) - b |= 0x2; - if(yo + y >= 0 && yo + y < (int)caca_get_height()) - b |= 0x4; - if(yo - y >= 0 && yo - y < (int)caca_get_height()) - b |= 0x8; - - if((b & (0x1|0x4)) == (0x1|0x4)) - caca_putchar(xo + x, yo + y, c); - - if((b & (0x2|0x4)) == (0x2|0x4)) - caca_putchar(xo - x, yo + y, c); - - if((b & (0x1|0x8)) == (0x1|0x8)) - caca_putchar(xo + x, yo - y, c); - - if((b & (0x2|0x8)) == (0x2|0x8)) - caca_putchar(xo - x, yo - y, c); -} - diff --git a/libcaca/graphics.c b/libcaca/graphics.c deleted file mode 100644 index 0896abc..0000000 --- a/libcaca/graphics.c +++ /dev/null @@ -1,158 +0,0 @@ -/* - * libcaca ASCII-Art library - * Copyright (c) 2002, 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 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "config.h" - -#if defined(USE_SLANG) -# include -#elif defined(USE_NCURSES) -# include -#elif defined(USE_CONIO) -# include -#else -# error "no graphics library detected" -#endif - -#include -#include -#include - -#include "caca.h" -#include "caca_internals.h" - -static int _caca_color = 0; - -void caca_set_color(int color) -{ - if(color < 0 || color > 15) - return; - - _caca_color = color; -#if defined(USE_SLANG) - SLsmg_set_color(color + 1); -#elif defined(USE_NCURSES) - attrset(_caca_attr[color]); -#elif defined(USE_CONIO) - textcolor(color); -#endif -} - -int caca_get_color(void) -{ - return _caca_color; -} - -void caca_putchar(int x, int y, char c) -{ - if(x < 0 || x >= (int)caca_get_width() || - y < 0 || y >= (int)caca_get_height()) - return; - -#if defined(USE_SLANG) - SLsmg_gotorc(y, x); - SLsmg_write_char(c); -#elif defined(USE_NCURSES) - move(y, x); - addch(c); -#elif defined(USE_CONIO) - _caca_screen[2 * (x + y * caca_get_width())] = c; - _caca_screen[2 * (x + y * caca_get_width()) + 1] = _caca_color; -// gotoxy(x + 1, y + 1); -// putch(c); -#endif -} - -void caca_putstr(int x, int y, const char *s) -{ - unsigned int len; - - if(y < 0 || y >= (int)caca_get_height() || x >= (int)caca_get_width()) - return; - - len = strlen(s); - - if(x < 0) - { - len -= -x; - if(len < 0) - return; - s += -x; - x = 0; - } - - if(x + len >= caca_get_width()) - { - memcpy(_caca_scratch_line, s, caca_get_width() - x); - _caca_scratch_line[caca_get_width() - x] = '\0'; - s = _caca_scratch_line; - } - -#if defined(USE_SLANG) - SLsmg_gotorc(y, x); - SLsmg_write_string(s); -#elif defined(USE_NCURSES) - move(y, x); - addstr(s); -#elif defined(USE_CONIO) - char *buf = _caca_screen + 2 * (x + y * caca_get_width()); - while(*s) - { - *buf++ = *s++; - *buf++ = _caca_color; - } -// gotoxy(x + 1, y + 1); -// cputs(s); -#endif -} - -void caca_printf(int x, int y, const char *format, ...) -{ - char tmp[BUFSIZ]; - char *buf = tmp; - va_list args; - - if(y < 0 || y >= (int)caca_get_height() || x >= (int)caca_get_width()) - return; - - if(caca_get_width() - x + 1 > BUFSIZ) - buf = malloc(caca_get_width() - x + 1); - - va_start(args, format); - vsnprintf(buf, caca_get_width() - x + 1, format, args); - buf[caca_get_width() - x] = '\0'; - va_end(args); - - caca_putstr(x, y, buf); - - if(buf != tmp) - free(buf); -} - -void caca_clear(void) -{ - /* We could use SLsmg_cls() etc., but drawing empty lines is much faster */ - int y = caca_get_height(); - - while(y--) - caca_putstr(0, y, _caca_empty_line); -} - diff --git a/libcaca/io.c b/libcaca/io.c deleted file mode 100644 index c4436ac..0000000 --- a/libcaca/io.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * libcaca ASCII-Art library - * Copyright (c) 2002, 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 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "config.h" - -#if defined(USE_SLANG) -# include -#elif defined(USE_NCURSES) -# include -#elif defined(USE_CONIO) -# include -#else -# error "no graphics library detected" -#endif - -#include "caca.h" -#include "caca_internals.h" - -char caca_get_key(void) -{ -#if defined(USE_SLANG) - return SLang_input_pending(0) ? SLang_getkey() : 0; - -#elif defined(USE_NCURSES) - char key = getch(); - return key != ERR ? key : 0; - -#elif defined(USE_CONIO) - return _conio_kbhit() ? getch() : 0; - -#endif -} - diff --git a/libcaca/line.c b/libcaca/line.c deleted file mode 100644 index c5fe7f2..0000000 --- a/libcaca/line.c +++ /dev/null @@ -1,375 +0,0 @@ -/* - * libcaca ASCII-Art library - * Copyright (c) 2002, 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 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "config.h" - -#ifdef HAVE_INTTYPES_H -# include -#else -typedef unsigned char uint8_t; -#endif - -#include - -#include "caca.h" -#include "caca_internals.h" - -struct line -{ - int x1, y1; - int x2, y2; - char c; - void (*draw) (struct line*); -}; - -static void clip_line(struct line*); -static uint8_t clip_bits(int, int); -static void draw_solid_line(struct line*); -static void draw_thin_line(struct line*); - -/** - * \brief Draw a line on the screen using the given character. - * - * \param x1 X coordinate of the first point. - * \param y1 Y coordinate of the first point. - * \param x2 X coordinate of the second point. - * \param y2 Y coordinate of the second point. - * \param c Character to draw the line with. - * \return nothing - */ -void caca_draw_line(int x1, int y1, int x2, int y2, char c) -{ - struct line s; - s.x1 = x1; - s.y1 = y1; - s.x2 = x2; - s.y2 = y2; - s.c = c; - s.draw = draw_solid_line; - clip_line(&s); -} - -void caca_draw_polyline(const int x[], const int y[], int n, char c) -{ - int i; - struct line s; - s.c = c; - s.draw = draw_solid_line; - - for(i = 0; i < n; i++) - { - s.x1 = x[i]; - s.y1 = y[i]; - s.x2 = x[i+1]; - s.y2 = y[i+1]; - clip_line(&s); - } -} - -/** - * \brief Draw a thin line on the screen, using ASCII art. - * - * \param x1 X coordinate of the first point. - * \param y1 Y coordinate of the first point. - * \param x2 X coordinate of the second point. - * \param y2 Y coordinate of the second point. - * \return nothing - */ -void caca_draw_thin_line(int x1, int y1, int x2, int y2) -{ - struct line s; - s.x1 = x1; - s.y1 = y1; - s.x2 = x2; - s.y2 = y2; - s.draw = draw_thin_line; - clip_line(&s); -} - -void caca_draw_thin_polyline(const int x[], const int y[], int n) -{ - int i; - struct line s; - s.draw = draw_thin_line; - - for(i = 0; i < n; i++) - { - s.x1 = x[i]; - s.y1 = y[i]; - s.x2 = x[i+1]; - s.y2 = y[i+1]; - clip_line(&s); - } -} - -/* - * XXX: The following functions are local. - */ - -/** - * \brief Generic Cohen-Sutherland line clipping function. - * - * \param s a line structure - * \return nothing - */ -static void clip_line(struct line* s) -{ - uint8_t bits1, bits2; - - bits1 = clip_bits(s->x1, s->y1); - bits2 = clip_bits(s->x2, s->y2); - - if(bits1 & bits2) - return; - - if(bits1 == 0) - { - if(bits2 == 0) - s->draw(s); - else - { - int tmp; - tmp = s->x1; s->x1 = s->x2; s->x2 = tmp; - tmp = s->y1; s->y1 = s->y2; s->y2 = tmp; - clip_line(s); - } - - return; - } - - if(bits1 & (1<<0)) - { - s->y1 = s->y2 - (s->x2 - 0) * (s->y2 - s->y1) / (s->x2 - s->x1); - s->x1 = 0; - } - else if(bits1 & (1<<1)) - { - int xmax = caca_get_width() - 1; - s->y1 = s->y2 - (s->x2 - xmax) * (s->y2 - s->y1) / (s->x2 - s->x1); - s->x1 = xmax; - } - else if(bits1 & (1<<2)) - { - s->x1 = s->x2 - (s->y2 - 0) * (s->x2 - s->x1) / (s->y2 - s->y1); - s->y1 = 0; - } - else if(bits1 & (1<<3)) - { - int ymax = caca_get_height() - 1; - s->x1 = s->x2 - (s->y2 - ymax) * (s->x2 - s->x1) / (s->y2 - s->y1); - s->y1 = ymax; - } - - clip_line(s); -} - -/** - * \brief Helper function for clip_line(). - * - * \param x X coordinate of the point. - * \param y Y coordinate of the point. - * \return b The clipping bits for the given point. - */ -static uint8_t clip_bits(int x, int y) -{ - uint8_t b = 0; - - if(x < 0) - b |= (1<<0); - else if(x >= caca_get_width()) - b |= (1<<1); - - if(y < 0) - b |= (1<<2); - else if(y >= caca_get_height()) - b |= (1<<3); - - return b; -} - -/** - * \brief Solid line drawing function, using Bresenham's mid-point line - * scan-conversion algorithm. - * - * \param s a line structure - * \return nothing - */ -static void draw_solid_line(struct line* s) -{ - int x1, y1, x2, y2; - int dx, dy; - int xinc, yinc; - - x1 = s->x1; y1 = s->y1; x2 = s->x2; y2 = s->y2; - - dx = abs(x2 - x1); - dy = abs(y2 - y1); - - xinc = (x1 > x2) ? -1 : 1; - yinc = (y1 > y2) ? -1 : 1; - - if(dx >= dy) - { - int dpr = dy << 1; - int dpru = dpr - (dx << 1); - int delta = dpr - dx; - - for(; dx>=0; dx--) - { - caca_putchar(x1, y1, s->c); - if(delta > 0) - { - x1 += xinc; - y1 += yinc; - delta += dpru; - } - else - { - x1 += xinc; - delta += dpr; - } - } - } - else - { - int dpr = dx << 1; - int dpru = dpr - (dy << 1); - int delta = dpr - dy; - - for(; dy >= 0; dy--) - { - caca_putchar(x1, y1, s->c); - if(delta > 0) - { - x1 += xinc; - y1 += yinc; - delta += dpru; - } - else - { - y1 += yinc; - delta += dpr; - } - } - } -} - -/** - * \brief Thin line drawing function, using Bresenham's mid-point line - * scan-conversion algorithm and ASCII art graphics. - * - * \param s a line structure - * \return nothing - */ -static void draw_thin_line(struct line* s) -{ - char *charmapx, *charmapy; - int x1, y1, x2, y2; - int dx, dy; - int yinc; - - if(s->x2 >= s->x1) - { - if(s->y1 > s->y2) - charmapx = ",'"; - else - charmapx = "`."; - x1 = s->x1; y1 = s->y1; x2 = s->x2; y2 = s->y2; - } - else - { - if(s->y1 > s->y2) - charmapx = "`."; - else - charmapx = ",'"; - x2 = s->x1; y2 = s->y1; x1 = s->x2; y1 = s->y2; - } - - dx = abs(x2 - x1); - dy = abs(y2 - y1); - - if(y1 > y2) - { - charmapy = ",'"; - yinc = -1; - } - else - { - yinc = 1; - charmapy = "`."; - } - - if(dx >= dy) - { - int dpr = dy << 1; - int dpru = dpr - (dx << 1); - int delta = dpr - dx; - int prev = 0; - - for(; dx>=0; dx--) - { - if(delta > 0) - { - caca_putchar(x1, y1, charmapy[1]); - x1++; - y1 += yinc; - delta += dpru; - prev = 1; - } - else - { - if(prev) - caca_putchar(x1, y1, charmapy[0]); - else - caca_putchar(x1, y1, '-'); - x1++; - delta += dpr; - prev = 0; - } - } - } - else - { - int dpr = dx << 1; - int dpru = dpr - (dy << 1); - int delta = dpr - dy; - - for(; dy >= 0; dy--) - { - if(delta > 0) - { - caca_putchar(x1, y1, charmapx[0]); - caca_putchar(x1 + 1, y1, charmapx[1]); - x1++; - y1 += yinc; - delta += dpru; - } - else - { - caca_putchar(x1, y1, '|'); - y1 += yinc; - delta += dpr; - } - } - } -} - diff --git a/libcaca/math.c b/libcaca/math.c deleted file mode 100644 index 489acb8..0000000 --- a/libcaca/math.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * libcaca ASCII-Art library - * Copyright (c) 2002, 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 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "config.h" - -#include - -#include "caca.h" -#include "caca_internals.h" - -int caca_rand(int min, int max) -{ - return min + (int)((1.0*(max-min+1)) * rand() / (RAND_MAX+1.0)); -} - -unsigned int caca_sqrt(unsigned int a) -{ - if(a == 0) - return 0; - - if(a < 1000000000) - { - unsigned int x = a < 10 ? 1 - : a < 1000 ? 10 - : a < 100000 ? 100 - : a < 10000000 ? 1000 - : 10000; - - /* Newton's method. Three iterations would be more than enough. */ - x = (x * x + a) / x / 2; - x = (x * x + a) / x / 2; - x = (x * x + a) / x / 2; - x = (x * x + a) / x / 2; - - return x; - } - - return 2 * caca_sqrt(a / 4); -} - diff --git a/libcaca/sprite.c b/libcaca/sprite.c deleted file mode 100644 index 0d0b1ed..0000000 --- a/libcaca/sprite.c +++ /dev/null @@ -1,262 +0,0 @@ -/* - * libcaca ASCII-Art library - * Copyright (c) 2002, 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 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "config.h" - -#include -#include -#include - -#include "caca.h" -#include "caca_internals.h" - -struct caca_frame -{ - int w, h; - int dx, dy; - char *chars; - int *color; -}; - -struct caca_sprite -{ - int nf; - struct caca_frame *frames; -}; - -struct caca_sprite *caca_load_sprite(const char *file) -{ - char buf[BUFSIZ]; - struct caca_sprite *sprite; - FILE *fd; - - fd = fopen(file, "r"); - if(fd == NULL) - return NULL; - - sprite = malloc(sizeof(struct caca_sprite)); - if(sprite == NULL) - goto sprite_alloc_failed; - - sprite->nf = 0; - sprite->frames = NULL; - - while(!feof(fd)) - { - int x, y; - int w = 0, h = 0, dx = 0, dy = 0; - struct caca_frame *frame; - - /* Get width and height */ - if(!fgets(buf, BUFSIZ, fd)) - break; - - sscanf(buf, "%i %i %i %i", &w, &h, &dx, &dy); - if(w <= 0 || h <= 0 || w > BUFSIZ / 2) - break; - - if(sprite->nf) - { - void *tmp = realloc(sprite->frames, - (sprite->nf + 1) * sizeof(struct caca_frame)); - if(tmp == NULL) - goto frame_failed; - sprite->frames = tmp; - sprite->nf++; - } - else - { - sprite->frames = malloc((sprite->nf + 1) * sizeof(struct caca_frame)); - if(sprite->frames == NULL) - goto sprite_failed; - sprite->nf++; - } - - frame = &sprite->frames[sprite->nf - 1]; - - frame->w = w; - frame->h = h; - frame->dx = dx; - frame->dy = dy; - frame->chars = malloc(w * h * sizeof(char)); - if(frame->chars == NULL) - { - sprite->nf--; - goto frame_failed; - } - frame->color = malloc(w * h * sizeof(int)); - if(frame->color == NULL) - { - free(frame->chars); - sprite->nf--; - goto frame_failed; - } - - for(y = 0; y < h; y++) - { - if(!fgets(buf, BUFSIZ, fd)) - goto frame_failed; - - for(x = 0; x < w && buf[x] && buf[x] != '\r' && buf[x] != '\n'; x++) - frame->chars[w * y + x] = buf[x]; - - for(; x < w; x++) - frame->chars[w * y + x] = ' '; - } - - for(y = 0; y < h; y++) - { - if(!fgets(buf, BUFSIZ, fd)) - goto frame_failed; - - for(x = 0; x < w && buf[x] && buf[x] != '\r' && buf[x] != '\n'; x++) - frame->color[w * y + x] = buf[x] - 'a'; - - for(; x < w; x++) - frame->color[w * y + x] = ' ' - 'a'; - } - - continue; - } - - if(sprite->nf == 0) - goto sprite_failed; - - fclose(fd); - return sprite; - -frame_failed: - while(sprite->nf) - { - free(sprite->frames[sprite->nf - 1].color); - free(sprite->frames[sprite->nf - 1].chars); - sprite->nf--; - } -sprite_failed: - free(sprite); -sprite_alloc_failed: - fclose(fd); - return NULL; -} - -int caca_get_sprite_frames(struct caca_sprite *sprite) -{ - if(sprite == NULL) - return 0; - - return sprite->nf; -} - -int caca_get_sprite_width(struct caca_sprite *sprite, int f) -{ - if(sprite == NULL) - return 0; - - if(f < 0 || f >= sprite->nf) - return 0; - - return sprite->frames[f].w; -} - -int caca_get_sprite_height(struct caca_sprite *sprite, int f) -{ - if(sprite == NULL) - return 0; - - if(f < 0 || f >= sprite->nf) - return 0; - - return sprite->frames[f].h; -} - -int caca_get_sprite_dx(struct caca_sprite *sprite, int f) -{ - if(sprite == NULL) - return 0; - - if(f < 0 || f >= sprite->nf) - return 0; - - return sprite->frames[f].dx; -} - -int caca_get_sprite_dy(struct caca_sprite *sprite, int f) -{ - if(sprite == NULL) - return 0; - - if(f < 0 || f >= sprite->nf) - return 0; - - return sprite->frames[f].dy; -} - -void caca_draw_sprite(int x, int y, struct caca_sprite *sprite, int f) -{ - int i, j, oldcol; - struct caca_frame *frame; - - if(sprite == NULL) - return; - - if(f < 0 || f >= sprite->nf) - return; - - frame = &sprite->frames[f]; - - oldcol = caca_get_color(); - - for(j = 0; j < frame->h; j++) - { - for(i = 0; i < frame->w; i++) - { - int col = frame->color[frame->w * j + i]; - if(col >= 0) - { - caca_set_color(col); - caca_putchar(x + i - frame->dx, y + j - frame->dy, - frame->chars[frame->w * j + i]); - } - } - } - - caca_set_color(oldcol); -} - -void caca_free_sprite(struct caca_sprite *sprite) -{ - int i; - - if(sprite == NULL) - return; - - for(i = sprite->nf; i--;) - { - struct caca_frame *frame = &sprite->frames[i]; - free(frame->chars); - free(frame->color); - } - - free(sprite->frames); - free(sprite); -} - diff --git a/libcaca/triangle.c b/libcaca/triangle.c deleted file mode 100644 index c90af92..0000000 --- a/libcaca/triangle.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - * libcaca ASCII-Art library - * Copyright (c) 2002, 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 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "config.h" - -#include - -#include "caca.h" -#include "caca_internals.h" - -void caca_draw_triangle(int x1, int y1, int x2, int y2, int x3, int y3, char c) -{ - caca_draw_line(x1, y1, x2, y2, c); - caca_draw_line(x2, y2, x3, y3, c); - caca_draw_line(x3, y3, x1, y1, c); -} - -void caca_draw_thin_triangle(int x1, int y1, int x2, int y2, int x3, int y3) -{ - caca_draw_thin_line(x1, y1, x2, y2); - caca_draw_thin_line(x2, y2, x3, y3); - caca_draw_thin_line(x3, y3, x1, y1); -} - -void caca_fill_triangle(int x1, int y1, int x2, int y2, int x3, int y3, char c) -{ - int x, y, xa, xb, xmax, ymax; - - /* Bubble-sort y1 <= y2 <= y3 */ - if(y1 > y2) - { - caca_fill_triangle(x2, y2, x1, y1, x3, y3, c); - return; - } - - if(y2 > y3) - { - caca_fill_triangle(x1, y1, x3, y3, x2, y2, c); - return; - } - - /* Promote precision */ - x1 *= 4; - x2 *= 4; - x3 *= 4; - - xmax = caca_get_width() - 1; - ymax = caca_get_height() - 1; - - /* Rasterize our triangle */ - for(y = y1 < 0 ? 0 : y1; y <= y3 && y <= ymax; y++) - { - if(y <= y2) - { - xa = (y1 == y2) ? x2 : x1 + (x2 - x1) * (y - y1) / (y2 - y1); - xb = (y1 == y3) ? x3 : x1 + (x3 - x1) * (y - y1) / (y3 - y1); - } - else - { - xa = (y3 == y2) ? x2 : x3 + (x2 - x3) * (y - y3) / (y2 - y3); - xb = (y3 == y1) ? x1 : x3 + (x1 - x3) * (y - y3) / (y1 - y3); - } - - if(xb < xa) - { - int tmp = xb; - xb = xa; xa = tmp; - } - - /* Rescale xa and xb, slightly cropping */ - xa = (xa + 2) / 4; - xb = (xb - 2) / 4; - - if(xb < 0) continue; - if(xa > xmax) continue; - if(xa < 0) xa = 0; - if(xb > xmax) xb = xmax; - - for(x = xa; x <= xb; x++) - caca_putchar(x, y, c); - } -} - diff --git a/src/Makefile.am b/src/Makefile.am index e774527..5cab224 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,7 +2,7 @@ # Automake targets and declarations for ttyvaders ############################################################################### -AM_CPPFLAGS = -I$(top_srcdir)/libcaca +AM_CPPFLAGS = -I$(top_srcdir)/../libcaca/src if USE_SLANG LDFLAGS_slang = -lslang @@ -29,5 +29,5 @@ ttyvaders_SOURCES = \ tunnel.c \ weapons.c \ $(NULL) -ttyvaders_LDADD = ../libcaca/libcaca.a $(LDFLAGS_slang) $(LDFLAGS_ncurses) -lm +ttyvaders_LDADD = ../../libcaca/src/libcaca.a $(LDFLAGS_slang) $(LDFLAGS_ncurses) -lm diff --git a/test/Makefile.am b/test/Makefile.am deleted file mode 100644 index 2bf7e4f..0000000 --- a/test/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -############################################################################### -# Automake targets and declarations for libcaca tests -############################################################################### - -AM_CPPFLAGS = -I$(top_srcdir)/libcaca - -if USE_SLANG -LDFLAGS_slang = -lslang -endif -if USE_NCURSES -LDFLAGS_ncurses = -lncurses -endif - -bin_PROGRAMS = demo spritedit - -demo_SOURCES = demo.c -demo_LDADD = ../libcaca/libcaca.a $(LDFLAGS_slang) $(LDFLAGS_ncurses) -lm -demo_CFLAGS = `pkg-config --cflags gtk+-2.0` -demo_LDFLAGS = `pkg-config --libs gtk+-2.0` - -spritedit_SOURCES = spritedit.c -spritedit_LDADD = ../libcaca/libcaca.a $(LDFLAGS_slang) $(LDFLAGS_ncurses) -lm - diff --git a/test/demo.c b/test/demo.c deleted file mode 100644 index 148a7b6..0000000 --- a/test/demo.c +++ /dev/null @@ -1,462 +0,0 @@ -/* - * demo demo using libcaca - * 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 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "config.h" - -#include -#include -#include - -#include -#include - -#include "caca.h" - -static void display_menu(void); - -static void demo_all(void); - -static void demo_color(void); -static void demo_dots(void); -static void demo_lines(void); -static void demo_boxes(void); -static void demo_ellipses(void); -static void demo_triangles(void); -static void demo_sprites(void); -static void demo_blit(void); - -int bounds = 0; -int outline = 0; -struct caca_sprite *sprite = NULL; - -GdkPixbuf *pixbuf; -char *pixels; -int bufx, bufy, bufpitch; - -int main(int argc, char **argv) -{ - void (*demo)(void) = NULL; - int quit = 0; - - if(caca_init()) - { - return 1; - } - - caca_set_delay(40000); - - /* Initialize data */ - sprite = caca_load_sprite("data/barboss.txt"); - -gdk_init (&argc, &argv); - //pixbuf = gdk_pixbuf_new_from_file("/home/sam/pix/gally4.jpeg", NULL); - //pixbuf = gdk_pixbuf_new_from_file("/home/sam/pix/badge1.jpeg", NULL); - //pixbuf = gdk_pixbuf_new_from_file("/home/sam/pix/union.png", NULL); - pixbuf = gdk_pixbuf_new_from_file("/home/sam/pix/pikachu.jpeg", NULL); -if(!pixbuf) return -2; - pixels = gdk_pixbuf_get_pixels(pixbuf); - bufx = gdk_pixbuf_get_width(pixbuf); - bufy = gdk_pixbuf_get_height(pixbuf); - bufpitch = gdk_pixbuf_get_rowstride(pixbuf); -fprintf(stderr, "bits: %i\n", gdk_pixbuf_get_bits_per_sample(pixbuf)); -fprintf(stderr, "w %i, h %i, stride %i\n", bufx, bufy, bufpitch); - - /* Main menu */ - display_menu(); - caca_refresh(); - - /* Go ! */ - while(!quit) - { - char key = caca_get_key(); - - if(key && demo) - { - display_menu(); - caca_refresh(); - demo = NULL; - } - else if(key) - { - handle_key: - switch(key) - { - case 'q': - case 'Q': - demo = NULL; - quit = 1; - break; - case 'o': - case 'O': - outline = (outline + 1) % 3; - display_menu(); - break; - case 'b': - case 'B': - bounds = (bounds + 1) % 2; - display_menu(); - break; - case 'c': - demo = demo_color; - break; - case 'f': - case 'F': - demo = demo_all; - break; - case '1': - demo = demo_dots; - break; - case '2': - demo = demo_lines; - break; - case '3': - demo = demo_boxes; - break; - case '4': - demo = demo_triangles; - break; - case '5': - demo = demo_ellipses; - break; - case 's': - case 'S': - demo = demo_sprites; - break; - case 'i': - case 'I': - demo = demo_blit; - break; - } - - if(demo) - caca_clear(); - - key = caca_get_key(); - if(key) - goto handle_key; - - caca_refresh(); - } - - if(demo) - { - demo(); - - caca_set_color(EE_WHITE); - caca_draw_thin_box(1, 1, caca_get_width() - 2, caca_get_height() - 2); - caca_printf(4, 1, "[%i.%i fps]----", - 1000000 / caca_get_rendertime(), - (10000000 / caca_get_rendertime()) % 10); - caca_refresh(); - } - } - - /* Clean up */ - caca_free_sprite(sprite); - caca_end(); - - return 0; -} - -static void display_menu(void) -{ - int xo = caca_get_width() - 2; - int yo = caca_get_height() - 2; - - caca_clear(); - caca_set_color(EE_WHITE); - caca_draw_thin_box(1, 1, xo, yo); - - caca_putstr((xo - strlen("libcaca demo")) / 2, 3, "libcaca demo"); - caca_putstr((xo - strlen("==============")) / 2, 4, "=============="); - - caca_putstr(4, 6, "demos:"); - caca_putstr(4, 7, "'f': full"); - caca_putstr(4, 8, "'1': dots"); - caca_putstr(4, 9, "'2': lines"); - caca_putstr(4, 10, "'3': boxes"); - caca_putstr(4, 11, "'4': triangles"); - caca_putstr(4, 12, "'5': ellipses"); - caca_putstr(4, 13, "'s': sprites"); - caca_putstr(4, 14, "'c': color"); - caca_putstr(4, 15, "'i': image blit"); - - caca_putstr(4, 17, "settings:"); - caca_printf(4, 18, "'o': outline: %s", - outline == 0 ? "none" : outline == 1 ? "solid" : "thin"); - caca_printf(4, 19, "'b': drawing boundaries: %s", - bounds == 0 ? "screen" : "infinite"); - - caca_putstr(4, yo - 2, "'q': quit"); -} - -static void demo_all(void) -{ - static int i = 0; - - int j, xo, yo, xa, ya, xb, yb, xc, yc; - - i++; - - caca_clear(); - - /* Draw the sun */ - caca_set_color(EE_YELLOW); - xo = caca_get_width() / 4; - yo = caca_get_height() / 4 + 5 * sin(0.03*i); - - for(j = 0; j < 16; j++) - { - xa = xo - (30 + sin(0.03*i) * 8) * sin(0.03*i + M_PI*j/8); - ya = yo + (15 + sin(0.03*i) * 4) * cos(0.03*i + M_PI*j/8); - caca_draw_thin_line(xo, yo, xa, ya); - } - - j = 15 + sin(0.03*i) * 8; - caca_set_color(EE_WHITE); - caca_fill_ellipse(xo, yo, j, j / 2, '#'); - caca_set_color(EE_YELLOW); - caca_draw_ellipse(xo, yo, j, j / 2, '#'); - - /* Draw the pyramid */ - xo = caca_get_width() * 5 / 8; - yo = 2; - - xa = caca_get_width() / 8 + sin(0.03*i) * 5; - ya = caca_get_height() / 2 + cos(0.03*i) * 5; - - xb = caca_get_width() - 10 - cos(0.02*i) * 10; - yb = caca_get_height() * 3 / 4 - 5 + sin(0.02*i) * 5; - - xc = caca_get_width() / 4 - sin(0.02*i) * 5; - yc = caca_get_height() * 3 / 4 + cos(0.02*i) * 5; - - caca_set_color(EE_GREEN); - caca_fill_triangle(xo, yo, xb, yb, xa, ya, '%'); - caca_set_color(EE_YELLOW); - caca_draw_thin_triangle(xo, yo, xb, yb, xa, ya); - - caca_set_color(EE_RED); - caca_fill_triangle(xa, ya, xb, yb, xc, yc, '#'); - caca_set_color(EE_YELLOW); - caca_draw_thin_triangle(xa, ya, xb, yb, xc, yc); - - caca_set_color(EE_BLUE); - caca_fill_triangle(xo, yo, xb, yb, xc, yc, '%'); - caca_set_color(EE_YELLOW); - caca_draw_thin_triangle(xo, yo, xb, yb, xc, yc); - - /* Draw a background triangle */ - xa = 2; - ya = 2; - - xb = caca_get_width() - 3; - yb = caca_get_height() / 2; - - xc = caca_get_width() / 3; - yc = caca_get_height() - 3; - - caca_set_color(EE_CYAN); - caca_draw_thin_triangle(xa, ya, xb, yb, xc, yc); - - xo = caca_get_width() / 2 + cos(0.027*i) * caca_get_width() / 3; - yo = caca_get_height() / 2 - sin(0.027*i) * caca_get_height() / 2; - - caca_draw_thin_line(xa, ya, xo, yo); - caca_draw_thin_line(xb, yb, xo, yo); - caca_draw_thin_line(xc, yc, xo, yo); - - /* Draw a sprite on the pyramid */ - caca_draw_sprite(xo, yo, sprite, 0); - - /* Draw a trail behind the foreground sprite */ - for(j = i - 60; j < i; j++) - { - int delta = caca_rand(-5, 5); - caca_set_color(caca_rand(0, 15)); - caca_putchar(caca_get_width() / 2 - + cos(0.02*j) * (delta + caca_get_width() / 4), - caca_get_height() / 2 - + sin(0.02*j) * (delta + caca_get_height() / 3), - '#'); - } - - /* Draw foreground sprite */ - caca_draw_sprite(caca_get_width() / 2 + cos(0.02*i) * caca_get_width() / 4, - caca_get_height() / 2 + sin(0.02*i) * caca_get_height() / 3, - sprite, 0); -} - -static void demo_dots(void) -{ - int xmax = caca_get_width() - 1; - int ymax = caca_get_height() - 1; - int i; - - for(i = 1000; i--;) - { - /* Putpixel */ - caca_set_color(caca_rand(0, 15)); - caca_putchar(caca_rand(0, xmax), caca_rand(0, ymax), '#'); - } -} - -static void demo_color(void) -{ - int i; - char buf[BUFSIZ]; - - caca_clear(); - for(i = 0; i < 16; i++) - { - sprintf(buf, "'%c': %i (%s)", 'a' + i, i, caca_get_color_name(i)); - caca_set_color(EE_WHITE); - caca_putstr(4, i + 3, buf); - caca_set_color(i); - caca_putstr(40, i + 3, "XXXXXXXXXX-XX--X----------"); - } -} - -static void demo_lines(void) -{ - int w = caca_get_width(); - int h = caca_get_height(); - int xa, ya, xb, yb; - - if(bounds) - { - xa = caca_rand(- w, 2 * w); ya = caca_rand(- h, 2 * h); - xb = caca_rand(- w, 2 * w); yb = caca_rand(- h, 2 * h); - } - else - { - xa = caca_rand(0, w - 1); ya = caca_rand(0, h - 1); - xb = caca_rand(0, w - 1); yb = caca_rand(0, h - 1); - } - - caca_set_color(caca_rand(0, 15)); - if(outline > 1) - caca_draw_thin_line(xa, ya, xb, yb); - else - caca_draw_line(xa, ya, xb, yb, '#'); -} - -static void demo_boxes(void) -{ - int w = caca_get_width(); - int h = caca_get_height(); - int xa, ya, xb, yb; - - if(bounds) - { - xa = caca_rand(- w, 2 * w); ya = caca_rand(- h, 2 * h); - xb = caca_rand(- w, 2 * w); yb = caca_rand(- h, 2 * h); - } - else - { - xa = caca_rand(0, w - 1); ya = caca_rand(0, h - 1); - xb = caca_rand(0, w - 1); yb = caca_rand(0, h - 1); - } - - caca_set_color(caca_rand(0, 15)); - caca_fill_box(xa, ya, xb, yb, '#'); - - caca_set_color(caca_rand(0, 15)); - if(outline == 2) - caca_draw_thin_box(xa, ya, xb, yb); - else if(outline == 1) - caca_draw_box(xa, ya, xb, yb, '#'); -} - -static void demo_ellipses(void) -{ - int w = caca_get_width(); - int h = caca_get_height(); - int x, y, a, b; - - if(bounds) - { - x = caca_rand(- w, 2 * w); y = caca_rand(- h, 2 * h); - a = caca_rand(0, w); b = caca_rand(0, h); - } - else - { - do - { - x = caca_rand(0, w); y = caca_rand(0, h); - a = caca_rand(0, w); b = caca_rand(0, h); - - } while(x - a < 0 || x + a >= w || y - b < 0 || y + b >= h); - } - - caca_set_color(caca_rand(0, 15)); - caca_fill_ellipse(x, y, a, b, '#'); - - caca_set_color(caca_rand(0, 15)); - if(outline == 2) - caca_draw_thin_ellipse(x, y, a, b); - else if(outline == 1) - caca_draw_ellipse(x, y, a, b, '#'); -} - -static void demo_triangles(void) -{ - int w = caca_get_width(); - int h = caca_get_height(); - int xa, ya, xb, yb, xc, yc; - - if(bounds) - { - xa = caca_rand(- w, 2 * w); ya = caca_rand(- h, 2 * h); - xb = caca_rand(- w, 2 * w); yb = caca_rand(- h, 2 * h); - xc = caca_rand(- w, 2 * w); yc = caca_rand(- h, 2 * h); - } - else - { - - xa = caca_rand(0, w - 1); ya = caca_rand(0, h - 1); - xb = caca_rand(0, w - 1); yb = caca_rand(0, h - 1); - xc = caca_rand(0, w - 1); yc = caca_rand(0, h - 1); - } - - caca_set_color(caca_rand(0, 15)); - caca_fill_triangle(xa, ya, xb, yb, xc, yc, '#'); - - caca_set_color(caca_rand(0, 15)); - if(outline == 2) - caca_draw_thin_triangle(xa, ya, xb, yb, xc, yc); - else if(outline == 1) - caca_draw_triangle(xa, ya, xb, yb, xc, yc, '#'); -} - -static void demo_sprites(void) -{ - caca_draw_sprite(caca_rand(0, caca_get_width() - 1), - caca_rand(0, caca_get_height() - 1), sprite, 0); -} - -static void demo_blit(void) -{ -caca_set_color(EE_LIGHTGRAY); - caca_blit(6, 4, caca_get_width() - 6, caca_get_height() - 4, pixels, bufx, bufy); -} - diff --git a/test/spritedit.c b/test/spritedit.c deleted file mode 100644 index 9264924..0000000 --- a/test/spritedit.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * spritedit sprite editor using libcaca - * 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 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "config.h" - -#include - -#include "caca.h" - -int main(int argc, char **argv) -{ - int quit = 0; - struct caca_sprite *sprite; - int frame = 0; - - if(argc < 2) - { - fprintf(stderr, "%s: missing argument (filename).\n", argv[0]); - return 1; - } - - if(caca_init()) - return 1; - - sprite = caca_load_sprite(argv[1]); - - if(!sprite) - { - caca_end(); - fprintf(stderr, "%s: could not open `%s'.\n", argv[0], argv[1]); - return 1; - } - - /* Go ! */ - while(!quit) - { - int xa, ya, xb, yb; - char buf[BUFSIZ]; - - switch(caca_get_key()) - { - case 0: - break; - case 'q': - quit = 1; - break; - case '-': - if(frame > 0) - frame--; - break; - case '+': - if(frame < caca_get_sprite_frames(sprite) - 1) - frame++; - break; - } - - caca_clear(); - - caca_set_color(EE_WHITE); - caca_draw_thin_box(0, 0, caca_get_width() - 1, caca_get_height() - 1); - - caca_putstr(3, 0, "[ Sprite editor for libcaca ]"); - - sprintf(buf, "sprite `%s'", argv[1]); - caca_putstr(3, 2, buf); - sprintf(buf, "frame %i/%i", frame, caca_get_sprite_frames(sprite) - 1); - caca_putstr(3, 3, buf); - - /* Crosshair */ - caca_draw_thin_line(57, 2, 57, 18); - caca_draw_thin_line(37, 10, 77, 10); - caca_putchar(57, 10, '+'); - - /* Boxed sprite */ - xa = -1 - caca_get_sprite_dx(sprite, frame); - ya = -1 - caca_get_sprite_dy(sprite, frame); - xb = xa + 1 + caca_get_sprite_width(sprite, frame); - yb = ya + 1 + caca_get_sprite_height(sprite, frame); - caca_set_color(EE_BLACK); - caca_fill_box(57 + xa, 10 + ya, 57 + xb, 10 + yb, ' '); - caca_set_color(EE_WHITE); - caca_draw_thin_box(57 + xa, 10 + ya, 57 + xb, 10 + yb); - caca_draw_sprite(57, 10, sprite, frame); - - /* Free sprite */ - caca_draw_sprite(20, 10, sprite, frame); - - caca_refresh(); - } - - /* Clean up */ - caca_end(); - - return 0; -} -