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; | uint32_t *chars = kk->qq->chars; | ||||
for(n = kk->qq->height * kk->qq->width; n--; ) | 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++; | *screen++ = *attr++; | ||||
} | } | ||||
# if defined(SCREENUPDATE_IN_PC_H) | # if defined(SCREENUPDATE_IN_PC_H) | ||||
@@ -78,7 +78,7 @@ struct driver_private | |||||
unsigned int new_width, new_height; | unsigned int new_width, new_height; | ||||
float font_width, font_height; | float font_width, font_height; | ||||
float incx, incy; | float incx, incy; | ||||
int id[94]; | |||||
int id[128 - 32]; | |||||
unsigned char bit; | unsigned char bit; | ||||
unsigned char mouse_changed, mouse_clicked; | unsigned char mouse_changed, mouse_clicked; | ||||
unsigned int mouse_x, mouse_y; | 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); | memset(empty_texture, 0xff, 16 * 16 * 4); | ||||
glEnable(GL_TEXTURE_2D); | 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_MIN_FILTER, GL_LINEAR); | ||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, | ||||
16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, empty_texture); | 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); | glDisable(GL_TEXTURE_2D); | ||||
glClear(GL_COLOR_BUFFER_BIT); | glClear(GL_COLOR_BUFFER_BIT); | ||||
glColor3f(1, 1, 1); | glColor3f(1, 1, 1); | ||||
glRasterPos2f(0, 15); | glRasterPos2f(0, 15); | ||||
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, i + 32); | |||||
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, i); | |||||
glEnable(GL_TEXTURE_2D); | 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, | glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, | ||||
0, kk->drv.p->height - 16, 16, 16, 0); | 0, kk->drv.p->height - 16, 16, 16, 0); | ||||
@@ -236,7 +236,8 @@ static void gl_display(caca_t *kk) | |||||
glBegin(GL_QUADS); | glBegin(GL_QUADS); | ||||
glVertex2f(x, y); | glVertex2f(x, y); | ||||
glVertex2f(x + kk->drv.p->font_width, 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); | glVertex2f(x, y + kk->drv.p->font_height); | ||||
glEnd(); | 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) | 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]); | glColor4bv(gl_bgpal[attr[0] & 0xf]); | ||||
glBegin(GL_QUADS); | glBegin(GL_QUADS); | ||||
glTexCoord2f(0, kk->drv.p->sh); | glTexCoord2f(0, kk->drv.p->sh); | ||||
@@ -279,7 +279,6 @@ static void gl_display(caca_t *kk) | |||||
} | } | ||||
attr++; | attr++; | ||||
chars++; | |||||
} | } | ||||
line++; | line++; | ||||
} | } | ||||
@@ -192,8 +192,13 @@ static void ncurses_display(caca_t *kk) | |||||
move(y, 0); | move(y, 0); | ||||
for(x = kk->qq->width; x--; ) | for(x = kk->qq->width; x--; ) | ||||
{ | { | ||||
uint32_t c = *chars++; | |||||
attrset(kk->drv.p->attr[*attr++]); | attrset(kk->drv.p->attr[*attr++]); | ||||
addch(*chars++ & 0x7f); | |||||
if(c > 0x00000020 && c < 0x00000080) | |||||
addch((char)c); | |||||
else | |||||
addch(' '); | |||||
} | } | ||||
} | } | ||||
refresh(); | refresh(); | ||||
@@ -203,15 +203,21 @@ static void slang_display(caca_t *kk) | |||||
SLsmg_gotorc(y, 0); | SLsmg_gotorc(y, 0); | ||||
for(x = kk->qq->width; x--; ) | for(x = kk->qq->width; x--; ) | ||||
{ | { | ||||
uint32_t c = *chars++; | |||||
#if defined(OPTIMISE_SLANG_PALETTE) | #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 fgcolor = *attr & 0xf; | ||||
uint8_t bgcolor = *attr >> 4; | 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) | if(fgcolor != bgcolor) | ||||
{ | { | ||||
SLsmg_set_color(slang_assoc[*attr++]); | 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 | else | ||||
{ | { | ||||
@@ -224,12 +230,14 @@ static void slang_display(caca_t *kk) | |||||
fgcolor = CUCUL_COLOR_WHITE; | fgcolor = CUCUL_COLOR_WHITE; | ||||
SLsmg_set_color(slang_assoc[fgcolor + 16 * bgcolor]); | SLsmg_set_color(slang_assoc[fgcolor + 16 * bgcolor]); | ||||
SLsmg_write_char(' '); | SLsmg_write_char(' '); | ||||
chars++; | |||||
attr++; | attr++; | ||||
} | } | ||||
#else | #else | ||||
SLsmg_set_color(*attr++); | SLsmg_set_color(*attr++); | ||||
SLsmg_write_char(*chars++ & 0x7f); | |||||
if(c > 0x00000020 && 0x00000080) | |||||
SLsmg_write_char((char)c); | |||||
else | |||||
SLsmg_write_char(' '); | |||||
#endif | #endif | ||||
} | } | ||||
} | } | ||||
@@ -198,7 +198,13 @@ static void win32_display(caca_t *kk) | |||||
/* Render everything to our back buffer */ | /* Render everything to our back buffer */ | ||||
for(i = 0; i < kk->qq->width * kk->qq->height; i++) | 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 = | kk->drv.p->buffer[i].Attributes = | ||||
win32_fg_palette[kk->qq->attr[i] & 0xf] | win32_fg_palette[kk->qq->attr[i] & 0xf] | ||||
| win32_bg_palette[kk->qq->attr[i] >> 4]; | | win32_bg_palette[kk->qq->attr[i] >> 4]; | ||||
@@ -271,6 +271,9 @@ static void x11_display(caca_t *kk) | |||||
/* Then print the foreground characters */ | /* Then print the foreground characters */ | ||||
for(y = 0; y < kk->qq->height; y++) | 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) | for(x = 0; x < kk->qq->width; x += len) | ||||
{ | { | ||||
char buffer[BUFSIZ]; /* FIXME: use a smaller buffer */ | char buffer[BUFSIZ]; /* FIXME: use a smaller buffer */ | ||||
@@ -280,27 +283,30 @@ static void x11_display(caca_t *kk) | |||||
len = 1; | len = 1; | ||||
/* Skip spaces */ | /* Skip spaces */ | ||||
if(chars[0] == ' ') | |||||
if(chars[0] <= 0x00000020 || chars[0] >= 0x00000080) | |||||
continue; | continue; | ||||
buffer[0] = chars[0] & 0x7f; | |||||
buffer[0] = (char)chars[0]; | |||||
while(x + len < kk->qq->width | while(x + len < kk->qq->width | ||||
&& (attr[len] & 0xf) == (attr[0] & 0xf)) | && (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++; | 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, | 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->width * kk->drv.p->font_width, | ||||
kk->qq->height * kk->drv.p->font_height, | kk->qq->height * kk->drv.p->font_height, | ||||
0, 0); | 0, 0); | ||||