gbits.c (2918B)
1 #include <u.h> 2 #include <libc.h> 3 #include <libg.h> 4 #include <bio.h> 5 #include "hdr.h" 6 7 /* 8 this file reads bdf fonts. it is mapping dependent in that the ENCODING 9 field is font dependent. 10 */ 11 12 static char *field(Biobuf *, char *); 13 14 Bitmap * 15 greadbits(char *file, int n, long *chars, int size, uchar *bits, int **doneptr) 16 { 17 Bitmap *bm; 18 Biobuf *bf; 19 char *p, *s; 20 long kmin, kmax; 21 int i, j, byt; 22 int nch; 23 long c; 24 uchar *b; 25 int *done; 26 uchar *nbits; 27 char buf[1024]; /* big enough for one char! */ 28 static int dig[256] = { 29 ['0'] 0, ['1'] 1, ['2'] 2, ['3'] 3, ['4'] 4, ['5'] 5, ['6'] 6, ['7'] 7, 30 ['8'] 8, ['9'] 9, ['a'] 10, ['b'] 11, ['c'] 12, ['d'] 13, ['e'] 14, ['f'] 15, 31 }; 32 33 bf = Bopen(file, OREAD); 34 if(bf == 0){ 35 fprint(2, "%s: %s: %r\n", argv0, file); 36 exits("bitfile open error"); 37 } 38 done = (int *)malloc(n*sizeof(done[0])); 39 if(done == 0){ 40 fprint(2, "%s: malloc error (%d bytes)\n", argv0, n); 41 exits("malloc error"); 42 } 43 *doneptr = done; 44 memset(done, 0, n*sizeof(done[0])); 45 kmin = 65536; 46 kmax = 0; 47 for(i = 0; i < n; i++){ 48 c = chars[i]; 49 if(kmin > c) 50 kmin = c; 51 if(kmax < c) 52 kmax = c; 53 } 54 nch = 0; 55 byt = size/8; 56 for(;;){ 57 while(s = Brdline(bf, '\n')){ 58 if(strncmp(s, "STARTCHAR", 9) == 0) 59 break; 60 } 61 if(s == 0) 62 break; 63 s = field(bf, "ENCODING"); 64 c = strtol(s, (char **)0, 10); 65 c = (c/256 - 0xA0)*100 + (c%256 - 0xA0); 66 field(bf, "BITMAP"); 67 p = buf; 68 for(i = 0; i < size; i++){ /* rows */ 69 if((s = Brdline(bf, '\n')) == 0){ 70 exits("bad bdf"); 71 } 72 memcpy(p, s, 2*byt); 73 p += 2*byt; 74 } 75 field(bf, "ENDCHAR"); 76 if((c < kmin) || (c > kmax)) 77 continue; 78 for(i = 0; i < n; i++) 79 if(c == chars[i]){ 80 nch++; 81 done[i] = 1; 82 p = buf; 83 b = bits + i*byt; 84 for(i = 0; i < size; i++){ /* rows */ 85 for(j = 0; j < byt; j++){ 86 *b++ = (dig[*p]<<4) | dig[p[1]]; 87 p += 2; 88 } 89 b += (n-1)*byt; 90 } 91 break; 92 } 93 } 94 nbits = (uchar *)malloc(nch*byt*size); 95 if(nbits == 0){ 96 fprint(2, "%s: malloc error (%d bytes)\n", argv0, nch*byt); 97 exits("malloc error"); 98 } 99 c = 0; 100 for(i = 0; i < n; i++) 101 if(done[i]){ 102 for(j = 0; j < size; j++) 103 memmove(nbits+c*byt+j*nch*byt, bits+i*byt+j*n*byt, byt); 104 c++; 105 } 106 bm = balloc((Rectangle){(Point){0, 0}, (Point){nch*size, size}}, 0); 107 if(bm == 0){ 108 fprint(2, "%s: balloc failure\n", argv0); 109 exits("balloc failure"); 110 } 111 wrbitmap(bm, 0, size, nbits); 112 for(i = 0; i < n; i++) 113 if(done[i] == 0){ 114 /*fprint(2, "char 0x%x (%d) not found\n", chars[i], chars[i]);/**/ 115 } 116 return(bm); 117 } 118 119 static char * 120 field(Biobuf *bf, char *name) 121 { 122 char *s; 123 int n; 124 125 n = strlen(name); 126 while(s = Brdline(bf, '\n')){ 127 if(strncmp(s, name, n) == 0) 128 return(s+n); 129 if(strncmp(s, "ENDCHAR", 7) == 0){ 130 fprint(2, "%s: char missing %s field\n", argv0, name); 131 exits("bad bdf"); 132 } 133 } 134 fprint(2, "%s: char missing %s field; unexpected EOF\n", argv0, name); 135 exits("bad bdf"); 136 return(0); 137 }