Blame


1 a31db67d 2004-04-21 devnull #include <u.h>
2 a31db67d 2004-04-21 devnull #include <libc.h>
3 a31db67d 2004-04-21 devnull #include <libg.h>
4 a31db67d 2004-04-21 devnull #include <bio.h>
5 a31db67d 2004-04-21 devnull
6 a31db67d 2004-04-21 devnull static void usage(void);
7 a31db67d 2004-04-21 devnull static void snarf(char *, int);
8 a31db67d 2004-04-21 devnull static void choose(Fontchar *, Bitmap *, int, int, int);
9 a31db67d 2004-04-21 devnull struct {
10 a31db67d 2004-04-21 devnull char *name;
11 a31db67d 2004-04-21 devnull Bitmap *bm;
12 a31db67d 2004-04-21 devnull Subfont *sf;
13 a31db67d 2004-04-21 devnull } ft[1024];
14 a31db67d 2004-04-21 devnull int nf;
15 a31db67d 2004-04-21 devnull
16 a31db67d 2004-04-21 devnull void
17 a31db67d 2004-04-21 devnull main(int argc, char **argv)
18 a31db67d 2004-04-21 devnull {
19 a31db67d 2004-04-21 devnull int i, errs;
20 a31db67d 2004-04-21 devnull Fontchar *fc;
21 a31db67d 2004-04-21 devnull Bitmap *b;
22 a31db67d 2004-04-21 devnull int nc, ht, as;
23 a31db67d 2004-04-21 devnull Subfont *f;
24 a31db67d 2004-04-21 devnull
25 a31db67d 2004-04-21 devnull binit(0, 0, "font merge");
26 a31db67d 2004-04-21 devnull if(argc < 1)
27 a31db67d 2004-04-21 devnull usage();
28 a31db67d 2004-04-21 devnull nf = argc-1;
29 a31db67d 2004-04-21 devnull for(i = 0; i < nf; i++)
30 a31db67d 2004-04-21 devnull snarf(argv[i+1], i);
31 a31db67d 2004-04-21 devnull nc = ft[0].sf->n;
32 a31db67d 2004-04-21 devnull ht = ft[0].sf->height;
33 a31db67d 2004-04-21 devnull as = ft[0].sf->ascent;
34 a31db67d 2004-04-21 devnull errs = 0;
35 a31db67d 2004-04-21 devnull for(i = 0; i < nf; i++){
36 a31db67d 2004-04-21 devnull if(nc < ft[i].sf->n) nc = ft[i].sf->n;
37 a31db67d 2004-04-21 devnull if(ht != ft[1].sf->height){
38 a31db67d 2004-04-21 devnull fprint(2, "%s: %s.height=%d (!= %s.height=%d)\n", argv[0],
39 a31db67d 2004-04-21 devnull ft[i].name, ft[i].sf->height, ft[0].name, ht);
40 a31db67d 2004-04-21 devnull errs = 1;
41 a31db67d 2004-04-21 devnull }
42 a31db67d 2004-04-21 devnull if(as != ft[1].sf->ascent){
43 a31db67d 2004-04-21 devnull fprint(2, "%s: %s.ascent=%d (!= %s.ascent=%d)\n", argv[0],
44 a31db67d 2004-04-21 devnull ft[i].name, ft[i].sf->ascent, ft[0].name, ht);
45 a31db67d 2004-04-21 devnull errs = 1;
46 a31db67d 2004-04-21 devnull }
47 a31db67d 2004-04-21 devnull }
48 a31db67d 2004-04-21 devnull if(errs)
49 a31db67d 2004-04-21 devnull exits("param mismatch");
50 a31db67d 2004-04-21 devnull fc = (Fontchar *)malloc(nc*sizeof(Fontchar));
51 a31db67d 2004-04-21 devnull b = balloc(Rect(0, 0, nc*64, ht), ft[0].bm->ldepth);
52 a31db67d 2004-04-21 devnull if(b == 0 || fc == 0){
53 a31db67d 2004-04-21 devnull fprint(2, "%s: couldn't malloc %d chars\n", argv0, nc);
54 a31db67d 2004-04-21 devnull exits("out of memory");
55 a31db67d 2004-04-21 devnull }
56 a31db67d 2004-04-21 devnull bitblt(b, b->r.min, b, b->r, Zero);
57 a31db67d 2004-04-21 devnull choose(fc, b, nc, ht, as);
58 a31db67d 2004-04-21 devnull wrbitmapfile(1, b);
59 a31db67d 2004-04-21 devnull bitblt(&screen, screen.r.min, b, b->r, S); bflush();sleep(5000);
60 a31db67d 2004-04-21 devnull f = subfalloc(nc, ht, as, fc, b, ~0, ~0);
61 a31db67d 2004-04-21 devnull wrsubfontfile(1, f);
62 a31db67d 2004-04-21 devnull exits(0);
63 a31db67d 2004-04-21 devnull }
64 a31db67d 2004-04-21 devnull
65 a31db67d 2004-04-21 devnull static void
66 a31db67d 2004-04-21 devnull usage(void)
67 a31db67d 2004-04-21 devnull {
68 a31db67d 2004-04-21 devnull fprint(2, "Usage: %s file ...\n", argv0);
69 a31db67d 2004-04-21 devnull exits("usage");
70 a31db67d 2004-04-21 devnull }
71 a31db67d 2004-04-21 devnull
72 a31db67d 2004-04-21 devnull static void
73 a31db67d 2004-04-21 devnull snarf(char *name, int i)
74 a31db67d 2004-04-21 devnull {
75 a31db67d 2004-04-21 devnull int fd;
76 a31db67d 2004-04-21 devnull Bitmap *b;
77 a31db67d 2004-04-21 devnull
78 a31db67d 2004-04-21 devnull ft[i].name = name;
79 a31db67d 2004-04-21 devnull if((fd = open(name, OREAD)) < 0){
80 a31db67d 2004-04-21 devnull perror(name);
81 a31db67d 2004-04-21 devnull exits("font read");
82 a31db67d 2004-04-21 devnull }
83 a31db67d 2004-04-21 devnull if((b = rdbitmapfile(fd)) == 0){
84 a31db67d 2004-04-21 devnull fprint(2, "rdbitmapfile failed\n");
85 a31db67d 2004-04-21 devnull exits("font read");
86 a31db67d 2004-04-21 devnull }
87 a31db67d 2004-04-21 devnull if((ft[i].bm = balloc(b->r, b->ldepth)) == 0){
88 a31db67d 2004-04-21 devnull fprint(2, "ballocsnarf failed\n");
89 a31db67d 2004-04-21 devnull exits("font read");
90 a31db67d 2004-04-21 devnull }
91 a31db67d 2004-04-21 devnull bitblt(ft[i].bm, b->r.min, b, b->r, S);
92 a31db67d 2004-04-21 devnull if((ft[i].sf = rdsubfontfile(fd, b)) == 0){
93 a31db67d 2004-04-21 devnull fprint(2, "rdsubfontfile failed\n");
94 a31db67d 2004-04-21 devnull exits("font read");
95 a31db67d 2004-04-21 devnull }
96 a31db67d 2004-04-21 devnull close(fd);
97 a31db67d 2004-04-21 devnull }
98 a31db67d 2004-04-21 devnull
99 a31db67d 2004-04-21 devnull static void
100 a31db67d 2004-04-21 devnull choose(Fontchar *f, Bitmap *b, int nc, int ht, int as)
101 a31db67d 2004-04-21 devnull {
102 a31db67d 2004-04-21 devnull int j;
103 a31db67d 2004-04-21 devnull Fontchar *info;
104 a31db67d 2004-04-21 devnull int lastx = 0;
105 a31db67d 2004-04-21 devnull int w, n;
106 a31db67d 2004-04-21 devnull
107 a31db67d 2004-04-21 devnull for(n = 0; n < nc; n++, f++){
108 a31db67d 2004-04-21 devnull f->x = lastx;
109 a31db67d 2004-04-21 devnull for(j = 0; j < nf; j++){
110 a31db67d 2004-04-21 devnull if(n >= ft[j].sf->n)
111 a31db67d 2004-04-21 devnull continue;
112 a31db67d 2004-04-21 devnull info = ft[j].sf->info;
113 a31db67d 2004-04-21 devnull if(info[n+1].x != info[n].x)
114 a31db67d 2004-04-21 devnull goto found;
115 a31db67d 2004-04-21 devnull }
116 a31db67d 2004-04-21 devnull continue;
117 a31db67d 2004-04-21 devnull found:
118 a31db67d 2004-04-21 devnull f->left = info[n].left;
119 a31db67d 2004-04-21 devnull f->top = info[n].top;
120 a31db67d 2004-04-21 devnull f->bottom = info[n].bottom;
121 a31db67d 2004-04-21 devnull f->width = info[n].width;
122 a31db67d 2004-04-21 devnull w = info[n+1].x - info[n].x;
123 a31db67d 2004-04-21 devnull bitblt(b, Pt(0, lastx), ft[j].bm, Rect(0, info[n].x, ht, info[n+1].x), S);
124 a31db67d 2004-04-21 devnull lastx += w;
125 a31db67d 2004-04-21 devnull }
126 a31db67d 2004-04-21 devnull f->x = lastx;
127 a31db67d 2004-04-21 devnull }