diff options
| author | wkj <devnull@localhost> | 2004-04-21 01:15:41 +0000 |
|---|---|---|
| committer | wkj <devnull@localhost> | 2004-04-21 01:15:41 +0000 |
| commit | a31db67d14c0e50353eac3db342f3c969cabdf76 (patch) | |
| tree | 0cebd9a65bab940355f5be0751f53238366555d7 /src/cmd/tcs/font/merge.c | |
| parent | ba03b8910dd07511378e6f1007faf0539ed25598 (diff) | |
| download | plan9port-a31db67d14c0e50353eac3db342f3c969cabdf76.tar.gz plan9port-a31db67d14c0e50353eac3db342f3c969cabdf76.zip | |
Add tcs; it compiles in my world, but I haven't tried it in Russ's yet.
Diffstat (limited to 'src/cmd/tcs/font/merge.c')
| -rw-r--r-- | src/cmd/tcs/font/merge.c | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/src/cmd/tcs/font/merge.c b/src/cmd/tcs/font/merge.c new file mode 100644 index 00000000..35a5db39 --- /dev/null +++ b/src/cmd/tcs/font/merge.c @@ -0,0 +1,127 @@ +#include <u.h> +#include <libc.h> +#include <libg.h> +#include <bio.h> + +static void usage(void); +static void snarf(char *, int); +static void choose(Fontchar *, Bitmap *, int, int, int); +struct { + char *name; + Bitmap *bm; + Subfont *sf; +} ft[1024]; +int nf; + +void +main(int argc, char **argv) +{ + int i, errs; + Fontchar *fc; + Bitmap *b; + int nc, ht, as; + Subfont *f; + + binit(0, 0, "font merge"); + if(argc < 1) + usage(); + nf = argc-1; + for(i = 0; i < nf; i++) + snarf(argv[i+1], i); + nc = ft[0].sf->n; + ht = ft[0].sf->height; + as = ft[0].sf->ascent; + errs = 0; + for(i = 0; i < nf; i++){ + if(nc < ft[i].sf->n) nc = ft[i].sf->n; + if(ht != ft[1].sf->height){ + fprint(2, "%s: %s.height=%d (!= %s.height=%d)\n", argv[0], + ft[i].name, ft[i].sf->height, ft[0].name, ht); + errs = 1; + } + if(as != ft[1].sf->ascent){ + fprint(2, "%s: %s.ascent=%d (!= %s.ascent=%d)\n", argv[0], + ft[i].name, ft[i].sf->ascent, ft[0].name, ht); + errs = 1; + } + } + if(errs) + exits("param mismatch"); + fc = (Fontchar *)malloc(nc*sizeof(Fontchar)); + b = balloc(Rect(0, 0, nc*64, ht), ft[0].bm->ldepth); + if(b == 0 || fc == 0){ + fprint(2, "%s: couldn't malloc %d chars\n", argv0, nc); + exits("out of memory"); + } + bitblt(b, b->r.min, b, b->r, Zero); + choose(fc, b, nc, ht, as); + wrbitmapfile(1, b); +bitblt(&screen, screen.r.min, b, b->r, S); bflush();sleep(5000); + f = subfalloc(nc, ht, as, fc, b, ~0, ~0); + wrsubfontfile(1, f); + exits(0); +} + +static void +usage(void) +{ + fprint(2, "Usage: %s file ...\n", argv0); + exits("usage"); +} + +static void +snarf(char *name, int i) +{ + int fd; + Bitmap *b; + + ft[i].name = name; + if((fd = open(name, OREAD)) < 0){ + perror(name); + exits("font read"); + } + if((b = rdbitmapfile(fd)) == 0){ + fprint(2, "rdbitmapfile failed\n"); + exits("font read"); + } + if((ft[i].bm = balloc(b->r, b->ldepth)) == 0){ + fprint(2, "ballocsnarf failed\n"); + exits("font read"); + } + bitblt(ft[i].bm, b->r.min, b, b->r, S); + if((ft[i].sf = rdsubfontfile(fd, b)) == 0){ + fprint(2, "rdsubfontfile failed\n"); + exits("font read"); + } + close(fd); +} + +static void +choose(Fontchar *f, Bitmap *b, int nc, int ht, int as) +{ + int j; + Fontchar *info; + int lastx = 0; + int w, n; + + for(n = 0; n < nc; n++, f++){ + f->x = lastx; + for(j = 0; j < nf; j++){ + if(n >= ft[j].sf->n) + continue; + info = ft[j].sf->info; + if(info[n+1].x != info[n].x) + goto found; + } + continue; + found: + f->left = info[n].left; + f->top = info[n].top; + f->bottom = info[n].bottom; + f->width = info[n].width; + w = info[n+1].x - info[n].x; + bitblt(b, Pt(0, lastx), ft[j].bm, Rect(0, info[n].x, ht, info[n+1].x), S); + lastx += w; + } + f->x = lastx; +} |
