diff options
Diffstat (limited to 'src/cmd/tcs/font/kbits.c')
-rw-r--r-- | src/cmd/tcs/font/kbits.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/cmd/tcs/font/kbits.c b/src/cmd/tcs/font/kbits.c new file mode 100644 index 00000000..325edc33 --- /dev/null +++ b/src/cmd/tcs/font/kbits.c @@ -0,0 +1,93 @@ +#include <u.h> +#include <libc.h> +#include <libg.h> +#include <bio.h> +#include "hdr.h" + +Bitmap * +kreadbits(char *file, int n, long *chars, int size, uchar *bits, int **doneptr) +{ + Bitmap *bm; + Biobuf *bf; + char *p; + long kmin, kmax; + int i, j, byt; + int nch; + long c; + uchar *b; + int *done; + uchar *nbits; + static int dig[256] = { + ['0'] 0, ['1'] 1, ['2'] 2, ['3'] 3, ['4'] 4, ['5'] 5, ['6'] 6, ['7'] 7, + ['8'] 8, ['9'] 9, ['a'] 10, ['b'] 11, ['c'] 12, ['d'] 13, ['e'] 14, ['f'] 15, + }; + + bf = Bopen(file, OREAD); + if(bf == 0){ + fprint(2, "%s: %s: %r\n", argv0, file); + exits("bitfile open error"); + } + done = (int *)malloc(n*sizeof(done[0])); + if(done == 0){ + fprint(2, "%s: malloc error (%d bytes)\n", argv0, n); + exits("malloc error"); + } + *doneptr = done; + memset(done, 0, n*sizeof(done[0])); + kmin = 65536; + kmax = 0; + for(i = 0; i < n; i++){ + c = chars[i]; + if(kmin > c) + kmin = c; + if(kmax < c) + kmax = c; + } + nch = 0; + byt = size/8; + Brdline(bf, '\n'); /* header line 1 */ + Brdline(bf, '\n'); /* header line 2 */ + while(p = (char *)Brdline(bf, '\n')){ + c = strtol(p+17, (char **)0, 10); + if((c < kmin) || (c > kmax)) + continue; + for(i = 0; i < n; i++) + if(c == chars[i]){ + nch++; + done[i] = 1; + p += 25; + b = bits + i*byt; + for(i = 0; i < size; i++){ /* rows */ + for(j = 0; j < byt; j++){ + *b++ = (dig[*p]<<4) | dig[p[1]]; + p += 2; + } + b += (n-1)*byt; + } + break; + } + } + nbits = (uchar *)malloc(nch*byt*size); + if(nbits == 0){ + fprint(2, "%s: malloc error (%d bytes)\n", argv0, nch*byt); + exits("malloc error"); + } + c = 0; + for(i = 0; i < n; i++) + if(done[i]){ + for(j = 0; j < size; j++) + memmove(nbits+c*byt+j*nch*byt, bits+i*byt+j*n*byt, byt); + c++; + } + bm = balloc((Rectangle){(Point){0, 0}, (Point){nch*size, size}}, 0); + if(bm == 0){ + fprint(2, "%s: balloc failure\n", argv0); + exits("balloc failure"); + } + wrbitmap(bm, 0, size, nbits); + for(i = 0; i < n; i++) + if(done[i] == 0){ + /*fprint(2, "char 0x%x (%d) not found\n", chars[i], chars[i]);/**/ + } + return(bm); +} |