Ignore:
Timestamp:
Nov 12, 2006, 1:26:48 PM (14 years ago)
Author:
Sam Hocevar
Message:
  • Support fullwidth fonts.
  • Add Katakanas and Hiraganas to the default fonts.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/tools/makefont.c

    r1271 r1359  
    5757    0x2500, 0x2580, /* Box Drawing: ═ ║ ╗ ╔ ╩ */
    5858    0x2580, 0x25a0, /* Block Elements: ▛ ▞ ░ ▒ ▓ */
     59    0x3040, 0x30a0, /* Hiragana: で す */
     60    0x30a0, 0x3100, /* Katakana: ロ ル */
    5961    0, 0
    6062};
     
    6567    char buf[10];
    6668    unsigned int same_as;
    67     unsigned int data_index;
     69    unsigned int data_offset;
     70    unsigned int data_width;
     71    unsigned int data_size;
    6872};
    6973
     
    8690
    8791    FT_Bitmap img;
    88     int width, height, blocks, glyphs;
    89     unsigned int n, b, i, index, glyph_size, control_size, data_size;
     92    int width, height, blocks, glyphs, fullwidth;
     93    unsigned int n, b, i, index;
     94    unsigned int glyph_size, control_size, data_size, current_offset;
    9095    uint8_t *glyph_data;
    9196    struct glyph *gtab;
     
    150155    blocks = 0;
    151156    glyphs = 0;
     157    fullwidth = 0;
    152158    for(b = 0; blocklist[b + 1]; b += 2)
    153159    {
    154160        blocks++;
    155161        glyphs += blocklist[b + 1] - blocklist[b];
     162        for(i = blocklist[b]; i < blocklist[b + 1]; i++)
     163            if(cucul_utf32_is_fullwidth(i))
     164                fullwidth++;
    156165    }
    157166
    158167    control_size = 24 + 12 * blocks + 8 * glyphs;
    159     data_size = glyph_size * glyphs;
     168    data_size = glyph_size * (glyphs + fullwidth);
    160169
    161170    gtab = malloc(glyphs * sizeof(struct glyph));
     
    212221
    213222    /* Render all glyphs, so that we can know their offset */
    214     n = index = 0;
     223    current_offset = n = index = 0;
    215224    for(b = 0; blocklist[b + 1]; b += 2)
    216225    {
    217226        for(i = blocklist[b]; i < blocklist[b + 1]; i++)
    218227        {
    219             int x, y, bytes;
    220             unsigned int k;
    221 
     228            int x, y, bytes, current_width = width;
     229            unsigned int k, current_size = glyph_size;
     230
     231            if(cucul_utf32_is_fullwidth(i))
     232            {
     233                current_width *= 2;
     234                current_size *= 2;
     235            }
    222236            gtab[n].unicode = i;
    223237            bytes = cucul_utf32_to_utf8(gtab[n].buf, gtab[n].unicode);
     
    230244
    231245            /* Fix glyphs that we know how to handle better */
    232             fix_glyph(&img, gtab[n].unicode, width, height);
     246            fix_glyph(&img, gtab[n].unicode, current_width, height);
    233247
    234248            /* Write bitmap as an escaped C string */
    235             memset(glyph_data + n * glyph_size, 0, glyph_size);
     249            memset(glyph_data + current_offset, 0, current_size);
    236250            k = 0;
    237251            for(y = 0; y < height; y++)
    238252            {
    239                 for(x = 0; x < width; x++)
     253                for(x = 0; x < current_width; x++)
    240254                {
    241255                    uint8_t pixel = img.buffer[y * img.pitch + x];
    242256
    243257                    pixel >>= (8 - bpp);
    244                     glyph_data[n * glyph_size + k / 8]
     258                    glyph_data[current_offset + k / 8]
    245259                        |= pixel << (8 - bpp - (k % 8));
    246260                    k += bpp;
     
    253267            for(k = 0; k < n; k++)
    254268            {
    255                 if(!memcmp(glyph_data + k * glyph_size,
    256                            glyph_data + n * glyph_size, glyph_size))
     269                if(gtab[k].data_size != current_size)
     270                    continue;
     271#if 0
     272                if(!memcmp(glyph_data + gtab[k].data_offset,
     273                           glyph_data + current_offset, current_size))
    257274                    break;
     275#endif
    258276            }
    259277
    260             gtab[n].data_index = index;
     278            gtab[n].data_offset = current_offset;
     279            gtab[n].data_width = current_width;
     280            gtab[n].data_size = current_size;
    261281            gtab[n].same_as = k;
    262282
    263283            if(k == n)
    264                 index++;
     284                current_offset += current_size;
    265285
    266286            n++;
     
    274294        for(i = blocklist[b]; i < blocklist[b + 1]; i++)
    275295        {
    276             printf_u16("\"%s", width);
     296            printf_u16("\"%s", gtab[n].data_width);
    277297            printf_u16("%s", height);
    278             printf_u32("%s\"\n", gtab[gtab[n].same_as].data_index * glyph_size);
     298            printf_u32("%s\"\n", gtab[gtab[n].same_as].data_offset);
    279299            n++;
    280300        }
     
    294314            if(gtab[n].same_as == n)
    295315                printf_hex(" */ \"%s\"\n",
    296                            glyph_data + n * glyph_size, glyph_size);
     316                           glyph_data + gtab[n].data_offset, gtab[n].data_size);
    297317            else
    298318            {
Note: See TracChangeset for help on using the changeset viewer.