1*7dd7cddfSDavid du Colombier #include <u.h>
2*7dd7cddfSDavid du Colombier #include <libc.h>
3*7dd7cddfSDavid du Colombier #include <libg.h>
4*7dd7cddfSDavid du Colombier #include <bio.h>
5*7dd7cddfSDavid du Colombier #include "hdr.h"
6*7dd7cddfSDavid du Colombier
7*7dd7cddfSDavid du Colombier /*
8*7dd7cddfSDavid du Colombier produces the bitmap for the designated han characters
9*7dd7cddfSDavid du Colombier */
10*7dd7cddfSDavid du Colombier
11*7dd7cddfSDavid du Colombier static void usage(void);
12*7dd7cddfSDavid du Colombier enum { Jis = 0, Big5, Gb_bdf, Gb_qw };
13*7dd7cddfSDavid du Colombier enum { Size24 = 0, Size16 };
14*7dd7cddfSDavid du Colombier struct {
15*7dd7cddfSDavid du Colombier char *names[2];
16*7dd7cddfSDavid du Colombier mapfn *mfn;
17*7dd7cddfSDavid du Colombier readbitsfn *bfn;
18*7dd7cddfSDavid du Colombier } source[] = {
19*7dd7cddfSDavid du Colombier [Jis] { "../han/jis.bits", "../han/jis16.bits", kmap, kreadbits },
20*7dd7cddfSDavid du Colombier [Big5] { "no 24 bit file", "../han/big5.16.bits", bmap, breadbits },
21*7dd7cddfSDavid du Colombier [Gb_bdf] { "no 24 bit file", "../han/cclib16fs.bdf", gmap, greadbits },
22*7dd7cddfSDavid du Colombier [Gb_qw] { "no 24 bit file", "no 16bit file", gmap, qreadbits },
23*7dd7cddfSDavid du Colombier };
24*7dd7cddfSDavid du Colombier
25*7dd7cddfSDavid du Colombier void
main(int argc,char ** argv)26*7dd7cddfSDavid du Colombier main(int argc, char **argv)
27*7dd7cddfSDavid du Colombier {
28*7dd7cddfSDavid du Colombier int from, to;
29*7dd7cddfSDavid du Colombier int size = 24;
30*7dd7cddfSDavid du Colombier int src = Jis;
31*7dd7cddfSDavid du Colombier char *file = 0;
32*7dd7cddfSDavid du Colombier long nc, nb;
33*7dd7cddfSDavid du Colombier int x;
34*7dd7cddfSDavid du Colombier uchar *bits;
35*7dd7cddfSDavid du Colombier long *chars;
36*7dd7cddfSDavid du Colombier int raw = 0;
37*7dd7cddfSDavid du Colombier Bitmap *b, *b1;
38*7dd7cddfSDavid du Colombier Subfont *f;
39*7dd7cddfSDavid du Colombier int *found;
40*7dd7cddfSDavid du Colombier
41*7dd7cddfSDavid du Colombier ARGBEGIN{
42*7dd7cddfSDavid du Colombier case 'f': file = ARGF(); break;
43*7dd7cddfSDavid du Colombier case 'r': raw = 1; break;
44*7dd7cddfSDavid du Colombier case '5': src = Big5; break;
45*7dd7cddfSDavid du Colombier case 's': size = 16; break;
46*7dd7cddfSDavid du Colombier case 'g': src = Gb_bdf; break;
47*7dd7cddfSDavid du Colombier case 'q': src = Gb_qw; break;
48*7dd7cddfSDavid du Colombier default: usage();
49*7dd7cddfSDavid du Colombier }ARGEND
50*7dd7cddfSDavid du Colombier if(file == 0)
51*7dd7cddfSDavid du Colombier file = source[src].names[(size==24)? Size24:Size16];
52*7dd7cddfSDavid du Colombier if(argc != 2)
53*7dd7cddfSDavid du Colombier usage();
54*7dd7cddfSDavid du Colombier from = strtol(argv[0], (char **)0, 0);
55*7dd7cddfSDavid du Colombier to = strtol(argv[1], (char **)0, 0);
56*7dd7cddfSDavid du Colombier binit(0, 0, "fontgen");
57*7dd7cddfSDavid du Colombier nc = to-from+1;
58*7dd7cddfSDavid du Colombier nb = size*size/8; /* bytes per char */
59*7dd7cddfSDavid du Colombier nb *= nc;
60*7dd7cddfSDavid du Colombier bits = (uchar *)malloc(nb);
61*7dd7cddfSDavid du Colombier chars = (long *)malloc(sizeof(long)*nc);
62*7dd7cddfSDavid du Colombier found = (int *)malloc(sizeof(found[0])*nc);
63*7dd7cddfSDavid du Colombier if(bits == 0 || chars == 0){
64*7dd7cddfSDavid du Colombier fprint(2, "%s: couldn't malloc %d bytes for %d chars\n", argv0, nb, nc);
65*7dd7cddfSDavid du Colombier exits("out of memory");
66*7dd7cddfSDavid du Colombier }
67*7dd7cddfSDavid du Colombier if(raw){
68*7dd7cddfSDavid du Colombier for(x = from; x <= to; x++)
69*7dd7cddfSDavid du Colombier chars[x-from] = x;
70*7dd7cddfSDavid du Colombier } else
71*7dd7cddfSDavid du Colombier source[src].mfn(from, to, chars);
72*7dd7cddfSDavid du Colombier memset(bits, 0, nb);
73*7dd7cddfSDavid du Colombier b = source[src].bfn(file, nc, chars, size, bits, &found);
74*7dd7cddfSDavid du Colombier b1 = balloc(b->r, b->ldepth);
75*7dd7cddfSDavid du Colombier bitblt(b1, b1->r.min, b, b->r, S);
76*7dd7cddfSDavid du Colombier f = bf(nc, size, b1, found);
77*7dd7cddfSDavid du Colombier wrbitmapfile(1, b);
78*7dd7cddfSDavid du Colombier wrsubfontfile(1, f);/**/
79*7dd7cddfSDavid du Colombier exits(0);
80*7dd7cddfSDavid du Colombier }
81*7dd7cddfSDavid du Colombier
82*7dd7cddfSDavid du Colombier static void
usage(void)83*7dd7cddfSDavid du Colombier usage(void)
84*7dd7cddfSDavid du Colombier {
85*7dd7cddfSDavid du Colombier fprint(2, "Usage: %s [-s] from to\n", argv0);
86*7dd7cddfSDavid du Colombier exits("usage");
87*7dd7cddfSDavid du Colombier }
88