Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include        <u.h>
#include        <libc.h>
#include        <libg.h>
#include        <bio.h>
#include        "hdr.h"

/*
        produces the bitmap for the designated han characters
*/

static void usage(void);
enum { Jis = 0, Big5, Gb_bdf, Gb_qw };
enum { Size24 = 0, Size16 };
struct {
        char *names[2];
        mapfn *mfn;
        readbitsfn *bfn;
} source[] = {
        [Jis] { "../han/jis.bits", "../han/jis16.bits", kmap, kreadbits },
        [Big5] { "no 24 bit file", "../han/big5.16.bits", bmap, breadbits },
        [Gb_bdf] { "no 24 bit file", "../han/cclib16fs.bdf", gmap, greadbits },
        [Gb_qw] { "no 24 bit file", "no 16bit file", gmap, qreadbits },
};

void
main(int argc, char **argv)
{
        int from, to;
        int size = 24;
        int src = Jis;
        char *file = 0;
        long nc, nb;
        int x;
        uchar *bits;
        long *chars;
        int raw = 0;
        Bitmap *b, *b1;
        Subfont *f;
        int *found;

        ARGBEGIN{
        case 'f':       file = ARGF(); break;
        case 'r':       raw = 1; break;
        case '5':       src = Big5; break;
        case 's':       size = 16; break;
        case 'g':       src = Gb_bdf; break;
        case 'q':       src = Gb_qw; break;
        default:        usage();
        }ARGEND
        if(file == 0)
                file = source[src].names[(size==24)? Size24:Size16];
        if(argc != 2)
                usage();
        from = strtol(argv[0], (char **)0, 0);
        to = strtol(argv[1], (char **)0, 0);
        binit(0, 0, "fontgen");
        nc = to-from+1;
        nb = size*size/8;               /* bytes per char */
        nb *= nc;
        bits = (uchar *)malloc(nb);
        chars = (long *)malloc(sizeof(long)*nc);
        found = (int *)malloc(sizeof(found[0])*nc);
        if(bits == 0 || chars == 0){
                fprint(2, "%s: couldn't malloc %d bytes for %d chars\n", argv0, nb, nc);
                exits("out of memory");
        }
        if(raw){
                for(x = from; x <= to; x++)
                        chars[x-from] = x;
        } else
                source[src].mfn(from, to, chars);
        memset(bits, 0, nb);
        b = source[src].bfn(file, nc, chars, size, bits, &found);
        b1 = balloc(b->r, b->ldepth);
        bitblt(b1, b1->r.min, b, b->r, S);
        f = bf(nc, size, b1, found);
        wrbitmapfile(1, b);
        wrsubfontfile(1, f);/**/
        exits(0);
}

static void
usage(void)
{
        fprint(2, "Usage: %s [-s] from to\n", argv0);
        exits("usage");
}