Browse Source

* Use cucul_render_canvas() instead of cucul_render_glyph() in the GL driver.

tags/v0.99.beta14
Sam Hocevar sam 18 years ago
parent
commit
d1d4aeca10
1 changed files with 54 additions and 59 deletions
  1. +54
    -59
      caca/driver_gl.c

+ 54
- 59
caca/driver_gl.c View File

@@ -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);
}

/*


Loading…
Cancel
Save