| #include <u.h> |
| #include <libc.h> |
| #include <draw.h> |
| |
| Subfont* |
| readsubfonti(Display*d, char *name, int fd, Image *ai, int dolock) |
| { |
| char hdr[3*12+4+1]; |
| int n; |
| uchar *p; |
| Fontchar *fc; |
| Subfont *f; |
| Image *i; |
| |
| i = ai; |
| if(i == nil){ |
| i = readimage(d, fd, dolock); |
| if(i == nil) |
| return nil; |
| } |
| if(read(fd, hdr, 3*12) != 3*12){ |
| if(ai == nil) |
| freeimage(i); |
| werrstr("rdsubfonfile: header read error: %r"); |
| return nil; |
| } |
| n = atoi(hdr); |
| p = malloc(6*(n+1)); |
| if(p == nil) |
| goto Err; |
| if(read(fd, p, 6*(n+1)) != 6*(n+1)){ |
| werrstr("rdsubfonfile: fontchar read error: %r"); |
| Err: |
| if(ai == nil) |
| freeimage(i); |
| free(p); |
| return nil; |
| } |
| fc = malloc(sizeof(Fontchar)*(n+1)); |
| if(fc == nil) |
| goto Err; |
| _unpackinfo(fc, p, n); |
| if(dolock) |
| lockdisplay(d); |
| f = allocsubfont(name, n, atoi(hdr+12), atoi(hdr+24), fc, i); |
| if(dolock) |
| unlockdisplay(d); |
| if(f == nil){ |
| free(fc); |
| goto Err; |
| } |
| free(p); |
| return f; |
| } |
| |
| Subfont* |
| readsubfont(Display*d, char *name, int fd, int dolock) |
| { |
| return readsubfonti(d, name, fd, nil, dolock); |
| } |