+ Interpret escape sequences for F1, F2, left, right, etc. * src/Makefile.am examples/Makefile.am: + Install caca.h in /usr/include. + Do not install example programs. * src/blit.c: + Minor improvements to grayscale colors.tags/v0.99.beta14
@@ -13,7 +13,7 @@ if USE_NCURSES | |||||
LDFLAGS_ncurses = -lncurses | LDFLAGS_ncurses = -lncurses | ||||
endif | endif | ||||
bin_PROGRAMS = demo spritedit | |||||
noinst_PROGRAMS = demo spritedit | |||||
demo_SOURCES = demo.c | demo_SOURCES = demo.c | ||||
demo_LDADD = ../src/libcaca.a $(LDFLAGS_slang) $(LDFLAGS_ncurses) -lm | demo_LDADD = ../src/libcaca.a $(LDFLAGS_slang) $(LDFLAGS_ncurses) -lm | ||||
@@ -18,3 +18,5 @@ libcaca_a_SOURCES = \ | |||||
blit.c \ | blit.c \ | ||||
$(NULL) | $(NULL) | ||||
include_HEADERS = caca.h | |||||
@@ -85,6 +85,7 @@ void caca_set_dithering(enum caca_dithering dither) | |||||
void caca_blit(int x1, int y1, int x2, int y2, void *pixels, int w, int h) | void caca_blit(int x1, int y1, int x2, int y2, void *pixels, int w, int h) | ||||
{ | { | ||||
static int white_colors[] = {CACA_COLOR_DARKGRAY, CACA_COLOR_LIGHTGRAY, CACA_COLOR_WHITE}; | |||||
static int light_colors[] = {CACA_COLOR_LIGHTMAGENTA, CACA_COLOR_LIGHTRED, CACA_COLOR_YELLOW, CACA_COLOR_LIGHTGREEN, CACA_COLOR_LIGHTCYAN, CACA_COLOR_LIGHTBLUE, CACA_COLOR_LIGHTMAGENTA}; | static int light_colors[] = {CACA_COLOR_LIGHTMAGENTA, CACA_COLOR_LIGHTRED, CACA_COLOR_YELLOW, CACA_COLOR_LIGHTGREEN, CACA_COLOR_LIGHTCYAN, CACA_COLOR_LIGHTBLUE, CACA_COLOR_LIGHTMAGENTA}; | ||||
static int dark_colors[] = {CACA_COLOR_MAGENTA, CACA_COLOR_RED, CACA_COLOR_BROWN, CACA_COLOR_GREEN, CACA_COLOR_CYAN, CACA_COLOR_BLUE, CACA_COLOR_MAGENTA}; | static int dark_colors[] = {CACA_COLOR_MAGENTA, CACA_COLOR_RED, CACA_COLOR_BROWN, CACA_COLOR_GREEN, CACA_COLOR_CYAN, CACA_COLOR_BLUE, CACA_COLOR_MAGENTA}; | ||||
static char foo[] = { ' ', '.', ':', ';', '=', '%', '$', 'W', '#', '8', '@' }; | static char foo[] = { ' ', '.', ':', ';', '=', '%', '$', 'W', '#', '8', '@' }; | ||||
@@ -100,7 +101,8 @@ void caca_blit(int x1, int y1, int x2, int y2, void *pixels, int w, int h) | |||||
int tmp = y2; y2 = y1; y1 = tmp; | int tmp = y2; y2 = y1; y1 = tmp; | ||||
} | } | ||||
pitch = (3 * w + 3) / 4 * 4; | |||||
//pitch = (3 * w + 3) / 4 * 4; | |||||
pitch = 4 * w; | |||||
for(y = y1 > 0 ? y1 : 0; y <= y2 && y <= (int)caca_get_height(); y++) | for(y = y1 > 0 ? y1 : 0; y <= y2 && y <= (int)caca_get_height(); y++) | ||||
{ | { | ||||
@@ -112,9 +114,12 @@ void caca_blit(int x1, int y1, int x2, int y2, void *pixels, int w, int h) | |||||
{ | { | ||||
int fromx = w * (x - x1) / (x2 - x1 + 1); | int fromx = w * (x - x1) / (x2 - x1 + 1); | ||||
int fromy = h * (y - y1) / (y2 - y1 + 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]; | |||||
//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]; | |||||
int b = ((unsigned char *)pixels)[4 * fromx + pitch * fromy]; | |||||
int g = ((unsigned char *)pixels)[4 * fromx + 1 + pitch * fromy]; | |||||
int r = ((unsigned char *)pixels)[4 * fromx + 2 + pitch * fromy]; | |||||
int hue, sat, val; | int hue, sat, val; | ||||
int min = r, max = r, delta; | int min = r, max = r, delta; | ||||
@@ -146,7 +151,7 @@ void caca_blit(int x1, int y1, int x2, int y2, void *pixels, int w, int h) | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
caca_set_color(CACA_COLOR_LIGHTGRAY); | |||||
caca_set_color(white_colors[max * 3 / 256]); | |||||
} | } | ||||
caca_putchar(x, y, foo[(r + g + b + 2 * _get_dither()) / 3 / 25]); | caca_putchar(x, y, foo[(r + g + b + 2 * _get_dither()) / 3 / 25]); | ||||
@@ -62,6 +62,33 @@ enum caca_dithering | |||||
CACA_DITHER_RANDOM | CACA_DITHER_RANDOM | ||||
}; | }; | ||||
/* | |||||
* Keys | |||||
*/ | |||||
enum caca_key | |||||
{ | |||||
CACA_KEY_UP = 273, | |||||
CACA_KEY_DOWN = 274, | |||||
CACA_KEY_LEFT = 275, | |||||
CACA_KEY_RIGHT = 276, | |||||
CACA_KEY_F1 = 282, | |||||
CACA_KEY_F2 = 283, | |||||
CACA_KEY_F3 = 284, | |||||
CACA_KEY_F4 = 285, | |||||
CACA_KEY_F5 = 286, | |||||
CACA_KEY_F6 = 287, | |||||
CACA_KEY_F7 = 288, | |||||
CACA_KEY_F8 = 289, | |||||
CACA_KEY_F9 = 290, | |||||
CACA_KEY_F10 = 291, | |||||
CACA_KEY_F11 = 292, | |||||
CACA_KEY_F12 = 293, | |||||
CACA_KEY_F13 = 294, | |||||
CACA_KEY_F14 = 295, | |||||
CACA_KEY_F15 = 296 | |||||
}; | |||||
/* | /* | ||||
* Types | * Types | ||||
*/ | */ | ||||
@@ -80,7 +107,7 @@ const char *caca_get_color_name(unsigned int); | |||||
void caca_refresh(void); | void caca_refresh(void); | ||||
void caca_end(void); | void caca_end(void); | ||||
char caca_get_key(void); | |||||
int caca_get_key(void); | |||||
void caca_set_color(enum caca_color); | void caca_set_color(enum caca_color); | ||||
enum caca_color caca_get_color(void); | enum caca_color caca_get_color(void); | ||||
@@ -36,18 +36,111 @@ | |||||
#include "caca.h" | #include "caca.h" | ||||
#include "caca_internals.h" | #include "caca_internals.h" | ||||
char caca_get_key(void) | |||||
static unsigned char back[5] = {0, 0, 0, 0, 0}; | |||||
static void _push_key(unsigned char key) | |||||
{ | |||||
back[4] = back[3]; | |||||
back[3] = back[2]; | |||||
back[2] = back[1]; | |||||
back[1] = back[0]; | |||||
back[0] = key; | |||||
} | |||||
static unsigned char _pop_key(void) | |||||
{ | |||||
unsigned char key = back[0]; | |||||
back[0] = back[1]; | |||||
back[1] = back[2]; | |||||
back[2] = back[3]; | |||||
back[3] = back[4]; | |||||
return key; | |||||
} | |||||
static unsigned char _read_key(void) | |||||
{ | { | ||||
#if defined(USE_SLANG) | #if defined(USE_SLANG) | ||||
return SLang_input_pending(0) ? SLang_getkey() : 0; | return SLang_input_pending(0) ? SLang_getkey() : 0; | ||||
#elif defined(USE_NCURSES) | #elif defined(USE_NCURSES) | ||||
char key = getch(); | |||||
return key != ERR ? key : 0; | |||||
unsigned char key = getch(); | |||||
return (key == ERR) ? 0 : key; | |||||
#elif defined(USE_CONIO) | #elif defined(USE_CONIO) | ||||
return _conio_kbhit() ? getch() : 0; | return _conio_kbhit() ? getch() : 0; | ||||
#endif | #endif | ||||
} | } | ||||
int caca_get_key(void) | |||||
{ | |||||
unsigned char key[5]; | |||||
/* If there were legacy keys, pop them */ | |||||
key[0] = _pop_key(); | |||||
if(key[0]) | |||||
return key[0]; | |||||
key[0] = _read_key(); | |||||
if(key[0] != 0x1b) | |||||
return key[0]; | |||||
key[1] = _read_key(); | |||||
if(!key[1]) | |||||
return key[0]; | |||||
key[2] = _read_key(); | |||||
if(!key[2]) | |||||
{ | |||||
_push_key(key[1]); | |||||
return key[0]; | |||||
} | |||||
if(key[1] == 0x4f) | |||||
{ | |||||
switch(key[2]) | |||||
{ | |||||
case 0x50: return CACA_KEY_F1; | |||||
case 0x51: return CACA_KEY_F2; | |||||
case 0x52: return CACA_KEY_F3; | |||||
case 0x53: return CACA_KEY_F4; | |||||
} | |||||
} | |||||
else if(key[1] == 0x5b) | |||||
{ | |||||
switch(key[2]) | |||||
{ | |||||
case 0x41: return CACA_KEY_UP; | |||||
case 0x42: return CACA_KEY_DOWN; | |||||
case 0x43: return CACA_KEY_LEFT; | |||||
case 0x44: return CACA_KEY_RIGHT; | |||||
} | |||||
key[3] = _read_key(); | |||||
key[4] = _read_key(); | |||||
if(key[2] == 0x31 && key[4] == 0x7e) | |||||
switch(key[3]) | |||||
{ | |||||
case 0x35: return CACA_KEY_F5; | |||||
case 0x37: return CACA_KEY_F6; | |||||
case 0x38: return CACA_KEY_F7; | |||||
case 0x39: return CACA_KEY_F8; | |||||
} | |||||
if(key[2] == 0x32 && key[4] == 0x7e) | |||||
switch(key[3]) | |||||
{ | |||||
case 0x30: return CACA_KEY_F9; | |||||
case 0x31: return CACA_KEY_F10; | |||||
case 0x33: return CACA_KEY_F11; | |||||
case 0x34: return CACA_KEY_F12; | |||||
} | |||||
_push_key(key[4]); | |||||
_push_key(key[3]); | |||||
} | |||||
/* Unknown escape sequence: return 0 */ | |||||
_push_key(key[2]); | |||||
_push_key(key[1]); | |||||
return key[0]; | |||||
} | |||||