Changeset 746


Ignore:
Timestamp:
Apr 13, 2006, 10:16:04 AM (15 years ago)
Author:
Sam Hocevar
Message:
  • Slightly updated the font format and wrote a font loader. Also added a skeleton for the renderer that will not last very long.
Location:
libcaca/trunk/cucul
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/cucul/cucul.h

    r734 r746  
    178178/*  @} */
    179179
     180/** \defgroup font Font handling
     181 *
     182 *  These functions provide font handling routines and high quality
     183 *  canvas to bitmap rendering.
     184 *
     185 *  @{ */
     186struct cucul_font;
     187struct cucul_font *cucul_load_font(void *, unsigned int);
     188void cucul_free_font(struct cucul_font *);
     189/*  @} */
     190
    180191/** \defgroup exporter Exporters to various formats
    181192 *
  • libcaca/trunk/cucul/font.c

    r745 r746  
    1818 */
    1919
     20#include "config.h"
     21
     22#if !defined(__KERNEL__)
     23#   if defined(HAVE_ENDIAN_H)
     24#       include <endian.h>
     25#   endif
     26#   include <stdio.h>
     27#   include <stdlib.h>
     28#   include <string.h>
     29#   include <arpa/inet.h>
     30#endif
     31
     32#include "cucul.h"
     33#include "cucul_internals.h"
     34
     35struct font_header
     36{
     37    uint32_t control_size, data_size;
     38    uint16_t version, blocks;
     39    uint32_t glyphs;
     40    uint16_t bpp, width, height, flags;
     41};
     42
     43struct block_info
     44{
     45    uint32_t start, stop, index;
     46};
     47
     48struct glyph_info
     49{
     50    uint16_t width, height;
     51    uint32_t data_offset;
     52};
     53
     54struct cucul_font
     55{
     56    struct font_header header;
     57
     58    struct block_info *block_list;
     59    struct glyph_info *glyph_list;
     60    uint8_t *font_data;
     61
     62    uint8_t *private;
     63};
     64
     65struct cucul_font *cucul_load_font(void *data, unsigned int size)
     66{
     67    struct cucul_font *f;
     68    unsigned int i;
     69
     70    f = malloc(sizeof(struct cucul_font));
     71    f->private = data;
     72
     73    memcpy(&f->header, f->private + 8, sizeof(struct font_header));
     74    f->header.control_size = htonl(f->header.control_size);
     75    f->header.data_size = htonl(f->header.data_size);
     76    f->header.version = htons(f->header.version);
     77    f->header.blocks = htons(f->header.blocks);
     78    f->header.glyphs = htonl(f->header.glyphs);
     79    f->header.bpp = htons(f->header.bpp);
     80    f->header.width = htons(f->header.width);
     81    f->header.height = htons(f->header.height);
     82    f->header.flags = htons(f->header.flags);
     83
     84    f->block_list = malloc(f->header.blocks * sizeof(struct block_info));
     85    memcpy(f->block_list,
     86           f->private + 8 + sizeof(struct font_header),
     87           f->header.blocks * sizeof(struct block_info));
     88    for(i = 0; i < f->header.blocks; i++)
     89    {
     90        f->block_list[i].start = htonl(f->block_list[i].start);
     91        f->block_list[i].stop = htonl(f->block_list[i].stop);
     92        f->block_list[i].index = htonl(f->block_list[i].index);
     93    }
     94
     95    f->glyph_list = malloc(f->header.glyphs * sizeof(struct glyph_info));
     96    memcpy(f->glyph_list,
     97           f->private + 8 + sizeof(struct font_header)
     98                + f->header.blocks * sizeof(struct block_info),
     99           f->header.glyphs * sizeof(struct glyph_info));
     100    for(i = 0; i < f->header.glyphs; i++)
     101    {
     102        f->glyph_list[i].width = htons(f->glyph_list[i].width);
     103        f->glyph_list[i].height = htons(f->glyph_list[i].height);
     104        f->glyph_list[i].data_offset = htonl(f->glyph_list[i].data_offset);
     105    }
     106
     107    f->font_data = f->private + 8 + f->header.control_size;
     108
     109    return f;
     110}
     111
     112void cucul_free_font(struct cucul_font *f)
     113{
     114    free(f->glyph_list);
     115    free(f->block_list);
     116    free(f);
     117}
     118
     119void cucul_render_canvas(cucul_t *qq, struct cucul_font *f)
     120{
     121    uint8_t *buf = malloc(qq->width * f->header.width * qq->height * f->header.height);
     122    unsigned int x, y, i, j;
     123
     124    for(y = 0; y < qq->height; y++)
     125    {
     126        for(x = 0; x < qq->width; x++)
     127        {
     128            unsigned int starty = y * f->header.height;
     129            unsigned int startx = x * f->header.width;
     130            uint32_t ch = qq->chars[y * qq->width + x];
     131            unsigned int b;
     132            struct glyph_info *g;
     133
     134            /* Find the Unicode block where our glyph lies */
     135            for(b = 0; b < f->header.blocks; b++)
     136            {
     137                if(ch < f->block_list[b].start)
     138                {
     139                    b = f->header.blocks;
     140                    break;
     141                }
     142
     143                if(ch < f->block_list[b].stop)
     144                    break;
     145            }
     146
     147            /* Glyph not in font? Skip it. */
     148            if(b == f->header.blocks)
     149                continue;
     150
     151            g = &f->glyph_list[f->block_list[b].index
     152                                + ch - f->block_list[b].start];
     153
     154            for(j = 0; j < g->height; j++)
     155            {
     156                for(i = 0; i < g->width; i++)
     157                {
     158                    /* FIXME: this is 8 bit only */
     159                    buf[(starty + j) * qq->width * f->header.width
     160                          + startx + i] = f->font_data[g->data_offset + j * g->width + i];
     161                }
     162            }
     163        }
     164    }
     165
     166    for(y = 0; y < qq->height * f->header.height; y++)
     167    {
     168        for(x = 0; x < qq->width * f->header.width; x++)
     169        {
     170            printf("%.02x", buf[y * qq->width * f->header.width + x]);
     171        }
     172        printf("\n");
     173    }
     174}
     175
    20176/*
    21177 * The libcaca font format, version 1
     
    30186 *
    31187 * font_header:
    32  *    uint32_t header_size;      // Header size (font_data - font_header)
     188 *    uint32_t control_size;     // Control size (font_data - font_header)
    33189 *    uint32_t data_size;        // Data size (EOF - font_data)
    34190 *
     
    54210 *    {
    55211 *       uint32_t start;         // Unicode index of the first glyph
    56  *       uint32_t end;           // Unicode index of the last glyph + 1
    57  *       uint32_t info_offset;   // Offset (starting from data) to the info
    58  *                               // for the first glyph
     212 *       uint32_t stop;          // Unicode index of the last glyph + 1
     213 *       uint32_t index;         // Glyph info index of the first glyph
    59214 *    }
    60215 *    block_list[blocks];
Note: See TracChangeset for help on using the changeset viewer.