Ignore:
Timestamp:
Sep 19, 2006, 2:01:26 AM (14 years ago)
Author:
Sam Hocevar
Message:
  • Use cucul_render_canvas() instead of cucul_render_glyph() in the GL driver.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/caca/driver_gl.c

    r1060 r1061  
    5858#endif
    5959static void _display(void);
    60 static void gl_generate_glyph(uint32_t, uint32_t, caca_display_t *);
     60static void gl_compute_font(caca_display_t *);
    6161static void gl_generate_unicode_glyph(uint32_t, uint32_t, caca_display_t *);
    6262
     
    8585static int gl_init_graphics(caca_display_t *dp)
    8686{
    87     char *empty_texture;
    8887    char const *geometry;
    8988    char *argv[2] = { "", NULL };
     
    9190    unsigned int width = 0, height = 0;
    9291    int argc = 1;
    93     int i, b;
    9492
    9593    dp->drv.p = malloc(sizeof(struct driver_private));
     
    179177    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    180178
    181 
    182     empty_texture = malloc(16 * 16 * 4);
    183     if(empty_texture == NULL)
    184         return -1;
    185 
    186     memset(empty_texture, 0xff, 16 * 16 * 4);
    187179    glEnable(GL_TEXTURE_2D);
    188180
    189     dp->drv.p->blocks = cucul_get_font_blocks(dp->drv.p->f);
    190 
    191     for(b = 0, i = 0; dp->drv.p->blocks[i + 1]; i += 2)
    192         b += dp->drv.p->blocks[i + 1] - dp->drv.p->blocks[i];
    193 
    194     dp->drv.p->txid = malloc(b * sizeof(int));
    195 
    196     for(b = 0, i = 0; dp->drv.p->blocks[i + 1]; i += 2)
    197     {
    198         int j, n = dp->drv.p->blocks[i + 1] - dp->drv.p->blocks[i];
    199 
    200         for(j = 0; j < n; j++)
    201         {
    202             glGenTextures(1, (GLuint*)&dp->drv.p->txid[b + j]);
    203             glBindTexture(GL_TEXTURE_2D, dp->drv.p->txid[b + j]);
    204             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    205             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    206             glTexImage2D(GL_TEXTURE_2D, 0, 4,
    207                          16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, empty_texture);
    208 
    209             gl_generate_unicode_glyph(dp->drv.p->blocks[i] + j, b + j, dp);
    210         }
    211 
    212         b += dp->drv.p->blocks[i + 1] - dp->drv.p->blocks[i];
    213     }
     181    gl_compute_font(dp);
    214182
    215183    return 0;
     
    523491}
    524492
    525 static void gl_generate_unicode_glyph(uint32_t c, uint32_t tid,
    526                                       caca_display_t *dp)
    527 {
    528     int y, x, w, h;
    529     uint8_t *glyph8 = calloc(dp->drv.p->font_width * dp->drv.p->font_height, 1);
    530     uint8_t *glyph32 = calloc(16 * 16 * 4, 1);
    531 
    532     cucul_render_glyph(dp->drv.p->f, c, glyph8, dp->drv.p->font_width);
     493static void gl_compute_font(caca_display_t *dp)
     494{
     495    cucul_canvas_t *cv;
     496    uint32_t *image;
     497    int i, b, w, h, x, y;
     498
     499    dp->drv.p->blocks = cucul_get_font_blocks(dp->drv.p->f);
     500
     501    for(b = 0, i = 0; dp->drv.p->blocks[i + 1]; i += 2)
     502        b += dp->drv.p->blocks[i + 1] - dp->drv.p->blocks[i];
     503
     504    dp->drv.p->txid = malloc(b * sizeof(int));
     505    cv = cucul_create_canvas(1, b);
     506    cucul_set_color(cv, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLACK);
     507
     508    for(b = 0, i = 0; dp->drv.p->blocks[i + 1]; i += 2)
     509    {
     510        int j, n = dp->drv.p->blocks[i + 1] - dp->drv.p->blocks[i];
     511
     512        for(j = 0; j < n; j++)
     513            cucul_putchar(cv, 0, b + j, dp->drv.p->blocks[i] + j);
     514
     515        b += n;
     516    }
     517
     518    image = malloc(b * dp->drv.p->font_height
     519                     * dp->drv.p->font_width * sizeof(uint32_t));
     520    cucul_render_canvas(cv, dp->drv.p->f, image, dp->drv.p->font_width,
     521                        b * dp->drv.p->font_height, 4 * dp->drv.p->font_width);
     522    cucul_free_canvas(cv);
    533523
    534524    w = dp->drv.p->font_width <= 16 ? dp->drv.p->font_width : 16;
    535525    h = dp->drv.p->font_height <= 16 ? dp->drv.p->font_height : 16;
    536526
    537     /* Convert resulting 8bbp glyph to 32bits, 16x16 */
    538     for(y = 0; y < h; y++)
    539     {
    540         for(x = 0; x < w; x++)
     527    for(i = 0; i < b; i++)
     528    {
     529        uint8_t tmp[16 * 4 * 16];
     530        uint32_t *glyph = image + (int)(i * dp->drv.p->font_width
     531                                          * dp->drv.p->font_height);
     532        memset(tmp, 0, 16 * 4 * 16);
     533
     534        for(y = 0; y < h; y++)
    541535        {
    542             uint32_t offset = x * 4 + (15 - y) * 16 * 4;
    543             uint8_t c = glyph8[x + y * (int)dp->drv.p->font_width];
    544             glyph32[offset] = c;
    545             glyph32[1 + offset] = c;
    546             glyph32[2 + offset] = c;
    547             glyph32[3 + offset] = c;
     536            for(x = 0; x < w; x++)
     537            {
     538                uint32_t offset = x + (15 - y) * 16;
     539                uint8_t c = glyph[x + y * (int)dp->drv.p->font_width] >> 8;
     540                tmp[offset * 4] = c;
     541                tmp[offset * 4 + 1] = c;
     542                tmp[offset * 4 + 2] = c;
     543                tmp[offset * 4 + 3] = c;
     544            }
    548545        }
    549     }
    550 
    551     glBindTexture(GL_TEXTURE_2D, dp->drv.p->txid[tid]);
    552     glTexImage2D(GL_TEXTURE_2D,
    553                  0, 4,
    554                  16,16,
    555                  0, GL_RGBA, GL_UNSIGNED_BYTE,
    556                  glyph32);
    557     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    558     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    559     free(glyph8);
    560     free(glyph32);
     546
     547        glGenTextures(1, (GLuint*)&dp->drv.p->txid[i]);
     548        glBindTexture(GL_TEXTURE_2D, dp->drv.p->txid[i]);
     549        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     550        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     551        glTexImage2D(GL_TEXTURE_2D, 0, 4, 16, 16, 0,
     552                     GL_RGBA, GL_UNSIGNED_BYTE, tmp);
     553    }
     554
     555    free(image);
    561556}
    562557
Note: See TracChangeset for help on using the changeset viewer.