Blob


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