|
|
@@ -57,7 +57,7 @@ static void gl_handle_mouse_motion(int, int); |
|
|
|
static void gl_handle_close(void); |
|
|
|
#endif |
|
|
|
static void _display(void); |
|
|
|
static void gl_generate_glyph(uint32_t, uint32_t, caca_display_t *); |
|
|
|
static void gl_compute_font(caca_display_t *); |
|
|
|
static void gl_generate_unicode_glyph(uint32_t, uint32_t, caca_display_t *); |
|
|
|
|
|
|
|
struct driver_private |
|
|
@@ -84,13 +84,11 @@ struct driver_private |
|
|
|
|
|
|
|
static int gl_init_graphics(caca_display_t *dp) |
|
|
|
{ |
|
|
|
char *empty_texture; |
|
|
|
char const *geometry; |
|
|
|
char *argv[2] = { "", NULL }; |
|
|
|
char const * const * fonts; |
|
|
|
unsigned int width = 0, height = 0; |
|
|
|
int argc = 1; |
|
|
|
int i, b; |
|
|
|
|
|
|
|
dp->drv.p = malloc(sizeof(struct driver_private)); |
|
|
|
|
|
|
@@ -178,39 +176,9 @@ static int gl_init_graphics(caca_display_t *dp) |
|
|
|
glEnable(GL_BLEND); |
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
|
|
|
|
|
|
|
|
|
|
|
empty_texture = malloc(16 * 16 * 4); |
|
|
|
if(empty_texture == NULL) |
|
|
|
return -1; |
|
|
|
|
|
|
|
memset(empty_texture, 0xff, 16 * 16 * 4); |
|
|
|
glEnable(GL_TEXTURE_2D); |
|
|
|
|
|
|
|
dp->drv.p->blocks = cucul_get_font_blocks(dp->drv.p->f); |
|
|
|
|
|
|
|
for(b = 0, i = 0; dp->drv.p->blocks[i + 1]; i += 2) |
|
|
|
b += dp->drv.p->blocks[i + 1] - dp->drv.p->blocks[i]; |
|
|
|
|
|
|
|
dp->drv.p->txid = malloc(b * sizeof(int)); |
|
|
|
|
|
|
|
for(b = 0, i = 0; dp->drv.p->blocks[i + 1]; i += 2) |
|
|
|
{ |
|
|
|
int j, n = dp->drv.p->blocks[i + 1] - dp->drv.p->blocks[i]; |
|
|
|
|
|
|
|
for(j = 0; j < n; j++) |
|
|
|
{ |
|
|
|
glGenTextures(1, (GLuint*)&dp->drv.p->txid[b + j]); |
|
|
|
glBindTexture(GL_TEXTURE_2D, dp->drv.p->txid[b + j]); |
|
|
|
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, 4, |
|
|
|
16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, empty_texture); |
|
|
|
|
|
|
|
gl_generate_unicode_glyph(dp->drv.p->blocks[i] + j, b + j, dp); |
|
|
|
} |
|
|
|
|
|
|
|
b += dp->drv.p->blocks[i + 1] - dp->drv.p->blocks[i]; |
|
|
|
} |
|
|
|
gl_compute_font(dp); |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
@@ -522,42 +490,69 @@ static void _display(void) |
|
|
|
gl_display(dp); |
|
|
|
} |
|
|
|
|
|
|
|
static void gl_generate_unicode_glyph(uint32_t c, uint32_t tid, |
|
|
|
caca_display_t *dp) |
|
|
|
static void gl_compute_font(caca_display_t *dp) |
|
|
|
{ |
|
|
|
int y, x, w, h; |
|
|
|
uint8_t *glyph8 = calloc(dp->drv.p->font_width * dp->drv.p->font_height, 1); |
|
|
|
uint8_t *glyph32 = calloc(16 * 16 * 4, 1); |
|
|
|
cucul_canvas_t *cv; |
|
|
|
uint32_t *image; |
|
|
|
int i, b, w, h, x, y; |
|
|
|
|
|
|
|
cucul_render_glyph(dp->drv.p->f, c, glyph8, dp->drv.p->font_width); |
|
|
|
dp->drv.p->blocks = cucul_get_font_blocks(dp->drv.p->f); |
|
|
|
|
|
|
|
for(b = 0, i = 0; dp->drv.p->blocks[i + 1]; i += 2) |
|
|
|
b += dp->drv.p->blocks[i + 1] - dp->drv.p->blocks[i]; |
|
|
|
|
|
|
|
dp->drv.p->txid = malloc(b * sizeof(int)); |
|
|
|
cv = cucul_create_canvas(1, b); |
|
|
|
cucul_set_color(cv, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLACK); |
|
|
|
|
|
|
|
for(b = 0, i = 0; dp->drv.p->blocks[i + 1]; i += 2) |
|
|
|
{ |
|
|
|
int j, n = dp->drv.p->blocks[i + 1] - dp->drv.p->blocks[i]; |
|
|
|
|
|
|
|
for(j = 0; j < n; j++) |
|
|
|
cucul_putchar(cv, 0, b + j, dp->drv.p->blocks[i] + j); |
|
|
|
|
|
|
|
b += n; |
|
|
|
} |
|
|
|
|
|
|
|
image = malloc(b * dp->drv.p->font_height |
|
|
|
* dp->drv.p->font_width * sizeof(uint32_t)); |
|
|
|
cucul_render_canvas(cv, dp->drv.p->f, image, dp->drv.p->font_width, |
|
|
|
b * dp->drv.p->font_height, 4 * dp->drv.p->font_width); |
|
|
|
cucul_free_canvas(cv); |
|
|
|
|
|
|
|
w = dp->drv.p->font_width <= 16 ? dp->drv.p->font_width : 16; |
|
|
|
h = dp->drv.p->font_height <= 16 ? dp->drv.p->font_height : 16; |
|
|
|
|
|
|
|
/* Convert resulting 8bbp glyph to 32bits, 16x16 */ |
|
|
|
for(y = 0; y < h; y++) |
|
|
|
for(i = 0; i < b; i++) |
|
|
|
{ |
|
|
|
for(x = 0; x < w; x++) |
|
|
|
uint8_t tmp[16 * 4 * 16]; |
|
|
|
uint32_t *glyph = image + (int)(i * dp->drv.p->font_width |
|
|
|
* dp->drv.p->font_height); |
|
|
|
memset(tmp, 0, 16 * 4 * 16); |
|
|
|
|
|
|
|
for(y = 0; y < h; y++) |
|
|
|
{ |
|
|
|
uint32_t offset = x * 4 + (15 - y) * 16 * 4; |
|
|
|
uint8_t c = glyph8[x + y * (int)dp->drv.p->font_width]; |
|
|
|
glyph32[offset] = c; |
|
|
|
glyph32[1 + offset] = c; |
|
|
|
glyph32[2 + offset] = c; |
|
|
|
glyph32[3 + offset] = c; |
|
|
|
for(x = 0; x < w; x++) |
|
|
|
{ |
|
|
|
uint32_t offset = x + (15 - y) * 16; |
|
|
|
uint8_t c = glyph[x + y * (int)dp->drv.p->font_width] >> 8; |
|
|
|
tmp[offset * 4] = c; |
|
|
|
tmp[offset * 4 + 1] = c; |
|
|
|
tmp[offset * 4 + 2] = c; |
|
|
|
tmp[offset * 4 + 3] = c; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
glGenTextures(1, (GLuint*)&dp->drv.p->txid[i]); |
|
|
|
glBindTexture(GL_TEXTURE_2D, dp->drv.p->txid[i]); |
|
|
|
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, 4, 16, 16, 0, |
|
|
|
GL_RGBA, GL_UNSIGNED_BYTE, tmp); |
|
|
|
} |
|
|
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, dp->drv.p->txid[tid]); |
|
|
|
glTexImage2D(GL_TEXTURE_2D, |
|
|
|
0, 4, |
|
|
|
16,16, |
|
|
|
0, GL_RGBA, GL_UNSIGNED_BYTE, |
|
|
|
glyph32); |
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
|
|
|
free(glyph8); |
|
|
|
free(glyph32); |
|
|
|
free(image); |
|
|
|
} |
|
|
|
|
|
|
|
/* |
|
|
|