+ Added setab/setaf quotes from the XTerm terminfo. + Proposed a workaround for bright colours on any terminal. * src/caca.c: + 16 colour support for ncurses and conio. * src/graphics.c: + Ported to 16 colour support. + Added a missing <stdio.h> for BUFSIZ. + Disabled vsnprintf under DOS (only vsprintf exists). * examples/: + Don't abort if the caca.txt sprite was not found. + Ported to 16 colour support.tags/v0.99.beta14
@@ -4,6 +4,25 @@ $Id$ | |||
many terminal emulators and tried to summarise which combinations | |||
worked properly and which ones did not. | |||
From termcap(5): | |||
set_a_background setab AB Set background | |||
color to #1, using | |||
ANSI escape | |||
set_a_foreground setaf AF Set foreground | |||
color to #1, using | |||
ANSI escape | |||
From the xterm terminfo: | |||
setab=\E[4%p1%dm, setaf=\E[3%p1%dm | |||
From the xterm-16color terminfo: | |||
setab=\E[%?%p1%{8}%<%t%p1%{40}%+%e%p1%{92}%+%;%dm, | |||
setaf=\E[%?%p1%{8}%<%t%p1%{30}%+%e%p1%{82}%+%;%dm, | |||
(http://www.sct.gu.edu.au/~anthony/info/X/Xterm_xf86.terminfo) | |||
o I tested the following terminals: | |||
name $TERM $COLORTERM | |||
@@ -20,8 +39,8 @@ $Id$ | |||
uxterm xterm | |||
o In most terminals, \e[3xm and \[4xm respectively set the foreground | |||
and background colours. x is an colour between 0 and 7 or the value | |||
9 for default value. | |||
and background colours. x is a colour between 0 and 7 or the value | |||
9 for default colour (may be transparent). | |||
\e[0m sets everything to normal, \e[1m sets bold, \e[5m sets blink | |||
and \e[7m sets inverse video. | |||
@@ -35,7 +54,7 @@ $Id$ | |||
for invert in '' '\e[7m'; do | |||
for blink in '' '\e[5m'; do | |||
for bold in '' '\e[1m'; do | |||
echo -ne "$bold$blink$invert"'\e[34m\e[43m'hop'\e[0m ' | |||
echo -ne "$bold$blink$invert"'\e[33m\e[44m'hop'\e[0m ' | |||
echo "($bold$blink$invert)" | |||
done | |||
done | |||
@@ -48,7 +67,8 @@ $Id$ | |||
+ aterm, wterm, rxvt | |||
Almost works on: | |||
+ xterm (bright bg works for blue, but not for red or yellow) | |||
+ xterm (bright bg only works when fg is bright and then inverted, | |||
but then fg is not bright) | |||
Fails on: | |||
+ mlterm (no bright colours, neither fg nor bg) | |||
@@ -74,11 +94,23 @@ $Id$ | |||
+ xterm | |||
+ pterm | |||
Failed (\e[9x and \e[10x don't work) on: | |||
Failed (\e[9x and \e[10x don't do anything) on: | |||
+ Eterm | |||
+ aterm, wterm, rxvt | |||
+ mlterm | |||
+ linux | |||
+ Linux console | |||
o How to draw bright colours on any terminal? | |||
'\e[93;104m' -> bright yellow on bright blue | |||
doesn't work on mlterm, gnome-terminal, konsole | |||
'\e[5;1;33;44m' -> bright yellow on bright blue | |||
doesn't work on mlterm, aterm/wterm/rxvt, Eterm, console | |||
'\e[5;1;33;44;93;104m' -> bright yellow on bright blue | |||
works on gnome-terminal, xterm, pterm, aterm/wterm/rxvt, console | |||
doesn't work on konsole | |||
o S-Lang: | |||
@@ -62,8 +62,6 @@ int main(int argc, char **argv) | |||
sprite = caca_load_sprite("caca.txt"); | |||
if(!sprite) | |||
sprite = caca_load_sprite("examples/caca.txt"); | |||
if(!sprite) | |||
return 1; | |||
/* Main menu */ | |||
display_menu(); | |||
@@ -132,13 +130,11 @@ int main(int argc, char **argv) | |||
break; | |||
case 's': | |||
case 'S': | |||
demo = demo_sprites; | |||
if(sprite) | |||
demo = demo_sprites; | |||
break; | |||
} | |||
if(demo) | |||
caca_clear(); | |||
handle_event: | |||
event = caca_get_event(); | |||
if(event & CACA_EVENT_KEY_PRESS) | |||
@@ -147,11 +143,14 @@ int main(int argc, char **argv) | |||
goto handle_event; | |||
caca_refresh(); | |||
if(demo) | |||
caca_clear(); | |||
} | |||
else if(event & CACA_EVENT_MOUSE_CLICK) | |||
{ | |||
display_menu(); | |||
caca_set_color(CACA_COLOR_RED); | |||
caca_set_color(CACA_COLOR_RED, CACA_COLOR_BLACK); | |||
caca_putstr((event & 0xff00) >> 8, event & 0xff, "|\\"); | |||
caca_refresh(); | |||
} | |||
@@ -160,7 +159,7 @@ int main(int argc, char **argv) | |||
{ | |||
demo(); | |||
caca_set_color(CACA_COLOR_WHITE); | |||
caca_set_color(CACA_COLOR_LIGHTGRAY, CACA_COLOR_BLACK); | |||
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(), | |||
@@ -182,7 +181,7 @@ static void display_menu(void) | |||
int yo = caca_get_height() - 2; | |||
caca_clear(); | |||
caca_set_color(CACA_COLOR_WHITE); | |||
caca_set_color(CACA_COLOR_LIGHTGRAY, CACA_COLOR_BLACK); | |||
caca_draw_thin_box(1, 1, xo, yo); | |||
caca_putstr((xo - strlen("libcaca demo")) / 2, 3, "libcaca demo"); | |||
@@ -195,15 +194,16 @@ static void display_menu(void) | |||
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, 13, "'c': colour"); | |||
if(sprite) | |||
caca_putstr(4, 14, "'s': sprites"); | |||
caca_putstr(4, 17, "settings:"); | |||
caca_printf(4, 18, "'o': outline: %s", | |||
caca_putstr(4, 16, "settings:"); | |||
caca_printf(4, 17, "'o': outline: %s", | |||
outline == 0 ? "none" : outline == 1 ? "solid" : "thin"); | |||
caca_printf(4, 19, "'b': drawing boundaries: %s", | |||
caca_printf(4, 18, "'b': drawing boundaries: %s", | |||
bounds == 0 ? "screen" : "infinite"); | |||
caca_printf(4, 20, "'d': %s dithering", | |||
caca_printf(4, 19, "'d': %s dithering", | |||
dithering == 0 ? "no" : dithering == 1 ? "ordered" : "random"); | |||
caca_putstr(4, yo - 2, "'q': quit"); | |||
@@ -220,7 +220,7 @@ static void demo_all(void) | |||
caca_clear(); | |||
/* Draw the sun */ | |||
caca_set_color(CACA_COLOR_YELLOW); | |||
caca_set_color(CACA_COLOR_YELLOW, CACA_COLOR_BLACK); | |||
xo = caca_get_width() / 4; | |||
yo = caca_get_height() / 4 + 5 * sin(0.03*i); | |||
@@ -232,9 +232,9 @@ static void demo_all(void) | |||
} | |||
j = 15 + sin(0.03*i) * 8; | |||
caca_set_color(CACA_COLOR_WHITE); | |||
caca_set_color(CACA_COLOR_WHITE, CACA_COLOR_BLACK); | |||
caca_fill_ellipse(xo, yo, j, j / 2, '#'); | |||
caca_set_color(CACA_COLOR_YELLOW); | |||
caca_set_color(CACA_COLOR_YELLOW, CACA_COLOR_BLACK); | |||
caca_draw_ellipse(xo, yo, j, j / 2, '#'); | |||
/* Draw the pyramid */ | |||
@@ -250,19 +250,19 @@ static void demo_all(void) | |||
xc = caca_get_width() / 4 - sin(0.02*i) * 5; | |||
yc = caca_get_height() * 3 / 4 + cos(0.02*i) * 5; | |||
caca_set_color(CACA_COLOR_GREEN); | |||
caca_set_color(CACA_COLOR_GREEN, CACA_COLOR_BLACK); | |||
caca_fill_triangle(xo, yo, xb, yb, xa, ya, '%'); | |||
caca_set_color(CACA_COLOR_YELLOW); | |||
caca_set_color(CACA_COLOR_YELLOW, CACA_COLOR_BLACK); | |||
caca_draw_thin_triangle(xo, yo, xb, yb, xa, ya); | |||
caca_set_color(CACA_COLOR_RED); | |||
caca_set_color(CACA_COLOR_RED, CACA_COLOR_BLACK); | |||
caca_fill_triangle(xa, ya, xb, yb, xc, yc, '#'); | |||
caca_set_color(CACA_COLOR_YELLOW); | |||
caca_set_color(CACA_COLOR_YELLOW, CACA_COLOR_BLACK); | |||
caca_draw_thin_triangle(xa, ya, xb, yb, xc, yc); | |||
caca_set_color(CACA_COLOR_BLUE); | |||
caca_set_color(CACA_COLOR_BLUE, CACA_COLOR_BLACK); | |||
caca_fill_triangle(xo, yo, xb, yb, xc, yc, '%'); | |||
caca_set_color(CACA_COLOR_YELLOW); | |||
caca_set_color(CACA_COLOR_YELLOW, CACA_COLOR_BLACK); | |||
caca_draw_thin_triangle(xo, yo, xb, yb, xc, yc); | |||
/* Draw a background triangle */ | |||
@@ -275,7 +275,7 @@ static void demo_all(void) | |||
xc = caca_get_width() / 3; | |||
yc = caca_get_height() - 3; | |||
caca_set_color(CACA_COLOR_CYAN); | |||
caca_set_color(CACA_COLOR_CYAN, CACA_COLOR_BLACK); | |||
caca_draw_thin_triangle(xa, ya, xb, yb, xc, yc); | |||
xo = caca_get_width() / 2 + cos(0.027*i) * caca_get_width() / 3; | |||
@@ -292,7 +292,7 @@ static void demo_all(void) | |||
for(j = i - 60; j < i; j++) | |||
{ | |||
int delta = caca_rand(-5, 5); | |||
caca_set_color(caca_rand(0, 15)); | |||
caca_set_color(caca_rand(0, 15), caca_rand(0, 15)); | |||
caca_putchar(caca_get_width() / 2 | |||
+ cos(0.02*j) * (delta + caca_get_width() / 4), | |||
caca_get_height() / 2 | |||
@@ -311,28 +311,36 @@ static void demo_dots(void) | |||
int xmax = caca_get_width() - 1; | |||
int ymax = caca_get_height() - 1; | |||
int i; | |||
static char chars[10] = | |||
{ | |||
'+', '-', '*', '#', 'X', '@', '%', '$', 'M', 'W' | |||
}; | |||
for(i = 1000; i--;) | |||
{ | |||
/* Putpixel */ | |||
caca_set_color(caca_rand(0, 15)); | |||
caca_putchar(caca_rand(0, xmax), caca_rand(0, ymax), '#'); | |||
caca_set_color(caca_rand(0, 15), caca_rand(0, 15)); | |||
caca_putchar(caca_rand(0, xmax), caca_rand(0, ymax), | |||
chars[caca_rand(0, 9)]); | |||
} | |||
} | |||
static void demo_color(void) | |||
{ | |||
int i; | |||
int i, j; | |||
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(CACA_COLOR_WHITE); | |||
caca_putstr(4, i + 3, buf); | |||
caca_set_color(i); | |||
caca_putstr(40, i + 3, "XXXXXXXXXX-XX--X----------"); | |||
caca_set_color(CACA_COLOR_LIGHTGRAY, CACA_COLOR_BLACK); | |||
caca_putstr(4, i + (i >= 8 ? 4 : 3), buf); | |||
for(j = 0; j < 16; j++) | |||
{ | |||
caca_set_color(i, j); | |||
caca_putstr((j >= 8 ? 41 : 40) + j * 2, i + (i >= 8 ? 4 : 3), "# "); | |||
} | |||
} | |||
} | |||
@@ -353,7 +361,7 @@ static void demo_lines(void) | |||
xb = caca_rand(0, w - 1); yb = caca_rand(0, h - 1); | |||
} | |||
caca_set_color(caca_rand(0, 15)); | |||
caca_set_color(caca_rand(0, 15), CACA_COLOR_BLACK); | |||
if(outline > 1) | |||
caca_draw_thin_line(xa, ya, xb, yb); | |||
else | |||
@@ -377,10 +385,10 @@ static void demo_boxes(void) | |||
xb = caca_rand(0, w - 1); yb = caca_rand(0, h - 1); | |||
} | |||
caca_set_color(caca_rand(0, 15)); | |||
caca_set_color(caca_rand(0, 15), caca_rand(0, 15)); | |||
caca_fill_box(xa, ya, xb, yb, '#'); | |||
caca_set_color(caca_rand(0, 15)); | |||
caca_set_color(caca_rand(0, 15), CACA_COLOR_BLACK); | |||
if(outline == 2) | |||
caca_draw_thin_box(xa, ya, xb, yb); | |||
else if(outline == 1) | |||
@@ -408,10 +416,10 @@ static void demo_ellipses(void) | |||
} while(x - a < 0 || x + a >= w || y - b < 0 || y + b >= h); | |||
} | |||
caca_set_color(caca_rand(0, 15)); | |||
caca_set_color(caca_rand(0, 15), caca_rand(0, 15)); | |||
caca_fill_ellipse(x, y, a, b, '#'); | |||
caca_set_color(caca_rand(0, 15)); | |||
caca_set_color(caca_rand(0, 15), CACA_COLOR_BLACK); | |||
if(outline == 2) | |||
caca_draw_thin_ellipse(x, y, a, b); | |||
else if(outline == 1) | |||
@@ -438,10 +446,10 @@ static void demo_triangles(void) | |||
xc = caca_rand(0, w - 1); yc = caca_rand(0, h - 1); | |||
} | |||
caca_set_color(caca_rand(0, 15)); | |||
caca_set_color(caca_rand(0, 15), caca_rand(0, 15)); | |||
caca_fill_triangle(xa, ya, xb, yb, xc, yc, '#'); | |||
caca_set_color(caca_rand(0, 15)); | |||
caca_set_color(caca_rand(0, 15), CACA_COLOR_BLACK); | |||
if(outline == 2) | |||
caca_draw_thin_triangle(xa, ya, xb, yb, xc, yc); | |||
else if(outline == 1) | |||
@@ -81,7 +81,7 @@ int main(int argc, char **argv) | |||
caca_clear(); | |||
caca_set_color(CACA_COLOR_WHITE); | |||
caca_set_color(CACA_COLOR_LIGHTGRAY, CACA_COLOR_BLACK); | |||
caca_draw_thin_box(0, 0, caca_get_width() - 1, caca_get_height() - 1); | |||
caca_putstr(3, 0, "[ Sprite editor for libcaca ]"); | |||
@@ -101,9 +101,9 @@ int main(int argc, char **argv) | |||
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(CACA_COLOR_BLACK); | |||
caca_set_color(CACA_COLOR_BLACK, CACA_COLOR_BLACK); | |||
caca_fill_box(57 + xa, 10 + ya, 57 + xb, 10 + yb, ' '); | |||
caca_set_color(CACA_COLOR_WHITE); | |||
caca_set_color(CACA_COLOR_LIGHTGRAY, CACA_COLOR_BLACK); | |||
caca_draw_thin_box(57 + xa, 10 + ya, 57 + xb, 10 + yb); | |||
caca_draw_sprite(57, 10, sprite, frame); | |||
@@ -33,6 +33,8 @@ | |||
# include <inttypes.h> | |||
#else | |||
typedef unsigned char uint8_t; | |||
typedef unsigned short uint16_t; | |||
typedef unsigned int uint32_t; | |||
#endif | |||
#include <stdlib.h> | |||
@@ -61,7 +61,7 @@ char *_caca_scratch_line; | |||
#if defined(USE_NCURSES) | |||
static mmask_t oldmask; | |||
int _caca_attr[16]; | |||
int _caca_attr[16*16]; | |||
#endif | |||
#if defined(USE_CONIO) | |||
@@ -72,6 +72,7 @@ char *_caca_screen; | |||
int caca_init(void) | |||
{ | |||
#if defined(USE_SLANG) | |||
/* See SLang ref., 5.4.4. */ | |||
static char *slang_colors[16] = | |||
{ | |||
"black", | |||
@@ -92,7 +93,7 @@ int caca_init(void) | |||
"white", | |||
}; | |||
int i; | |||
int fg, bg; | |||
/* Initialize slang library */ | |||
SLsig_block_signals(); | |||
@@ -120,11 +121,36 @@ int caca_init(void) | |||
SLtt_set_mouse_mode(1, 0); | |||
SLsmg_refresh(); | |||
for(i = 0; i < 16; i++) | |||
SLtt_set_color(i + 1, NULL, slang_colors[i], "black"); | |||
for(bg = 0; bg < 16; bg++) | |||
for(fg = 0; fg < 16; fg++) | |||
{ | |||
int i = fg + 16 * bg; | |||
SLtt_set_color(i, NULL, slang_colors[fg], slang_colors[bg]); | |||
} | |||
#elif defined(USE_NCURSES) | |||
int i; | |||
static int curses_colors[] = | |||
{ | |||
COLOR_BLACK, | |||
COLOR_BLUE, | |||
COLOR_GREEN, | |||
COLOR_CYAN, | |||
COLOR_RED, | |||
COLOR_MAGENTA, | |||
COLOR_YELLOW, | |||
COLOR_WHITE, | |||
/* Extra values for xterm-16color */ | |||
COLOR_BLACK + 8, | |||
COLOR_BLUE + 8, | |||
COLOR_GREEN + 8, | |||
COLOR_CYAN + 8, | |||
COLOR_RED + 8, | |||
COLOR_MAGENTA + 8, | |||
COLOR_YELLOW + 8, | |||
COLOR_WHITE + 8 | |||
}; | |||
int fg, bg, max; | |||
mmask_t newmask; | |||
initscr(); | |||
@@ -135,33 +161,35 @@ int caca_init(void) | |||
nodelay(stdscr, TRUE); | |||
curs_set(0); | |||
/* Activate mouse */ | |||
newmask = ALL_MOUSE_EVENTS; | |||
mousemask(newmask, &oldmask); | |||
/* Activate colour */ | |||
start_color(); | |||
init_pair(1 + CACA_COLOR_BLACK, COLOR_BLACK, COLOR_BLACK); | |||
init_pair(1 + CACA_COLOR_BLUE, COLOR_BLUE, COLOR_BLACK); | |||
init_pair(1 + CACA_COLOR_GREEN, COLOR_GREEN, COLOR_BLACK); | |||
init_pair(1 + CACA_COLOR_CYAN, COLOR_CYAN, COLOR_BLACK); | |||
init_pair(1 + CACA_COLOR_RED, COLOR_RED, COLOR_BLACK); | |||
init_pair(1 + CACA_COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK); | |||
init_pair(1 + CACA_COLOR_BROWN, COLOR_YELLOW, COLOR_BLACK); | |||
init_pair(1 + CACA_COLOR_LIGHTGRAY, COLOR_WHITE, COLOR_BLACK); | |||
init_pair(1 + CACA_COLOR_DARKGRAY, COLOR_BLACK, COLOR_BLACK); | |||
init_pair(1 + CACA_COLOR_LIGHTBLUE, COLOR_BLUE, COLOR_BLACK); | |||
init_pair(1 + CACA_COLOR_LIGHTGREEN, COLOR_GREEN, COLOR_BLACK); | |||
init_pair(1 + CACA_COLOR_LIGHTCYAN, COLOR_CYAN, COLOR_BLACK); | |||
init_pair(1 + CACA_COLOR_LIGHTRED, COLOR_RED, COLOR_BLACK); | |||
init_pair(1 + CACA_COLOR_LIGHTMAGENTA, COLOR_MAGENTA, COLOR_BLACK); | |||
init_pair(1 + CACA_COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK); | |||
init_pair(1 + CACA_COLOR_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); | |||
} | |||
max = COLORS >= 16 ? 16 : 8; | |||
for(bg = 0; bg < max; bg++) | |||
for(fg = 0; fg < max; fg++) | |||
{ | |||
/* Use ((max + 7 - fg) % max) instead of fg so that colour 0 | |||
* is light gray on black, since some terminals don't like | |||
* this colour pair to be redefined. */ | |||
int col = ((max + 7 - fg) % max) + max * bg; | |||
init_pair(col, curses_colors[fg], curses_colors[bg]); | |||
_caca_attr[fg + 16 * bg] = COLOR_PAIR(col); | |||
if(max == 8) | |||
{ | |||
/* Bright fg on simple bg */ | |||
_caca_attr[fg + 8 + 16 * bg] = A_BOLD | COLOR_PAIR(col); | |||
/* 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); | |||
} | |||
} | |||
#elif defined(USE_CONIO) | |||
gettextinfo(&ti); | |||
@@ -150,8 +150,9 @@ unsigned int caca_get_event(void); | |||
/* | |||
* Character graphics | |||
*/ | |||
void caca_set_color(enum caca_color); | |||
enum caca_color caca_get_color(void); | |||
void caca_set_color(enum caca_color, enum caca_color); | |||
enum caca_color caca_get_fg_color(void); | |||
enum caca_color caca_get_bg_color(void); | |||
void caca_putchar(int, int, char); | |||
void caca_putstr(int, int, const char *); | |||
void caca_printf(int, int, const char *, ...); | |||
@@ -202,6 +203,7 @@ void caca_free_sprite(struct caca_sprite *); | |||
*/ | |||
struct caca_bitmap; | |||
struct caca_bitmap *caca_create_bitmap(int, int, int, int, int, int, int); | |||
void caca_set_bitmap_palette(struct caca_bitmap *, int[], int[], int[]); | |||
void caca_draw_bitmap(int, int, int, int, struct caca_bitmap *, char *); | |||
void caca_free_bitmap(struct caca_bitmap *); | |||
@@ -39,6 +39,7 @@ | |||
# error "no graphics library detected" | |||
#endif | |||
#include <stdio.h> /* BUFSIZ */ | |||
#include <string.h> | |||
#include <stdlib.h> | |||
#include <stdarg.h> | |||
@@ -46,30 +47,41 @@ | |||
#include "caca.h" | |||
#include "caca_internals.h" | |||
static enum caca_color _caca_color = CACA_COLOR_WHITE; | |||
static enum caca_color _caca_fgcolor = CACA_COLOR_LIGHTGRAY; | |||
static enum caca_color _caca_bgcolor = CACA_COLOR_BLACK; | |||
void caca_set_color(enum caca_color color) | |||
void caca_set_color(enum caca_color fgcolor, enum caca_color bgcolor) | |||
{ | |||
if(color < 0 || color > 15) | |||
if(fgcolor < 0 || fgcolor > 15 || bgcolor < 0 || bgcolor > 15) | |||
return; | |||
_caca_color = color; | |||
_caca_fgcolor = fgcolor; | |||
_caca_bgcolor = bgcolor; | |||
#if defined(USE_SLANG) | |||
SLsmg_set_color(color + 1); | |||
SLsmg_set_color(fgcolor + 16 * bgcolor); | |||
#elif defined(USE_NCURSES) | |||
attrset(_caca_attr[color]); | |||
attrset(_caca_attr[fgcolor + 16 * bgcolor]); | |||
#elif defined(USE_CONIO) | |||
textcolor(color); | |||
textbackground(bgcolor); | |||
textcolor(fgcolor); | |||
#endif | |||
} | |||
enum caca_color caca_get_color(void) | |||
enum caca_color caca_get_fg_color(void) | |||
{ | |||
return _caca_color; | |||
return _caca_fgcolor; | |||
} | |||
enum caca_color caca_get_bg_color(void) | |||
{ | |||
return _caca_bgcolor; | |||
} | |||
void caca_putchar(int x, int y, char c) | |||
{ | |||
#if defined(USE_CONIO) | |||
char *data; | |||
#endif | |||
if(x < 0 || x >= (int)caca_get_width() || | |||
y < 0 || y >= (int)caca_get_height()) | |||
return; | |||
@@ -81,8 +93,9 @@ void caca_putchar(int x, int y, char c) | |||
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; | |||
data = _caca_screen + 2 * (x + y * caca_get_width()); | |||
data[0] = c; | |||
data[1] = (_caca_bgcolor << 4) | _caca_fgcolor; | |||
// gotoxy(x + 1, y + 1); | |||
// putch(c); | |||
#endif | |||
@@ -124,7 +137,7 @@ void caca_putstr(int x, int y, const char *s) | |||
while(*s) | |||
{ | |||
*buf++ = *s++; | |||
*buf++ = _caca_color; | |||
*buf++ = (_caca_bgcolor << 4) | _caca_fgcolor; | |||
} | |||
// gotoxy(x + 1, y + 1); | |||
// cputs(s); | |||
@@ -144,7 +157,11 @@ void caca_printf(int x, int y, const char *format, ...) | |||
buf = malloc(caca_get_width() - x + 1); | |||
va_start(args, format); | |||
#if defined(HAVE_VSNPRINTF) | |||
vsnprintf(buf, caca_get_width() - x + 1, format, args); | |||
#else | |||
vsprintf(buf, format, args); | |||
#endif | |||
buf[caca_get_width() - x] = '\0'; | |||
va_end(args); | |||
@@ -156,10 +173,16 @@ void caca_printf(int x, int y, const char *format, ...) | |||
void caca_clear(void) | |||
{ | |||
/* We could use SLsmg_cls() etc., but drawing empty lines is much faster */ | |||
enum caca_color oldfg = caca_get_fg_color(); | |||
enum caca_color oldbg = caca_get_bg_color(); | |||
int y = caca_get_height(); | |||
caca_set_color(CACA_COLOR_LIGHTGRAY, CACA_COLOR_BLACK); | |||
/* We could use SLsmg_cls() etc., but drawing empty lines is much faster */ | |||
while(y--) | |||
caca_putstr(0, y, _caca_empty_line); | |||
caca_set_color(oldfg, oldbg); | |||
} | |||
@@ -219,7 +219,8 @@ int caca_get_sprite_dy(struct caca_sprite *sprite, int f) | |||
void caca_draw_sprite(int x, int y, struct caca_sprite *sprite, int f) | |||
{ | |||
int i, j, oldcol; | |||
int i, j; | |||
enum caca_color oldfg, oldbg; | |||
struct caca_frame *frame; | |||
if(sprite == NULL) | |||
@@ -230,7 +231,8 @@ void caca_draw_sprite(int x, int y, struct caca_sprite *sprite, int f) | |||
frame = &sprite->frames[f]; | |||
oldcol = caca_get_color(); | |||
oldfg = caca_get_fg_color(); | |||
oldbg = caca_get_bg_color(); | |||
for(j = 0; j < frame->h; j++) | |||
{ | |||
@@ -239,14 +241,14 @@ void caca_draw_sprite(int x, int y, struct caca_sprite *sprite, int f) | |||
int col = frame->color[frame->w * j + i]; | |||
if(col >= 0) | |||
{ | |||
caca_set_color(col); | |||
caca_set_color(col, CACA_COLOR_BLACK); | |||
caca_putchar(x + i - frame->dx, y + j - frame->dy, | |||
frame->chars[frame->w * j + i]); | |||
} | |||
} | |||
} | |||
caca_set_color(oldcol); | |||
caca_set_color(oldfg, oldbg); | |||
} | |||
void caca_free_sprite(struct caca_sprite *sprite) | |||