+ 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 | many terminal emulators and tried to summarise which combinations | ||||
| worked properly and which ones did not. | 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: | o I tested the following terminals: | ||||
| name $TERM $COLORTERM | name $TERM $COLORTERM | ||||
| @@ -20,8 +39,8 @@ $Id$ | |||||
| uxterm xterm | uxterm xterm | ||||
| o In most terminals, \e[3xm and \[4xm respectively set the foreground | 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 | \e[0m sets everything to normal, \e[1m sets bold, \e[5m sets blink | ||||
| and \e[7m sets inverse video. | and \e[7m sets inverse video. | ||||
| @@ -35,7 +54,7 @@ $Id$ | |||||
| for invert in '' '\e[7m'; do | for invert in '' '\e[7m'; do | ||||
| for blink in '' '\e[5m'; do | for blink in '' '\e[5m'; do | ||||
| for bold in '' '\e[1m'; 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)" | echo "($bold$blink$invert)" | ||||
| done | done | ||||
| done | done | ||||
| @@ -48,7 +67,8 @@ $Id$ | |||||
| + aterm, wterm, rxvt | + aterm, wterm, rxvt | ||||
| Almost works on: | 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: | Fails on: | ||||
| + mlterm (no bright colours, neither fg nor bg) | + mlterm (no bright colours, neither fg nor bg) | ||||
| @@ -74,11 +94,23 @@ $Id$ | |||||
| + xterm | + xterm | ||||
| + pterm | + pterm | ||||
| Failed (\e[9x and \e[10x don't work) on: | |||||
| Failed (\e[9x and \e[10x don't do anything) on: | |||||
| + Eterm | + Eterm | ||||
| + aterm, wterm, rxvt | + aterm, wterm, rxvt | ||||
| + mlterm | + 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: | o S-Lang: | ||||
| @@ -62,8 +62,6 @@ int main(int argc, char **argv) | |||||
| sprite = caca_load_sprite("caca.txt"); | sprite = caca_load_sprite("caca.txt"); | ||||
| if(!sprite) | if(!sprite) | ||||
| sprite = caca_load_sprite("examples/caca.txt"); | sprite = caca_load_sprite("examples/caca.txt"); | ||||
| if(!sprite) | |||||
| return 1; | |||||
| /* Main menu */ | /* Main menu */ | ||||
| display_menu(); | display_menu(); | ||||
| @@ -132,13 +130,11 @@ int main(int argc, char **argv) | |||||
| break; | break; | ||||
| case 's': | case 's': | ||||
| case 'S': | case 'S': | ||||
| demo = demo_sprites; | |||||
| if(sprite) | |||||
| demo = demo_sprites; | |||||
| break; | break; | ||||
| } | } | ||||
| if(demo) | |||||
| caca_clear(); | |||||
| handle_event: | handle_event: | ||||
| event = caca_get_event(); | event = caca_get_event(); | ||||
| if(event & CACA_EVENT_KEY_PRESS) | if(event & CACA_EVENT_KEY_PRESS) | ||||
| @@ -147,11 +143,14 @@ int main(int argc, char **argv) | |||||
| goto handle_event; | goto handle_event; | ||||
| caca_refresh(); | caca_refresh(); | ||||
| if(demo) | |||||
| caca_clear(); | |||||
| } | } | ||||
| else if(event & CACA_EVENT_MOUSE_CLICK) | else if(event & CACA_EVENT_MOUSE_CLICK) | ||||
| { | { | ||||
| display_menu(); | 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_putstr((event & 0xff00) >> 8, event & 0xff, "|\\"); | ||||
| caca_refresh(); | caca_refresh(); | ||||
| } | } | ||||
| @@ -160,7 +159,7 @@ int main(int argc, char **argv) | |||||
| { | { | ||||
| demo(); | 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_draw_thin_box(1, 1, caca_get_width() - 2, caca_get_height() - 2); | ||||
| caca_printf(4, 1, "[%i.%i fps]----", | caca_printf(4, 1, "[%i.%i fps]----", | ||||
| 1000000 / caca_get_rendertime(), | 1000000 / caca_get_rendertime(), | ||||
| @@ -182,7 +181,7 @@ static void display_menu(void) | |||||
| int yo = caca_get_height() - 2; | int yo = caca_get_height() - 2; | ||||
| caca_clear(); | 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_draw_thin_box(1, 1, xo, yo); | ||||
| caca_putstr((xo - strlen("libcaca demo")) / 2, 3, "libcaca demo"); | 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, 10, "'3': boxes"); | ||||
| caca_putstr(4, 11, "'4': triangles"); | caca_putstr(4, 11, "'4': triangles"); | ||||
| caca_putstr(4, 12, "'5': ellipses"); | 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"); | 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"); | 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"); | dithering == 0 ? "no" : dithering == 1 ? "ordered" : "random"); | ||||
| caca_putstr(4, yo - 2, "'q': quit"); | caca_putstr(4, yo - 2, "'q': quit"); | ||||
| @@ -220,7 +220,7 @@ static void demo_all(void) | |||||
| caca_clear(); | caca_clear(); | ||||
| /* Draw the sun */ | /* Draw the sun */ | ||||
| caca_set_color(CACA_COLOR_YELLOW); | |||||
| caca_set_color(CACA_COLOR_YELLOW, CACA_COLOR_BLACK); | |||||
| xo = caca_get_width() / 4; | xo = caca_get_width() / 4; | ||||
| yo = caca_get_height() / 4 + 5 * sin(0.03*i); | 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; | 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_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, '#'); | caca_draw_ellipse(xo, yo, j, j / 2, '#'); | ||||
| /* Draw the pyramid */ | /* Draw the pyramid */ | ||||
| @@ -250,19 +250,19 @@ static void demo_all(void) | |||||
| xc = caca_get_width() / 4 - 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; | 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_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_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_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_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_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); | caca_draw_thin_triangle(xo, yo, xb, yb, xc, yc); | ||||
| /* Draw a background triangle */ | /* Draw a background triangle */ | ||||
| @@ -275,7 +275,7 @@ static void demo_all(void) | |||||
| xc = caca_get_width() / 3; | xc = caca_get_width() / 3; | ||||
| yc = caca_get_height() - 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); | caca_draw_thin_triangle(xa, ya, xb, yb, xc, yc); | ||||
| xo = caca_get_width() / 2 + cos(0.027*i) * caca_get_width() / 3; | 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++) | for(j = i - 60; j < i; j++) | ||||
| { | { | ||||
| int delta = caca_rand(-5, 5); | 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 | caca_putchar(caca_get_width() / 2 | ||||
| + cos(0.02*j) * (delta + caca_get_width() / 4), | + cos(0.02*j) * (delta + caca_get_width() / 4), | ||||
| caca_get_height() / 2 | caca_get_height() / 2 | ||||
| @@ -311,28 +311,36 @@ static void demo_dots(void) | |||||
| int xmax = caca_get_width() - 1; | int xmax = caca_get_width() - 1; | ||||
| int ymax = caca_get_height() - 1; | int ymax = caca_get_height() - 1; | ||||
| int i; | int i; | ||||
| static char chars[10] = | |||||
| { | |||||
| '+', '-', '*', '#', 'X', '@', '%', '$', 'M', 'W' | |||||
| }; | |||||
| for(i = 1000; i--;) | for(i = 1000; i--;) | ||||
| { | { | ||||
| /* Putpixel */ | /* 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) | static void demo_color(void) | ||||
| { | { | ||||
| int i; | |||||
| int i, j; | |||||
| char buf[BUFSIZ]; | char buf[BUFSIZ]; | ||||
| caca_clear(); | caca_clear(); | ||||
| for(i = 0; i < 16; i++) | for(i = 0; i < 16; i++) | ||||
| { | { | ||||
| sprintf(buf, "'%c': %i (%s)", 'a' + i, i, caca_get_color_name(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); | 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) | if(outline > 1) | ||||
| caca_draw_thin_line(xa, ya, xb, yb); | caca_draw_thin_line(xa, ya, xb, yb); | ||||
| else | else | ||||
| @@ -377,10 +385,10 @@ static void demo_boxes(void) | |||||
| xb = caca_rand(0, w - 1); yb = 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_set_color(caca_rand(0, 15), caca_rand(0, 15)); | |||||
| caca_fill_box(xa, ya, xb, yb, '#'); | 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) | if(outline == 2) | ||||
| caca_draw_thin_box(xa, ya, xb, yb); | caca_draw_thin_box(xa, ya, xb, yb); | ||||
| else if(outline == 1) | 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); | } 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_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) | if(outline == 2) | ||||
| caca_draw_thin_ellipse(x, y, a, b); | caca_draw_thin_ellipse(x, y, a, b); | ||||
| else if(outline == 1) | 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); | 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_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) | if(outline == 2) | ||||
| caca_draw_thin_triangle(xa, ya, xb, yb, xc, yc); | caca_draw_thin_triangle(xa, ya, xb, yb, xc, yc); | ||||
| else if(outline == 1) | else if(outline == 1) | ||||
| @@ -81,7 +81,7 @@ int main(int argc, char **argv) | |||||
| caca_clear(); | 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_draw_thin_box(0, 0, caca_get_width() - 1, caca_get_height() - 1); | ||||
| caca_putstr(3, 0, "[ Sprite editor for libcaca ]"); | 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); | ya = -1 - caca_get_sprite_dy(sprite, frame); | ||||
| xb = xa + 1 + caca_get_sprite_width(sprite, frame); | xb = xa + 1 + caca_get_sprite_width(sprite, frame); | ||||
| yb = ya + 1 + caca_get_sprite_height(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_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_thin_box(57 + xa, 10 + ya, 57 + xb, 10 + yb); | ||||
| caca_draw_sprite(57, 10, sprite, frame); | caca_draw_sprite(57, 10, sprite, frame); | ||||
| @@ -33,6 +33,8 @@ | |||||
| # include <inttypes.h> | # include <inttypes.h> | ||||
| #else | #else | ||||
| typedef unsigned char uint8_t; | typedef unsigned char uint8_t; | ||||
| typedef unsigned short uint16_t; | |||||
| typedef unsigned int uint32_t; | |||||
| #endif | #endif | ||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| @@ -61,7 +61,7 @@ char *_caca_scratch_line; | |||||
| #if defined(USE_NCURSES) | #if defined(USE_NCURSES) | ||||
| static mmask_t oldmask; | static mmask_t oldmask; | ||||
| int _caca_attr[16]; | |||||
| int _caca_attr[16*16]; | |||||
| #endif | #endif | ||||
| #if defined(USE_CONIO) | #if defined(USE_CONIO) | ||||
| @@ -72,6 +72,7 @@ char *_caca_screen; | |||||
| int caca_init(void) | int caca_init(void) | ||||
| { | { | ||||
| #if defined(USE_SLANG) | #if defined(USE_SLANG) | ||||
| /* See SLang ref., 5.4.4. */ | |||||
| static char *slang_colors[16] = | static char *slang_colors[16] = | ||||
| { | { | ||||
| "black", | "black", | ||||
| @@ -92,7 +93,7 @@ int caca_init(void) | |||||
| "white", | "white", | ||||
| }; | }; | ||||
| int i; | |||||
| int fg, bg; | |||||
| /* Initialize slang library */ | /* Initialize slang library */ | ||||
| SLsig_block_signals(); | SLsig_block_signals(); | ||||
| @@ -120,11 +121,36 @@ int caca_init(void) | |||||
| SLtt_set_mouse_mode(1, 0); | SLtt_set_mouse_mode(1, 0); | ||||
| SLsmg_refresh(); | 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) | #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; | mmask_t newmask; | ||||
| initscr(); | initscr(); | ||||
| @@ -135,33 +161,35 @@ int caca_init(void) | |||||
| nodelay(stdscr, TRUE); | nodelay(stdscr, TRUE); | ||||
| curs_set(0); | curs_set(0); | ||||
| /* Activate mouse */ | |||||
| newmask = ALL_MOUSE_EVENTS; | newmask = ALL_MOUSE_EVENTS; | ||||
| mousemask(newmask, &oldmask); | mousemask(newmask, &oldmask); | ||||
| /* Activate colour */ | |||||
| start_color(); | 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) | #elif defined(USE_CONIO) | ||||
| gettextinfo(&ti); | gettextinfo(&ti); | ||||
| @@ -150,8 +150,9 @@ unsigned int caca_get_event(void); | |||||
| /* | /* | ||||
| * Character graphics | * 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_putchar(int, int, char); | ||||
| void caca_putstr(int, int, const char *); | void caca_putstr(int, int, const char *); | ||||
| void caca_printf(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; | ||||
| struct caca_bitmap *caca_create_bitmap(int, int, int, int, int, int, int); | 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_draw_bitmap(int, int, int, int, struct caca_bitmap *, char *); | ||||
| void caca_free_bitmap(struct caca_bitmap *); | void caca_free_bitmap(struct caca_bitmap *); | ||||
| @@ -39,6 +39,7 @@ | |||||
| # error "no graphics library detected" | # error "no graphics library detected" | ||||
| #endif | #endif | ||||
| #include <stdio.h> /* BUFSIZ */ | |||||
| #include <string.h> | #include <string.h> | ||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include <stdarg.h> | #include <stdarg.h> | ||||
| @@ -46,30 +47,41 @@ | |||||
| #include "caca.h" | #include "caca.h" | ||||
| #include "caca_internals.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; | return; | ||||
| _caca_color = color; | |||||
| _caca_fgcolor = fgcolor; | |||||
| _caca_bgcolor = bgcolor; | |||||
| #if defined(USE_SLANG) | #if defined(USE_SLANG) | ||||
| SLsmg_set_color(color + 1); | |||||
| SLsmg_set_color(fgcolor + 16 * bgcolor); | |||||
| #elif defined(USE_NCURSES) | #elif defined(USE_NCURSES) | ||||
| attrset(_caca_attr[color]); | |||||
| attrset(_caca_attr[fgcolor + 16 * bgcolor]); | |||||
| #elif defined(USE_CONIO) | #elif defined(USE_CONIO) | ||||
| textcolor(color); | |||||
| textbackground(bgcolor); | |||||
| textcolor(fgcolor); | |||||
| #endif | #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) | void caca_putchar(int x, int y, char c) | ||||
| { | { | ||||
| #if defined(USE_CONIO) | |||||
| char *data; | |||||
| #endif | |||||
| if(x < 0 || x >= (int)caca_get_width() || | if(x < 0 || x >= (int)caca_get_width() || | ||||
| y < 0 || y >= (int)caca_get_height()) | y < 0 || y >= (int)caca_get_height()) | ||||
| return; | return; | ||||
| @@ -81,8 +93,9 @@ void caca_putchar(int x, int y, char c) | |||||
| move(y, x); | move(y, x); | ||||
| addch(c); | addch(c); | ||||
| #elif defined(USE_CONIO) | #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); | // gotoxy(x + 1, y + 1); | ||||
| // putch(c); | // putch(c); | ||||
| #endif | #endif | ||||
| @@ -124,7 +137,7 @@ void caca_putstr(int x, int y, const char *s) | |||||
| while(*s) | while(*s) | ||||
| { | { | ||||
| *buf++ = *s++; | *buf++ = *s++; | ||||
| *buf++ = _caca_color; | |||||
| *buf++ = (_caca_bgcolor << 4) | _caca_fgcolor; | |||||
| } | } | ||||
| // gotoxy(x + 1, y + 1); | // gotoxy(x + 1, y + 1); | ||||
| // cputs(s); | // cputs(s); | ||||
| @@ -144,7 +157,11 @@ void caca_printf(int x, int y, const char *format, ...) | |||||
| buf = malloc(caca_get_width() - x + 1); | buf = malloc(caca_get_width() - x + 1); | ||||
| va_start(args, format); | va_start(args, format); | ||||
| #if defined(HAVE_VSNPRINTF) | |||||
| vsnprintf(buf, caca_get_width() - x + 1, format, args); | vsnprintf(buf, caca_get_width() - x + 1, format, args); | ||||
| #else | |||||
| vsprintf(buf, format, args); | |||||
| #endif | |||||
| buf[caca_get_width() - x] = '\0'; | buf[caca_get_width() - x] = '\0'; | ||||
| va_end(args); | va_end(args); | ||||
| @@ -156,10 +173,16 @@ void caca_printf(int x, int y, const char *format, ...) | |||||
| void caca_clear(void) | 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(); | 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--) | while(y--) | ||||
| caca_putstr(0, y, _caca_empty_line); | 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) | 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; | struct caca_frame *frame; | ||||
| if(sprite == NULL) | 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]; | 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++) | 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]; | int col = frame->color[frame->w * j + i]; | ||||
| if(col >= 0) | if(col >= 0) | ||||
| { | { | ||||
| caca_set_color(col); | |||||
| caca_set_color(col, CACA_COLOR_BLACK); | |||||
| caca_putchar(x + i - frame->dx, y + j - frame->dy, | caca_putchar(x + i - frame->dx, y + j - frame->dy, | ||||
| frame->chars[frame->w * j + i]); | frame->chars[frame->w * j + i]); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| caca_set_color(oldcol); | |||||
| caca_set_color(oldfg, oldbg); | |||||
| } | } | ||||
| void caca_free_sprite(struct caca_sprite *sprite) | void caca_free_sprite(struct caca_sprite *sprite) | ||||