| #include <u.h> |
| #include <libc.h> |
| #include <draw.h> |
| #include <memdraw.h> |
| |
| Memsubfont* |
| openmemsubfont(char *name) |
| { |
| Memsubfont *sf; |
| Memimage *i; |
| Fontchar *fc; |
| int fd, n; |
| char hdr[3*12+4+1]; |
| uchar *p; |
| |
| fd = open(name, OREAD); |
| if(fd < 0) |
| return nil; |
| p = nil; |
| i = readmemimage(fd); |
| if(i == nil) |
| goto Err; |
| if(read(fd, hdr, 3*12) != 3*12){ |
| werrstr("openmemsubfont: header read error: %r"); |
| goto Err; |
| } |
| n = atoi(hdr); |
| p = malloc(6*(n+1)); |
| if(p == nil) |
| goto Err; |
| if(read(fd, p, 6*(n+1)) != 6*(n+1)){ |
| werrstr("openmemsubfont: fontchar read error: %r"); |
| goto Err; |
| } |
| fc = malloc(sizeof(Fontchar)*(n+1)); |
| if(fc == nil) |
| goto Err; |
| _unpackinfo(fc, p, n); |
| sf = allocmemsubfont(name, n, atoi(hdr+12), atoi(hdr+24), fc, i); |
| if(sf == nil){ |
| free(fc); |
| goto Err; |
| } |
| free(p); |
| return sf; |
| Err: |
| close(fd); |
| if (i != nil) |
| freememimage(i); |
| if (p != nil) |
| free(p); |
| return nil; |
| } |