by simply ignoring everything non ASCII :-)tags/v0.99.beta14
@@ -103,7 +103,13 @@ static void conio_display(caca_t *kk) | |||
uint32_t *chars = kk->qq->chars; | |||
for(n = kk->qq->height * kk->qq->width; n--; ) | |||
{ | |||
*screen++ = *chars++ & 0x7f; | |||
uint32_t c = *chars++; | |||
if(c > 0x00000020 && c < 0x00000080) | |||
*screen++ = (char)c; | |||
else | |||
*screen++ = ' '; | |||
*screen++ = *attr++; | |||
} | |||
# if defined(SCREENUPDATE_IN_PC_H) | |||
@@ -78,7 +78,7 @@ struct driver_private | |||
unsigned int new_width, new_height; | |||
float font_width, font_height; | |||
float incx, incy; | |||
int id[94]; | |||
int id[128 - 32]; | |||
unsigned char bit; | |||
unsigned char mouse_changed, mouse_clicked; | |||
unsigned int mouse_x, mouse_y; | |||
@@ -164,27 +164,27 @@ static int gl_init_graphics(caca_t *kk) | |||
memset(empty_texture, 0xff, 16 * 16 * 4); | |||
glEnable(GL_TEXTURE_2D); | |||
for(i = 0; i < 94; i++) | |||
for(i = 32; i < 128; i++) | |||
{ | |||
glGenTextures(1, (GLuint*)&kk->drv.p->id[i]); | |||
glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[i]); | |||
glGenTextures(1, (GLuint*)&kk->drv.p->id[i - 32]); | |||
glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[i - 32]); | |||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | |||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | |||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, | |||
16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, empty_texture); | |||
} | |||
for(i = 0; i < 94; i++) | |||
for(i = 32; i < 128; i++) | |||
{ | |||
glDisable(GL_TEXTURE_2D); | |||
glClear(GL_COLOR_BUFFER_BIT); | |||
glColor3f(1, 1, 1); | |||
glRasterPos2f(0, 15); | |||
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, i + 32); | |||
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, i); | |||
glEnable(GL_TEXTURE_2D); | |||
glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[i]); | |||
glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[i - 32]); | |||
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, | |||
0, kk->drv.p->height - 16, 16, 16, 0); | |||
@@ -236,7 +236,8 @@ static void gl_display(caca_t *kk) | |||
glBegin(GL_QUADS); | |||
glVertex2f(x, y); | |||
glVertex2f(x + kk->drv.p->font_width, y); | |||
glVertex2f(x + kk->drv.p->font_width, y + kk->drv.p->font_height); | |||
glVertex2f(x + kk->drv.p->font_width, | |||
y + kk->drv.p->font_height); | |||
glVertex2f(x, y + kk->drv.p->font_height); | |||
glEnd(); | |||
@@ -259,12 +260,11 @@ static void gl_display(caca_t *kk) | |||
for(x = 0; x < kk->drv.p->width; x += kk->drv.p->font_width) | |||
{ | |||
if(*chars != (uint32_t)' ') | |||
{ | |||
char ch = *chars & 0x7f; | |||
uint32_t c = *chars++; | |||
/* FIXME: check ch bounds */ | |||
glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[ch - 32]); | |||
if(c > 0x00000020 && c < 0x00000080) | |||
{ | |||
glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[c - 32]); | |||
glColor4bv(gl_bgpal[attr[0] & 0xf]); | |||
glBegin(GL_QUADS); | |||
glTexCoord2f(0, kk->drv.p->sh); | |||
@@ -279,7 +279,6 @@ static void gl_display(caca_t *kk) | |||
} | |||
attr++; | |||
chars++; | |||
} | |||
line++; | |||
} | |||
@@ -192,8 +192,13 @@ static void ncurses_display(caca_t *kk) | |||
move(y, 0); | |||
for(x = kk->qq->width; x--; ) | |||
{ | |||
uint32_t c = *chars++; | |||
attrset(kk->drv.p->attr[*attr++]); | |||
addch(*chars++ & 0x7f); | |||
if(c > 0x00000020 && c < 0x00000080) | |||
addch((char)c); | |||
else | |||
addch(' '); | |||
} | |||
} | |||
refresh(); | |||
@@ -203,15 +203,21 @@ static void slang_display(caca_t *kk) | |||
SLsmg_gotorc(y, 0); | |||
for(x = kk->qq->width; x--; ) | |||
{ | |||
uint32_t c = *chars++; | |||
#if defined(OPTIMISE_SLANG_PALETTE) | |||
/* If foreground == background, just don't use this colour | |||
* pair, and print a space instead of the real character. */ | |||
uint8_t fgcolor = *attr & 0xf; | |||
uint8_t bgcolor = *attr >> 4; | |||
/* If foreground == background, just don't use this colour | |||
* pair, and print a space instead of the real character. */ | |||
if(fgcolor != bgcolor) | |||
{ | |||
SLsmg_set_color(slang_assoc[*attr++]); | |||
SLsmg_write_char(*chars++ & 0x7f); | |||
if(c > 0x00000020 && 0x00000080) | |||
SLsmg_write_char((char)c); | |||
else | |||
SLsmg_write_char(' '); | |||
} | |||
else | |||
{ | |||
@@ -224,12 +230,14 @@ static void slang_display(caca_t *kk) | |||
fgcolor = CUCUL_COLOR_WHITE; | |||
SLsmg_set_color(slang_assoc[fgcolor + 16 * bgcolor]); | |||
SLsmg_write_char(' '); | |||
chars++; | |||
attr++; | |||
} | |||
#else | |||
SLsmg_set_color(*attr++); | |||
SLsmg_write_char(*chars++ & 0x7f); | |||
if(c > 0x00000020 && 0x00000080) | |||
SLsmg_write_char((char)c); | |||
else | |||
SLsmg_write_char(' '); | |||
#endif | |||
} | |||
} | |||
@@ -198,7 +198,13 @@ static void win32_display(caca_t *kk) | |||
/* Render everything to our back buffer */ | |||
for(i = 0; i < kk->qq->width * kk->qq->height; i++) | |||
{ | |||
kk->drv.p->buffer[i].Char.AsciiChar = kk->qq->chars[i] & 0x7f; | |||
uint32_t c = kk->qq->chars[i]; | |||
if(c > 0x00000020 && c < 0x00000080) | |||
kk->drv.p->buffer[i].Char.AsciiChar = (char)c; | |||
else | |||
kk->drv.p->buffer[i].Char.AsciiChar = ' '; | |||
kk->drv.p->buffer[i].Attributes = | |||
win32_fg_palette[kk->qq->attr[i] & 0xf] | |||
| win32_bg_palette[kk->qq->attr[i] >> 4]; | |||
@@ -271,6 +271,9 @@ static void x11_display(caca_t *kk) | |||
/* Then print the foreground characters */ | |||
for(y = 0; y < kk->qq->height; y++) | |||
{ | |||
unsigned int yoff = (y + 1) * kk->drv.p->font_height | |||
- kk->drv.p->font_offset; | |||
for(x = 0; x < kk->qq->width; x += len) | |||
{ | |||
char buffer[BUFSIZ]; /* FIXME: use a smaller buffer */ | |||
@@ -280,27 +283,30 @@ static void x11_display(caca_t *kk) | |||
len = 1; | |||
/* Skip spaces */ | |||
if(chars[0] == ' ') | |||
if(chars[0] <= 0x00000020 || chars[0] >= 0x00000080) | |||
continue; | |||
buffer[0] = chars[0] & 0x7f; | |||
buffer[0] = (char)chars[0]; | |||
while(x + len < kk->qq->width | |||
&& (attr[len] & 0xf) == (attr[0] & 0xf)) | |||
{ | |||
buffer[len] = chars[len] & 0x7f; | |||
if(chars[len] > 0x00000020 && chars[len] < 0x00000080) | |||
buffer[len] = (char)chars[len]; | |||
else | |||
buffer[len] = ' '; | |||
len++; | |||
} | |||
XSetForeground(kk->drv.p->dpy, kk->drv.p->gc, kk->drv.p->colors[attr[0] & 0xf]); | |||
XSetForeground(kk->drv.p->dpy, kk->drv.p->gc, | |||
kk->drv.p->colors[attr[0] & 0xf]); | |||
XDrawString(kk->drv.p->dpy, kk->drv.p->pixmap, kk->drv.p->gc, | |||
x * kk->drv.p->font_width, | |||
(y + 1) * kk->drv.p->font_height - kk->drv.p->font_offset, | |||
buffer, len); | |||
x * kk->drv.p->font_width, yoff, buffer, len); | |||
} | |||
} | |||
XCopyArea(kk->drv.p->dpy, kk->drv.p->pixmap, kk->drv.p->window, kk->drv.p->gc, 0, 0, | |||
XCopyArea(kk->drv.p->dpy, kk->drv.p->pixmap, kk->drv.p->window, | |||
kk->drv.p->gc, 0, 0, | |||
kk->qq->width * kk->drv.p->font_width, | |||
kk->qq->height * kk->drv.p->font_height, | |||
0, 0); | |||