#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; | |
} |