From 88359dfc90df5b2fd0fbae842d4e1b85fe8db738 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Sat, 29 Nov 2003 14:41:37 +0000 Subject: [PATCH] * configure.ac: + Default to ncurses, not slang, because slang only has 128 colour pairs. * src/caca.c: + Disable scrolling to avoid hashmap scrolling optimization code. * src/graphics.c: + Swap fg and bg in the colour pair indexing, so that bg is always right. + Disable alt charset support to exploit my patched slang. --- NOTES | 5 +++++ configure.ac | 18 +++++++++--------- src/caca.c | 4 ++++ src/graphics.c | 29 +++++++++++++++++++++++------ 4 files changed, 41 insertions(+), 15 deletions(-) diff --git a/NOTES b/NOTES index 837a721..e49b835 100644 --- a/NOTES +++ b/NOTES @@ -117,6 +117,11 @@ $Id$ o S-Lang: + 256 character pairs are definable, but only 128 can be used. This is + because slsmg.c's This_Color variable uses its 8th bit to indicate an + alternate character set. Replacing a few 0x7F with 0xFF in sldisply.c + works around the problem but gets rid of the alternate charset. + o MS-DOS: all bright colours, bright backgrounds, and bright combinations work using . No need to kludge anything. diff --git a/configure.ac b/configure.ac index 8ffe57d..906ec8c 100644 --- a/configure.ac +++ b/configure.ac @@ -17,10 +17,10 @@ dnl AC_PROG_EGREP only exists in autoconf 2.54+, so we use AC_EGREP_CPP right dnl now otherwise it might be set in an obscure if statement. AC_EGREP_CPP(foo,foo) -AC_ARG_ENABLE(slang, - [ --enable-slang slang graphics support (default enabled)]) AC_ARG_ENABLE(ncurses, - [ --enable-ncurses ncurses graphics support (default disabled)]) + [ --enable-ncurses ncurses graphics support (default enabled)]) +AC_ARG_ENABLE(slang, + [ --enable-slang slang graphics support (default disabled)]) AC_ARG_ENABLE(conio, [ --enable-conio DOS conio.h graphics support (default disabled)]) @@ -40,16 +40,16 @@ if test "${enable_conio}" = "yes"; then AC_MSG_RESULT(no)]) AC_DEFINE(USE_CONIO, 1, Define if the backend driver is conio.h) USE_CONIO=: -elif test "${enable_ncurses}" = "yes"; then - AC_CHECK_HEADER(ncurses.h,:,AC_MSG_ERROR([cannot find ncurses headers])) - AC_CHECK_LIB(ncurses,initscr,:,AC_MSG_ERROR([cannot find ncurses library])) - AC_DEFINE(USE_NCURSES, 1, Define if the backend driver is ncurses) - USE_NCURSES=: -elif test "${enable_slang}" != "no"; then +elif test "${enable_slang}" = "yes"; then AC_CHECK_HEADER(slang.h,:,AC_MSG_ERROR([cannot find slang headers])) AC_CHECK_LIB(slang,SLkp_init,:,AC_MSG_ERROR([cannot find slang library])) AC_DEFINE(USE_SLANG, 1, Define if the backend driver is slang) USE_SLANG=: +elif test "${enable_ncurses}" != "no"; then + AC_CHECK_HEADER(ncurses.h,:,AC_MSG_ERROR([cannot find ncurses headers])) + AC_CHECK_LIB(ncurses,initscr,:,AC_MSG_ERROR([cannot find ncurses library])) + AC_DEFINE(USE_NCURSES, 1, Define if the backend driver is ncurses) + USE_NCURSES=: else AC_MSG_ERROR([could not find any terminal graphics interface]) fi diff --git a/src/caca.c b/src/caca.c index ee2209c..377f2cb 100644 --- a/src/caca.c +++ b/src/caca.c @@ -97,6 +97,10 @@ int caca_init(void) SLtt_set_mouse_mode(1, 0); SLsmg_refresh(); + /* Disable scrolling so that hashmap scrolling optimization code + * does not cause ugly refreshes due to slow terminals */ + SLtt_Term_Cannot_Scroll = 1; + #elif defined(USE_NCURSES) mmask_t newmask; diff --git a/src/graphics.c b/src/graphics.c index f5c4f6d..c45905d 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -39,6 +39,10 @@ # error "no graphics library detected" #endif +#ifdef HAVE_INTTYPES_H +# include +#endif + #include /* BUFSIZ */ #include #include @@ -64,7 +68,7 @@ void caca_set_color(enum caca_color fgcolor, enum caca_color bgcolor) _caca_fgcolor = fgcolor; _caca_bgcolor = bgcolor; #if defined(USE_SLANG) - SLsmg_set_color(fgcolor + 16 * bgcolor); + SLsmg_set_color((bgcolor + 16 * fgcolor) /*% 128*/); #elif defined(USE_NCURSES) attrset(_caca_attr[fgcolor + 16 * bgcolor]); #elif defined(USE_CONIO) @@ -134,7 +138,7 @@ void caca_putstr(int x, int y, const char *s) #if defined(USE_SLANG) SLsmg_gotorc(y, x); - SLsmg_write_string(s); + SLsmg_write_string((char *)(intptr_t)s); #elif defined(USE_NCURSES) move(y, x); addstr(s); @@ -198,6 +202,7 @@ int _caca_init_graphics(void) /* See SLang ref., 5.4.4. */ static char *slang_colors[16] = { + /* Standard colours */ "black", "blue", "green", @@ -206,6 +211,7 @@ int _caca_init_graphics(void) "magenta", "brown", "lightgray", + /* Bright colours */ "gray", "brightblue", "brightgreen", @@ -218,16 +224,20 @@ int _caca_init_graphics(void) int fg, bg; - for(bg = 0; bg < 16; bg++) - for(fg = 0; fg < 16; fg++) + for(fg = 0; fg < 16; fg++) + for(bg = 0; bg < 16; bg++) { - int i = fg + 16 * bg; + int i = bg + 16 * fg; SLtt_set_color(i, NULL, slang_colors[fg], slang_colors[bg]); } + /* Disable alt charset support so that we get all 256 colour pairs */ + SLtt_Has_Alt_Charset = 0; + #elif defined(USE_NCURSES) static int curses_colors[] = { + /* Standard curses colours */ COLOR_BLACK, COLOR_BLUE, COLOR_GREEN, @@ -252,6 +262,12 @@ int _caca_init_graphics(void) /* Activate colour */ start_color(); + /* If COLORS == 16, it means the terminal supports full bright colours + * using setab and setaf (will use \e[90m \e[91m etc. for colours >= 8), + * we can build 16*16 colour pairs. + * If COLORS == 8, it means the terminal does not know about bright + * colours and we need to get them through A_BOLD and A_BLINK (\e[1m + * and \e[5m). We can only build 8*8 colour pairs. */ max = COLORS >= 16 ? 16 : 8; for(bg = 0; bg < max; bg++) @@ -271,7 +287,8 @@ int _caca_init_graphics(void) /* Simple fg on bright bg */ _caca_attr[fg + 16 * (bg + 8)] = A_BLINK | COLOR_PAIR(col); /* Bright fg on bright bg */ - _caca_attr[fg + 8 + 16 * (bg + 8)] = A_BLINK | A_BOLD | COLOR_PAIR(col); + _caca_attr[fg + 8 + 16 * (bg + 8)] = A_BLINK | A_BOLD + | COLOR_PAIR(col); } }