xref: /plan9/sys/src/cmd/tcs/font/main.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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