| @@ -57,7 +57,7 @@ static void gl_handle_mouse_motion(int, int); | |||||
| static void gl_handle_close(void); | static void gl_handle_close(void); | ||||
| #endif | #endif | ||||
| static void _display(void); | 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 *); | static void gl_generate_unicode_glyph(uint32_t, uint32_t, caca_display_t *); | ||||
| struct driver_private | struct driver_private | ||||
| @@ -84,13 +84,11 @@ struct driver_private | |||||
| static int gl_init_graphics(caca_display_t *dp) | static int gl_init_graphics(caca_display_t *dp) | ||||
| { | { | ||||
| char *empty_texture; | |||||
| char const *geometry; | char const *geometry; | ||||
| char *argv[2] = { "", NULL }; | char *argv[2] = { "", NULL }; | ||||
| char const * const * fonts; | char const * const * fonts; | ||||
| unsigned int width = 0, height = 0; | unsigned int width = 0, height = 0; | ||||
| int argc = 1; | int argc = 1; | ||||
| int i, b; | |||||
| dp->drv.p = malloc(sizeof(struct driver_private)); | dp->drv.p = malloc(sizeof(struct driver_private)); | ||||
| @@ -178,39 +176,9 @@ static int gl_init_graphics(caca_display_t *dp) | |||||
| glEnable(GL_BLEND); | glEnable(GL_BLEND); | ||||
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | 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); | 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; | return 0; | ||||
| } | } | ||||
| @@ -522,42 +490,69 @@ static void _display(void) | |||||
| gl_display(dp); | 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; | 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; | 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); | |||||
| } | } | ||||
| /* | /* | ||||